Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/bin/pax/tty_subs.c
39475 views
1
/*-
2
* SPDX-License-Identifier: BSD-3-Clause
3
*
4
* Copyright (c) 1992 Keith Muller.
5
* Copyright (c) 1992, 1993
6
* The Regents of the University of California. All rights reserved.
7
*
8
* This code is derived from software contributed to Berkeley by
9
* Keith Muller of the University of California, San Diego.
10
*
11
* Redistribution and use in source and binary forms, with or without
12
* modification, are permitted provided that the following conditions
13
* are met:
14
* 1. Redistributions of source code must retain the above copyright
15
* notice, this list of conditions and the following disclaimer.
16
* 2. Redistributions in binary form must reproduce the above copyright
17
* notice, this list of conditions and the following disclaimer in the
18
* documentation and/or other materials provided with the distribution.
19
* 3. Neither the name of the University nor the names of its contributors
20
* may be used to endorse or promote products derived from this software
21
* without specific prior written permission.
22
*
23
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33
* SUCH DAMAGE.
34
*/
35
36
#include <sys/types.h>
37
#include <sys/stat.h>
38
#include <fcntl.h>
39
#include <stdio.h>
40
#include <unistd.h>
41
#include <string.h>
42
#include "pax.h"
43
#include "extern.h"
44
#include <stdarg.h>
45
46
/*
47
* routines that deal with I/O to and from the user
48
*/
49
50
#define DEVTTY "/dev/tty" /* device for interactive i/o */
51
static FILE *ttyoutf = NULL; /* output pointing at control tty */
52
static FILE *ttyinf = NULL; /* input pointing at control tty */
53
54
/*
55
* tty_init()
56
* try to open the controlling terminal (if any) for this process. if the
57
* open fails, future ops that require user input will get an EOF
58
*/
59
60
int
61
tty_init(void)
62
{
63
int ttyfd;
64
65
if ((ttyfd = open(DEVTTY, O_RDWR)) >= 0) {
66
if ((ttyoutf = fdopen(ttyfd, "w")) != NULL) {
67
if ((ttyinf = fdopen(ttyfd, "r")) != NULL)
68
return(0);
69
(void)fclose(ttyoutf);
70
}
71
(void)close(ttyfd);
72
}
73
74
if (iflag) {
75
paxwarn(1, "Fatal error, cannot open %s", DEVTTY);
76
return(-1);
77
}
78
return(0);
79
}
80
81
/*
82
* tty_prnt()
83
* print a message using the specified format to the controlling tty
84
* if there is no controlling terminal, just return.
85
*/
86
87
void
88
tty_prnt(const char *fmt, ...)
89
{
90
va_list ap;
91
if (ttyoutf == NULL)
92
return;
93
va_start(ap, fmt);
94
(void)vfprintf(ttyoutf, fmt, ap);
95
va_end(ap);
96
(void)fflush(ttyoutf);
97
}
98
99
/*
100
* tty_read()
101
* read a string from the controlling terminal if it is open into the
102
* supplied buffer
103
* Return:
104
* 0 if data was read, -1 otherwise.
105
*/
106
107
int
108
tty_read(char *str, int len)
109
{
110
char *pt;
111
112
if ((--len <= 0) || (ttyinf == NULL) || (fgets(str,len,ttyinf) == NULL))
113
return(-1);
114
*(str + len) = '\0';
115
116
/*
117
* strip off that trailing newline
118
*/
119
if ((pt = strchr(str, '\n')) != NULL)
120
*pt = '\0';
121
return(0);
122
}
123
124
/*
125
* paxwarn()
126
* write a warning message to stderr. if "set" the exit value of pax
127
* will be non-zero.
128
*/
129
130
void
131
paxwarn(int set, const char *fmt, ...)
132
{
133
va_list ap;
134
va_start(ap, fmt);
135
if (set)
136
exit_val = 1;
137
/*
138
* when vflag we better ship out an extra \n to get this message on a
139
* line by itself
140
*/
141
if (vflag && vfpart) {
142
(void)fflush(listf);
143
(void)fputc('\n', stderr);
144
vfpart = 0;
145
}
146
(void)fprintf(stderr, "%s: ", argv0);
147
(void)vfprintf(stderr, fmt, ap);
148
va_end(ap);
149
(void)fputc('\n', stderr);
150
}
151
152
/*
153
* syswarn()
154
* write a warning message to stderr. if "set" the exit value of pax
155
* will be non-zero.
156
*/
157
158
void
159
syswarn(int set, int errnum, const char *fmt, ...)
160
{
161
va_list ap;
162
va_start(ap, fmt);
163
if (set)
164
exit_val = 1;
165
/*
166
* when vflag we better ship out an extra \n to get this message on a
167
* line by itself
168
*/
169
if (vflag && vfpart) {
170
(void)fflush(listf);
171
(void)fputc('\n', stderr);
172
vfpart = 0;
173
}
174
(void)fprintf(stderr, "%s: ", argv0);
175
(void)vfprintf(stderr, fmt, ap);
176
va_end(ap);
177
178
/*
179
* format and print the errno
180
*/
181
if (errnum > 0)
182
(void)fprintf(stderr, " <%s>", strerror(errnum));
183
(void)fputc('\n', stderr);
184
}
185
186