157114Smuller /*-
257114Smuller * Copyright (c) 1992 Keith Muller.
360676Sbostic * Copyright (c) 1992, 1993
460676Sbostic * The Regents of the University of California. All rights reserved.
557114Smuller *
657114Smuller * This code is derived from software contributed to Berkeley by
757114Smuller * Keith Muller of the University of California, San Diego.
857114Smuller *
957114Smuller * %sccs.include.redist.c%
1057114Smuller */
1157114Smuller
1257114Smuller #ifndef lint
13*66890Sbostic static char sccsid[] = "@(#)tty_subs.c 8.2 (Berkeley) 04/18/94";
1457114Smuller #endif /* not lint */
1557114Smuller
1657114Smuller #include <sys/types.h>
1757114Smuller #include <sys/time.h>
1857114Smuller #include <sys/stat.h>
1957114Smuller #include <sys/param.h>
2057114Smuller #include <fcntl.h>
2157114Smuller #include <stdio.h>
2257114Smuller #include <ctype.h>
2357114Smuller #include <errno.h>
2457114Smuller #include <unistd.h>
2557114Smuller #include <stdlib.h>
2657114Smuller #include <string.h>
2757114Smuller #include "pax.h"
2857114Smuller #include "extern.h"
2957114Smuller #if __STDC__
3057114Smuller #include <stdarg.h>
3157114Smuller #else
3257114Smuller #include <varargs.h>
3357114Smuller #endif
3457114Smuller
3557114Smuller /*
3657114Smuller * routines that deal with I/O to and from the user
3757114Smuller */
3857114Smuller
3957114Smuller #define DEVTTY "/dev/tty" /* device for interactive i/o */
4057114Smuller static FILE *ttyoutf = NULL; /* output pointing at control tty */
4157114Smuller static FILE *ttyinf = NULL; /* input pointing at control tty */
4257114Smuller
4357114Smuller /*
4457114Smuller * tty_init()
4557114Smuller * try to open the controlling termina (if any) for this process. if the
4657114Smuller * open fails, future ops that require user input will get an EOF
4757114Smuller */
4857114Smuller
4957114Smuller #if __STDC__
5057114Smuller int
tty_init(void)5157114Smuller tty_init(void)
5257114Smuller #else
5357114Smuller int
5457114Smuller tty_init()
5557114Smuller #endif
5657114Smuller {
5757114Smuller int ttyfd;
5857114Smuller
5957114Smuller if ((ttyfd = open(DEVTTY, O_RDWR)) >= 0) {
6057114Smuller if ((ttyoutf = fdopen(ttyfd, "w")) != NULL) {
6157114Smuller if ((ttyinf = fdopen(ttyfd, "r")) != NULL)
6257114Smuller return(0);
6357114Smuller (void)fclose(ttyoutf);
6457114Smuller }
6557114Smuller (void)close(ttyfd);
6657114Smuller }
6757114Smuller
6857114Smuller if (iflag) {
6957114Smuller warn(1, "Fatal error, cannot open %s", DEVTTY);
7057114Smuller return(-1);
7157114Smuller }
7257114Smuller return(0);
7357114Smuller }
7457114Smuller
7557114Smuller /*
7657114Smuller * tty_prnt()
7757114Smuller * print a message using the specified format to the controlling tty
7857114Smuller * if there is no controlling terminal, just return.
7957114Smuller */
8057114Smuller
8157114Smuller #if __STDC__
8257114Smuller void
tty_prnt(char * fmt,...)8357114Smuller tty_prnt(char *fmt, ...)
8457114Smuller #else
8557114Smuller void
8657114Smuller tty_prnt(fmt, va_alist)
8757114Smuller char *fmt;
8857114Smuller va_dcl
8957114Smuller #endif
9057114Smuller {
9157114Smuller va_list ap;
9257114Smuller # if __STDC__
9357114Smuller va_start(ap, fmt);
9457114Smuller # else
9557114Smuller va_start(ap);
9657114Smuller # endif
9757114Smuller if (ttyoutf == NULL)
9857114Smuller return;
9957114Smuller (void)vfprintf(ttyoutf, fmt, ap);
10057114Smuller va_end(ap);
10157114Smuller (void)fflush(ttyoutf);
10257114Smuller }
10357114Smuller
10457114Smuller /*
10557114Smuller * tty_read()
10657114Smuller * read a string from the controlling terminal if it is open into the
10757114Smuller * supplied buffer
10857114Smuller * Return:
10957114Smuller * 0 if data was read, -1 otherwise.
11057114Smuller */
11157114Smuller
11257114Smuller #if __STDC__
11357114Smuller int
tty_read(char * str,int len)11457114Smuller tty_read(char *str, int len)
11557114Smuller #else
11657114Smuller int
11757114Smuller tty_read(str, len)
11857114Smuller char *str;
11957114Smuller int len;
12057114Smuller #endif
12157114Smuller {
12257114Smuller register char *pt;
12357114Smuller
12457114Smuller if ((--len <= 0) || (ttyinf == NULL) || (fgets(str,len,ttyinf) == NULL))
12557114Smuller return(-1);
12657114Smuller *(str + len) = '\0';
12757114Smuller
12857114Smuller /*
12957114Smuller * strip off that trailing newline
13057114Smuller */
13157114Smuller if ((pt = strchr(str, '\n')) != NULL)
13257114Smuller *pt = '\0';
13357114Smuller return(0);
13457114Smuller }
13557114Smuller
13657114Smuller /*
13757114Smuller * warn()
13857114Smuller * write a warning message to stderr. if "set" the exit value of pax
13957114Smuller * will be non-zero.
14057114Smuller */
14157114Smuller
14257114Smuller #if __STDC__
14357114Smuller void
warn(int set,char * fmt,...)14457114Smuller warn(int set, char *fmt, ...)
14557114Smuller #else
14657114Smuller void
14757114Smuller warn(set, fmt, va_alist)
14857114Smuller int set;
14957114Smuller char *fmt;
15057114Smuller va_dcl
15157114Smuller #endif
15257114Smuller {
15357114Smuller va_list ap;
15457114Smuller # if __STDC__
15557114Smuller va_start(ap, fmt);
15657114Smuller # else
15757114Smuller va_start(ap);
15857114Smuller # endif
15957114Smuller if (set)
16057114Smuller exit_val = 1;
16157114Smuller /*
16257114Smuller * when vflag we better ship out an extra \n to get this message on a
16357114Smuller * line by itself
16457114Smuller */
16557114Smuller if (vflag && vfpart) {
16657114Smuller (void)fputc('\n', stderr);
16757114Smuller vfpart = 0;
16857114Smuller }
169*66890Sbostic (void)fprintf(stderr, "%s: ", argv0);
17057114Smuller (void)vfprintf(stderr, fmt, ap);
17157114Smuller va_end(ap);
17257114Smuller (void)fputc('\n', stderr);
17357114Smuller }
17457114Smuller
17557114Smuller /*
17657114Smuller * syswarn()
17757114Smuller * write a warning message to stderr. if "set" the exit value of pax
17857114Smuller * will be non-zero.
17957114Smuller */
18057114Smuller
18157114Smuller #if __STDC__
18257114Smuller void
syswarn(int set,int errnum,char * fmt,...)18357114Smuller syswarn(int set, int errnum, char *fmt, ...)
18457114Smuller #else
18557114Smuller void
18657114Smuller syswarn(set, errnum, fmt, va_alist)
18757114Smuller int set;
18857114Smuller int errnum;
18957114Smuller char *fmt;
19057114Smuller va_dcl
19157114Smuller #endif
19257114Smuller {
19357114Smuller va_list ap;
19457114Smuller # if __STDC__
19557114Smuller va_start(ap, fmt);
19657114Smuller # else
19757114Smuller va_start(ap);
19857114Smuller # endif
19957114Smuller if (set)
20057114Smuller exit_val = 1;
20157114Smuller /*
20257114Smuller * when vflag we better ship out an extra \n to get this message on a
20357114Smuller * line by itself
20457114Smuller */
20557114Smuller if (vflag && vfpart) {
20657114Smuller (void)fputc('\n', stderr);
20757114Smuller vfpart = 0;
20857114Smuller }
209*66890Sbostic (void)fprintf(stderr, "%s: ", argv0);
21057114Smuller (void)vfprintf(stderr, fmt, ap);
21157114Smuller va_end(ap);
21257114Smuller
21357114Smuller /*
21457114Smuller * format and print the errno
21557114Smuller */
21657114Smuller if (errnum > 0)
21757114Smuller (void)fprintf(stderr, " <%s>", sys_errlist[errnum]);
21857114Smuller (void)fputc('\n', stderr);
21957114Smuller }
220