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