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 read_response(mdata_get_t *mdg) { int retries = 3; string_t *resp = dynstr_new(); for (;;) { char buf[2]; ssize_t sz = fread(&buf, 1, 1, mdg->mdg_fp); if (sz == 1) { if (buf[0] == '\n') { process_input(mdg, dynstr_cstr(resp)); dynstr_reset(resp); } else { buf[1] = '\0'; dynstr_append(resp, buf); } } else if ((sz == 0) || (sz == -1 && errno == EAGAIN)) { if (--retries == 0) errx(1, "timed out while reading metadata " "response"); sleep(1); } else { errx(1, "could not read metadata response"); } if (mdg->mdg_state == MDGS_DONE) break; } }
static int plat_send_reset(mdata_plat_t *mpl) { int ret = -1; string_t *str = dynstr_new(); dynstr_append(str, "\n"); if (plat_send(mpl, str) != 0) goto bail; dynstr_reset(str); if (plat_recv(mpl, str, 2000) != 0) goto bail; if (strcmp(dynstr_cstr(str), "invalid command") != 0) goto bail; ret = 0; bail: dynstr_free(str); return (ret); }
int main(int argc, char **argv) { char *errmsg; mdata_get_t mdg; if (argc < 2) { errx(MDEC_USAGE_ERROR, "Usage: %s <keyname>", argv[0]); } bzero(&mdg, sizeof (mdg)); mdg.mdg_keyname = strdup(argv[1]); mdg.mdg_data = dynstr_new(); if (open_metadata_stream(&mdg.mdg_fp, &errmsg) == -1) { errx(MDEC_TRY_AGAIN, "%s", errmsg); } write_get(&mdg); read_response(&mdg); print_response(&mdg); (void) fclose(mdg.mdg_fp); mdg.mdg_fp = NULL; free(mdg.mdg_keyname); if (mdg.mdg_state == MDGS_DONE) { if (mdg.mdg_response == MDGR_SUCCESS) return (MDEC_SUCCESS); else if (mdg.mdg_response == MDGR_NOTFOUND) return (MDEC_NOTFOUND); else return (MDEC_ERROR); } else { return (MDEC_TRY_AGAIN); } }