X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=ust%2Fust.c;h=789dfe0feeb7c8d44da14ebc97ae23cef75969c3;hb=89a10f62996c8fa75cb2eb90871a705c919ea625;hp=d572973acd540dbb1c1b00db3bdb7addfe25f3be;hpb=ef290fcae477f5717256af47b4342c0f59948d7a;p=ust.git diff --git a/ust/ust.c b/ust/ust.c index d572973..789dfe0 100644 --- a/ust/ust.c +++ b/ust/ust.c @@ -21,10 +21,10 @@ #include #include #include -#include #include "ustcomm.h" #include "ustcmd.h" +#include "usterr.h" enum command { START_TRACE, @@ -41,9 +41,7 @@ enum command { struct ust_opts { enum command cmd; pid_t *pids; - char* regex; - regex_t preg; - int regex_state; + char *regex; }; char *progname = NULL; @@ -70,7 +68,6 @@ int parse_opts_long(int argc, char **argv, struct ust_opts *opts) opts->pids = NULL; opts->regex = NULL; - opts->regex_state = -1; while (1) { int option_index = 0; @@ -142,13 +139,21 @@ int parse_opts_long(int argc, char **argv, struct ust_opts *opts) } } - if(argc - optind > 0 && opts->cmd != GET_ONLINE_PIDS) { + if (argc - optind > 0 && opts->cmd != GET_ONLINE_PIDS) { int i; int pididx=0; opts->pids = malloc((argc-optind+1) * sizeof(pid_t)); for(i=optind; ipids[pididx++] = atoi(argv[i]); + /* don't take any chances, use a long long */ + long long tmp; + char *endptr; + tmp = strtoull(argv[i], &endptr, 10); + if(*endptr != '\0') { + ERR("The pid \"%s\" is invalid.", argv[i]); + return 1; + } + opts->pids[pididx++] = (pid_t) tmp; } opts->pids[pididx] = -1; } @@ -159,8 +164,6 @@ int parse_opts_long(int argc, char **argv, struct ust_opts *opts) int main(int argc, char *argv[]) { pid_t *pidit; - //char *msg = argv[2]; - struct ustcomm_connection conn; int result; struct ust_opts opts; @@ -174,6 +177,7 @@ int main(int argc, char *argv[]) result = parse_opts_long(argc, argv, &opts); if(result) { + fprintf(stderr, "\n"); usage(); exit(EXIT_FAILURE); } @@ -189,7 +193,7 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } if (opts.cmd == GET_ONLINE_PIDS) { - pid_t* pp = ustcmd_get_online_pids(); + pid_t *pp = ustcmd_get_online_pids(); unsigned int i = 0; if (pp) { @@ -204,92 +208,85 @@ int main(int argc, char *argv[]) } pidit = opts.pids; - struct USTcmd_cmsf* cmsf = NULL; + struct marker_status *cmsf = NULL; while(*pidit != -1) { switch (opts.cmd) { case START_TRACE: - if (ustcmd_start_trace(*pidit)) { - fprintf(stderr, - "error while trying to for trace " - "with PID %u\n", (unsigned int) *pidit); + result = ustcmd_start_trace(*pidit); + if (result) { + ERR("error while trying to for trace with PID %u\n", (unsigned int) *pidit); + break; + } + //printf("sucessfully started trace for PID %u\n", (unsigned int) *pidit); break; - } - printf("sucessfully started trace for PID %u\n", - (unsigned int) *pidit); - break; case STOP_TRACE: - if (ustcmd_stop_trace(*pidit)) { - fprintf(stderr, - "error while trying to stop trace " - "for PID %u\n", (unsigned int) *pidit); + result = ustcmd_stop_trace(*pidit); + if (result) { + ERR("error while trying to stop trace for PID %u\n", (unsigned int) *pidit); + break; + } + //printf("sucessfully stopped trace for PID %u\n", (unsigned int) *pidit); break; - } - printf("sucessfully stopped trace for PID %u\n", - (unsigned int) *pidit); - break; case START: - if (ustcmd_setup_and_start(*pidit)) { - fprintf(stderr, - "error while trying to setup/start " - "trace for PID %u\n", - (unsigned int) *pidit); + result = ustcmd_setup_and_start(*pidit); + if (result) { + ERR("error while trying to setup/start trace for PID %u\n", (unsigned int) *pidit); + break; + } + //printf("sucessfully setup/started trace for PID %u\n", (unsigned int) *pidit); break; - } - printf("sucessfully setup/started trace for PID %u\n", - (unsigned int) *pidit); - break; case DESTROY: - if (ustcmd_destroy_trace(*pidit)) { - fprintf(stderr, - "error while trying to destroy " - "trace with PID %u\n", - (unsigned int) *pidit); + result = ustcmd_destroy_trace(*pidit); + if (result) { + ERR("error while trying to destroy trace with PID %u\n", (unsigned int) *pidit); + break; + } + //printf("sucessfully destroyed trace for PID %u\n", (unsigned int) *pidit); break; - } - printf("sucessfully destroyed trace for PID %u\n", - (unsigned int) *pidit); - break; case LIST_MARKERS: - cmsf = NULL; - if (ustcmd_get_cmsf(&cmsf, *pidit)) { - fprintf(stderr, - "error while trying to list markers for" - " PID %u\n", (unsigned int) *pidit); + cmsf = NULL; + if (ustcmd_get_cmsf(&cmsf, *pidit)) { + fprintf(stderr, + "error while trying to list markers for" + " PID %u\n", (unsigned int) *pidit); + break; + } + unsigned int i = 0; + while (cmsf[i].channel != NULL) { + printf("{PID: %u, channel/marker: %s/%s, " + "state: %u, fmt: %s}\n", + (unsigned int) *pidit, + cmsf[i].channel, + cmsf[i].marker, + cmsf[i].state, + cmsf[i].fs); + ++i; + } + ustcmd_free_cmsf(cmsf); break; - } - unsigned int i = 0; - while (cmsf[i].channel != NULL) { - printf("{PID: %u, channel/marker: %s/%s, " - "state: %u, fs: %s}\n", - (unsigned int) *pidit, - cmsf[i].channel, - cmsf[i].marker, - cmsf[i].state, - cmsf[i].fs); - ++i; - } - ustcmd_free_cmsf(cmsf); - break; case ENABLE_MARKER: + if(opts.regex) + ustcmd_set_marker_state(opts.regex, 1, *pidit); + break; case DISABLE_MARKER: - regex_change_m_state(&opts, *pidit); - break; + if(opts.regex) + ustcmd_set_marker_state(opts.regex, 0, *pidit); + break; default: - fprintf(stderr, "error: unknown command...\n"); + ERR("unknown command\n"); break; } pidit++; } - exit_free: if (opts.pids != NULL) { free(opts.pids); }