aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dscrtags.c1
-rw-r--r--src/eclat.h1
-rw-r--r--src/util.c74
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);
diff --git a/src/util.c b/src/util.c
index f906e6f..f61432d 100644
--- a/src/util.c
+++ b/src/util.c
@@ -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()

Return to:

Send suggestions and report system problems to the System administrator.