157114Smuller /*- 257114Smuller * Copyright (c) 1992 Keith Muller. 3*60676Sbostic * Copyright (c) 1992, 1993 4*60676Sbostic * 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*60676Sbostic static char sccsid[] = "@(#)tty_subs.c 8.1 (Berkeley) 05/31/93"; 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 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 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 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 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 } 16957114Smuller (void)fputs("pax: ", stderr); 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 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 } 20957114Smuller (void)fputs("pax: ", stderr); 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