blob: 4316331f0ee19d99b74ad9c3d19aca00933036fb [file] [log] [blame]
/*
* Copyright 2017 Limes Audio AB. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "diagnose.h"
#include "list.h"
#include "upgrade.h"
#include <argp.h>
#include <stdlib.h>
#include <string.h>
struct arguments {
int (*func)(int argc, char **argv);
int argc;
char **argv;
};
static void
cmd_prepare(struct argp_state *state, struct arguments *arguments)
{
if (state->next <= 0) {
argp_error(state, "unable to parse command line argument");
return;
}
int argc = state->argc - state->next + 1;
char **argv = &state->argv[state->next - 1];
char *cmd_name = argv[0];
argv[0] = malloc(strlen(state->name) + 1 + strlen(cmd_name) + 1);
if (!argv[0]) {
argp_failure(state, 1, ENOMEM, NULL);
}
sprintf(argv[0], "%s %s", state->name, cmd_name);
arguments->argc = argc;
arguments->argv = argv;
}
static error_t
parser(int key, char *arg, struct argp_state *state)
{
struct arguments *arguments = state->input;
switch (key) {
case ARGP_KEY_ARG:
if (state->arg_num == 0) {
if (strcmp(arg, "diagnose") == 0) {
arguments->func = diagnose;
} else if (strcmp(arg, "list") == 0) {
arguments->func = list;
} else if (strcmp(arg, "upgrade") == 0) {
arguments->func = upgrade;
}
if (arguments->func) {
cmd_prepare(state, arguments);
return ARGP_KEY_SUCCESS;
}
argp_error(state, "%s is not a valid command", arg);
}
break;
case ARGP_KEY_NO_ARGS:
argp_state_help(state, stdout, ARGP_HELP_STD_HELP);
break;
default:
return ARGP_ERR_UNKNOWN;
}
return 0;
}
int
main(int argc, char **argv)
{
char args_doc[] = "[COMMAND]";
char doc[] =
"\n"
"Options:"
"\v"
"Commands:\n"
"\n"
" diagnose Show diagnostic information\n"
" list List info about attached devices\n"
" upgrade Firmware upgrade";
struct argp argp = {NULL, parser, args_doc, doc, NULL, NULL, NULL};
struct arguments arguments = {0};
int retval = argp_parse(&argp, argc, argv, ARGP_IN_ORDER, NULL, &arguments);
if (retval < 0) {
return 1;
}
retval = arguments.func(arguments.argc, arguments.argv);
free(arguments.argv[0]);
if (retval < 0) {
return 1;
}
return 0;
}