diff options
-rw-r--r-- | src/dscrtags.c | 1 | ||||
-rw-r--r-- | src/eclat.h | 1 | ||||
-rw-r--r-- | src/util.c | 74 |
3 files changed, 75 insertions, 1 deletions
diff --git a/src/dscrtags.c b/src/dscrtags.c index 6dc200c..92c45dd 100644 --- a/src/dscrtags.c +++ b/src/dscrtags.c @@ -63,6 +63,7 @@ eclat_describe_tags(CURL *curl, int argc, char **argv) parse_options(argc, argv, &i); argv += i; argc -= i; + translate_resource_ids(argc, argv); q = describe_query_create(curl, "DescribeTags", argc, argv, NULL); return eclat_send_query(curl, q); diff --git a/src/eclat.h b/src/eclat.h index 5abf933..96068d9 100644 --- a/src/eclat.h +++ b/src/eclat.h @@ -103,6 +103,7 @@ struct filter_descr *available_filters; void list_filters(FILE *fp); int get_scr_cols(void); void translate_ids(int argc, char **argv, const char *mapname); +void translate_resource_ids(int argc, char **argv); int get_access_creds(const char *id, char **access_key_ptr, char **secret_key_ptr); @@ -26,7 +26,7 @@ translate_ids(int argc, char **argv, const char *mapname) { int i; struct eclat_map *map; - char *val; + char *val, *p; if (!translate_option) return; @@ -50,6 +50,78 @@ translate_ids(int argc, char **argv, const char *mapname) } } } + +char * +eclat_stpcpy(char *p, char *q) +{ + while (*p = *q++) + ++p; + return p; +} + +#define RESOURCE_ID_PFX "resource-id=" +#define RESOURCE_ID_LEN (sizeof(RESOURCE_ID_PFX) - 1) + +void +translate_resource_ids(int argc, char **argv) +{ + int i, j, rc, ecnt; + size_t len; + struct eclat_map *map; + char *val, *p, *mapname; + struct wordsplit ws; + int wsflags = WRDSF_DEFFLAGS|WRDSF_DELIM; + + if (!translate_option) + return; + ws.ws_delim = ","; + for (i = 0; i < argc; i++) { + if (strncmp(argv[i], RESOURCE_ID_PFX, RESOURCE_ID_LEN)) + continue; + if (wordsplit(argv[i] + RESOURCE_ID_LEN, &ws, wsflags)) + die(EX_SOFTWARE, + "error expanding argument %s: %s", + argv[i] + RESOURCE_ID_LEN, + wordsplit_strerror(&ws)); + wsflags |= WRDSF_REUSE; + for (j = 0, ecnt = 0; j < ws.ws_wordc; j++) { + if (!(p = strchr(ws.ws_wordv[j], ':'))) + continue; + *p++ = 0; + map = eclat_map_lookup(ws.ws_wordv[j]); + if (!map) + die(EX_UNAVAILABLE, "no such map: %s", + ws.ws_wordv[j]); + if (eclat_map_open(map) != eclat_map_ok) + exit(EX_UNAVAILABLE); + rc = eclat_map_get(map, p, &val); + if (rc != eclat_map_ok) { + die(EX_UNAVAILABLE, + "cannot translate %s using map %s: %s", + p, ws.ws_wordv[j], eclat_map_strerror(rc)); + } + free(ws.ws_wordv[j]); + ws.ws_wordv[j] = val; + ecnt++; + } + if (ecnt == 0) + continue; + len = RESOURCE_ID_LEN + ws.ws_wordc - 1; + for (j = 0; j < ws.ws_wordc; j++) + len += strlen(ws.ws_wordv[j]); + val = grecs_malloc(len + 1); + strcpy(val, RESOURCE_ID_PFX); + p = val + RESOURCE_ID_LEN; + for (j = 0; j < ws.ws_wordc; j++) { + if (j) + *p++ = ','; + p = eclat_stpcpy(p, ws.ws_wordv[j]); + } + argv[i] = val; + } + if (wsflags & WRDSF_REUSE) + wordsplit_free(&ws); +} int get_scr_cols() |