diff options
author | Xin Li <delphij@google.com> | 2019-04-10 13:38:23 -0700 |
---|---|---|
committer | Xin Li <delphij@google.com> | 2019-04-10 13:38:23 -0700 |
commit | 1e1dad6992abea357715fdae4f747ae2051025a0 (patch) | |
tree | 1032d98650dc82331ccdcba50ae36e98c507ad84 /main.c | |
download | fsck_msdos-1e1dad6992abea357715fdae4f747ae2051025a0.tar.gz |
Import revision 9131ba637f003fb5894e3f6343a27d6322205f18 from FreeBSD.
Change-Id: I8ee418314ea407ca679bcd1bed85bd4cff435c22
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 157 |
1 files changed, 157 insertions, 0 deletions
@@ -0,0 +1,157 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (C) 1995 Wolfgang Solfrank + * Copyright (c) 1995 Martin Husemann + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#include <sys/cdefs.h> +#ifndef lint +__RCSID("$NetBSD: main.c,v 1.10 1997/10/01 02:18:14 enami Exp $"); +static const char rcsid[] = + "$FreeBSD$"; +#endif /* not lint */ + +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <unistd.h> +#include <errno.h> +#include <stdarg.h> + +#include "fsutil.h" +#include "ext.h" + +int alwaysno; /* assume "no" for all questions */ +int alwaysyes; /* assume "yes" for all questions */ +int preen; /* set when preening */ +int rdonly; /* device is opened read only (supersedes above) */ +int skipclean; /* skip clean file systems if preening */ + +static void usage(void) __dead2; + +static void +usage(void) +{ + + fprintf(stderr, "%s\n%s\n", + "usage: fsck_msdosfs -p [-f] filesystem ...", + " fsck_msdosfs [-ny] filesystem ..."); + exit(1); +} + +int +main(int argc, char **argv) +{ + int ret = 0, erg; + int ch; + + skipclean = 1; + while ((ch = getopt(argc, argv, "CfFnpy")) != -1) { + switch (ch) { + case 'C': /* for fsck_ffs compatibility */ + break; + case 'f': + skipclean = 0; + break; + case 'F': + /* + * We can never run in the background. We must exit + * silently with a nonzero exit code so that fsck(8) + * can probe our support for -F. The exit code + * doesn't really matter, but we use an unusual one + * in case someone tries -F directly. The -F flag + * is intentionally left out of the usage message. + */ + exit(5); + case 'n': + alwaysno = 1; + alwaysyes = preen = 0; + break; + case 'y': + alwaysyes = 1; + alwaysno = preen = 0; + break; + + case 'p': + preen = 1; + alwaysyes = alwaysno = 0; + break; + + default: + usage(); + break; + } + } + argc -= optind; + argv += optind; + + if (!argc) + usage(); + + while (--argc >= 0) { + setcdevname(*argv, preen); + erg = checkfilesys(*argv++); + if (erg > ret) + ret = erg; + } + + return ret; +} + + +/*VARARGS*/ +int +ask(int def, const char *fmt, ...) +{ + va_list ap; + + char prompt[256]; + int c; + + if (preen) { + if (rdonly) + def = 0; + if (def) + printf("FIXED\n"); + return def; + } + + va_start(ap, fmt); + vsnprintf(prompt, sizeof(prompt), fmt, ap); + va_end(ap); + if (alwaysyes || rdonly) { + printf("%s? %s\n", prompt, rdonly ? "no" : "yes"); + return !rdonly; + } + do { + printf("%s? [yn] ", prompt); + fflush(stdout); + c = getchar(); + while (c != '\n' && getchar() != '\n') + if (feof(stdin)) + return 0; + } while (c != 'y' && c != 'Y' && c != 'n' && c != 'N'); + return c == 'y' || c == 'Y'; +} |