diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
commit | 47e6e7c84f008a53061e661f31ae96629bc694ef (patch) | |
tree | 648a07f3b5b9d67ce19b0fd72e8caa1175c98f1a /qa/src/aggrstore.c | |
download | pcp-debian/3.9.10.tar.gz |
Debian 3.9.10debian/3.9.10debian
Diffstat (limited to 'qa/src/aggrstore.c')
-rw-r--r-- | qa/src/aggrstore.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/qa/src/aggrstore.c b/qa/src/aggrstore.c new file mode 100644 index 0000000..a45dc80 --- /dev/null +++ b/qa/src/aggrstore.c @@ -0,0 +1,129 @@ +/* + * Copyright (c) 1997-2001 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2010 Ken McDonell. All Rights Reserved. + * + * Store a string value into an aggregate metric + */ + +#include <ctype.h> +#include <pcp/pmapi.h> +#include <pcp/impl.h> + +int +main(int argc, char **argv) +{ + int type = PM_CONTEXT_HOST; + int c; + int sts; + int errflag = 0; + char *host = "localhost"; + static char *usage = "[-D N] [-h hostname] metric stringvalue"; + int len; + int n; + char *namelist[1]; + pmID pmidlist[1]; + pmResult *res; + + __pmSetProgname(argv[0]); + + while ((c = getopt(argc, argv, "D:h:")) != EOF) { + switch (c) { + +#ifdef PCP_DEBUG + case 'D': /* debug flag */ + sts = __pmParseDebug(optarg); + if (sts < 0) { + fprintf(stderr, "%s: unrecognized debug flag specification (%s)\n", + pmProgname, optarg); + errflag++; + } + else + pmDebug |= sts; + break; +#endif + + case 'h': /* hostname for PMCD to contact */ + host = optarg; + break; + + case '?': + default: + errflag++; + break; + } + } + + if (errflag || optind != argc-2) { + printf("Usage: %s %s\n", pmProgname, usage); + exit(1); + } + + if ((sts = pmNewContext(type, host)) < 0) { + printf("%s: Cannot connect to PMCD on host \"%s\": %s\n", + pmProgname, host, pmErrStr(sts)); + exit(1); + } + + namelist[0] = argv[optind]; + n = pmLookupName(1, namelist, pmidlist); + if (n < 0 || pmidlist[0] == PM_ID_NULL) { + printf("pmLookupName: %s\n", pmErrStr(n)); + exit(1); + } + + if ((n = pmFetch(1, pmidlist, &res)) < 0) { + printf("pmFetch: %s\n", pmErrStr(n)); + exit(1); + } + + /* + * expecting one value and a pmValueBlock with a type + * of PM_TYPE_AGGREGATE + */ + if (res->vset[0]->numval != 1) { + printf("Expecting numval 1, found %d\n", res->vset[0]->numval); + __pmDumpResult(stdout, res); + exit(1); + } + if (res->vset[0]->valfmt == PM_VAL_INSITU) { + printf("Not expecing PM_VAL_INSITU\n"); + __pmDumpResult(stdout, res); + exit(1); + } + if (res->vset[0]->vlist[0].value.pval->vtype != PM_TYPE_AGGREGATE) { + printf("Not expecing type %s\n", pmTypeStr(res->vset[0]->vlist[0].value.pval->vtype)); + __pmDumpResult(stdout, res); + exit(1); + } + printf("%s old value: ", namelist[0]); + pmPrintValue(stdout, res->vset[0]->valfmt, res->vset[0]->vlist[0].value.pval->vtype, &res->vset[0]->vlist[0], 0); + + /* + * old value is probably from a pinned PDU buffer ... don't free + * and accept small mem leak here + */ + len = strlen(argv[optind+1]); + res->vset[0]->vlist[0].value.pval = (pmValueBlock *)malloc(len + PM_VAL_HDR_SIZE); + + res->vset[0]->vlist[0].value.pval->vtype = PM_TYPE_AGGREGATE; + res->vset[0]->vlist[0].value.pval->vlen = len + PM_VAL_HDR_SIZE; + memcpy(res->vset[0]->vlist[0].value.pval->vbuf, argv[optind+1], len); + + if ((n = pmStore(res)) < 0) { + printf("pmStore: %s\n", pmErrStr(n)); + exit(1); + } + pmFreeResult(res); + + if ((n = pmFetch(1, pmidlist, &res)) < 0) { + printf("pmFetch again: %s\n", pmErrStr(n)); + exit(1); + } + printf(" new value: "); + pmPrintValue(stdout, res->vset[0]->valfmt, res->vset[0]->vlist[0].value.pval->vtype, &res->vset[0]->vlist[0], 0); + putchar('\n'); + + pmFreeResult(res); + + exit(0); +} |