1*57114Smuller /*- 2*57114Smuller * Copyright (c) 1992 Keith Muller. 3*57114Smuller * Copyright (c) 1992 The Regents of the University of California. 4*57114Smuller * All rights reserved. 5*57114Smuller * 6*57114Smuller * This code is derived from software contributed to Berkeley by 7*57114Smuller * Keith Muller of the University of California, San Diego. 8*57114Smuller * 9*57114Smuller * %sccs.include.redist.c% 10*57114Smuller */ 11*57114Smuller 12*57114Smuller #ifndef lint 13*57114Smuller static char sccsid[] = "@(#)tty_subs.c 1.1 (Berkeley) 12/13/92"; 14*57114Smuller #endif /* not lint */ 15*57114Smuller 16*57114Smuller #include <sys/types.h> 17*57114Smuller #include <sys/time.h> 18*57114Smuller #include <sys/stat.h> 19*57114Smuller #include <sys/param.h> 20*57114Smuller #include <fcntl.h> 21*57114Smuller #include <stdio.h> 22*57114Smuller #include <ctype.h> 23*57114Smuller #include <errno.h> 24*57114Smuller #include <unistd.h> 25*57114Smuller #include <stdlib.h> 26*57114Smuller #include <string.h> 27*57114Smuller #include "pax.h" 28*57114Smuller #include "extern.h" 29*57114Smuller #if __STDC__ 30*57114Smuller #include <stdarg.h> 31*57114Smuller #else 32*57114Smuller #include <varargs.h> 33*57114Smuller #endif 34*57114Smuller 35*57114Smuller /* 36*57114Smuller * routines that deal with I/O to and from the user 37*57114Smuller */ 38*57114Smuller 39*57114Smuller #define DEVTTY "/dev/tty" /* device for interactive i/o */ 40*57114Smuller static FILE *ttyoutf = NULL; /* output pointing at control tty */ 41*57114Smuller static FILE *ttyinf = NULL; /* input pointing at control tty */ 42*57114Smuller extern char *sys_errlist[]; /* errno printable strings */ 43*57114Smuller 44*57114Smuller /* 45*57114Smuller * tty_init() 46*57114Smuller * try to open the controlling termina (if any) for this process. if the 47*57114Smuller * open fails, future ops that require user input will get an EOF 48*57114Smuller */ 49*57114Smuller 50*57114Smuller #if __STDC__ 51*57114Smuller int 52*57114Smuller tty_init(void) 53*57114Smuller #else 54*57114Smuller int 55*57114Smuller tty_init() 56*57114Smuller #endif 57*57114Smuller { 58*57114Smuller int ttyfd; 59*57114Smuller 60*57114Smuller if ((ttyfd = open(DEVTTY, O_RDWR)) >= 0) { 61*57114Smuller if ((ttyoutf = fdopen(ttyfd, "w")) != NULL) { 62*57114Smuller if ((ttyinf = fdopen(ttyfd, "r")) != NULL) 63*57114Smuller return(0); 64*57114Smuller (void)fclose(ttyoutf); 65*57114Smuller } 66*57114Smuller (void)close(ttyfd); 67*57114Smuller } 68*57114Smuller 69*57114Smuller if (iflag) { 70*57114Smuller warn(1, "Fatal error, cannot open %s", DEVTTY); 71*57114Smuller return(-1); 72*57114Smuller } 73*57114Smuller return(0); 74*57114Smuller } 75*57114Smuller 76*57114Smuller /* 77*57114Smuller * tty_prnt() 78*57114Smuller * print a message using the specified format to the controlling tty 79*57114Smuller * if there is no controlling terminal, just return. 80*57114Smuller */ 81*57114Smuller 82*57114Smuller #if __STDC__ 83*57114Smuller void 84*57114Smuller tty_prnt(char *fmt, ...) 85*57114Smuller #else 86*57114Smuller void 87*57114Smuller tty_prnt(fmt, va_alist) 88*57114Smuller char *fmt; 89*57114Smuller va_dcl 90*57114Smuller #endif 91*57114Smuller { 92*57114Smuller va_list ap; 93*57114Smuller # if __STDC__ 94*57114Smuller va_start(ap, fmt); 95*57114Smuller # else 96*57114Smuller va_start(ap); 97*57114Smuller # endif 98*57114Smuller if (ttyoutf == NULL) 99*57114Smuller return; 100*57114Smuller (void)vfprintf(ttyoutf, fmt, ap); 101*57114Smuller va_end(ap); 102*57114Smuller (void)fflush(ttyoutf); 103*57114Smuller } 104*57114Smuller 105*57114Smuller /* 106*57114Smuller * tty_read() 107*57114Smuller * read a string from the controlling terminal if it is open into the 108*57114Smuller * supplied buffer 109*57114Smuller * Return: 110*57114Smuller * 0 if data was read, -1 otherwise. 111*57114Smuller */ 112*57114Smuller 113*57114Smuller #if __STDC__ 114*57114Smuller int 115*57114Smuller tty_read(char *str, int len) 116*57114Smuller #else 117*57114Smuller int 118*57114Smuller tty_read(str, len) 119*57114Smuller char *str; 120*57114Smuller int len; 121*57114Smuller #endif 122*57114Smuller { 123*57114Smuller register char *pt; 124*57114Smuller 125*57114Smuller if ((--len <= 0) || (ttyinf == NULL) || (fgets(str,len,ttyinf) == NULL)) 126*57114Smuller return(-1); 127*57114Smuller *(str + len) = '\0'; 128*57114Smuller 129*57114Smuller /* 130*57114Smuller * strip off that trailing newline 131*57114Smuller */ 132*57114Smuller if ((pt = strchr(str, '\n')) != NULL) 133*57114Smuller *pt = '\0'; 134*57114Smuller return(0); 135*57114Smuller } 136*57114Smuller 137*57114Smuller /* 138*57114Smuller * warn() 139*57114Smuller * write a warning message to stderr. if "set" the exit value of pax 140*57114Smuller * will be non-zero. 141*57114Smuller */ 142*57114Smuller 143*57114Smuller #if __STDC__ 144*57114Smuller void 145*57114Smuller warn(int set, char *fmt, ...) 146*57114Smuller #else 147*57114Smuller void 148*57114Smuller warn(set, fmt, va_alist) 149*57114Smuller int set; 150*57114Smuller char *fmt; 151*57114Smuller va_dcl 152*57114Smuller #endif 153*57114Smuller { 154*57114Smuller va_list ap; 155*57114Smuller # if __STDC__ 156*57114Smuller va_start(ap, fmt); 157*57114Smuller # else 158*57114Smuller va_start(ap); 159*57114Smuller # endif 160*57114Smuller if (set) 161*57114Smuller exit_val = 1; 162*57114Smuller /* 163*57114Smuller * when vflag we better ship out an extra \n to get this message on a 164*57114Smuller * line by itself 165*57114Smuller */ 166*57114Smuller if (vflag && vfpart) { 167*57114Smuller (void)fputc('\n', stderr); 168*57114Smuller vfpart = 0; 169*57114Smuller } 170*57114Smuller (void)fputs("pax: ", stderr); 171*57114Smuller (void)vfprintf(stderr, fmt, ap); 172*57114Smuller va_end(ap); 173*57114Smuller (void)fputc('\n', stderr); 174*57114Smuller } 175*57114Smuller 176*57114Smuller /* 177*57114Smuller * syswarn() 178*57114Smuller * write a warning message to stderr. if "set" the exit value of pax 179*57114Smuller * will be non-zero. 180*57114Smuller */ 181*57114Smuller 182*57114Smuller #if __STDC__ 183*57114Smuller void 184*57114Smuller syswarn(int set, int errnum, char *fmt, ...) 185*57114Smuller #else 186*57114Smuller void 187*57114Smuller syswarn(set, errnum, fmt, va_alist) 188*57114Smuller int set; 189*57114Smuller int errnum; 190*57114Smuller char *fmt; 191*57114Smuller va_dcl 192*57114Smuller #endif 193*57114Smuller { 194*57114Smuller va_list ap; 195*57114Smuller # if __STDC__ 196*57114Smuller va_start(ap, fmt); 197*57114Smuller # else 198*57114Smuller va_start(ap); 199*57114Smuller # endif 200*57114Smuller if (set) 201*57114Smuller exit_val = 1; 202*57114Smuller /* 203*57114Smuller * when vflag we better ship out an extra \n to get this message on a 204*57114Smuller * line by itself 205*57114Smuller */ 206*57114Smuller if (vflag && vfpart) { 207*57114Smuller (void)fputc('\n', stderr); 208*57114Smuller vfpart = 0; 209*57114Smuller } 210*57114Smuller (void)fputs("pax: ", stderr); 211*57114Smuller (void)vfprintf(stderr, fmt, ap); 212*57114Smuller va_end(ap); 213*57114Smuller 214*57114Smuller /* 215*57114Smuller * format and print the errno 216*57114Smuller */ 217*57114Smuller if (errnum > 0) 218*57114Smuller (void)fprintf(stderr, " <%s>", sys_errlist[errnum]); 219*57114Smuller (void)fputc('\n', stderr); 220*57114Smuller } 221