util-linux/disk-utils/mkfs.c

143 lines
3.5 KiB
C
Raw Normal View History

2006-12-06 17:25:32 -06:00
/*
2006-12-06 17:25:33 -06:00
* mkfs A simple generic frontend for the for the mkfs program
* under Linux. See the manual page for details.
2006-12-06 17:25:32 -06:00
*
* Authors: David Engel, <david@ods.com>
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
2006-12-06 17:25:33 -06:00
* Ron Sommeling, <sommel@sci.kun.nl>
*
* Mon Jul 1 18:52:58 1996: janl@math.uio.no (Nicolai Langfeldt):
* Incorporated fix by Jonathan Kamens <jik@annex-1-slip-jik.cam.ov.com>
* 1999-02-22 Arkadiusz Mi<EFBFBD>kiewicz <misiek@pld.ORG.PL>
2006-12-06 17:25:39 -06:00
* - added Native Language Support
*
2006-12-06 17:25:32 -06:00
*/
#include <getopt.h>
#include <limits.h>
2006-12-06 17:25:32 -06:00
#include <stdio.h>
#include <stdlib.h>
2006-12-06 17:25:35 -06:00
#include <string.h>
#include <unistd.h>
2006-12-06 17:25:33 -06:00
#include "c.h"
#include "nls.h"
#include "xalloc.h"
2006-12-06 17:25:32 -06:00
#ifndef DEFAULT_FSTYPE
#define DEFAULT_FSTYPE "ext2"
2006-12-06 17:25:32 -06:00
#endif
#define SEARCH_PATH "PATH=" FS_SEARCH_PATH
2006-12-06 17:25:33 -06:00
#define PROGNAME "mkfs.%s"
2006-12-06 17:25:32 -06:00
static void __attribute__ ((__noreturn__)) usage(FILE * out)
{
fprintf(out,
_("Usage: %s [options] [-t type fs-options] device [size]\n"),
program_invocation_short_name);
fprintf(out, _("\nOptions:\n"
" -t, --type=TYPE file system type, when undefined ext2 is used\n"
" fs-options parameters to real file system builder\n"
" device path to a device\n"
" size number of blocks on the device\n"
" -V, --verbose explain what is done\n"
" defining -V more than once will cause a dry-run\n"
" -V, --version output version information and exit\n"
" -V as version must be only option\n"
" -h, --help display this help and exit\n"));
fprintf(out, _("\nFor more information see mkfs(8).\n"));
exit(out == stderr ? EXIT_FAILURE : EXIT_SUCCESS);
}
static void __attribute__ ((__noreturn__)) print_version(void)
{
printf(_("%s (%s)\n"),
program_invocation_short_name, PACKAGE_STRING);
exit(EXIT_SUCCESS);
}
int main(int argc, char **argv)
2006-12-06 17:25:32 -06:00
{
char *progname; /* name of executable to be called */
char *fstype = NULL;
int i, more = 0, verbose = 0;
char *oldpath, *newpath;
enum { VERSION_OPTION = CHAR_MAX + 1 };
static const struct option longopts[] = {
{"type", required_argument, NULL, 't'},
{"version", no_argument, NULL, VERSION_OPTION},
{"help", no_argument, NULL, 'h'},
{NULL, 0, NULL, 0}
};
setlocale(LC_ALL, "");
bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE);
if (argc == 2 && !strcmp(argv[1], "-V"))
print_version();
/* Check commandline options. */
opterr = 0;
while ((more == 0)
&& ((i = getopt_long(argc, argv, "Vt:h", longopts, NULL))
!= -1))
switch (i) {
case 'V':
verbose++;
break;
case 't':
fstype = optarg;
break;
case 'h':
usage(stdout);
case VERSION_OPTION:
print_version();
default:
optind--;
more = 1;
break; /* start of specific arguments */
}
if (optind == argc)
usage(stderr);
/* If -t wasn't specified, use the default */
if (fstype == NULL)
fstype = DEFAULT_FSTYPE;
/* Set PATH and program name */
oldpath = getenv("PATH");
if (!oldpath)
oldpath = "/bin";
newpath = xmalloc(strlen(oldpath) + sizeof(SEARCH_PATH) + 3);
sprintf(newpath, "%s:%s\n", SEARCH_PATH, oldpath);
putenv(newpath);
progname = xmalloc(sizeof(PROGNAME) + strlen(fstype) + 1);
sprintf(progname, PROGNAME, fstype);
argv[--optind] = progname;
if (verbose) {
printf(_("mkfs (%s)\n"), PACKAGE_STRING);
i = optind;
while (argv[i])
printf("%s ", argv[i++]);
printf("\n");
if (verbose > 1)
return EXIT_SUCCESS;
}
/* Execute the program */
execvp(progname, argv + optind);
perror(progname);
return EXIT_FAILURE;
2006-12-06 17:25:32 -06:00
}