diff --git a/observation/src/biolatency/biolatency.c b/observation/src/biolatency/biolatency.c index c251224290cfcf36dba4367a4bd438e4a3d8c251..965304e6f36aef7e7493aba3b0954881fbd42b48 100644 --- a/observation/src/biolatency/biolatency.c +++ b/observation/src/biolatency/biolatency.c @@ -26,4 +26,68 @@ static struct env { static volatile sig_atomic_t exiting; const char *argp_program_version = "biolatency 0.1"; -const char *argp_program_bug_address = "Jackie Liu "; \ No newline at end of file +const char *argp_program_bug_address = "Jackie Liu "; + +static error_t parse_arg(int key, char *arg, struct argp_state *state) +{ + static int pos_args; + + switch (key) { + case 'h': + argp_state_help(state, stderr, ARGP_HELP_STD_HELP); + break; + case 'v': + env.verbose = true; + break; + case 'T': + env.timestamp = true; + break; + case 'm': + env.milliseconds = true; + break; + case 'Q': + env.queued = true; + break; + case 'D': + env.per_disk = true; + break; + case 'F': + env.per_flag = true; + break; + case 'c': + env.cgroupspath = arg; + env.cg = true; + break; + case 'd': + env.disk = arg; + if (strlen(arg) + 1 > DISK_NAME_LEN) { + warning("Invalid disk name: too long\n"); + argp_usage(state); + } + break; + case ARGP_KEY_ARG: + errno = 0; + if (pos_args == 0) { + env.interval = strtol(arg, NULL, 10); + if (errno || env.interval <= 0) { + warning("Invalid interval\n"); + argp_usage(state); + } + } else if (pos_args == 1) { + env.times = strtol(arg, NULL, 10); + if (errno || env.times <= 0) { + warning("Invalid times\n"); + argp_usage(state); + } + } else { + warning("Unrecognized positional argument: %s\n", arg); + argp_usage(state); + } + pos_args++; + break; + default: + return ARGP_ERR_UNKNOWN; + } + + return 0; +}