diff options
author | Joseph Hunkeler <jhunk@stsci.edu> | 2009-09-10 19:36:35 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunk@stsci.edu> | 2009-09-10 19:36:35 -0400 |
commit | fa3bd4af5e0301ef905873cd674932b00209f74b (patch) | |
tree | dcd456ce5c6751dd25850d5cc4f7eafaf85be95b | |
parent | b7010fa981c2f1f03282db9e2158dc5eaa20c946 (diff) | |
download | NetNuke-fa3bd4af5e0301ef905873cd674932b00209f74b.tar.gz |
Too many changes to really note them all.
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | netnuke.c | 118 |
2 files changed, 105 insertions, 15 deletions
@@ -2,5 +2,5 @@ CFLAGS=-Wall -pipe -O2 -funroll-loops OUTPUT=netnuke all: - gcc -o ${OUTPUT} -lutil ${CFLAGS} netnuke.c + cc -std=c99 -o ${OUTPUT} -lutil ${CFLAGS} netnuke.c @@ -21,9 +21,10 @@ #include <stdio.h> #include <stdint.h> #include <stdlib.h> -#include <stdbool.h> #include <string.h> +#include <stdbool.h> #include <unistd.h> +#include <ctype.h> #include <errno.h> #include <fcntl.h> #include <err.h> @@ -41,12 +42,12 @@ /* Global variables */ static int64_t error; -static bool udef_verbose = false; -static int8_t udef_wmode = 0; /* O_SYNC is default */ -static int16_t udef_nukelevel = 1; /* Static patterns is default */ -static int16_t udef_passes = 1; -static bool udef_testmode = true; /* Test mode should always be enabled by default. */ -static int32_t udef_blocksize = 512; /* 1 block = 512 bytes*/ +bool udef_verbose = false; +int8_t udef_wmode = 0; /* O_SYNC is default */ +int32_t udef_nukelevel = 1; /* Static patterns is default */ +int32_t udef_passes = 2; +bool udef_testmode = true; /* Test mode should always be enabled by default. */ +int32_t udef_blocksize = 512; /* 1 block = 512 bytes*/ /* List of media types that we can nuke */ #ifdef __FreeBSD__ @@ -225,7 +226,7 @@ void echoList() * Otherwise this loop would never end. */ if((int64_t)size > 0L) { - strncpy(mediaShort, &media[5], strlen(&media[5])); + strncpy(mediaShort, &media[5], strlen(media)); printf("%s: %jd\n", mediaShort , (intmax_t)size); mediaFound++; } @@ -325,13 +326,59 @@ void version(const char* cmd) printf("That source code (from libutil) is licensed under the BSD software license.\n\n"); } -#define ARGMATCH(arg) strncmp(argv[tok], arg, strlen(arg)+1) == 0 -#define ARGFILTER() \ - if(argv[tok] == NULL) fprintf(stderr, "%s was null.\n", __LINE__) +#define ARGMATCH(arg) strncmp(argv[tok], arg, strlen(arg)) == 0 +#define ARGNULL(arg) if(argv[tok arg] == NULL) exit(1); #define ARGVALINT(ref) tok++; ref = atoi(argv[tok]) +#define ARGVALSTR(ref) tok++; ref = argv[tok]; + +#define NOZERO 0 +#define NONEGATIVE 2 +#define NEEDNUM 4 +#define NEEDSTR 8 +int filterArg(const char* key, char* value, short flags) +{ + int test; + int length = strlen(value); + + if((flags & NEEDNUM) > 0) + { + for(test = 0; test < length; test++) + { + if(!isdigit(value[test])) + { + printf("argument %s did not receive an integer\n", key); + exit(1); + } + } + } + + if((flags & NONEGATIVE) > 0) + { + if((atoi(value) < 0)) + { + printf("argument %s received a negative number\n", key); + exit(1); + } + } + + if((flags & NOZERO) > 0) + { + if((atoi(value) == 0)) + { + printf("argument %s received zero. not allowed.\n", key); + exit(1); + } + } + + + return 0; +} + int main(int argc, char* argv[]) { int tok = 0; + + /* Static arguments that must happen first */ for(tok = 0; tok < argc; tok++) { if(ARGMATCH("--help") || ARGMATCH("-h")) @@ -349,30 +396,73 @@ int main(int argc, char* argv[]) udef_verbose = true; } + } + + /* Dynamic arguments come second */ + for(tok = 0; tok < argc; tok++) + { + if(ARGMATCH("--write-mode") || ARGMATCH("-w")) { - ARGVALINT(udef_wmode); + ARGNULL(+1); + if(filterArg(argv[tok], argv[tok+1], NONEGATIVE|NEEDNUM) == 0) + { + ARGVALINT(udef_wmode); + } + if(udef_verbose) printf("write mode is %d\n", udef_wmode); } if(ARGMATCH("--nuke-level") || ARGMATCH("-n")) { - ARGFILTER(); - ARGVALINT(udef_nukelevel); + ARGNULL(+1); + if(filterArg(argv[tok-1], argv[tok+1], NONEGATIVE|NEEDNUM) == 0) + { + ARGVALINT(udef_nukelevel); + } + if(udef_verbose) printf("nuke level is %d\n", udef_nukelevel); + } if(ARGMATCH("--passes") || ARGMATCH("-p")) { + ARGNULL(+1); + if(filterArg(argv[tok-1], argv[tok+1], NEEDNUM) == 0) + { + ARGVALINT(udef_passes); + if(udef_passes < 1) + udef_passes = 1; + } + + if(udef_verbose) + printf("passes is %u\n", udef_passes); } if(ARGMATCH("--disable-test")) { + udef_testmode = false; + if(udef_verbose) + printf("testmode disabled\n"); } if(ARGMATCH("--block-size") || ARGMATCH("-b")) { + ARGNULL(+1); + if(filterArg(argv[tok-1], argv[tok+1], NONEGATIVE|NOZERO|NEEDNUM) == 0) + { + ARGVALINT(udef_blocksize); + } + + if(udef_verbose) + printf("block size is %d\n", udef_blocksize); + } + if(argv[tok+1] == NULL) + { + //usage(argv[0]); + //exit(1); + //break; } } |