main.c revision 123873
1201360Srdivacky/* 2201360Srdivacky * Copyright (C) 1995 Wolfgang Solfrank 3201360Srdivacky * Copyright (c) 1995 Martin Husemann 4201360Srdivacky * 5201360Srdivacky * Redistribution and use in source and binary forms, with or without 6201360Srdivacky * modification, are permitted provided that the following conditions 7201360Srdivacky * are met: 8201360Srdivacky * 1. Redistributions of source code must retain the above copyright 9201360Srdivacky * notice, this list of conditions and the following disclaimer. 10201360Srdivacky * 2. Redistributions in binary form must reproduce the above copyright 11201360Srdivacky * notice, this list of conditions and the following disclaimer in the 12201360Srdivacky * documentation and/or other materials provided with the distribution. 13201360Srdivacky * 3. All advertising materials mentioning features or use of this software 14201360Srdivacky * must display the following acknowledgement: 15201360Srdivacky * This product includes software developed by Martin Husemann 16201360Srdivacky * and Wolfgang Solfrank. 17201360Srdivacky * 4. Neither the name of the University nor the names of its contributors 18201360Srdivacky * may be used to endorse or promote products derived from this software 19201360Srdivacky * without specific prior written permission. 20201360Srdivacky * 21201360Srdivacky * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 22201360Srdivacky * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23201360Srdivacky * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24201360Srdivacky * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25201360Srdivacky * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26201360Srdivacky * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27201360Srdivacky * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28201360Srdivacky * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29201360Srdivacky * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30201360Srdivacky * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31201360Srdivacky */ 32201360Srdivacky 33201360Srdivacky 34201360Srdivacky#include <sys/cdefs.h> 35201360Srdivacky#ifndef lint 36201360Srdivacky__RCSID("$NetBSD: main.c,v 1.10 1997/10/01 02:18:14 enami Exp $"); 37201360Srdivackystatic const char rcsid[] = 38201360Srdivacky "$FreeBSD: head/sbin/fsck_msdosfs/main.c 123873 2003-12-26 17:19:19Z trhodes $"; 39201360Srdivacky#endif /* not lint */ 40201360Srdivacky 41201360Srdivacky#include <stdlib.h> 42201360Srdivacky#include <string.h> 43201360Srdivacky#include <ctype.h> 44201360Srdivacky#include <stdio.h> 45201360Srdivacky#include <unistd.h> 46201360Srdivacky#include <errno.h> 47201360Srdivacky#include <stdarg.h> 48201360Srdivacky 49201360Srdivacky#include "fsutil.h" 50201360Srdivacky#include "ext.h" 51201360Srdivacky 52201360Srdivackyint alwaysno; /* assume "no" for all questions */ 53201360Srdivackyint alwaysyes; /* assume "yes" for all questions */ 54201360Srdivackyint preen; /* set when preening */ 55201360Srdivackyint rdonly; /* device is opened read only (supersedes above) */ 56201360Srdivackyint force; /* force check even the fs is clean */ 57201360Srdivacky 58201360Srdivackystatic void usage(void) __dead2; 59201360Srdivacky 60201360Srdivackystatic void 61201360Srdivackyusage() 62201360Srdivacky{ 63201360Srdivacky errexit("usage: fsck_msdos [-fnpy] filesystem ... \n"); 64201360Srdivacky} 65201360Srdivacky 66201360Srdivackyint 67201360Srdivackymain(int argc, char **argv) 68201360Srdivacky{ 69201360Srdivacky int ret = 0, erg; 70201360Srdivacky int ch; 71201360Srdivacky 72201360Srdivacky force = 0; 73201360Srdivacky while ((ch = getopt(argc, argv, "fFnpy")) != -1) { 74249423Sdim switch (ch) { 75201360Srdivacky case 'f': 76201360Srdivacky force = 1; 77201360Srdivacky break; 78201360Srdivacky case 'F': 79201360Srdivacky /* We can never run in background */ 80201360Srdivacky exit(5); 81201360Srdivacky break; 82201360Srdivacky case 'n': 83201360Srdivacky alwaysno = 1; 84243830Sdim alwaysyes = preen = 0; 85201360Srdivacky break; 86201360Srdivacky case 'y': 87201360Srdivacky alwaysyes = 1; 88201360Srdivacky alwaysno = preen = 0; 89243830Sdim break; 90201360Srdivacky 91201360Srdivacky case 'p': 92201360Srdivacky preen = 1; 93201360Srdivacky alwaysyes = alwaysno = 0; 94201360Srdivacky break; 95201360Srdivacky 96201360Srdivacky default: 97201360Srdivacky usage(); 98201360Srdivacky break; 99201360Srdivacky } 100201360Srdivacky } 101201360Srdivacky argc -= optind; 102201360Srdivacky argv += optind; 103201360Srdivacky 104201360Srdivacky if (!argc) 105201360Srdivacky usage(); 106201360Srdivacky 107201360Srdivacky while (--argc >= 0) { 108201360Srdivacky setcdevname(*argv, preen); 109201360Srdivacky erg = checkfilesys(*argv++); 110201360Srdivacky if (erg > ret) 111201360Srdivacky ret = erg; 112201360Srdivacky } 113201360Srdivacky 114201360Srdivacky return ret; 115201360Srdivacky} 116201360Srdivacky 117201360Srdivacky 118201360Srdivacky/*VARARGS*/ 119201360Srdivackyint 120201360Srdivackyask(int def, const char *fmt, ...) 121201360Srdivacky{ 122201360Srdivacky va_list ap; 123201360Srdivacky 124201360Srdivacky char prompt[256]; 125201360Srdivacky int c; 126201360Srdivacky 127201360Srdivacky if (preen) { 128201360Srdivacky if (rdonly) 129201360Srdivacky def = 0; 130201360Srdivacky if (def) 131201360Srdivacky printf("FIXED\n"); 132201360Srdivacky return def; 133201360Srdivacky } 134201360Srdivacky 135201360Srdivacky va_start(ap, fmt); 136201360Srdivacky vsnprintf(prompt, sizeof(prompt), fmt, ap); 137201360Srdivacky if (alwaysyes || rdonly) { 138201360Srdivacky printf("%s? %s\n", prompt, rdonly ? "no" : "yes"); 139201360Srdivacky return !rdonly; 140201360Srdivacky } 141201360Srdivacky do { 142201360Srdivacky printf("%s? [yn] ", prompt); 143201360Srdivacky fflush(stdout); 144201360Srdivacky c = getchar(); 145201360Srdivacky while (c != '\n' && getchar() != '\n') 146201360Srdivacky if (feof(stdin)) 147201360Srdivacky return 0; 148201360Srdivacky } while (c != 'y' && c != 'Y' && c != 'n' && c != 'N'); 149201360Srdivacky return c == 'y' || c == 'Y'; 150201360Srdivacky} 151201360Srdivacky