xref: /csrg-svn/bin/pax/tty_subs.c (revision 57114)
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