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