diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2013-04-20 22:11:19 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2013-04-20 22:58:21 +0300 |
commit | 59849e3be117458f687e5e540dbc870aa4dfd920 (patch) | |
tree | e18dc445beb1a3c1162bdbed3c10dfccdaf3f8b8 /src/eclat.c | |
parent | 0320e20133d5f606dc65dac164b0e3731bca9b46 (diff) | |
download | eclat-59849e3be117458f687e5e540dbc870aa4dfd920.tar.gz eclat-59849e3be117458f687e5e540dbc870aa4dfd920.tar.bz2 |
Implement new command - lsattr. Improve docs.
The lsattr command combines the functionality of lsiattr and lssattr.
Diffstat (limited to 'src/eclat.c')
-rw-r--r-- | src/eclat.c | 89 |
1 files changed, 56 insertions, 33 deletions
diff --git a/src/eclat.c b/src/eclat.c index 13b8e74..30f0b70 100644 --- a/src/eclat.c +++ b/src/eclat.c @@ -271,7 +271,9 @@ struct eclat_command cmdtab[] = { { "mkimg", "create-image", "CreateImage", eclat_create_image, CMD_MOD }, { "deimg", "deregister-image", "DeregisterImage", - eclat_deregister_image, CMD_MOD|CMD_DESTR } + eclat_deregister_image, CMD_MOD|CMD_DESTR }, + { "lsattr", NULL, NULL, + eclat_lsattr, CMD_NOQRY }, }; size_t cmdcnt = sizeof(cmdtab) / sizeof(cmdtab[0]); @@ -280,7 +282,15 @@ cmdcmp(const void *a, const void *b) { struct eclat_command const *cmda = a; struct eclat_command const *cmdb = b; - return strcmp(cmda->ident, cmdb->ident); + if (cmda->name && cmdb->name) + return strcmp(cmda->name, cmdb->name); + else if (cmda->ident && cmdb->ident) + return strcmp(cmda->ident, cmdb->ident); + else if (cmda->ident || cmda->name) + return 127; + else if (cmdb->ident || cmdb->name) + return -127; + return 0; } static void @@ -370,11 +380,13 @@ listcmd(char *fmt) continue; } - if (p != start) - fmtstr(start, p - start); - fmtstr(s[0], l[0]); - printf("%s", str); - fmtstr(s[1], l[1]); + if (str) { + if (p != start) + fmtstr(start, p - start); + fmtstr(s[0], l[0]); + printf("%s", str); + fmtstr(s[1], l[1]); + } start = p = end; } else { p++; @@ -393,11 +405,12 @@ listcmdhook() printf("Available commands\n"); printf("Eclat name EC2 Name\n"); printf("-----------+---------\n"); - for (cp = cmdtab; cp < cmdtab + cmdcnt; cp++) - if (cp->name) - printf(" %-10s %s\n", cp->name, cp->ident); - else - printf(" %10s %s\n", "", cp->ident); + for (cp = cmdtab; cp < cmdtab + cmdcnt; cp++) { + printf(" %-10s", cp->name ? cp->name : ""); + if (cp->ident) + printf (" %s", cp->ident); + putchar ('\n'); + } printf("\nRun \"%s COMMAND --help\" to get help on a particular command.\n", program_name); @@ -439,8 +452,10 @@ find_command_name(const char *name) struct eclat_command *cp, *match = NULL; for (cp = cmdtab; cp < cmdtab + cmdcnt; cp++) { - if (strcmp(cp->name, name) == 0) + if (cp->name && strcmp(cp->name, name) == 0) return cp; + if (!cp->ident) + continue; switch (ident_matches(cp->ident, name)) { case NO_MATCH: break; @@ -472,7 +487,8 @@ print_matching_commands(const char *pat) size_t patlen = strlen (pat); for (cp = cmdtab; cp < cmdtab + cmdcnt; cp++) { - if (cp->name && strlen (cp->name) >= patlen && memcmp (cp->name, pat, patlen) == 0) + if (cp->name && strlen (cp->name) >= patlen && + memcmp (cp->name, pat, patlen) == 0) printf("%s\n", cp->name); if (ident_matches(cp->ident, pat) != NO_MATCH) printf("%s\n", cp->ident); @@ -701,7 +717,7 @@ read_format(struct eclat_command *cmd) char *filename; kwe[0] = "command"; - kwe[1] = cmd->ident; + kwe[1] = cmd->ident ? cmd->ident : cmd->name; kwe[2] = "action"; kwe[3] = cmd->tag; kwe[4] = NULL; @@ -735,7 +751,29 @@ read_format(struct eclat_command *cmd) exit(EX_UNAVAILABLE); return env; } - + +int +eclat_do_command(eclat_command_env_t *env, struct eclat_command *command, + int argc, char **argv) +{ + int rc; + + if (!(command->flags & CMD_NOQRY)) { + env->query = eclat_query_create(use_ssl ? EC2_QF_HTTPS : 0, + endpoint, "/"); + eclat_query_add_param(env->query, "Action", command->tag); + } + + rc = command->handler(env, argc, argv); + + if (rc == 0 && !(command->flags & CMD_NOQRY)) { + if (!eclat_confirm(confirm_mode, + "Proceed with %s", command->ident)) + die(EX_CANCELLED, "command not confirmed"); + rc = eclat_send_query(env->curl, env->query); + } + return rc; +} int main(int argc, char **argv) @@ -888,25 +926,10 @@ main(int argc, char **argv) memset(&cmdenv, 0, sizeof(cmdenv)); cmdenv.cmd = command; cmdenv.curl = curl; - - if (!(command->flags & CMD_NOQRY)) { - cmdenv.query = eclat_query_create(use_ssl ? EC2_QF_HTTPS : 0, - endpoint, "/"); - eclat_query_add_param(cmdenv.query, "Action", command->tag); - } - - rc = command->handler(&cmdenv, argc, argv); + + rc = eclat_do_command(&cmdenv, command, argc, argv); if (rc) exit(rc); - - if (!(command->flags & CMD_NOQRY)) { - if (!eclat_confirm(confirm_mode, - "Proceed with %s", command->ident)) - die(EX_CANCELLED, "command not confirmed"); - rc = eclat_send_query(cmdenv.curl, cmdenv.query); - if (rc) - exit(rc); - } curl_easy_cleanup(curl); XML_Parse(parser, "", 0, 1); |