Example #1
0
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);
}
Example #2
0
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;
	}
}
Example #3
0
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);
}
Example #4
0
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);
	}
}