main.c revision 1.1 1 /* $NetBSD: main.c,v 1.1 1996/05/14 17:39:36 ws Exp $ */
2
3 /*
4 * Copyright (C) 1995 Wolfgang Solfrank
5 * Copyright (c) 1995 Martin Husemann
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by Martin Husemann
18 * and Wolfgang Solfrank.
19 * 4. 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 AUTHORS ``AS IS'' AND ANY EXPRESS OR
24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35
36 #ifndef lint
37 static char rcsid[] = "$NetBSD: main.c,v 1.1 1996/05/14 17:39:36 ws Exp $";
38 #endif /* not lint */
39
40 #include <stdlib.h>
41 #include <string.h>
42 #include <ctype.h>
43 #include <stdio.h>
44 #include <unistd.h>
45 #include <errno.h>
46 #if __STDC__
47 #include <stdarg.h>
48 #else
49 #include <varargs.h>
50 #endif
51
52 #include "ext.h"
53
54 int alwaysno; /* assume "no" for all questions */
55 int alwaysyes; /* assume "yes" for all questions */
56 int preen; /* set when preening */
57 int rdonly; /* device is opened read only (supersedes above) */
58
59 char *fname; /* filesystem currently checked */
60
61 static void
62 usage()
63 {
64 errexit("Usage: fsck_msdos [-pny] filesystem ... \n");
65 }
66
67 int
68 main(argc, argv)
69 int argc;
70 char **argv;
71 {
72 extern int optind;
73 int ret = 0, erg;
74 int ch;
75
76 while ((ch = getopt(argc, argv, "vpyn")) != EOF) {
77 switch (ch) {
78 case 'n':
79 alwaysno = 1;
80 alwaysyes = preen = 0;
81 break;
82 case 'y':
83 alwaysyes = 1;
84 alwaysno = preen = 0;
85 break;
86
87 case 'p':
88 preen = 1;
89 alwaysyes = alwaysno = 0;
90 break;
91
92 default:
93 usage();
94 break;
95 }
96 }
97 argc -= optind;
98 argv += optind;
99
100 if (!argc)
101 usage();
102
103 while (argc-- > 0) {
104 erg = checkfilesys(fname = *argv++);
105 if (erg > ret)
106 ret = erg;
107 }
108 exit(ret);
109 }
110
111 /*VARARGS*/
112 void
113 #if __STDC__
114 errexit(const char *fmt, ...)
115 #else
116 errexit(fmt, va_alist)
117 char *fmt;
118 va_dcl
119 #endif
120 {
121 va_list ap;
122
123 #if __STDC__
124 va_start(ap, fmt);
125 #else
126 va_start(ap);
127 #endif
128 vprintf(fmt, ap);
129 va_end(ap);
130 exit(8);
131 }
132
133 /*VARARGS*/
134 void
135 #if __STDC__
136 pfatal(const char *fmt, ...)
137 #else
138 pfatal(fmt, va_alist)
139 char *fmt;
140 va_dcl
141 #endif
142 {
143 va_list ap;
144
145 if (preen)
146 printf("%s: ", fname);
147 #if __STDC__
148 va_start(ap, fmt);
149 #else
150 va_start(ap);
151 #endif
152 vprintf(fmt, ap);
153 va_end(ap);
154 printf("\n");
155 if (preen)
156 exit(8);
157 }
158
159 /*VARARGS*/
160 void
161 #if __STDC__
162 pwarn(const char *fmt, ...)
163 #else
164 pwarn(fmt, va_alist)
165 char *fmt;
166 va_dcl
167 #endif
168 {
169 va_list ap;
170
171 if (preen)
172 printf("%s: ", fname);
173 #if __STDC__
174 va_start(ap, fmt);
175 #else
176 va_start(ap);
177 #endif
178 vprintf(fmt, ap);
179 va_end(ap);
180 }
181
182 #if sun
183 char *
184 strerror(n)
185 int n;
186 {
187 extern int sys_nerr;
188 extern char *sys_errlist[];
189 static char alt[80];
190
191 if (n < sys_nerr)
192 return sys_errlist[n];
193 sprintf(alt, "Unknown error %d", n);
194 return alt;
195 }
196 #endif
197
198 void
199 perror(s)
200 const char *s;
201 {
202 pfatal("%s (%s)", s, strerror(errno));
203 }
204
205 /*VARARGS*/
206 int
207 #if __STDC__
208 ask(int def, const char *fmt, ...)
209 #else
210 ask(def, fmt, va_alist)
211 int def;
212 char *fmt;
213 va_dcl
214 #endif
215 {
216 va_list ap;
217
218 char prompt[256];
219 int c;
220
221 if (preen) {
222 if (rdonly)
223 def = 0;
224 if (def)
225 printf("FIXED\n");
226 return def;
227 }
228
229 #if __STDC__
230 va_start(ap, fmt);
231 #else
232 va_start(ap);
233 #endif
234 #if sun
235 vsprintf(prompt, fmt, ap);
236 #else
237 vsnprintf(prompt, sizeof(prompt), fmt, ap);
238 #endif
239 if (alwaysyes || rdonly) {
240 printf("%s? %s\n", prompt, rdonly ? "no" : "yes");
241 return !rdonly;
242 }
243 do {
244 printf("%s? [yn] ", prompt);
245 fflush(stdout);
246 c = getchar();
247 while (c != '\n' && getchar() != '\n')
248 if (feof(stdin))
249 return 0;
250 } while (c != 'y' && c != 'Y' && c != 'n' && c != 'N');
251 return c == 'y' || c == 'Y';
252 }
253