From 2f310a802a5d94b5036672290c91ecb27e37f83b Mon Sep 17 00:00:00 2001 From: Eric Bollengier Date: Wed, 27 Oct 2010 15:36:05 +0200 Subject: [PATCH] Add -l and -a options to drivetype tool These switchs permit to display the list of all local hardrive on a windows box drivetype.exe -l -a c:\ d:\ e:\ --- bacula/src/tools/drivetype.c | 61 +++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 15 deletions(-) diff --git a/bacula/src/tools/drivetype.c b/bacula/src/tools/drivetype.c index 7aaa74edc0..0a630385d3 100644 --- a/bacula/src/tools/drivetype.c +++ b/bacula/src/tools/drivetype.c @@ -50,6 +50,8 @@ static void usage() " Print the drive type a given file/directory is on.\n" " The following options are supported:\n" "\n" +" -l print local fixed hard drive\n" +" -a display information on all drives\n" " -v print both path and file system type.\n" " -? print this message.\n" "\n")); @@ -57,24 +59,54 @@ static void usage() exit(1); } +int display_drive(char *drive, bool display_local, int verbose) +{ + char dt[100]; + int status = 0; + + if (drivetype(drive, dt, sizeof(dt))) { + if (display_local) { /* in local mode, display only harddrive */ + if (strcmp(dt, "fixed") == 0) { + printf("%s\n", drive); + } + } else if (verbose) { + printf("%s: %s\n", drive, dt); + } else { + puts(dt); + } + } else if (!display_local) { /* local mode is used by FileSet scripts */ + fprintf(stderr, _("%s: unknown\n"), drive); + status = 1; + } + return status; +} int main (int argc, char *const *argv) { - char dt[100]; int verbose = 0; int status = 0; int ch, i; + bool display_local = false; + bool display_all = false; + char drive='A'; + char buf[16]; setlocale(LC_ALL, ""); bindtextdomain("bacula", LOCALEDIR); textdomain("bacula"); - while ((ch = getopt(argc, argv, "v?")) != -1) { + while ((ch = getopt(argc, argv, "alv?")) != -1) { switch (ch) { case 'v': verbose = 1; break; + case 'l': + display_local = true; + break; + case 'a': + display_all = true; + break; case '?': default: usage(); @@ -84,24 +116,23 @@ main (int argc, char *const *argv) argc -= optind; argv += optind; + OSDependentInit(); + + if (argc < 1 && display_all) { + /* Try all letters */ + for (drive = 'A'; drive <= 'Z'; drive++) { + bsnprintf(buf, sizeof(buf), "%c:/", drive); + display_drive(buf, display_local, verbose); + } + exit(status); + } + if (argc < 1) { usage(); } - OSDependentInit(); - for (i = 0; i < argc; --argc, ++argv) { - if (drivetype(*argv, dt, sizeof(dt))) { - if (verbose) { - printf("%s: %s\n", *argv, dt); - } else { - puts(dt); - } - } else { - fprintf(stderr, _("%s: unknown\n"), *argv); - status = 1; - } + status += display_drive(*argv, display_local, verbose); } - exit(status); } -- 2.39.5