From 44d27c85c87a4dba60c96f8572a999c0ff069e61 Mon Sep 17 00:00:00 2001 From: Raghavendra Bhat Date: Wed, 21 Sep 2011 19:23:29 +0530 Subject: c_pgms/ping_pong: validate the arguments given properly --- c_pgms/ping_pong.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 65 insertions(+), 6 deletions(-) (limited to 'c_pgms') diff --git a/c_pgms/ping_pong.c b/c_pgms/ping_pong.c index afd624c..7881266 100644 --- a/c_pgms/ping_pong.c +++ b/c_pgms/ping_pong.c @@ -18,6 +18,7 @@ #include #include #include +#include static struct timeval tp1,tp2; @@ -145,6 +146,48 @@ static void ping_pong(void *info) } } +int +check_options_valid (char *data, int *value) +{ + int ret = 0; + int len = 0; + int i = 0; + char *endptr, *str; + int old_errno; + long val = -1; + + old_errno = errno; + errno = 0; + str = data; + + val = strtol (str, &endptr, 10); + /* Check for various possible errors */ + if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) + || (errno != 0)) { + fprintf (stderr, "%s", strerror (errno)); + ret = -1; + goto out; + } + + if (endptr == str) { + fprintf(stderr, "No digits were found\n"); + ret = -1; + goto out; + } + + /* Not necessarily an error... */ + if (*endptr != '\0') { + printf("Further characters after number: %s\n", endptr); + ret = -1; + goto out; + } + + *value = val; + ret = 0; +out: + return ret; +} + int main(int argc, char *argv[]) { char *fname; @@ -154,6 +197,7 @@ int main(int argc, char *argv[]) pthread_t thread; int tid = -1; int zzzz = 600; + int ret = 0; while ((c = getopt(argc, argv, "rwm")) != -1) { switch (c){ @@ -184,12 +228,19 @@ int main(int argc, char *argv[]) } fname = argv[0]; - num_locks = atoi(argv[1]); - if (argv[2]) - zzzz = atoi (argv[2]); - if (zzzz <= 0) { - fprintf (stderr, "Cannot sleep for 0 or -ve seconds. Defaulting to 600"); + ret = check_options_valid (argv[1], &num_locks); + if (ret < 0) + goto out; + + if (argv[2]) { + ret = check_options_valid (argv[2], &zzzz); + if (ret < 0) + goto out; + } + + if (zzzz < 0) { + fprintf (stderr, "Cannot sleep for -ve seconds. Defaulting to 600"); zzzz = 600; } @@ -201,6 +252,14 @@ int main(int argc, char *argv[]) tid = pthread_create (&thread, NULL, (void *)ping_pong, (void *)&info_file); + if (zzzz == 0) { + printf ("running indefinitely\n"); + pthread_join (thread, NULL); + goto out; + } + sleep (zzzz); - return 0; + + out: + return ret; } -- cgit