xref: /plan9/sys/src/ape/cmd/pax/warn.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier /* $Source: /u/mark/src/pax/RCS/warn.c,v $
2*9a747e4fSDavid du Colombier  *
3*9a747e4fSDavid du Colombier  * $Revision: 1.2 $
4*9a747e4fSDavid du Colombier  *
5*9a747e4fSDavid du Colombier  * warn.c - miscellaneous user warning routines
6*9a747e4fSDavid du Colombier  *
7*9a747e4fSDavid du Colombier  * DESCRIPTION
8*9a747e4fSDavid du Colombier  *
9*9a747e4fSDavid du Colombier  *	These routines provide the user with various forms of warning
10*9a747e4fSDavid du Colombier  *	and informational messages.
11*9a747e4fSDavid du Colombier  *
12*9a747e4fSDavid du Colombier  * AUTHOR
13*9a747e4fSDavid du Colombier  *
14*9a747e4fSDavid du Colombier  *     Mark H. Colburn, NAPS International (mark@jhereg.mn.org)
15*9a747e4fSDavid du Colombier  *
16*9a747e4fSDavid du Colombier  * Sponsored by The USENIX Association for public distribution.
17*9a747e4fSDavid du Colombier  *
18*9a747e4fSDavid du Colombier  * Copyright (c) 1989 Mark H. Colburn.
19*9a747e4fSDavid du Colombier  * All rights reserved.
20*9a747e4fSDavid du Colombier  *
21*9a747e4fSDavid du Colombier  * Redistribution and use in source and binary forms are permitted
22*9a747e4fSDavid du Colombier  * provided that the above copyright notice is duplicated in all such
23*9a747e4fSDavid du Colombier  * forms and that any documentation, advertising materials, and other
24*9a747e4fSDavid du Colombier  * materials related to such distribution and use acknowledge that the
25*9a747e4fSDavid du Colombier  * software was developed * by Mark H. Colburn and sponsored by The
26*9a747e4fSDavid du Colombier  * USENIX Association.
27*9a747e4fSDavid du Colombier  *
28*9a747e4fSDavid du Colombier  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
29*9a747e4fSDavid du Colombier  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
30*9a747e4fSDavid du Colombier  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
31*9a747e4fSDavid du Colombier  *
32*9a747e4fSDavid du Colombier  * $Log:	warn.c,v $
33*9a747e4fSDavid du Colombier  * Revision 1.2  89/02/12  10:06:15  mark
34*9a747e4fSDavid du Colombier  * 1.2 release fixes
35*9a747e4fSDavid du Colombier  *
36*9a747e4fSDavid du Colombier  * Revision 1.1  88/12/23  18:02:40  mark
37*9a747e4fSDavid du Colombier  * Initial revision
38*9a747e4fSDavid du Colombier  *
39*9a747e4fSDavid du Colombier  */
40*9a747e4fSDavid du Colombier 
41*9a747e4fSDavid du Colombier #ifndef lint
42*9a747e4fSDavid du Colombier static char *ident = "$Id: warn.c,v 1.2 89/02/12 10:06:15 mark Exp $";
43*9a747e4fSDavid du Colombier static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
44*9a747e4fSDavid du Colombier #endif /* ! lint */
45*9a747e4fSDavid du Colombier 
46*9a747e4fSDavid du Colombier 
47*9a747e4fSDavid du Colombier /* Headers */
48*9a747e4fSDavid du Colombier 
49*9a747e4fSDavid du Colombier #include "pax.h"
50*9a747e4fSDavid du Colombier 
51*9a747e4fSDavid du Colombier 
52*9a747e4fSDavid du Colombier /* Function Prototypes */
53*9a747e4fSDavid du Colombier 
54*9a747e4fSDavid du Colombier #ifdef __STDC__
55*9a747e4fSDavid du Colombier 
56*9a747e4fSDavid du Colombier static void prsize(FILE *, OFFSET);
57*9a747e4fSDavid du Colombier 
58*9a747e4fSDavid du Colombier #else /* !__STDC__ */
59*9a747e4fSDavid du Colombier 
60*9a747e4fSDavid du Colombier static void prsize();
61*9a747e4fSDavid du Colombier 
62*9a747e4fSDavid du Colombier #endif /* __STDC__ */
63*9a747e4fSDavid du Colombier 
64*9a747e4fSDavid du Colombier 
65*9a747e4fSDavid du Colombier /* warnarch - print an archive-related warning message and offset
66*9a747e4fSDavid du Colombier  *
67*9a747e4fSDavid du Colombier  * DESCRIPTION
68*9a747e4fSDavid du Colombier  *
69*9a747e4fSDavid du Colombier  *	Present the user with an error message and an archive offset at
70*9a747e4fSDavid du Colombier  *	which the error occured.   This can be useful for diagnosing or
71*9a747e4fSDavid du Colombier  *	fixing damaged archives.
72*9a747e4fSDavid du Colombier  *
73*9a747e4fSDavid du Colombier  * PARAMETERS
74*9a747e4fSDavid du Colombier  *
75*9a747e4fSDavid du Colombier  *	char 	*msg	- A message string to be printed for the user.
76*9a747e4fSDavid du Colombier  *	OFFSET 	adjust	- An adjustment which is added to the current
77*9a747e4fSDavid du Colombier  *			  archive position to tell the user exactly where
78*9a747e4fSDavid du Colombier  *			  the error occurred.
79*9a747e4fSDavid du Colombier  */
80*9a747e4fSDavid du Colombier 
81*9a747e4fSDavid du Colombier #ifdef __STDC__
82*9a747e4fSDavid du Colombier 
warnarch(char * msg,OFFSET adjust)83*9a747e4fSDavid du Colombier void warnarch(char *msg, OFFSET adjust)
84*9a747e4fSDavid du Colombier 
85*9a747e4fSDavid du Colombier #else
86*9a747e4fSDavid du Colombier 
87*9a747e4fSDavid du Colombier void warnarch(msg, adjust)
88*9a747e4fSDavid du Colombier char           *msg;
89*9a747e4fSDavid du Colombier OFFSET          adjust;
90*9a747e4fSDavid du Colombier 
91*9a747e4fSDavid du Colombier #endif
92*9a747e4fSDavid du Colombier {
93*9a747e4fSDavid du Colombier     fprintf(stderr, "%s: [offset ", myname);
94*9a747e4fSDavid du Colombier     prsize(stderr, total - adjust);
95*9a747e4fSDavid du Colombier     fprintf(stderr, "]: %s\n", msg);
96*9a747e4fSDavid du Colombier }
97*9a747e4fSDavid du Colombier 
98*9a747e4fSDavid du Colombier 
99*9a747e4fSDavid du Colombier /* strerror - return pointer to appropriate system error message
100*9a747e4fSDavid du Colombier  *
101*9a747e4fSDavid du Colombier  * DESCRIPTION
102*9a747e4fSDavid du Colombier  *
103*9a747e4fSDavid du Colombier  *	Get an error message string which is appropriate for the setting
104*9a747e4fSDavid du Colombier  *	of the errno variable.
105*9a747e4fSDavid du Colombier  *
106*9a747e4fSDavid du Colombier  * RETURNS
107*9a747e4fSDavid du Colombier  *
108*9a747e4fSDavid du Colombier  *	Returns a pointer to a string which has an appropriate error
109*9a747e4fSDavid du Colombier  *	message for the present value of errno.  The error message
110*9a747e4fSDavid du Colombier  *	strings are taken from sys_errlist[] where appropriate.  If an
111*9a747e4fSDavid du Colombier  *	appropriate message is not available in sys_errlist, then a
112*9a747e4fSDavid du Colombier  *	pointer to the string "Unknown error (errno <errvalue>)" is
113*9a747e4fSDavid du Colombier  *	returned instead.
114*9a747e4fSDavid du Colombier  */
115*9a747e4fSDavid du Colombier 
116*9a747e4fSDavid du Colombier #ifdef __STDC__
117*9a747e4fSDavid du Colombier 
strerror(void)118*9a747e4fSDavid du Colombier char *strerror(void)
119*9a747e4fSDavid du Colombier 
120*9a747e4fSDavid du Colombier #else
121*9a747e4fSDavid du Colombier 
122*9a747e4fSDavid du Colombier char *strerror()
123*9a747e4fSDavid du Colombier 
124*9a747e4fSDavid du Colombier #endif
125*9a747e4fSDavid du Colombier {
126*9a747e4fSDavid du Colombier #ifdef _POSIX_SOURCE
127*9a747e4fSDavid du Colombier #undef strerror
128*9a747e4fSDavid du Colombier     return (strerror(errno));
129*9a747e4fSDavid du Colombier #else
130*9a747e4fSDavid du Colombier     static char     msg[40];		/* used for "Unknown error" messages */
131*9a747e4fSDavid du Colombier 
132*9a747e4fSDavid du Colombier     if (errno > 0 && errno < sys_nerr) {
133*9a747e4fSDavid du Colombier 	return (sys_errlist[errno]);
134*9a747e4fSDavid du Colombier     }
135*9a747e4fSDavid du Colombier     sprintf(msg, "Unknown error (errno %d)", errno);
136*9a747e4fSDavid du Colombier     return (msg);
137*9a747e4fSDavid du Colombier #endif
138*9a747e4fSDavid du Colombier }
139*9a747e4fSDavid du Colombier 
140*9a747e4fSDavid du Colombier 
141*9a747e4fSDavid du Colombier /* prsize - print a file offset on a file stream
142*9a747e4fSDavid du Colombier  *
143*9a747e4fSDavid du Colombier  * DESCRIPTION
144*9a747e4fSDavid du Colombier  *
145*9a747e4fSDavid du Colombier  *	Prints a file offset to a specific file stream.  The file offset is
146*9a747e4fSDavid du Colombier  *	of the form "%dm+%dk+%d", where the number preceeding the "m" and
147*9a747e4fSDavid du Colombier  *	the "k" stand for the number of Megabytes and the number of
148*9a747e4fSDavid du Colombier  *	Kilobytes, respectivley, which have been processed so far.
149*9a747e4fSDavid du Colombier  *
150*9a747e4fSDavid du Colombier  * PARAMETERS
151*9a747e4fSDavid du Colombier  *
152*9a747e4fSDavid du Colombier  *	FILE  *stream	- Stream which is to be used for output
153*9a747e4fSDavid du Colombier  *	OFFSET size	- Current archive position to be printed on the output
154*9a747e4fSDavid du Colombier  *			  stream in the form: "%dm+%dk+%d".
155*9a747e4fSDavid du Colombier  *
156*9a747e4fSDavid du Colombier  */
157*9a747e4fSDavid du Colombier 
158*9a747e4fSDavid du Colombier #ifdef __STDC__
159*9a747e4fSDavid du Colombier 
prsize(FILE * stream,OFFSET size)160*9a747e4fSDavid du Colombier static void prsize(FILE *stream, OFFSET size)
161*9a747e4fSDavid du Colombier 
162*9a747e4fSDavid du Colombier #else
163*9a747e4fSDavid du Colombier 
164*9a747e4fSDavid du Colombier static void prsize(stream, size)
165*9a747e4fSDavid du Colombier FILE           *stream;		/* stream which is used for output */
166*9a747e4fSDavid du Colombier OFFSET          size;		/* current archive position to be printed */
167*9a747e4fSDavid du Colombier 
168*9a747e4fSDavid du Colombier #endif
169*9a747e4fSDavid du Colombier 
170*9a747e4fSDavid du Colombier {
171*9a747e4fSDavid du Colombier     OFFSET          n;
172*9a747e4fSDavid du Colombier 
173*9a747e4fSDavid du Colombier     if (n = (size / (1024L * 1024L))) {
174*9a747e4fSDavid du Colombier 	fprintf(stream, "%ldm+", n);
175*9a747e4fSDavid du Colombier 	size -= n * 1024L * 1024L;
176*9a747e4fSDavid du Colombier     }
177*9a747e4fSDavid du Colombier     if (n = (size / 1024L)) {
178*9a747e4fSDavid du Colombier 	fprintf(stream, "%ldk+", n);
179*9a747e4fSDavid du Colombier 	size -= n * 1024L;
180*9a747e4fSDavid du Colombier     }
181*9a747e4fSDavid du Colombier     fprintf(stream, "%ld", size);
182*9a747e4fSDavid du Colombier }
183*9a747e4fSDavid du Colombier 
184*9a747e4fSDavid du Colombier 
185*9a747e4fSDavid du Colombier /* fatal - print fatal message and exit
186*9a747e4fSDavid du Colombier  *
187*9a747e4fSDavid du Colombier  * DESCRIPTION
188*9a747e4fSDavid du Colombier  *
189*9a747e4fSDavid du Colombier  *	Fatal prints the program's name along with an error message, then
190*9a747e4fSDavid du Colombier  *	exits the program with a non-zero return code.
191*9a747e4fSDavid du Colombier  *
192*9a747e4fSDavid du Colombier  * PARAMETERS
193*9a747e4fSDavid du Colombier  *
194*9a747e4fSDavid du Colombier  *	char 	*why	- description of reason for termination
195*9a747e4fSDavid du Colombier  *
196*9a747e4fSDavid du Colombier  * RETURNS
197*9a747e4fSDavid du Colombier  *
198*9a747e4fSDavid du Colombier  *	Returns an exit code of 1 to the parent process.
199*9a747e4fSDavid du Colombier  */
200*9a747e4fSDavid du Colombier 
201*9a747e4fSDavid du Colombier #ifdef __STDC__
202*9a747e4fSDavid du Colombier 
fatal(char * why)203*9a747e4fSDavid du Colombier void fatal(char *why)
204*9a747e4fSDavid du Colombier 
205*9a747e4fSDavid du Colombier #else
206*9a747e4fSDavid du Colombier 
207*9a747e4fSDavid du Colombier void fatal(why)
208*9a747e4fSDavid du Colombier char           *why;		/* description of reason for termination */
209*9a747e4fSDavid du Colombier 
210*9a747e4fSDavid du Colombier #endif
211*9a747e4fSDavid du Colombier {
212*9a747e4fSDavid du Colombier     fprintf(stderr, "%s: %s\n", myname, why);
213*9a747e4fSDavid du Colombier     exit(1);
214*9a747e4fSDavid du Colombier }
215*9a747e4fSDavid du Colombier 
216*9a747e4fSDavid du Colombier 
217*9a747e4fSDavid du Colombier 
218*9a747e4fSDavid du Colombier /* warn - print a warning message
219*9a747e4fSDavid du Colombier  *
220*9a747e4fSDavid du Colombier  * DESCRIPTION
221*9a747e4fSDavid du Colombier  *
222*9a747e4fSDavid du Colombier  *	Print an error message listing the program name, the actual error
223*9a747e4fSDavid du Colombier  *	which occurred and an informational message as to why the error
224*9a747e4fSDavid du Colombier  *	occurred on the standard error device.  The standard error is
225*9a747e4fSDavid du Colombier  *	flushed after the error is printed to assure that the user gets
226*9a747e4fSDavid du Colombier  *	the message in a timely fasion.
227*9a747e4fSDavid du Colombier  *
228*9a747e4fSDavid du Colombier  * PARAMETERS
229*9a747e4fSDavid du Colombier  *
230*9a747e4fSDavid du Colombier  *	char *what	- Pointer to string describing what failed.
231*9a747e4fSDavid du Colombier  *	char *why	- Pointer to string describing why did it failed.
232*9a747e4fSDavid du Colombier  */
233*9a747e4fSDavid du Colombier 
234*9a747e4fSDavid du Colombier #ifdef __STDC__
235*9a747e4fSDavid du Colombier 
warn(char * what,char * why)236*9a747e4fSDavid du Colombier void warn(char *what, char *why)
237*9a747e4fSDavid du Colombier 
238*9a747e4fSDavid du Colombier #else
239*9a747e4fSDavid du Colombier 
240*9a747e4fSDavid du Colombier void warn(what, why)
241*9a747e4fSDavid du Colombier char           *what;		/* message as to what the error was */
242*9a747e4fSDavid du Colombier char           *why;		/* explanation why the error occurred */
243*9a747e4fSDavid du Colombier 
244*9a747e4fSDavid du Colombier #endif
245*9a747e4fSDavid du Colombier {
246*9a747e4fSDavid du Colombier     fprintf(stderr, "%s: %s : %s\n", myname, what, why);
247*9a747e4fSDavid du Colombier     fflush(stderr);
248*9a747e4fSDavid du Colombier }
249