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