int main(int argc, char **argv) { mdata_proto_t *mdp; mdata_response_t mdr; string_t *data; const char *errmsg = NULL; if (argc < 2) { errx(MDEC_USAGE_ERROR, "Usage: %s <keyname>", argv[0]); } if (proto_init(&mdp, &errmsg) != 0) { fprintf(stderr, "ERROR: could not initialise protocol: %s\n", errmsg); return (MDEC_ERROR); } if (proto_version(mdp) < 2) { fprintf(stderr, "ERROR: host does not support DELETE\n"); return (MDEC_ERROR); } keyname = strdup(argv[1]); if (proto_execute(mdp, "DELETE", keyname, &mdr, &data) != 0) { fprintf(stderr, "ERROR: could not execute GET\n"); return (MDEC_ERROR); } return (print_response(mdr, data)); }
void mdataPut(const char *keyname, const char *value) { string_t *data; char *errmsg = NULL; mdata_response_t mdr; string_t *req = dynstr_new(); if (initialized_proto == 0) { if (proto_init(&mdp, &errmsg) != 0) { fatal(ERR_MDATA_INIT, "could not initialize metadata: %s\n", errmsg); } initialized_proto = 1; } base64_encode(keyname, strlen(keyname), req); dynstr_appendc(req, ' '); base64_encode(value, strlen(value), req); if (proto_version(mdp) < 2) { fatal(ERR_MDATA_TOO_OLD, "mdata protocol must be >= 2 for PUT"); } if (proto_execute(mdp, "PUT", dynstr_cstr(req), &mdr, &data) != 0) { fatal(ERR_MDATA_FAIL, "failed to PUT"); } dynstr_free(req); dlog("MDATA PUT %s=%s\n", keyname, value); }
void mdataDelete(const char *keyname) { string_t *data; char *errmsg = NULL; mdata_response_t mdr; if (initialized_proto == 0) { if (proto_init(&mdp, &errmsg) != 0) { fatal(ERR_MDATA_INIT, "could not initialize metadata: %s\n", errmsg); } initialized_proto = 1; } if (proto_version(mdp) < 2) { fatal(ERR_MDATA_TOO_OLD, "mdata protocol must be >= 2 for DELETE"); } if (proto_execute(mdp, "DELETE", keyname, &mdr, &data) != 0) { fatal(ERR_MDATA_FAIL, "failed to DELETE"); } dlog("MDATA DELETE %s\n", keyname); }
/* * Contact the hypervisor metadata agent and request the value for the provided * key name. Returns a C string if a value is found, NULL if no value is * found, or aborts the program on any other condition. The caller is expected * to call free(3C) on the returned string. */ char * mdataGet(const char *keyname) { char *errmsg = NULL; string_t *mdata = NULL; mdata_response_t mdr; char *out; if (initialized_proto == 0) { if (proto_init(&mdp, &errmsg) != 0) { fatal(ERR_MDATA_INIT, "could not initialize metadata: %s\n", errmsg); } initialized_proto = 1; } if (proto_execute(mdp, "GET", keyname, &mdr, &mdata) != 0) { fatal(ERR_UNEXPECTED, "failed to get metadata for '%s': unknown " "error\n", keyname); } switch (mdr) { case MDR_SUCCESS: if ((out = strdup(dynstr_cstr(mdata))) == NULL) { fatal(ERR_STRDUP, "strdup failure\n"); } dynstr_free(mdata); dlog("MDATA %s=%s\n", keyname, out); return (out); case MDR_NOTFOUND: dlog("INFO no metadata for '%s'\n", keyname); dynstr_free(mdata); return (NULL); case MDR_UNKNOWN: fatal(ERR_MDATA_FAIL, "failed to get metadata for '%s': %s\n", keyname, dynstr_cstr(mdata)); break; case MDR_INVALID_COMMAND: fatal(ERR_MDATA_FAIL, "failed to get metadata for '%s': %s\n", keyname, "host does not support GET"); break; default: fatal(ERR_UNEXPECTED, "GET[%s]: unknown response\n", keyname); break; } /* NOTREACHED */ abort(); return (NULL); }