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