158d4c6c35633437182289e3d226d156d31d3e801San Mehat/* 258d4c6c35633437182289e3d226d156d31d3e801San Mehat * Copyright (C) 1995 Wolfgang Solfrank 358d4c6c35633437182289e3d226d156d31d3e801San Mehat * Copyright (c) 1995 Martin Husemann 458d4c6c35633437182289e3d226d156d31d3e801San Mehat * 558d4c6c35633437182289e3d226d156d31d3e801San Mehat * Redistribution and use in source and binary forms, with or without 658d4c6c35633437182289e3d226d156d31d3e801San Mehat * modification, are permitted provided that the following conditions 758d4c6c35633437182289e3d226d156d31d3e801San Mehat * are met: 858d4c6c35633437182289e3d226d156d31d3e801San Mehat * 1. Redistributions of source code must retain the above copyright 958d4c6c35633437182289e3d226d156d31d3e801San Mehat * notice, this list of conditions and the following disclaimer. 1058d4c6c35633437182289e3d226d156d31d3e801San Mehat * 2. Redistributions in binary form must reproduce the above copyright 1158d4c6c35633437182289e3d226d156d31d3e801San Mehat * notice, this list of conditions and the following disclaimer in the 1258d4c6c35633437182289e3d226d156d31d3e801San Mehat * documentation and/or other materials provided with the distribution. 1358d4c6c35633437182289e3d226d156d31d3e801San Mehat * 3. All advertising materials mentioning features or use of this software 1458d4c6c35633437182289e3d226d156d31d3e801San Mehat * must display the following acknowledgement: 1558d4c6c35633437182289e3d226d156d31d3e801San Mehat * This product includes software developed by Martin Husemann 1658d4c6c35633437182289e3d226d156d31d3e801San Mehat * and Wolfgang Solfrank. 1758d4c6c35633437182289e3d226d156d31d3e801San Mehat * 4. Neither the name of the University nor the names of its contributors 1858d4c6c35633437182289e3d226d156d31d3e801San Mehat * may be used to endorse or promote products derived from this software 1958d4c6c35633437182289e3d226d156d31d3e801San Mehat * without specific prior written permission. 2058d4c6c35633437182289e3d226d156d31d3e801San Mehat * 2158d4c6c35633437182289e3d226d156d31d3e801San Mehat * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 2258d4c6c35633437182289e3d226d156d31d3e801San Mehat * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2358d4c6c35633437182289e3d226d156d31d3e801San Mehat * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2458d4c6c35633437182289e3d226d156d31d3e801San Mehat * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, 2558d4c6c35633437182289e3d226d156d31d3e801San Mehat * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2658d4c6c35633437182289e3d226d156d31d3e801San Mehat * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2758d4c6c35633437182289e3d226d156d31d3e801San Mehat * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2858d4c6c35633437182289e3d226d156d31d3e801San Mehat * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2958d4c6c35633437182289e3d226d156d31d3e801San Mehat * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 3058d4c6c35633437182289e3d226d156d31d3e801San Mehat * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3158d4c6c35633437182289e3d226d156d31d3e801San Mehat */ 3258d4c6c35633437182289e3d226d156d31d3e801San Mehat 3358d4c6c35633437182289e3d226d156d31d3e801San Mehat 3458d4c6c35633437182289e3d226d156d31d3e801San Mehat#include <sys/cdefs.h> 3558d4c6c35633437182289e3d226d156d31d3e801San Mehat#ifndef lint 3658d4c6c35633437182289e3d226d156d31d3e801San Mehat__RCSID("$NetBSD: main.c,v 1.10 1997/10/01 02:18:14 enami Exp $"); 3758d4c6c35633437182289e3d226d156d31d3e801San Mehatstatic const char rcsid[] = 3858d4c6c35633437182289e3d226d156d31d3e801San Mehat "$FreeBSD: src/sbin/fsck_msdosfs/main.c,v 1.16 2009/06/10 19:02:54 avg Exp $"; 3958d4c6c35633437182289e3d226d156d31d3e801San Mehat#endif /* not lint */ 4058d4c6c35633437182289e3d226d156d31d3e801San Mehat 4158d4c6c35633437182289e3d226d156d31d3e801San Mehat#include <stdlib.h> 4258d4c6c35633437182289e3d226d156d31d3e801San Mehat#include <string.h> 4358d4c6c35633437182289e3d226d156d31d3e801San Mehat#include <ctype.h> 4458d4c6c35633437182289e3d226d156d31d3e801San Mehat#include <stdio.h> 4558d4c6c35633437182289e3d226d156d31d3e801San Mehat#include <unistd.h> 4658d4c6c35633437182289e3d226d156d31d3e801San Mehat#include <errno.h> 4758d4c6c35633437182289e3d226d156d31d3e801San Mehat#include <stdarg.h> 4858d4c6c35633437182289e3d226d156d31d3e801San Mehat 4958d4c6c35633437182289e3d226d156d31d3e801San Mehat#include "fsutil.h" 5058d4c6c35633437182289e3d226d156d31d3e801San Mehat#include "ext.h" 5158d4c6c35633437182289e3d226d156d31d3e801San Mehat 5258d4c6c35633437182289e3d226d156d31d3e801San Mehatint alwaysno; /* assume "no" for all questions */ 5358d4c6c35633437182289e3d226d156d31d3e801San Mehatint alwaysyes; /* assume "yes" for all questions */ 5458d4c6c35633437182289e3d226d156d31d3e801San Mehatint preen; /* set when preening */ 5558d4c6c35633437182289e3d226d156d31d3e801San Mehatint rdonly; /* device is opened read only (supersedes above) */ 5658d4c6c35633437182289e3d226d156d31d3e801San Mehatint skipclean; /* skip clean file systems if preening */ 5758d4c6c35633437182289e3d226d156d31d3e801San Mehat 5858d4c6c35633437182289e3d226d156d31d3e801San Mehatstatic void usage(void); 5958d4c6c35633437182289e3d226d156d31d3e801San Mehat 6058d4c6c35633437182289e3d226d156d31d3e801San Mehatstatic void 6158d4c6c35633437182289e3d226d156d31d3e801San Mehatusage(void) 6258d4c6c35633437182289e3d226d156d31d3e801San Mehat{ 6358d4c6c35633437182289e3d226d156d31d3e801San Mehat 6458d4c6c35633437182289e3d226d156d31d3e801San Mehat fprintf(stderr, "%s\n%s\n", 6558d4c6c35633437182289e3d226d156d31d3e801San Mehat "usage: fsck_msdosfs -p [-f] filesystem ...", 6658d4c6c35633437182289e3d226d156d31d3e801San Mehat " fsck_msdosfs [-ny] filesystem ..."); 6758d4c6c35633437182289e3d226d156d31d3e801San Mehat exit(1); 6858d4c6c35633437182289e3d226d156d31d3e801San Mehat} 6958d4c6c35633437182289e3d226d156d31d3e801San Mehat 7058d4c6c35633437182289e3d226d156d31d3e801San Mehatint 7158d4c6c35633437182289e3d226d156d31d3e801San Mehatmain(int argc, char **argv) 7258d4c6c35633437182289e3d226d156d31d3e801San Mehat{ 7358d4c6c35633437182289e3d226d156d31d3e801San Mehat int ret = 0, erg; 7458d4c6c35633437182289e3d226d156d31d3e801San Mehat int ch; 7558d4c6c35633437182289e3d226d156d31d3e801San Mehat 7658d4c6c35633437182289e3d226d156d31d3e801San Mehat skipclean = 1; 7758d4c6c35633437182289e3d226d156d31d3e801San Mehat while ((ch = getopt(argc, argv, "CfFnpy")) != -1) { 7858d4c6c35633437182289e3d226d156d31d3e801San Mehat switch (ch) { 7958d4c6c35633437182289e3d226d156d31d3e801San Mehat case 'C': /* for fsck_ffs compatibility */ 8058d4c6c35633437182289e3d226d156d31d3e801San Mehat break; 8158d4c6c35633437182289e3d226d156d31d3e801San Mehat case 'f': 8258d4c6c35633437182289e3d226d156d31d3e801San Mehat skipclean = 0; 8358d4c6c35633437182289e3d226d156d31d3e801San Mehat break; 8458d4c6c35633437182289e3d226d156d31d3e801San Mehat case 'F': 8558d4c6c35633437182289e3d226d156d31d3e801San Mehat /* 8658d4c6c35633437182289e3d226d156d31d3e801San Mehat * We can never run in the background. We must exit 8758d4c6c35633437182289e3d226d156d31d3e801San Mehat * silently with a nonzero exit code so that fsck(8) 8858d4c6c35633437182289e3d226d156d31d3e801San Mehat * can probe our support for -F. The exit code 8958d4c6c35633437182289e3d226d156d31d3e801San Mehat * doesn't really matter, but we use an unusual one 9058d4c6c35633437182289e3d226d156d31d3e801San Mehat * in case someone tries -F directly. The -F flag 9158d4c6c35633437182289e3d226d156d31d3e801San Mehat * is intentionally left out of the usage message. 9258d4c6c35633437182289e3d226d156d31d3e801San Mehat */ 9358d4c6c35633437182289e3d226d156d31d3e801San Mehat exit(5); 9458d4c6c35633437182289e3d226d156d31d3e801San Mehat case 'n': 9558d4c6c35633437182289e3d226d156d31d3e801San Mehat alwaysno = 1; 9658d4c6c35633437182289e3d226d156d31d3e801San Mehat alwaysyes = preen = 0; 9758d4c6c35633437182289e3d226d156d31d3e801San Mehat break; 9858d4c6c35633437182289e3d226d156d31d3e801San Mehat case 'y': 9958d4c6c35633437182289e3d226d156d31d3e801San Mehat alwaysyes = 1; 10058d4c6c35633437182289e3d226d156d31d3e801San Mehat alwaysno = preen = 0; 10158d4c6c35633437182289e3d226d156d31d3e801San Mehat break; 10258d4c6c35633437182289e3d226d156d31d3e801San Mehat 10358d4c6c35633437182289e3d226d156d31d3e801San Mehat case 'p': 10458d4c6c35633437182289e3d226d156d31d3e801San Mehat preen = 1; 10558d4c6c35633437182289e3d226d156d31d3e801San Mehat alwaysyes = alwaysno = 0; 10658d4c6c35633437182289e3d226d156d31d3e801San Mehat break; 10758d4c6c35633437182289e3d226d156d31d3e801San Mehat 10858d4c6c35633437182289e3d226d156d31d3e801San Mehat default: 10958d4c6c35633437182289e3d226d156d31d3e801San Mehat usage(); 11058d4c6c35633437182289e3d226d156d31d3e801San Mehat break; 11158d4c6c35633437182289e3d226d156d31d3e801San Mehat } 11258d4c6c35633437182289e3d226d156d31d3e801San Mehat } 11358d4c6c35633437182289e3d226d156d31d3e801San Mehat argc -= optind; 11458d4c6c35633437182289e3d226d156d31d3e801San Mehat argv += optind; 11558d4c6c35633437182289e3d226d156d31d3e801San Mehat 11658d4c6c35633437182289e3d226d156d31d3e801San Mehat if (!argc) 11758d4c6c35633437182289e3d226d156d31d3e801San Mehat usage(); 11858d4c6c35633437182289e3d226d156d31d3e801San Mehat 11958d4c6c35633437182289e3d226d156d31d3e801San Mehat while (--argc >= 0) { 12058d4c6c35633437182289e3d226d156d31d3e801San Mehat// setcdevname(*argv, preen); 12158d4c6c35633437182289e3d226d156d31d3e801San Mehat erg = checkfilesys(*argv++); 12258d4c6c35633437182289e3d226d156d31d3e801San Mehat if (erg > ret) 12358d4c6c35633437182289e3d226d156d31d3e801San Mehat ret = erg; 12458d4c6c35633437182289e3d226d156d31d3e801San Mehat } 12558d4c6c35633437182289e3d226d156d31d3e801San Mehat 12658d4c6c35633437182289e3d226d156d31d3e801San Mehat return ret; 12758d4c6c35633437182289e3d226d156d31d3e801San Mehat} 12858d4c6c35633437182289e3d226d156d31d3e801San Mehat 12958d4c6c35633437182289e3d226d156d31d3e801San Mehat 13058d4c6c35633437182289e3d226d156d31d3e801San Mehat/*VARARGS*/ 13158d4c6c35633437182289e3d226d156d31d3e801San Mehatint 13258d4c6c35633437182289e3d226d156d31d3e801San Mehatask(int def, const char *fmt, ...) 13358d4c6c35633437182289e3d226d156d31d3e801San Mehat{ 13458d4c6c35633437182289e3d226d156d31d3e801San Mehat va_list ap; 13558d4c6c35633437182289e3d226d156d31d3e801San Mehat 13658d4c6c35633437182289e3d226d156d31d3e801San Mehat char prompt[256]; 13758d4c6c35633437182289e3d226d156d31d3e801San Mehat int c; 13858d4c6c35633437182289e3d226d156d31d3e801San Mehat 13958d4c6c35633437182289e3d226d156d31d3e801San Mehat if (preen) { 14058d4c6c35633437182289e3d226d156d31d3e801San Mehat if (rdonly) 14158d4c6c35633437182289e3d226d156d31d3e801San Mehat def = 0; 14258d4c6c35633437182289e3d226d156d31d3e801San Mehat if (def) 14358d4c6c35633437182289e3d226d156d31d3e801San Mehat printf("FIXED\n"); 14458d4c6c35633437182289e3d226d156d31d3e801San Mehat return def; 14558d4c6c35633437182289e3d226d156d31d3e801San Mehat } 14658d4c6c35633437182289e3d226d156d31d3e801San Mehat 14758d4c6c35633437182289e3d226d156d31d3e801San Mehat va_start(ap, fmt); 14858d4c6c35633437182289e3d226d156d31d3e801San Mehat vsnprintf(prompt, sizeof(prompt), fmt, ap); 14958d4c6c35633437182289e3d226d156d31d3e801San Mehat if (alwaysyes || rdonly) { 15058d4c6c35633437182289e3d226d156d31d3e801San Mehat printf("%s? %s\n", prompt, rdonly ? "no" : "yes"); 15158d4c6c35633437182289e3d226d156d31d3e801San Mehat return !rdonly; 15258d4c6c35633437182289e3d226d156d31d3e801San Mehat } 15358d4c6c35633437182289e3d226d156d31d3e801San Mehat do { 15458d4c6c35633437182289e3d226d156d31d3e801San Mehat printf("%s? [yn] ", prompt); 15558d4c6c35633437182289e3d226d156d31d3e801San Mehat fflush(stdout); 15658d4c6c35633437182289e3d226d156d31d3e801San Mehat c = getchar(); 15758d4c6c35633437182289e3d226d156d31d3e801San Mehat while (c != '\n' && getchar() != '\n') 15858d4c6c35633437182289e3d226d156d31d3e801San Mehat if (feof(stdin)) 15958d4c6c35633437182289e3d226d156d31d3e801San Mehat return 0; 16058d4c6c35633437182289e3d226d156d31d3e801San Mehat } while (c != 'y' && c != 'Y' && c != 'n' && c != 'N'); 16158d4c6c35633437182289e3d226d156d31d3e801San Mehat return c == 'y' || c == 'Y'; 16258d4c6c35633437182289e3d226d156d31d3e801San Mehat} 163