main.c revision 123888
168651Skris/* 268651Skris * Copyright (C) 1995 Wolfgang Solfrank 368651Skris * Copyright (c) 1995 Martin Husemann 468651Skris * 568651Skris * Redistribution and use in source and binary forms, with or without 668651Skris * modification, are permitted provided that the following conditions 768651Skris * are met: 868651Skris * 1. Redistributions of source code must retain the above copyright 968651Skris * notice, this list of conditions and the following disclaimer. 1068651Skris * 2. Redistributions in binary form must reproduce the above copyright 1168651Skris * notice, this list of conditions and the following disclaimer in the 1268651Skris * documentation and/or other materials provided with the distribution. 1368651Skris * 3. All advertising materials mentioning features or use of this software 1468651Skris * must display the following acknowledgement: 1568651Skris * This product includes software developed by Martin Husemann 1668651Skris * and Wolfgang Solfrank. 1768651Skris * 4. Neither the name of the University nor the names of its contributors 1868651Skris * may be used to endorse or promote products derived from this software 1968651Skris * without specific prior written permission. 2068651Skris * 2168651Skris * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 2268651Skris * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2368651Skris * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2468651Skris * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, 2568651Skris * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2668651Skris * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2768651Skris * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2868651Skris * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2968651Skris * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 3068651Skris * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3168651Skris */ 3268651Skris 3368651Skris 3468651Skris#include <sys/cdefs.h> 3568651Skris#ifndef lint 3668651Skris__RCSID("$NetBSD: main.c,v 1.10 1997/10/01 02:18:14 enami Exp $"); 3768651Skrisstatic const char rcsid[] = 3868651Skris "$FreeBSD: head/sbin/fsck_msdosfs/main.c 123888 2003-12-27 13:08:55Z bde $"; 3968651Skris#endif /* not lint */ 4068651Skris 4168651Skris#include <stdlib.h> 4268651Skris#include <string.h> 4368651Skris#include <ctype.h> 4468651Skris#include <stdio.h> 4568651Skris#include <unistd.h> 4668651Skris#include <errno.h> 4768651Skris#include <stdarg.h> 4868651Skris 4968651Skris#include "fsutil.h" 5068651Skris#include "ext.h" 5168651Skris 5268651Skrisint alwaysno; /* assume "no" for all questions */ 5368651Skrisint alwaysyes; /* assume "yes" for all questions */ 5468651Skrisint force; /* force check even the fs is clean */ 5568651Skrisint preen; /* set when preening */ 5668651Skrisint rdonly; /* device is opened read only (supersedes above) */ 5768651Skris 5868651Skrisstatic void usage(void) __dead2; 5968651Skris 6068651Skrisstatic void 6168651Skrisusage(void) 6268651Skris{ 6368651Skris 6468651Skris fprintf(stderr, "usage: fsck_msdos [-fnpy] filesystem ...\n"); 6568651Skris exit(1); 6668651Skris} 6768651Skris 6868651Skrisint 6968651Skrismain(int argc, char **argv) 7068651Skris{ 7168651Skris int ret = 0, erg; 7268651Skris int ch; 7368651Skris 7468651Skris force = 0; 7568651Skris while ((ch = getopt(argc, argv, "fFnpy")) != -1) { 7668651Skris switch (ch) { 7768651Skris case 'f': 7868651Skris force = 1; 7968651Skris break; 8068651Skris case 'F': 8168651Skris /* We can never run in background */ 8268651Skris exit(5); 8368651Skris break; 8468651Skris case 'n': 8568651Skris alwaysno = 1; 8668651Skris alwaysyes = preen = 0; 8768651Skris break; 8868651Skris case 'y': 8968651Skris alwaysyes = 1; 9068651Skris alwaysno = preen = 0; 9168651Skris break; 9268651Skris 9368651Skris case 'p': 9468651Skris preen = 1; 9568651Skris alwaysyes = alwaysno = 0; 9668651Skris break; 9768651Skris 9868651Skris default: 9968651Skris usage(); 10068651Skris break; 10168651Skris } 10268651Skris } 10368651Skris argc -= optind; 10468651Skris argv += optind; 10568651Skris 10668651Skris if (!argc) 10768651Skris usage(); 10868651Skris 10968651Skris while (--argc >= 0) { 11068651Skris setcdevname(*argv, preen); 11168651Skris erg = checkfilesys(*argv++); 11268651Skris if (erg > ret) 11368651Skris ret = erg; 11468651Skris } 11568651Skris 11668651Skris return ret; 11768651Skris} 11868651Skris 11968651Skris 12068651Skris/*VARARGS*/ 12168651Skrisint 12268651Skrisask(int def, const char *fmt, ...) 12368651Skris{ 12468651Skris va_list ap; 12568651Skris 12668651Skris char prompt[256]; 12768651Skris int c; 12868651Skris 12968651Skris if (preen) { 13068651Skris if (rdonly) 13168651Skris def = 0; 13268651Skris if (def) 13368651Skris printf("FIXED\n"); 13468651Skris return def; 13568651Skris } 13668651Skris 13768651Skris va_start(ap, fmt); 13868651Skris vsnprintf(prompt, sizeof(prompt), fmt, ap); 13968651Skris if (alwaysyes || rdonly) { 14068651Skris printf("%s? %s\n", prompt, rdonly ? "no" : "yes"); 14168651Skris return !rdonly; 14268651Skris } 14368651Skris do { 14468651Skris printf("%s? [yn] ", prompt); 14568651Skris fflush(stdout); 14668651Skris c = getchar(); 14768651Skris while (c != '\n' && getchar() != '\n') 14868651Skris if (feof(stdin)) 14968651Skris return 0; 15068651Skris } while (c != 'y' && c != 'Y' && c != 'n' && c != 'N'); 15168651Skris return c == 'y' || c == 'Y'; 15268651Skris} 15368651Skris