standardise usage and version info

(Logical change 1.105)
edge.strict_endians
flatcap.org!flatcap 2003-01-19 22:01:18 +00:00
parent 327bd2b2bc
commit 3769e91274
5 changed files with 361 additions and 365 deletions

View File

@ -1,7 +1,7 @@
/**
* ntfscluster - Part of the Linux-NTFS project.
*
* Copyright (c) 2002 Richard Russon <ntfs@flatcap.org>
* Copyright (c) 2002-2003 Richard Russon
*
* This utility will locate the owner of any given sector or cluster.
*
@ -34,7 +34,6 @@
#include "volume.h"
#include "debug.h"
static const char *AUTHOR = "Richard Russon (FlatCap)";
static const char *EXEC_NAME = "ntfscluster";
static struct options opts;
@ -51,14 +50,11 @@ GEN_PRINTF (Qprintf, stdout, &opts.quiet, FALSE)
*/
void version (void)
{
Qprintf ("%s v%s Copyright (C) 2002 %s\n***XXX***on "
"an NTFS Volume\n\n%s is free software, released under the GNU "
"General Public License\nand you are welcome to redistribute "
"it under certain conditions.\n%s comes with ABSOLUTELY NO "
"WARRANTY; for details read the GNU\nGeneral Public License "
"to be found in the file COPYING in the main\nLinux-NTFS "
"distribution directory.\n\n",
EXEC_NAME, VERSION, AUTHOR, EXEC_NAME, EXEC_NAME);
printf ("\n%s v%s - Find the owner of any given sector or cluster.\n\n",
EXEC_NAME, VERSION);
printf ("Copyright (c)\n");
printf (" 2002-2003 Richard Russon\n");
printf ("\n%s\n%s%s\n", ntfs_gpl, ntfs_bugs, ntfs_home);
}
/**
@ -70,7 +66,7 @@ void version (void)
*/
void usage (void)
{
Qprintf ("Usage: %s [options] device\n"
printf ("\nUsage: %s [options] device\n"
" -i --info Print information about the volume\n"
" -c range --cluster range Look for objects in this range of clusters\n"
" -s range --sector range Look for objects in this range of sectors\n"
@ -82,7 +78,7 @@ void usage (void)
" -V --version Version information\n"
" -h --help Print this help\n\n",
EXEC_NAME);
Qprintf ("Please report bugs to: linux-ntfs-dev@lists.sf.net\n\n");
printf ("%s%s\n", ntfs_bugs, ntfs_home);
}
/**
@ -96,7 +92,7 @@ void usage (void)
*/
int parse_options (int argc, char **argv)
{
static const char *sopt = "-c:fhiqs:vV"; // l
static const char *sopt = "-c:fh?iqs:vV"; // l
static const struct option lopt[] = {
{ "cluster", required_argument, NULL, 'c' },
{ "force", no_argument, NULL, 'f' },
@ -143,6 +139,7 @@ int parse_options (int argc, char **argv)
opts.force++;
break;
case 'h':
case '?':
help++;
break;
case 'i':
@ -196,7 +193,8 @@ int parse_options (int argc, char **argv)
opts.quiet = 0;
if (opts.device == NULL) {
Eprintf ("You must specify exactly one device.\n");
if (argc > 1)
Eprintf ("You must specify exactly one device.\n");
err++;
}
@ -211,7 +209,7 @@ int parse_options (int argc, char **argv)
} else if (opts.range_begin > opts.range_end) {
Eprintf ("The range must be in ascending order.\n");
err++;
}
}
}
if (ver)

View File

