diff options
author | Mateusz Moscicki <m.moscicki2@partner.samsung.com> | 2019-05-08 12:27:18 +0200 |
---|---|---|
committer | Mateusz Moscicki <m.moscicki2@partner.samsung.com> | 2019-05-23 08:29:11 +0200 |
commit | e137e834f9e1d555109cfa9373a35d390451d618 (patch) | |
tree | f051baedac91a0827257b1d50569b14a106d583f | |
parent | a54bfde742ac9387dec5e20bf54fa78ec11126ce (diff) | |
download | crash-worker-e137e834f9e1d555109cfa9373a35d390451d618.tar.gz crash-worker-e137e834f9e1d555109cfa9373a35d390451d618.tar.bz2 crash-worker-e137e834f9e1d555109cfa9373a35d390451d618.zip |
Use getopt to parse command line arguments
Change-Id: If8fcb875d19f4547348b72341e342251cb8b7fb2
-rw-r--r-- | src/crash-manager/99-crash-manager.conf.in | 2 | ||||
-rw-r--r-- | src/crash-manager/crash-manager.c | 102 | ||||
-rwxr-xr-x | tests/system/critical_process/critical_process.sh.template | 2 | ||||
-rwxr-xr-x | tests/system/wait_for_opt_usr/wait_for_opt_usr.sh.template | 2 |
4 files changed, 99 insertions, 9 deletions
diff --git a/src/crash-manager/99-crash-manager.conf.in b/src/crash-manager/99-crash-manager.conf.in index e1900b9..b7dfe62 100644 --- a/src/crash-manager/99-crash-manager.conf.in +++ b/src/crash-manager/99-crash-manager.conf.in @@ -1,5 +1,5 @@ # Tizen crash-manager -kernel.core_pattern=|/usr/bin/crash-manager %p %u %g %s %t %i +kernel.core_pattern=|/usr/bin/crash-manager -p %p -u %u -g %g -s %s -t %t kernel.core_pipe_limit=10 # All processes should be dumped fs.suid_dumpable=2 diff --git a/src/crash-manager/crash-manager.c b/src/crash-manager/crash-manager.c index de63b5d..27f503b 100644 --- a/src/crash-manager/crash-manager.c +++ b/src/crash-manager/crash-manager.c @@ -19,6 +19,7 @@ #include <assert.h> #include <dirent.h> #include <fcntl.h> +#include <getopt.h> #include <gio/gio.h> #include <iniparser.h> #include <inttypes.h> @@ -301,6 +302,91 @@ close_fd: return -1; } +static void print_help(const char *name) +{ + printf("Syntax: %s [OPTIONS]\n" + "\n" + " -p --pid=PID PID of dumped process\n" + " -u --uid=UID real UID of dumped process\n" + " -g --gid=GID real GID of dumped process\n" + " -i --tid=TID TID of thread that triggered core dump\n" + " -s --signal=SIG number of signal causing dump\n" + " -t --time=TIME time of dump, expressed as seconds since the Epoch\n" + " -h --help this message\n" + "\n", name); +} + +static bool parse_args(struct crash_info *cinfo, int argc, char *argv[]) +{ +#define QUOTE(member) #member +#define GET_NUMBER(member) \ + errno = 0; \ + cinfo->member##_info = strtol(optarg, NULL, 10); \ + if (errno != 0) { \ + _D("%s argument error\n", QUOTE(member)); \ + printf("%s argument error\n", QUOTE(member)); \ + return false; \ + } + + bool result = true; + int opt; + bool pid_set = false; + bool uid_set = false; + bool gid_set = false; + bool sig_set = false; + + struct option long_options[] = { + {"pid", required_argument, NULL, 'p'}, + {"uid", required_argument, NULL, 'u'}, + {"gid", required_argument, NULL, 'g'}, + {"tid", required_argument, NULL, 'i'}, + {"signal", required_argument, NULL, 's'}, + {"time", required_argument, NULL, 't'}, + {"help", no_argument, NULL, 'h'}, + }; + + while ((opt = getopt_long(argc, argv, "p:u:g:i:s:t:h", long_options, NULL)) != -1) { + switch (opt) { + case 'p': + GET_NUMBER(pid) + pid_set = true; + break; + case 'u': + GET_NUMBER(uid) + uid_set = true; + break; + case 'g': + GET_NUMBER(gid) + gid_set = true; + break; + case 'i': + GET_NUMBER(tid) + break; + case 's': + GET_NUMBER(sig) + sig_set = true; + break; + case 't': + GET_NUMBER(time) + break; + case 'h': + default: + print_help(argv[0]); + result = false; + break; + } + } + + if (result && !pid_set || !uid_set || !gid_set || !sig_set) { + printf("Not enough parameters.\n\n"); + print_help(argv[0]); + result = false; + } + return result; +#undef QUOTE +#undef GET_NUMBER +} + static int set_crash_info(struct crash_info *cinfo, int argc, char *argv[]) { int ret; @@ -308,11 +394,13 @@ static int set_crash_info(struct crash_info *cinfo, int argc, char *argv[]) char date[80]; struct tm loc_tm; - cinfo->pid_info = strtol(argv[1], NULL, 10); - cinfo->sig_info = atoi(argv[4]); - if (argc > 6) - cinfo->tid_info = strtol(argv[6], NULL, 10); - else { + cinfo->tid_info = -1; + cinfo->time_info = 0; + + if (!parse_args(cinfo, argc, argv)) + return -1; + + if (cinfo->tid_info == -1) { cinfo->tid_info = find_crash_tid(cinfo->pid_info); if (cinfo->tid_info < 0) { _I("TID not found"); @@ -326,7 +414,9 @@ static int set_crash_info(struct crash_info *cinfo, int argc, char *argv[]) return -1; } - cinfo->time_info = strtol(argv[5], NULL, 10); + if (cinfo->time_info == 0) + cinfo->time_info = time(NULL); + localtime_r(&cinfo->time_info, &loc_tm); strftime(date, sizeof(date), "%Y%m%d%H%M%S", &loc_tm); diff --git a/tests/system/critical_process/critical_process.sh.template b/tests/system/critical_process/critical_process.sh.template index 8eacf37..b2cbb8c 100755 --- a/tests/system/critical_process/critical_process.sh.template +++ b/tests/system/critical_process/critical_process.sh.template @@ -52,7 +52,7 @@ fi save_core_pattern trap restore_core_pattern 0 -echo "|/usr/bin/crash-manager %p %u %g %s %t %i" > /proc/sys/kernel/core_pattern +echo "|/usr/bin/crash-manager -p %p -u %u -g %g -s %s -t %t" > /proc/sys/kernel/core_pattern tlm-client -s --username test1 --password tizen --seat seat0 1> /dev/null 2>&1 sleep 4 diff --git a/tests/system/wait_for_opt_usr/wait_for_opt_usr.sh.template b/tests/system/wait_for_opt_usr/wait_for_opt_usr.sh.template index aa4cf28..bb36e4f 100755 --- a/tests/system/wait_for_opt_usr/wait_for_opt_usr.sh.template +++ b/tests/system/wait_for_opt_usr/wait_for_opt_usr.sh.template @@ -22,7 +22,7 @@ fi save_core_pattern trap restore_core_pattern 0 -echo "|/usr/bin/crash-manager %p %u %g %s %t %i" > /proc/sys/kernel/core_pattern +echo "|/usr/bin/crash-manager -p %p -u %u -g %g -s %s -t %t" > /proc/sys/kernel/core_pattern { ${CRASH_WORKER_SYSTEM_TESTS}/utils/kenny 10 & |