aboutsummaryrefslogtreecommitdiff
path: root/src/eclat.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2013-04-20 22:11:19 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2013-04-20 22:58:21 +0300
commit59849e3be117458f687e5e540dbc870aa4dfd920 (patch)
treee18dc445beb1a3c1162bdbed3c10dfccdaf3f8b8 /src/eclat.c
parent0320e20133d5f606dc65dac164b0e3731bca9b46 (diff)
downloadeclat-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.c89
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);

Return to:

Send suggestions and report system problems to the System administrator.