@ -36,7 +36,6 @@
#include "inode.h"
#include "utils.h"
static const char *AUTHOR = "Matthew J. Fanto";
static const char *EXEC_NAME = "ntfsinfo";
static struct options {
@ -60,14 +59,13 @@ GEN_PRINTF (Qprintf, stdout, &opts.quiet, FALSE)
*/
void version (void)
{
Qprintf ("%s v%s Copyright (C) 2002 %s\nDisplay information about an "
"NTFS Volume\n\n%s is free software, released under the GNU "
"General Public License\nand you are welcome to redistribute "
"it under certain conditions.\n%s comes with ABSOLUTELY NO "
"WARRANTY; for details read the GNU\nGeneral Public License "
"to be found in the file COPYING in the main\nLinux-NTFS "
"distribution directory.\n\n",
EXEC_NAME, VERSION, AUTHOR, EXEC_NAME, EXEC_NAME);
printf ("\n%s v%s - Display information about an NTFS Volume.\n\n",
EXEC_NAME, VERSION);
printf ("Copyright (c)\n");
printf (" 2002 Matthew J. Fanto\n");
printf (" 2002 Anton Altaparmakov\n");
printf (" 2002-2003 Richard Russon\n");
printf ("\n%s\n%s%s\n", ntfs_gpl, ntfs_bugs, ntfs_home);
}
/**
@ -79,7 +77,7 @@ void version (void)
*/
void usage (void)
{
Qprintf ("Usage: %s [options] device\n"
printf ("\nUsage: %s [options] device\n"
" -i num --inode num Display information about this inode\n"
"\n"
" -f --force Use less caution\n"
@ -88,7 +86,7 @@ void usage (void)
" -V --version Display version information\n"
" -h --help Display this help\n\n",
EXEC_NAME);
Qprintf ("Please report bugs to: linux-ntfs-dev@lists.sf.net\n\n");
printf ("%s%s\n", ntfs_bugs, ntfs_home);
}
/**
@ -102,7 +100,7 @@ void usage (void)
*/
int parse_options (int argc, char *argv[])
{
static const char *sopt = "-fhi:qvV";
static const char *sopt = "-fh?i:qvV";
static const struct option lopt[] = {
{ "force", no_argument, NULL, 'f' },
{ "help", no_argument, NULL, 'h' },
@ -142,6 +140,7 @@ int parse_options (int argc, char *argv[])
opts.force++;
break;
case 'h':
case '?':
help++;
break;
case 'q':
@ -168,12 +167,14 @@ int parse_options (int argc, char *argv[])
opts.quiet = 0;
} else {
if (opts.device == NULL) {
Eprintf ("You must specify exactly one device.\n");
if (argc > 1)
Eprintf ("You must specify exactly one device.\n");
err++;
}
if (opts.inode == -1) {
Eprintf ("You much specify an inode to learn about.\n");
if (argc > 1)
Eprintf ("You much specify an inode to learn about.\n");
err++;
}
@ -313,15 +314,15 @@ int main(int argc, char **argv)
{
ntfs_volume *vol;
utils_set_locale();
if (!parse_options (argc, argv))
return 1;
utils_set_locale();
vol = utils_mount_volume (opts.device, MS_RDONLY, opts.force);
if (!vol)
return 1;
ntfs_get_file_attributes (vol, opts.inode);
ntfs_umount (vol, FALSE);

View File

@ -60,12 +60,12 @@ GEN_PRINTF (Qprintf, stdout, &opts.quiet, FALSE)
*/
void version (void)
{
printf ("\n%s v%s - Display, or set, the label for an NTFS Volume\n\n",
printf ("\n%s v%s - Display, or set, the label for an NTFS Volume.\n\n",
EXEC_NAME, VERSION);
printf ("Copyright (c)\n");
printf ("\tMatthew J. Fanto\n");
printf ("\tAnton Altaparmakov\n");
printf ("\tRichard Russon\n");
printf (" 2002 Matthew J. Fanto\n");
printf (" 2002 Anton Altaparmakov\n");
printf (" 2002-2003 Richard Russon\n");
printf ("\n%s\n\n%s%s\n", ntfs_gpl, ntfs_bugs, ntfs_home);
}
@ -100,7 +100,7 @@ void usage (void)
*/
int parse_options (int argc, char *argv[])
{
static const char *sopt = "-fhnqvV";
static const char *sopt = "-fh?nqvV";
static const struct option lopt[] = {
{ "force", no_argument, NULL, 'f' },
{ "help", no_argument, NULL, 'h' },
@ -132,6 +132,7 @@ int parse_options (int argc, char *argv[])
opts.force++;
break;
case 'h':
case '?':
help++;
break;
case 'n':
@ -337,11 +338,11 @@ int main(int argc, char **argv)
int result = 0;
ntfs_volume *vol;
utils_set_locale();
if (!parse_options (argc, argv))
return 1;
utils_set_locale();
//XXX need to set and get mount flags
vol = utils_mount_volume (opts.device, 0, opts.force);
if (!vol)

View File

@ -1,7 +1,7 @@
/**
* ntfsundelete - Part of the Linux-NTFS project.
*
* Copyright (c) 2002 Richard Russon <ntfs@flatcap.org>
* Copyright (c) 2002-2003 Richard Russon
*
* This utility will recover deleted files from an NTFS volume.
*
@ -52,7 +52,6 @@
#include "utils.h"
#include "debug.h"
static const char *AUTHOR = "Richard Russon (FlatCap)";
static const char *EXEC_NAME = "ntfsundelete";
static const char *MFTFILE = "mft";
static const char *UNNAMED = "<unnamed>";
@ -75,14 +74,11 @@ GEN_PRINTF (Qprintf, stdout, &opts.quiet, FALSE)
*/
void version (void)
{
Qprintf ("%s v%s Copyright (C) 2002 %s\nRecover deleted files from an "
"NTFS Volume\n\n%s is free software, released under the GNU "
"General Public License\nand you are welcome to redistribute "
"it under certain conditions.\n%s comes with ABSOLUTELY NO "
"WARRANTY; for details read the GNU\nGeneral Public License "
"to be found in the file COPYING in the main\nLinux-NTFS "
"distribution directory.\n\n",
EXEC_NAME, VERSION, AUTHOR, EXEC_NAME, EXEC_NAME);
printf ("\n%s v%s - Recover deleted files from an NTFS Volume.\n\n",
EXEC_NAME, VERSION);
printf ("Copyright (c)\n");
printf (" 2002-2003 Richard Russon\n");
printf ("\n%s\n%s%s\n", ntfs_gpl, ntfs_bugs, ntfs_home);
}
/**
@ -94,7 +90,7 @@ void version (void)
*/
void usage (void)
{
Qprintf ("Usage: %s [options] device\n"
printf ("\nUsage: %s [options] device\n"
" -s --scan Scan for files (default)\n"
" -p num --percentage num Minimum percentage recoverable\n"
" -m pattern --match pattern Only work on files with matching names\n"
@ -115,7 +111,7 @@ void usage (void)
" -V --version Display version information\n"
" -h --help Display this help\n\n",
EXEC_NAME);
Qprintf ("Please report bugs to: linux-ntfs-dev@lists.sf.net\n\n");
printf ("%s%s\n", ntfs_bugs, ntfs_home);
}
/**
@ -272,7 +268,7 @@ int parse_time (const char *value, time_t *since)
*/
int parse_options (int argc, char *argv[])
{
static const char *sopt = "-b:Cc:d:fhm:o:p:sS:t:u:qvV";
static const char *sopt = "-b:Cc:d:fh?m:o:p:sS:t:u:qvV";
static const struct option lopt[] = {
{ "byte", required_argument, NULL, 'b' },
{ "case", no_argument, NULL, 'C' },
@ -349,6 +345,7 @@ int parse_options (int argc, char *argv[])
opts.force++;
break;
case 'h':
case '?':
help++;
break;
case 'm':
@ -436,7 +433,8 @@ int parse_options (int argc, char *argv[])
opts.quiet = 0;
} else {
if (opts.device == NULL) {
Eprintf ("You must specify exactly one device.\n");
if (argc > 1)
Eprintf ("You must specify exactly one device.\n");
err++;
}
@ -1653,11 +1651,11 @@ int main (int argc, char *argv[])
ntfs_volume *vol;
int result = 1;
utils_set_locale();
if (!parse_options (argc, argv))
goto free;
utils_set_locale();
vol = utils_mount_volume (opts.device, MS_RDONLY, opts.force);
if (!vol)
return 1;

View File

@ -1,7 +1,7 @@
/**
* ntfswipe - Part of the Linux-NTFS project.
*
* Copyright (c) 2002 Richard Russon <ntfs@flatcap.org>
* Copyright (c) 2002-2003 Richard Russon
*
* This utility will overwrite usused space on an NTFS volume.
*
@ -39,7 +39,6 @@
#include "utils.h"
#include "debug.h"
static const char *AUTHOR = "Richard Russon (FlatCap)";
static const char *EXEC_NAME = "ntfswipe";
static struct options opts;
@ -47,6 +46,303 @@ GEN_PRINTF (Eprintf, stderr, NULL, FALSE)
GEN_PRINTF (Vprintf, stdout, &opts.verbose, TRUE)
GEN_PRINTF (Qprintf, stdout, &opts.quiet, FALSE)
/**
* version - Print version information about the program
*
* Print a copyright statement and a brief description of the program.
*
* Return: none
*/
void version (void)
{
printf ("\n%s v%s - Overwrite the unused space on an NTFS Volume.\n\n",
EXEC_NAME, VERSION);
printf ("Copyright (c)\n");
printf (" 2002-2003 Richard Russon\n");
printf ("\n%s\n%s%s\n", ntfs_gpl, ntfs_bugs, ntfs_home);
}
/**
* usage - Print a list of the parameters to the program
*
* Print a list of the parameters and options for the program.
*
* Return: none
*/
void usage (void)
{
printf ("\nUsage: %s [options] device\n"
" -i --info Show volume information (default)\n"
"\n"
" -d --directory Wipe directory indexes\n"
" -l --logfile Wipe the logfile (journal)\n"
" -m --mft Wipe mft space\n"
" -p --pagefile Wipe pagefile (swap space)\n"
" -t --tails Wipe file tails\n"
" -u --unused Wipe unused clusters\n"
"\n"
" -a --all Wipe all unused space\n"
"\n"
" -c num --count num Number of times to write (default = 1)\n"
" -b list --bytes list List of values to write (default = 0)\n"
"\n"
" -n --no-action Do not write to disk\n"
" -f --force Use less caution\n"
" -q --quiet Less output\n"
" -v --verbose More output\n"
" -V --version Version information\n"
" -h --help Print this help\n\n",
EXEC_NAME);
printf ("%s%s\n", ntfs_bugs, ntfs_home);
}
/**
* parse_list - Read a comma-separated list of numbers
* @list: The comma-separated list of numbers
* @result: Store the parsed list here (must be freed by caller)
*
* Read a comma-separated list of numbers and allocate an array of ints to store
* them in. The numbers can be in decimal, octal or hex.
*
* N.B. The caller must free the memory returned in @result.
* N.B. If the function fails, @result is not changed.
*
* Return: 0 Error, invalid string
* n Success, the count of numbers parsed
*/
int parse_list (const char *list, int **result)
{
const char *ptr;
char *end;
int i;
int count;
int *mem = NULL;
if (!list || !result)
return 0;
for (count = 0, ptr = list; ptr; ptr = strchr (ptr+1, ','))
count++;
mem = malloc ((count+1) * sizeof (int));
if (!mem) {
Eprintf ("Couldn't allocate memory in parse_list().\n");
return 0;
}
memset (mem, 0xFF, (count+1) * sizeof (int));
for (ptr = list, i = 0; i < count; i++) {
end = NULL;
mem[i] = strtol (ptr, &end, 0);
if (!end || (end == ptr) || ((*end != ',') && (*end != 0))) {
Eprintf ("Invalid list '%s'\n", list);
free (mem);
return 0;
}
if ((mem[i] < 0) || (mem[i] > 255)) {
Eprintf ("Bytes must be in range 0-255.\n");
free (mem);
return 0;
}
ptr = end + 1;
}
Dprintf ("Parsing list '%s' - ", list);
for (i = 0; i <= count; i++)
Dprintf ("0x%02x ", mem[i]);
Dprintf ("\n");
*result = mem;
return count;
}
/**
* parse_options - Read and validate the programs command line
*
* Read the command line, verify the syntax and parse the options.
* This function is very long, but quite simple.
*
* Return: 1 Success
* 0 Error, one or more problems
*/
int parse_options (int argc, char *argv[])
{
static const char *sopt = "-ab:c:dfh?ilmnpqtuvV";
static const struct option lopt[] = {
{ "all", no_argument, NULL, 'a' },
{ "bytes", required_argument, NULL, 'b' },
{ "count", required_argument, NULL, 'c' },
{ "directory", no_argument, NULL, 'd' },
{ "force", no_argument, NULL, 'f' },
{ "help", no_argument, NULL, 'h' },
{ "info", no_argument, NULL, 'i' },
{ "logfile", no_argument, NULL, 'l' },
{ "mft", no_argument, NULL, 'm' },
{ "no-action", no_argument, NULL, 'n' },
{ "pagefile", no_argument, NULL, 'p' },
{ "quiet", no_argument, NULL, 'q' },
{ "tails", no_argument, NULL, 't' },
{ "unused", no_argument, NULL, 'u' },
{ "verbose", no_argument, NULL, 'v' },
{ "version", no_argument, NULL, 'V' },
{ NULL, 0, NULL, 0 }
};
char c = -1;
char *end;
int err = 0;
int ver = 0;
int help = 0;
opterr = 0; /* We'll handle the errors, thank you. */
opts.count = 1;
while ((c = getopt_long (argc, argv, sopt, lopt, NULL)) != -1) {
switch (c) {
case 1: /* A non-option argument */
if (!opts.device) {
opts.device = argv[optind-1];
} else {
opts.device = NULL;
err++;
}
break;
case 'i':
opts.info++; /* and fall through */
case 'a':
opts.directory++;
opts.logfile++;
opts.mft++;
opts.pagefile++;
opts.tails++;
opts.unused++;
break;
case 'b':
if (!opts.bytes) {
if (!parse_list (argv[optind-1], &opts.bytes))
err++;
} else {
err++;
}
break;
case 'c':
if (opts.count == 1) {
end = NULL;
opts.count = strtol (optarg, &end, 0);
if (end && *end)
err++;
} else {
err++;
}
break;
case 'd':
opts.directory++;
break;
case 'f':
opts.force++;
break;
case 'h':
case '?':
help++;
break;
case 'l':
opts.logfile++;
break;
case 'm':
opts.mft++;
break;
case 'n':
opts.noaction++;
break;
case 'p':
opts.pagefile++;
break;
case 'q':
opts.quiet++;
break;
case 't':
opts.tails++;
break;
case 'u':
opts.unused++;
break;
case 'v':
opts.verbose++;
break;
case 'V':
ver++;
break;
default:
if ((optopt == 'b') || (optopt == 'c')) {
Eprintf ("Option '%s' requires an argument.\n", argv[optind-1]);
} else {
Eprintf ("Unknown option '%s'.\n", argv[optind-1]);
}
err++;
break;
}
}
if (help || ver) {
opts.quiet = 0;
} else {
if (opts.device == NULL) {
if (argc > 1)
Eprintf ("You must specify exactly one device.\n");
err++;
}
if (opts.quiet && opts.verbose) {
Eprintf ("You may not use --quiet and --verbose at the same time.\n");
err++;
}
/*
if (opts.info && (opts.unused || opts.tails || opts.mft || opts.directory)) {
Eprintf ("You may not use any other options with --info.\n");
err++;
}
*/
if ((opts.count < 1) || (opts.count > 100)) {
Eprintf ("The iteration count must be between 1 and 100.\n");
err++;
}
/* Create a default list */
if (!opts.bytes) {
opts.bytes = malloc (2 * sizeof (int));
if (opts.bytes) {
opts.bytes[0] = 0;
opts.bytes[1] = -1;
} else {
Eprintf ("Couldn't allocate memory for byte list.\n");
err++;
}
}
if (!opts.directory && !opts.logfile && !opts.mft &&
!opts.pagefile && !opts.tails && !opts.unused) {
opts.info = 1;
}
}
if (ver)
version();
if (help || err)
usage();
return (!err && !help && !ver);
}
/**
* wipe_unused - Wipe unused clusters
* @vol: An ntfs volume obtained from ntfs_mount
@ -299,25 +595,25 @@ bmpdone:
/*
* wipe_unused - volume = n clusters, u unused (%age & MB)
* $Bitmap
* $Bitmap
* vol->lcnbmp_na
*
* wipe_tails - volume = n files, total tail slack space
* $MFT, $DATA
* vol->mft_na
* $MFT, $DATA
* vol->mft_na
*
* wipe_mft - volume = n mft records, u unused, s total slack space
* $MFT, $BITMAP
* vol->mftbmp_na
* $MFT, $BITMAP
* vol->mftbmp_na
*
* wipe_directory - volume has d dirs, t total slack space
* $MFT, $INDEX_ROOT, $INDEX_ALLOC, $BITMAP
* $MFT, $INDEX_ROOT, $INDEX_ALLOC, $BITMAP
*
* wipe_logfile - logfile is <size>
* $MFT, $DATA
* $MFT, $DATA
*
* wipe_pagefile - pagefile is <size>
* $MFT, $DATA
* $MFT, $DATA
*/
free (buffer);
@ -343,304 +639,6 @@ bmpdone:
}
/**
* version - Print version information about the program
*
* Print a copyright statement and a brief description of the program.
*
* Return: none
*/
void version (void)
{
Qprintf ("%s v%s Copyright (C) 2002 %s\nOverwrite the unused space on "
"an NTFS Volume\n\n%s is free software, released under the GNU "
"General Public License\nand you are welcome to redistribute "
"it under certain conditions.\n%s comes with ABSOLUTELY NO "
"WARRANTY; for details read the GNU\nGeneral Public License "
"to be found in the file COPYING in the main\nLinux-NTFS "
"distribution directory.\n\n",
EXEC_NAME, VERSION, AUTHOR, EXEC_NAME, EXEC_NAME);
}
/**
* usage - Print a list of the parameters to the program
*
* Print a list of the parameters and options for the program.
*
* Return: none
*/
void usage (void)
{
Qprintf ("Usage: %s [options] device\n"
" -i --info Show volume information (default)\n"
"\n"
" -d --directory Wipe directory indexes\n"
" -l --logfile Wipe the logfile (journal)\n"
" -m --mft Wipe mft space\n"
" -p --pagefile Wipe pagefile (swap space)\n"
" -t --tails Wipe file tails\n"
" -u --unused Wipe unused clusters\n"
"\n"
" -a --all Wipe all unused space\n"
"\n"
" -c num --count num Number of times to write (default = 1)\n"
" -b list --bytes list List of values to write (default = 0)\n"
"\n"
" -n --no-action Do not write to disk\n"
" -f --force Use less caution\n"
" -q --quiet Less output\n"
" -v --verbose More output\n"
" -V --version Version information\n"
" -h --help Print this help\n\n",
EXEC_NAME);
Qprintf ("Please report bugs to: linux-ntfs-dev@lists.sf.net\n\n");
}
/**
* parse_list - Read a comma-separated list of numbers
* @list: The comma-separated list of numbers
* @result: Store the parsed list here (must be freed by caller)
*
* Read a comma-separated list of numbers and allocate an array of ints to store
* them in. The numbers can be in decimal, octal or hex.
*
* N.B. The caller must free the memory returned in @result.
* N.B. If the function fails, @result is not changed.
*
* Return: 0 Error, invalid string
* n Success, the count of numbers parsed
*/
int parse_list (const char *list, int **result)
{
const char *ptr;
char *end;
int i;
int count;
int *mem = NULL;
if (!list || !result)
return 0;
for (count = 0, ptr = list; ptr; ptr = strchr (ptr+1, ','))
count++;
mem = malloc ((count+1) * sizeof (int));
if (!mem) {
Eprintf ("Couldn't allocate memory in parse_list().\n");
return 0;
}
memset (mem, 0xFF, (count+1) * sizeof (int));
for (ptr = list, i = 0; i < count; i++) {
end = NULL;
mem[i] = strtol (ptr, &end, 0);
if (!end || (end == ptr) || ((*end != ',') && (*end != 0))) {
Eprintf ("Invalid list '%s'\n", list);
free (mem);
return 0;
}
if ((mem[i] < 0) || (mem[i] > 255)) {
Eprintf ("Bytes must be in range 0-255.\n");
free (mem);
return 0;
}
ptr = end + 1;
}
Dprintf ("Parsing list '%s' - ", list);
for (i = 0; i <= count; i++)
Dprintf ("0x%02x ", mem[i]);
Dprintf ("\n");
*result = mem;
return count;
}
/**
* parse_options - Read and validate the programs command line
*
* Read the command line, verify the syntax and parse the options.
* This function is very long, but quite simple.
*
* Return: 1 Success
* 0 Error, one or more problems
*/
int parse_options (int argc, char *argv[])
{
static const char *sopt = "-ab:c:dfhilmnpqtuvV";
static const struct option lopt[] = {
{ "all", no_argument, NULL, 'a' },
{ "bytes", required_argument, NULL, 'b' },
{ "count", required_argument, NULL, 'c' },
{ "directory", no_argument, NULL, 'd' },
{ "force", no_argument, NULL, 'f' },
{ "help", no_argument, NULL, 'h' },
{ "info", no_argument, NULL, 'i' },
{ "logfile", no_argument, NULL, 'l' },
{ "mft", no_argument, NULL, 'm' },
{ "no-action", no_argument, NULL, 'n' },
{ "pagefile", no_argument, NULL, 'p' },
{ "quiet", no_argument, NULL, 'q' },
{ "tails", no_argument, NULL, 't' },
{ "unused", no_argument, NULL, 'u' },
{ "verbose", no_argument, NULL, 'v' },
{ "version", no_argument, NULL, 'V' },
{ NULL, 0, NULL, 0 }
};
char c = -1;
char *end;
int err = 0;
int ver = 0;
int help = 0;
opterr = 0; /* We'll handle the errors, thank you. */
opts.count = 1;
while ((c = getopt_long (argc, argv, sopt, lopt, NULL)) != -1) {
switch (c) {
case 1: /* A non-option argument */
if (!opts.device) {
opts.device = argv[optind-1];
} else {
opts.device = NULL;
err++;
}
break;
case 'i':
opts.info++; /* and fall through */
case 'a':
opts.directory++;
opts.logfile++;
opts.mft++;
opts.pagefile++;
opts.tails++;
opts.unused++;
break;
case 'b':
if (!opts.bytes) {
if (!parse_list (argv[optind-1], &opts.bytes))
err++;
} else {
err++;
}
break;
case 'c':
if (opts.count == 1) {
end = NULL;
opts.count = strtol (optarg, &end, 0);
if (end && *end)
err++;
} else {
err++;
}
break;
case 'd':
opts.directory++;
break;
case 'f':
opts.force++;
break;
case 'h':
help++;
break;
case 'l':
opts.logfile++;
break;
case 'm':
opts.mft++;
break;
case 'n':
opts.noaction++;
break;
case 'p':
opts.pagefile++;
break;
case 'q':
opts.quiet++;
break;
case 't':
opts.tails++;
break;
case 'u':
opts.unused++;
break;
case 'v':
opts.verbose++;
break;
case 'V':
ver++;
break;
default:
if ((optopt == 'b') || (optopt == 'c')) {
Eprintf ("Option '%s' requires an argument.\n", argv[optind-1]);
} else {
Eprintf ("Unknown option '%s'.\n", argv[optind-1]);
}
err++;
break;
}
}
if (help || ver) {
opts.quiet = 0;
} else {
if (opts.device == NULL) {
Eprintf ("You must specify exactly one device.\n");
err++;
}
if (opts.quiet && opts.verbose) {
Eprintf ("You may not use --quiet and --verbose at the same time.\n");
err++;
}
/*
if (opts.info && (opts.unused || opts.tails || opts.mft || opts.directory)) {
Eprintf ("You may not use any other options with --info.\n");
err++;
}
*/
if ((opts.count < 1) || (opts.count > 100)) {
Eprintf ("The iteration count must be between 1 and 100.\n");
err++;
}
/* Create a default list */
if (!opts.bytes) {
opts.bytes = malloc (2 * sizeof (int));
if (opts.bytes) {
opts.bytes[0] = 0;
opts.bytes[1] = -1;
} else {
Eprintf ("Couldn't allocate memory for byte list.\n");
err++;
}
}
if (!opts.directory && !opts.logfile && !opts.mft &&
!opts.pagefile && !opts.tails && !opts.unused) {
opts.info = 1;
}
}
if (ver)
version();
if (help || err)
usage();
return (!err && !help && !ver);
}
/**
* print_summary - Tell the user what we are about to do
*
@ -699,11 +697,11 @@ int main (int argc, char *argv[])
int i, j;
enum action act = act_info;
utils_set_locale();
if (!parse_options (argc, argv))
return 1;
utils_set_locale();
if (!opts.info)
print_summary();