summaryrefslogtreecommitdiff
path: root/qa/src/pducheck.c
diff options
context:
space:
mode:
Diffstat (limited to 'qa/src/pducheck.c')
-rw-r--r--qa/src/pducheck.c1512
1 files changed, 1512 insertions, 0 deletions
diff --git a/qa/src/pducheck.c b/qa/src/pducheck.c
new file mode 100644
index 0000000..376bdf7
--- /dev/null
+++ b/qa/src/pducheck.c
@@ -0,0 +1,1512 @@
+/*
+ * Copyright (c) 1997-2002 Silicon Graphics, Inc. All Rights Reserved.
+ */
+
+/*
+ * Mongo PDU conversion exerciser --
+ * + if run standalone uses Send and Recv down its own pipe.
+ * + if run remotely uses pdu-server at other end to echo PDUs
+ */
+
+#include <pcp/pmapi.h>
+#include <pcp/impl.h>
+#include <pcp/trace.h>
+#include <pcp/trace_dev.h>
+#include <math.h>
+#include "localconfig.h"
+
+static int fd[2];
+static int standalone = 1;
+static int e;
+static pmID pmidlist[6];
+
+/*
+ * warning:
+ * instlist[], namelist[] and statlist[] must have the same number
+ * of elements!
+ */
+
+static int instlist[] = {
+ 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024
+};
+
+static char *namelist[] = {
+ /* 1 */ "alpha",
+ /* 2 */ "beta",
+ /* 4 */ "gamma",
+ /* 8 */ "long-non-greek-letter-name-in-the-middle",
+ /* 16 */ "delta",
+ /* 32 */ "epsilon",
+ /* 64 */ "phi",
+ /* 128 */ "mu",
+ /* 256 */ "lambda",
+ /* 512 */ "omega",
+ /* 1024 */ "theta"
+};
+
+static int statlist[] = {
+ -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5
+};
+
+static struct {
+ int inst;
+ char *name;
+} indomlist[] = {
+ { 0xdead, NULL },
+ { 0, "fisho" },
+ { 0, NULL }
+};
+
+static pmDesc desc = {
+ 0xdeadbeef, PM_TYPE_64, 0xface, PM_SEM_COUNTER,
+ { 1, -1 , 0, PM_SPACE_MBYTE, PM_TIME_HOUR, 0 }
+};
+
+__pmLoggerStatus logstat;
+
+static int timeout = TIMEOUT_DEFAULT;
+static int iter = 5;
+static int pass;
+
+static long
+foorand(void)
+{
+ static long rn[] = {
+ 851401618, 1804928587, 758783491, 959030623, 684387517, 1903590565,
+ 33463914, 1254324197, 342241519, 824023566, 1483920592, 126398554,
+ 1932422408, 351212254, 341603450, 1144747756, 1297389768, 1251336619,
+ 579758561, 838545539, 630072926, 1594243340, 641078858, 162216788,
+ 869693583, 1841205112, 2022861571, 1423418003, 1817792895, 5916492,
+ 992951867, 1143741253, 1691952160, 570397931, 2110444415, 658816051,
+ 1290326580, 1307206911, 456208845, 1902445306, 654246144, 326116574,
+ 725123414, 832100416, 1382141583, 1618243337, 1296255701, 1141662977,
+ 986468767, 1401208270, 702616199, 2032315143, 790359597, 2026989069,
+ 15952070, 1109389944, 585771160, 52182039, 1271212614, 440155785
+ };
+ static int cnum = sizeof(rn) / sizeof (long);
+ static int cur=-1;
+
+
+ cur = (cur+1) % cnum;
+ return (rn[cur]);
+}
+
+static void
+_z(void)
+{
+ __pmPDU *pb;
+ __pmTracePDU *tpb;
+ int i;
+ int j;
+ int k;
+ int n;
+ pmID pmid;
+ pmResult *rp;
+ pmValueBlock myvb;
+ pmValueBlock *gvbp;
+ pmValueBlock *xvbp;
+ pmAtomValue av;
+ int ident;
+ int type;
+ char *buffer;
+ int control;
+ int attr;
+ int rate;
+ int state;
+ int num;
+ pmID *pmidp;
+ __pmInResult inres;
+ __pmInResult *inresp;
+ pmInDom indom;
+ int inst;
+ pmDesc result_desc;
+ pmDesc *descp = &result_desc;
+ int ctxnum;
+ __pmTimeval now;
+ __pmProfile curprof;
+ __pmInDomProfile idp[2];
+ __pmProfile *profp;
+ pmResult *resp;
+ int code;
+ int nv;
+ int sav_nv;
+ int sav_np;
+ int sender;
+ int count;
+ char *vp;
+ __pmCred increds[1];
+ __pmCred *outcreds;
+ char *resname;
+ char **resnamelist;
+ int *resstatlist;
+ __pmLoggerStatus *lsp;
+ double pi = M_PI;
+ char mytag[10];
+ /*
+ * use pid as "from" context for backwards compatibility to
+ * keep QA tests happy, rather than FROM_ANON which would be
+ * the more normal value for this usage.
+ */
+ pid_t mypid = getpid();
+
+/* PDU_ERROR */
+ for (i = -1; i < 2; i += 2) {
+ if ((e = __pmSendError(fd[1], mypid, i * PM_ERR_GENERIC)) < 0) {
+ fprintf(stderr, "Error: SendError: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvError: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvError: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_ERROR) {
+ fprintf(stderr, "Error: RecvError: %s wrong type PDU!\n", __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ __pmOverrideLastFd(PDU_OVERRIDE2);
+ if ((e = __pmDecodeError(pb, &code)) < 0) {
+ fprintf(stderr, "Error: DecodeError: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if (code != i * PM_ERR_GENERIC)
+ fprintf(stderr, "Botch: Error: code: got: 0x%x expect: 0x%x\n",
+ code, i * PM_ERR_GENERIC);
+ }
+ }
+ }
+ }
+
+/* PDU_RESULT */
+ resp = NULL;
+ num = 7; /* the _maximum_ number of merics we have */
+ rp = (pmResult *)malloc(sizeof(*rp) + (num -1)*sizeof(pmValueSet *));
+ rp->timestamp.tv_sec = 30 * 60 * 60; /* 30 hrs after the epoch */
+ rp->timestamp.tv_usec = 123456; /* plus a gnat */
+ i = 0;
+ /* singular instance, insitu value */
+ rp->vset[i] = (pmValueSet *)malloc(sizeof(*rp->vset[0]));
+ rp->vset[i]->pmid = 0xdead;
+ rp->vset[i]->numval = 1;
+ rp->vset[i]->valfmt = PM_VAL_INSITU;
+ rp->vset[i]->vlist[0].inst = PM_IN_NULL;
+ rp->vset[i]->vlist[0].value.lval = 1234;
+ i++;
+ /* 3 instances, all values insitu */
+ rp->vset[i] = (pmValueSet *)malloc(sizeof(*rp->vset[1])+2*sizeof(pmValue));
+ rp->vset[i]->pmid = 0xbeef;
+ rp->vset[i]->numval = 3;
+ rp->vset[i]->valfmt = PM_VAL_INSITU;
+ rp->vset[i]->vlist[0].inst = 2;
+ rp->vset[i]->vlist[0].value.lval = 2345;
+ rp->vset[i]->vlist[1].inst = 4;
+ rp->vset[i]->vlist[1].value.lval = 3456;
+ rp->vset[i]->vlist[2].inst = 8;
+ rp->vset[i]->vlist[2].value.lval = 4567;
+ i++;
+ /* singular instance, STRING value in pmValueBlock */
+ rp->vset[i] = (pmValueSet *)malloc(sizeof(*rp->vset[0]));
+ rp->vset[i]->pmid = pmidlist[0];
+ rp->vset[i]->numval = 1;
+ rp->vset[i]->valfmt = PM_VAL_DPTR;
+ rp->vset[i]->vlist[0].inst = PM_IN_NULL;
+ rp->vset[i]->vlist[0].value.pval = &myvb;
+ rp->vset[i]->vlist[0].value.pval->vtype = PM_TYPE_STRING;
+ rp->vset[i]->vlist[0].value.pval->vlen = PM_VAL_HDR_SIZE + 2;
+ av.cp = "0";
+ if ((e = __pmStuffValue(&av, &rp->vset[i]->vlist[0], PM_TYPE_STRING)) < 0) {
+ fprintf(stderr, "Error: __pmStuffValue vset[%d] PM_TYPE_STRING: %s\n", i, pmErrStr(e));
+ exit(1);
+ }
+ rp->vset[i]->vlist[0].value.pval->vbuf[0] = '0' + pass;
+ i++;
+ /* singular instance, U64 value in pmValueBlock */
+ rp->vset[i] = (pmValueSet *)malloc(sizeof(*rp->vset[0]));
+ rp->vset[i]->pmid = pmidlist[1];
+ rp->vset[i]->numval = 1;
+ rp->vset[i]->vlist[0].inst = PM_IN_NULL;
+ av.ull = 0x8765432112345678LL;
+ if ((e = __pmStuffValue(&av, &rp->vset[i]->vlist[0], PM_TYPE_U64)) < 0) {
+ fprintf(stderr, "Error: __pmStuffValue vset[%d] PM_TYPE_U64: %s\n", i, pmErrStr(e));
+ exit(1);
+ }
+ rp->vset[i]->valfmt = e;
+ i++;
+ /* singular instance, FLOAT value in pmValueBlock */
+ rp->vset[i] = (pmValueSet *)malloc(sizeof(*rp->vset[0]));
+ rp->vset[i]->pmid = pmidlist[2];
+ rp->vset[i]->numval = 1;
+ rp->vset[i]->vlist[0].inst = PM_IN_NULL;
+ av.f = 4.3E+21;
+ if ((e = __pmStuffValue(&av, &rp->vset[i]->vlist[0], PM_TYPE_FLOAT)) < 0) {
+ fprintf(stderr, "Error: __pmStuffValue vset[%d] PM_TYPE_FLOAT: %s\n", i, pmErrStr(e));
+ exit(1);
+ }
+ rp->vset[i]->valfmt = e;
+ i++;
+ /* singular instance, DOUBLE value in pmValueBlock */
+ rp->vset[i] = (pmValueSet *)malloc(sizeof(*rp->vset[0]));
+ rp->vset[i]->pmid = pmidlist[3];
+ rp->vset[i]->numval = 1;
+ rp->vset[i]->vlist[0].inst = PM_IN_NULL;
+ av.d = 4.56E+123;
+ if ((e = __pmStuffValue(&av, &rp->vset[i]->vlist[0], PM_TYPE_DOUBLE)) < 0) {
+ fprintf(stderr, "Error: __pmStuffValue vset[%d] PM_TYPE_DOUBLE: %s\n", i, pmErrStr(e));
+ exit(1);
+ }
+ rp->vset[i]->valfmt = e;
+ i++;
+ /* no values */
+ rp->vset[i] = (pmValueSet *)malloc(sizeof(*rp->vset[0]));
+ rp->vset[i]->pmid = 0xdeadcafe;
+ rp->vset[i]->numval = PM_ERR_GENERIC;
+ i++;
+ /* done with setup, do it! */
+ rp->numpmid = i;
+ if ((e = __pmSendResult(fd[1], mypid, rp)) < 0) {
+ fprintf(stderr, "Error: SendResult: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvResult: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvResult: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_RESULT) {
+ fprintf(stderr, "Error: RecvResult: %s wrong type PDU!\n", __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmDecodeResult(pb, &resp)) < 0) {
+ fprintf(stderr, "Error: DecodeResult: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ }
+ }
+ if (resp->timestamp.tv_sec != rp->timestamp.tv_sec)
+ fprintf(stderr, "Botch: Result: tv_sec: got: %d expect: %d\n",
+ (int)resp->timestamp.tv_sec, (int)rp->timestamp.tv_sec);
+ if (resp->timestamp.tv_usec != rp->timestamp.tv_usec)
+ fprintf(stderr, "Botch: Result: tv_usec: got: %d expect: %d\n",
+ (int)resp->timestamp.tv_usec, (int)rp->timestamp.tv_usec);
+ if (resp->numpmid != rp->numpmid)
+ fprintf(stderr, "Botch: Result: numpmid: got: %d expect: %d\n",
+ resp->numpmid, rp->numpmid);
+ for (i = 0; i < rp->numpmid; i++) {
+ if (resp->vset[i]->pmid != rp->vset[i]->pmid)
+ fprintf(stderr, "Botch: Result: vset[%d].pmid: got: 0x%x expect: 0x%x\n",
+ i, resp->vset[i]->pmid, rp->vset[i]->pmid);
+ if (resp->vset[i]->numval != rp->vset[i]->numval) {
+ fprintf(stderr, "Botch: Result: vset[%d].numval: got: %d expect: %d\n",
+ i, resp->vset[i]->numval, rp->vset[i]->numval);
+ continue;
+ }
+ if (resp->vset[i]->numval < 0)
+ continue;
+ if (resp->vset[i]->valfmt != rp->vset[i]->valfmt)
+ fprintf(stderr, "Botch: Result: vset[%d].valfmt: got: %d expect: %d\n",
+ i, resp->vset[i]->valfmt, rp->vset[i]->valfmt);
+ for (j = 0; j < rp->vset[i]->numval; j++) {
+ if (resp->vset[i]->vlist[j].inst != rp->vset[i]->vlist[j].inst)
+ fprintf(stderr, "Botch: Result: vset[%d][%d].inst: got: %d expect: %d\n",
+ i, j, resp->vset[i]->vlist[j].inst,
+ rp->vset[i]->vlist[j].inst);
+ if (resp->vset[i]->valfmt != rp->vset[i]->valfmt)
+ continue;
+ if (resp->vset[i]->valfmt == PM_VAL_INSITU) {
+ if (resp->vset[i]->vlist[j].value.lval != rp->vset[i]->vlist[j].value.lval)
+ fprintf(stderr, "Botch: Result: vset[%d][%d].value.lval: got: %d expect: %d\n",
+ i, j, resp->vset[i]->vlist[j].value.lval,
+ rp->vset[i]->vlist[j].value.lval);
+ continue;
+ }
+ /* NOT insitu */
+ gvbp = resp->vset[i]->vlist[j].value.pval;
+ xvbp = rp->vset[i]->vlist[j].value.pval;
+ if (gvbp->vlen != xvbp->vlen)
+ fprintf(stderr, "Botch: Result: vset[%d][%d].value.pval->vlen: got %d expect %d\n",
+ i, j, gvbp->vlen, xvbp->vlen);
+ if (gvbp->vtype != xvbp->vtype) {
+ fprintf(stderr, "Botch: Result: vset[%d][%d].value.pval->vtype: got %d expect %d\n",
+ i, j, gvbp->vtype, xvbp->vtype);
+ continue;
+ }
+ switch (gvbp->vtype) {
+ pmAtomValue gav;
+ pmAtomValue xav;
+ case PM_TYPE_STRING:
+ if (strncmp(gvbp->vbuf, xvbp->vbuf, gvbp->vlen - sizeof(int)) != 0)
+ fprintf(stderr, "Botch: Result: vset[%d][%d].value.pval->vbuf: got \"%*.*s\" expect \"%*.*s\"\n",
+ i, j, gvbp->vlen, gvbp->vlen, gvbp->vbuf,
+ gvbp->vlen, gvbp->vlen, xvbp->vbuf);
+ break;
+ case PM_TYPE_64:
+ case PM_TYPE_U64:
+ memcpy(&gav.ull, gvbp->vbuf, sizeof(__uint64_t));
+ memcpy(&xav.ull, xvbp->vbuf, sizeof(__uint64_t));
+ if (gav.ull != xav.ull)
+ fprintf(stderr, "Botch: Result: vset[%d][%d].value.pval->ull: got %lld expect %lld\n",
+ i, j, (long long)gav.ull, (long long)xav.ull);
+ break;
+ case PM_TYPE_FLOAT:
+ memcpy(&gav.f, gvbp->vbuf, sizeof(float));
+ memcpy(&xav.f, xvbp->vbuf, sizeof(float));
+ if (gav.f != xav.f)
+ fprintf(stderr, "Botch: Result: vset[%d][%d].value.pval->ull: got %e expect %e\n",
+ i, j, (double)gav.f, (double)xav.f);
+ break;
+ case PM_TYPE_DOUBLE:
+ memcpy(&gav.d, gvbp->vbuf, sizeof(double));
+ memcpy(&xav.d, xvbp->vbuf, sizeof(double));
+ if (gav.d != xav.d)
+ fprintf(stderr, "Botch: Result: vset[%d][%d].value.pval->ull: got %e expect %e\n",
+ i, j, gav.d, xav.d);
+ break;
+ }
+ }
+ }
+ if (resp != NULL)
+ pmFreeResult(resp);
+
+/* PDU_PROFILE */
+ n = sizeof(instlist) / sizeof(instlist[0]);
+ curprof.state = PM_PROFILE_EXCLUDE;
+ curprof.profile_len = 2;
+ curprof.profile = idp;
+ idp[0].indom = 0xdeadcafe;
+ idp[0].state = PM_PROFILE_INCLUDE;
+ idp[0].instances_len = 1 + (foorand() % n);
+ idp[0].instances = instlist;
+ idp[1].indom = 0xface;
+ idp[1].state = PM_PROFILE_EXCLUDE;
+ idp[1].instances_len = 1 + (foorand() % n);
+ idp[1].instances = &instlist[n - idp[1].instances_len];
+ /* context no == 42 ... hack */
+ if ((e = __pmSendProfile(fd[1], mypid, 42, &curprof)) < 0) {
+ fprintf(stderr, "Error: SendProfile: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvProfile: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvProfile: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_PROFILE) {
+ fprintf(stderr, "Error: RecvProfile: %s wrong type PDU!\n", __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ profp = NULL;
+ if ((e = __pmDecodeProfile(pb, &ctxnum, &profp)) < 0) {
+ fprintf(stderr, "Error: DecodeProfile: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if (ctxnum != 42)
+ fprintf(stderr, "Botch: Profile: ctxnum: got: %d expect: %d\n",
+ ctxnum, 42);
+ if (profp == NULL)
+ fprintf(stderr, "Botch: Profile: profp is NULL!\n");
+ else {
+ if (profp->state != curprof.state)
+ fprintf(stderr, "Botch: Profile: global state: got: %d expect: %d\n",
+ profp->state, curprof.state);
+ if (profp->profile_len != curprof.profile_len)
+ fprintf(stderr, "Botch: Profile: profile_len: got: %d expect: %d\n",
+ profp->profile_len, curprof.profile_len);
+ if (profp->profile == NULL)
+ fprintf(stderr, "Botch: Profile: profp->profile is NULL!\n");
+ else {
+ for (i = 0; i < curprof.profile_len; i++) {
+ if (profp->profile[i].indom != curprof.profile[i].indom)
+ fprintf(stderr, "Botch: Profile: [%d]indom: got: 0x%x expect: 0x%x\n",
+ i, profp->profile[i].indom, curprof.profile[i].indom);
+ if (profp->profile[i].state != curprof.profile[i].state)
+ fprintf(stderr, "Botch: Profile: [%d]state: got: %d expect: %d\n",
+ i, profp->profile[i].state, curprof.profile[i].state);
+ if (profp->profile[i].instances_len != curprof.profile[i].instances_len)
+ fprintf(stderr, "Botch: Profile: [%d]instances_len: got: %d expect: %d\n",
+ i, profp->profile[i].instances_len, curprof.profile[i].instances_len);
+ else if (profp->profile[i].instances == NULL)
+ fprintf(stderr, "Botch: Profile: profp->profile[%d].instances is NULL!\n", i);
+ else {
+ for (k = 0; k <curprof.profile[i].instances_len; k++) {
+ if (profp->profile[i].instances[k] != curprof.profile[i].instances[k])
+ fprintf(stderr, "Botch: Profile: [%d]instances[%d]: got: %d expect: %d\n",
+ i, k, profp->profile[i].instances[k], curprof.profile[i].instances[k]);
+ }
+ free(profp->profile[i].instances);
+ }
+ }
+ free(profp->profile);
+ }
+ free(profp);
+ }
+ }
+ }
+ }
+
+/* PDU_FETCH */
+ n = sizeof(pmidlist) / sizeof(pmidlist[0]);
+ if (pass != 0)
+ n = 1 + (foorand() % n);
+ if ((e = __pmSendFetch(fd[1], mypid, 43, (__pmTimeval *)0, n, pmidlist)) < 0) {
+ fprintf(stderr, "Error: SendFetch: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvFetch: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvFetch: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_FETCH) {
+ fprintf(stderr, "Error: RecvFetch: %s wrong type PDU!\n", __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmDecodeFetch(pb, &ctxnum, &now, &num, &pmidp)) < 0) {
+ fprintf(stderr, "Error: DecodeFetch: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if (ctxnum != 43)
+ fprintf(stderr, "Botch: Fetch: ctxnum: got: %d expect: %d\n",
+ ctxnum, 43);
+ if (num != n)
+ fprintf(stderr, "Botch: Fetch: num: got: %d expect: %d\n",
+ num, n);
+ else {
+ for (i = 0; i < num; i++) {
+ if (pmidlist[i] != pmidp[i])
+ fprintf(stderr, "Botch: Fetch: pmidlist[%d]: got: 0x%x expect: 0x%x\n",
+ i, pmidp[i], pmidlist[i]);
+ }
+ }
+ __pmUnpinPDUBuf(pmidp);
+ }
+ }
+ }
+
+/* PDU_DESC_REQ */
+ if ((e = __pmSendDescReq(fd[1], mypid, 0xdeadbeef)) < 0) {
+ fprintf(stderr, "Error: SendDescReq: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvDescReq: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvDescReq: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_DESC_REQ) {
+ fprintf(stderr, "Error: RecvDescReq: %s wrong type PDU!\n", __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmDecodeDescReq(pb, &pmid)) < 0) {
+ fprintf(stderr, "Error: DecodeDescReq: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if (pmid != 0xdeadbeef)
+ fprintf(stderr, "Botch: DescReq: pmid: got: 0x%x expect: 0x%x\n",
+ pmid, 0xdeadbeef);
+ }
+ }
+ }
+
+/* PDU_DESC */
+ if ((e = __pmSendDesc(fd[1], mypid, &desc)) < 0) {
+ fprintf(stderr, "Error: SendDesc: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvDesc: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvDesc: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_DESC) {
+ fprintf(stderr, "Error: RecvDesc: %s wrong type PDU!\n", __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmDecodeDesc(pb, descp)) < 0) {
+ fprintf(stderr, "Error: DecodeDesc: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if (descp->pmid != desc.pmid)
+ fprintf(stderr, "Botch: Desc: pmid: got: 0x%x expect: 0x%x\n",
+ descp->pmid, desc.pmid);
+ if (descp->type != desc.type)
+ fprintf(stderr, "Botch: Desc: type: got: %d expect: %d\n",
+ descp->type, desc.type);
+ if (descp->indom != desc.indom)
+ fprintf(stderr, "Botch: Desc: indom: got: 0x%x expect: 0x%x\n",
+ descp->indom, desc.indom);
+ if (descp->sem != desc.sem)
+ fprintf(stderr, "Botch: Desc: sem: got: %d expect: %d\n",
+ descp->sem, desc.sem);
+ if (descp->units.dimSpace != desc.units.dimSpace)
+ fprintf(stderr, "Botch: Desc: dimSpace: got: %d expect: %d\n",
+ descp->units.dimSpace, desc.units.dimSpace);
+ if (descp->units.dimTime != desc.units.dimTime)
+ fprintf(stderr, "Botch: Desc: dimTime: got: %d expect: %d\n",
+ descp->units.dimTime, desc.units.dimTime);
+ if (descp->units.dimCount != desc.units.dimCount)
+ fprintf(stderr, "Botch: Desc: dimCount: got: %d expect: %d\n",
+ descp->units.dimCount, desc.units.dimCount);
+ if (descp->units.scaleSpace != desc.units.scaleSpace)
+ fprintf(stderr, "Botch: Desc: scaleSpace: got: %d expect: %d\n",
+ descp->units.scaleSpace, desc.units.scaleSpace);
+ if (descp->units.scaleTime != desc.units.scaleTime)
+ fprintf(stderr, "Botch: Desc: scaleTime: got: %d expect: %d\n",
+ descp->units.scaleTime, desc.units.scaleTime);
+ if (descp->units.scaleCount != desc.units.scaleCount)
+ fprintf(stderr, "Botch: Desc: scaleCount: got: %d expect: %d\n",
+ descp->units.scaleCount, desc.units.scaleCount);
+ }
+ }
+ }
+
+/* PDU_INSTANCE_REQ */
+ n = sizeof(indomlist) / sizeof(indomlist[0]);
+ if (pass != 0)
+ n = 1 + (foorand() % n);
+ now.tv_sec = 60 * 60 * 60; /* 60 hrs after the epoch */
+ now.tv_usec = 654321; /* plus a gnat */
+ for (i = 0; i < n; i++) {
+ __pmTimeval tmp;
+ if ((e = __pmSendInstanceReq(fd[1], mypid, &now, 0xface, indomlist[i].inst, indomlist[i].name)) < 0) {
+ fprintf(stderr, "Error: SendInstanceReq: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvInstanceReq: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvInstanceReq: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_INSTANCE_REQ) {
+ fprintf(stderr, "Error: RecvInstanceReq: %s wrong type PDU!\n", __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmDecodeInstanceReq(pb, &tmp, &indom, &inst, &resname)) < 0) {
+ fprintf(stderr, "Error: DecodeInstanceReq: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if (tmp.tv_sec != now.tv_sec || tmp.tv_usec != now.tv_usec)
+ fprintf(stderr, "Botch: InstanceReq: when: got: %d,%d expect: %d,%d\n",
+ tmp.tv_sec, tmp.tv_usec, now.tv_sec, now.tv_usec);
+ if (indom != 0xface)
+ fprintf(stderr, "Botch: InstanceReq: indom: got: 0x%x expect: 0x%x\n",
+ indom, 0xface);
+ if (inst != indomlist[i].inst)
+ fprintf(stderr, "Botch: InstanceReq: inst: got: %d expect: %d\n",
+ inst, indomlist[i].inst);
+ if (resname != (char *)0 && indomlist[i].name != (char *)0 &&
+ strcmp(resname, indomlist[i].name) != 0)
+ fprintf(stderr, "Botch: InstanceReq: name: got: \"%s\" expect: \"%s\"\n",
+ resname, indomlist[i].name);
+ if ((resname == (char *)0 || indomlist[i].name == 0) &&
+ resname != indomlist[i].name)
+ fprintf(stderr, "Botch: InstanceReq: name: got: " PRINTF_P_PFX "%p expect: " PRINTF_P_PFX "%p\n",
+ resname, indomlist[i].name);
+ if (resname != (char *)0)
+ free(resname);
+ }
+ }
+ }
+ }
+
+/* PDU_INSTANCE */
+ n = sizeof(instlist) / sizeof(instlist[0]);
+ if (pass != 0)
+ n = (foorand() % n); /* zero is ok here */
+ inres.indom = 0x1234;
+ inres.numinst = n;
+ for (k = 0; k < 3; k++) {
+
+ if (k == 0) {
+ inres.instlist = instlist;
+ inres.namelist = namelist;
+ }
+ else if (k == 1) {
+ inres.instlist = NULL;
+ inres.namelist = namelist;
+ }
+ else {
+ inres.instlist = instlist;
+ inres.namelist = NULL;
+ }
+ inresp = NULL;
+ if ((e = __pmSendInstance(fd[1], mypid, &inres)) < 0) {
+ fprintf(stderr, "Error: SendInstance: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvInstance: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvInstance: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_INSTANCE) {
+ fprintf(stderr, "Error: RecvInstance: %s wrong type PDU!\n", __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmDecodeInstance(pb, &inresp)) < 0) {
+ fprintf(stderr, "Error: DecodeInstance: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if (inresp->indom != inres.indom)
+ fprintf(stderr, "Botch: Instance: indom: got: 0x%x expect: 0x%x\n",
+ inresp->indom, inres.indom);
+ if (inresp->numinst != inres.numinst)
+ fprintf(stderr, "Botch: Instance: numinst: got: %d expect: %d\n",
+ inresp->numinst, inres.numinst);
+ else {
+ for (i = 0; i < inres.numinst; i++) {
+ if (inres.instlist != NULL &&
+ inresp->instlist[i] != inres.instlist[i])
+ fprintf(stderr, "Botch: Instance: instlist[%d]: got: %d expect: %d\n",
+ i, inresp->instlist[i], inres.instlist[i]);
+ if (inres.namelist != NULL &&
+ strcmp(inresp->namelist[i], inres.namelist[i]) != 0)
+ fprintf(stderr, "Botch: Instance: namelist[%d]: got: \"%s\" expect: \"%s\"\n",
+ i, inresp->namelist[i], inres.namelist[i]);
+ }
+ }
+ }
+ }
+ }
+ if (inresp != NULL)
+ __pmFreeInResult(inresp);
+ }
+
+/* PDU_TEXT_REQ */
+ if ((e = __pmSendTextReq(fd[1], mypid, 0x12341234, PM_TEXT_PMID|PM_TEXT_ONELINE)) < 0) {
+ fprintf(stderr, "Error: SendTextReq: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvTextReq: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvTextReq: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_TEXT_REQ) {
+ fprintf(stderr, "Error: RecvTextReq: %s wrong type PDU!\n", __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmDecodeTextReq(pb, &ident, &type)) < 0) {
+ fprintf(stderr, "Error: DecodeTextReq: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if (ident != 0x12341234)
+ fprintf(stderr, "Botch: TextReq: ident: got: 0x%x expect: 0x%x\n",
+ ident, 0x12341234);
+ if (type != (PM_TEXT_PMID|PM_TEXT_ONELINE))
+ fprintf(stderr, "Botch: TextReq: type: got: 0x%x expect: 0x%x\n",
+ type, PM_TEXT_PMID|PM_TEXT_ONELINE);
+ }
+ }
+ }
+
+/* PDU_TEXT */
+#define MARY "mary had a little lamb\nits fleece was white as snow\n"
+ if ((e = __pmSendText(fd[1], mypid, 0x43214321, MARY)) < 0) {
+ fprintf(stderr, "Error: SendText: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvText: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvText: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_TEXT) {
+ fprintf(stderr, "Error: RecvText: %s wrong type PDU!\n", __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ buffer = NULL;
+ if ((e = __pmDecodeText(pb, &ident, &buffer)) < 0) {
+ fprintf(stderr, "Error: DecodeText: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if (ident != 0x43214321)
+ fprintf(stderr, "Botch: TextReq: ident: got: 0x%x expect: 0x%x\n",
+ ident, 0x43214321);
+ if (buffer == NULL)
+ fprintf(stderr, "Botch: TextReq: buffer is NULL!\n");
+ else {
+ if (strcmp(buffer, MARY) != 0)
+ fprintf(stderr, "Botch: Text: buffer: got: \"%s\" expect: \"%s\"\n",
+ buffer, MARY);
+ free(buffer);
+ }
+ }
+ }
+ }
+
+#if PCP_VER >= 3800
+/* PDU_AUTH */
+#define USERNAME "pcpqa"
+ if ((e = __pmSendAuth(fd[1], mypid, PCP_ATTR_USERNAME, USERNAME, sizeof(USERNAME))) < 0) {
+ fprintf(stderr, "Error: SendAuth: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvAuth: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvAuth: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_AUTH) {
+ fprintf(stderr, "Error: RecvAuth: %s wrong type PDU!\n", __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ buffer = NULL;
+ if ((e = __pmDecodeAuth(pb, &attr, &buffer, &count)) < 0) {
+ fprintf(stderr, "Error: DecodeAuth: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if (attr != PCP_ATTR_USERNAME)
+ fprintf(stderr, "Botch: AuthAttr: attr: got: 0x%x expect: 0x%x\n",
+ attr, PCP_ATTR_USERNAME);
+ if (count != sizeof(USERNAME))
+ fprintf(stderr, "Botch: AuthAttr: length: got: 0x%x expect: 0x%x\n",
+ count, (int)sizeof(USERNAME));
+ if (buffer == NULL)
+ fprintf(stderr, "Botch: AuthAttr: payload is NULL!\n");
+ else {
+ if (strncmp(buffer, USERNAME, sizeof(USERNAME)) != 0)
+ fprintf(stderr, "Botch: AuthAttr: payload: got: \"%s\" expect: \"%s\"\n",
+ buffer, USERNAME);
+ }
+ }
+ }
+ }
+#endif
+
+/* PDU_CREDS */
+ sender = 0;
+ count = -1;
+ outcreds = NULL;
+ increds[0].c_type = CVERSION;
+ increds[0].c_vala = (unsigned char)PDU_VERSION;
+ increds[0].c_valb = (unsigned char)10;
+ increds[0].c_valc = (unsigned char)11;
+#ifdef PCP_DEBUG
+ if (pmDebug & DBG_TRACE_APPL0) {
+ fprintf(stderr, "0 = %x\n", *(unsigned int*)&(increds[0]));
+ }
+#endif
+ if ((e = __pmSendCreds(fd[1], mypid, 1, increds)) < 0) {
+ fprintf(stderr, "Error: SendCreds: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvCreds: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvCreds: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_CREDS) {
+ fprintf(stderr, "Error: RecvCreds: %s wrong type PDU!\n", __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ outcreds = NULL;
+ if ((e = __pmDecodeCreds(pb, &sender, &count, &outcreds)) < 0) {
+ fprintf(stderr, "Error: DecodeCreds: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (outcreds == NULL)
+ fprintf(stderr, "Botch: DecodeCreds: outcreds is NULL!\n");
+ else {
+#ifdef PCP_DEBUG
+ if (pmDebug & DBG_TRACE_APPL0) {
+ fprintf(stderr, "0 = %x\n", *(unsigned int*)&(outcreds[0]));
+ }
+#endif
+ if (outcreds[0].c_type != CVERSION)
+ fprintf(stderr, "Botch: Creds: type: got: %x expect: %x\n",
+ (unsigned int)outcreds[0].c_type, (unsigned int)CVERSION);
+ if ((outcreds[0].c_vala != (unsigned char)PDU_VERSION) ||
+ (outcreds[0].c_valb != (unsigned char)10) ||
+ (outcreds[0].c_valc != (unsigned char)11))
+ fprintf(stderr, "Botch: Creds: value mismatch (cred #0)\n");
+ if (standalone && sender != mypid)
+ fprintf(stderr, "Botch: Creds: sender pid mismatch: got:%d expect:%" FMT_PID "\n",
+ sender, mypid);
+ if (count != 1)
+ fprintf(stderr, "Botch: Creds: PDU count: got:%d expect:%d\n", count, 1);
+ if (outcreds != NULL)
+ free(outcreds);
+ }
+ }
+ }
+
+/* PDU_PMNS_IDS */
+ n = sizeof(pmidlist) / sizeof(pmidlist[0]);
+ if (pass != 0)
+ n = 1 + (foorand() % n);
+ if ((e = __pmSendIDList(fd[1], mypid, n, pmidlist, 43)) < 0) {
+ fprintf(stderr, "Error: SendIDList: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvIDList: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvIDList: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_PMNS_IDS) {
+ fprintf(stderr, "Error: RecvIDList: %s wrong type PDU!\n", __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ pmID mylist[6];
+ if ((e = __pmDecodeIDList(pb, n, mylist, &k)) < 0) {
+ fprintf(stderr, "Error: DecodeIDList: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ for (i = 0; i < n; i++) {
+ if (pmidlist[i] != mylist[i])
+ fprintf(stderr, "Botch: IDList: pmidlist[%d]: got: 0x%x expect: 0x%x\n",
+ i, mylist[i], pmidlist[i]);
+ }
+ if (k != 43)
+ fprintf(stderr, "Botch: IDList: sts: got: %d expect: %d\n",
+ k, 43);
+ }
+ }
+ }
+
+/* PDU_PMNS_NAMES */
+ n = sizeof(namelist) / sizeof(namelist[0]);
+ if (pass != 0)
+ n = 1 + (foorand() % n);
+ if ((e = __pmSendNameList(fd[1], mypid, n, namelist, statlist)) < 0) {
+ fprintf(stderr, "Error: SendNameList: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvNameList: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvNameList: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_PMNS_NAMES) {
+ fprintf(stderr, "Error: RecvNameList: %s wrong type PDU!\n", __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ resnamelist = NULL;
+ resstatlist = NULL;
+ if ((e = __pmDecodeNameList(pb, &num, &resnamelist, &resstatlist)) < 0) {
+ fprintf(stderr, "Error: DecodeNameList: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if (num != n)
+ fprintf(stderr, "Botch: NameList: num: got: %d expect: %d\n",
+ num, n);
+ if (resnamelist == NULL)
+ fprintf(stderr, "Botch: NameList: resnamelist is NULL!\n");
+ else if (resstatlist == NULL)
+ fprintf(stderr, "Botch: NameList: resstatlist is NULL!\n");
+ else {
+ for (i = 0; i < num; i++) {
+ if (strcmp(resnamelist[i], namelist[i]) != 0)
+ fprintf(stderr, "Botch: NameList: name[%d]: got: \"%s\" expect: \"%s\"\n",
+ i, resnamelist[i], namelist[i]);
+ if (resstatlist[i] != statlist[i])
+ fprintf(stderr, "Botch: NameList: stat[%d]: got: %d expect: %d\n",
+ i, resstatlist[i], statlist[i]);
+ }
+ free(resnamelist);
+ free(resstatlist);
+ }
+ }
+ }
+ }
+ /* and again, with NULL statlist */
+ if ((e = __pmSendNameList(fd[1], mypid, n, namelist, NULL)) < 0) {
+ fprintf(stderr, "Error: SendNameList-2: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvNameList-2: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvNameList-2: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_PMNS_NAMES) {
+ fprintf(stderr, "Error: RecvNameList-2: %s wrong type PDU!\n", __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ resnamelist = NULL;
+ resstatlist = NULL;
+ if ((e = __pmDecodeNameList(pb, &num, &resnamelist, &resstatlist)) < 0) {
+ fprintf(stderr, "Error: DecodeNameList-2: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if (num != n)
+ fprintf(stderr, "Botch: NameList-2: num: got: %d expect: %d\n",
+ num, n);
+ if (resstatlist != NULL) {
+ fprintf(stderr, "Botch: NameList-2: resstatlist is NOT NULL!\n");
+ free(resstatlist);
+ }
+ if (resnamelist == NULL)
+ fprintf(stderr, "Botch: NameList-2: resnamelist is NULL!\n");
+ else {
+ for (i = 0; i < num; i++) {
+ if (strcmp(resnamelist[i], namelist[i]) != 0)
+ fprintf(stderr, "Botch: NameList-2: name[%d]: got: \"%s\" expect: \"%s\"\n",
+ i, resnamelist[i], namelist[i]);
+ }
+ free(resnamelist);
+ }
+ }
+ }
+ }
+
+/* PDU_PMNS_CHILD */
+ if ((e = __pmSendChildReq(fd[1], mypid, "mumble.fumble", 1)) < 0) {
+ fprintf(stderr, "Error: SendChildReq: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvChildReq: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvChildReq: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_PMNS_CHILD) {
+ fprintf(stderr, "Error: RecvChildReq: %s wrong type PDU!\n", __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ resname = NULL;
+ if ((e = __pmDecodeChildReq(pb, &resname, &k)) < 0) {
+ fprintf(stderr, "Error: DecodeChildReq: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if (resname == NULL)
+ fprintf(stderr, "Botch: DecodeChildReq: resname is NULL!\n");
+ else {
+ if (strcmp(resname, "mumble.fumble") != 0)
+ fprintf(stderr, "Botch: DecodeChildReq: name: got: \"%s\" expect: \"%s\"\n",
+ resname, "mumble.fumble");
+ if (k != 1)
+ fprintf(stderr, "Botch: DecodeChildReq: subtype: got: %d expect: %d\n",
+ k, 1);
+ free(resname);
+ }
+ }
+ }
+ }
+
+/* PDU_PMNS_TRAVERSE */
+ if ((e = __pmSendTraversePMNSReq(fd[1], mypid, "foo.bar.snort")) < 0) {
+ fprintf(stderr, "Error: SendTraversePMNSReq: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvTraversePMNSReq: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvTraversePMNSReq: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_PMNS_TRAVERSE) {
+ fprintf(stderr, "Error: RecvTraversePMNSReq: %s wrong type PDU!\n", __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ resname = NULL;
+ if ((e = __pmDecodeTraversePMNSReq(pb, &resname)) < 0) {
+ fprintf(stderr, "Error: DecodeTraversePMNSReq: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if (resname == NULL)
+ fprintf(stderr, "Botch: DecodeTraversePMNSReq: resname is NULL!\n");
+ else {
+ if (strcmp(resname, "foo.bar.snort") != 0)
+ fprintf(stderr, "Botch: DecodeTraversePMNSReq: name: got: \"%s\" expect: \"%s\"\n",
+ resname, "mumble.fumble");
+ free(resname);
+ }
+ }
+ }
+ }
+
+/* PDU_LOG_CONTROL */
+ sav_nv = rp->vset[0]->numval;
+ sav_np = rp->numpmid;
+ for (nv = -1; nv < 2; nv++) {
+ rp->numpmid = 2; /* use only first 2 from PDU_RESULT above */
+ rp->vset[0]->numval = nv;
+ if ((e = __pmSendLogControl(fd[1], rp, PM_LOG_MANDATORY, PM_LOG_MAYBE, 1000)) < 0) {
+ fprintf(stderr, "Error: SendLogControl: numval=%d %s\n", nv, pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvLogControl: numval=%d %s\n", nv, pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvLogControl: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_LOG_CONTROL) {
+ fprintf(stderr, "Error: RecvLogControl: numval=%d %s wrong type PDU!\n", nv, __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmDecodeLogControl(pb, &resp, &control, &state, &rate)) < 0) {
+ fprintf(stderr, "Error: DecodeLogControl: numval=%d %s\n", nv, pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if (state != PM_LOG_MAYBE)
+ fprintf(stderr, "Botch: LogControl: numval=%d state: got: %d expect: %d\n",
+ nv, state, PM_LOG_MAYBE);
+ if (control != PM_LOG_MANDATORY)
+ fprintf(stderr, "Botch: LogControl: numval=%d control: got: %d expect: %d\n",
+ nv, control, PM_LOG_MANDATORY);
+ if (rate != 1000)
+ fprintf(stderr, "Botch: LogControl: numval=%d rate: got: %d expect: %d\n",
+ nv, rate, 1000);
+ if (resp->numpmid != rp->numpmid)
+ fprintf(stderr, "Botch: LogControl: numval=%d numpmid: got: %d expect: %d\n",
+ nv, resp->numpmid, rp->numpmid);
+ else {
+ for (i = 0; i < rp->numpmid; i++) {
+ if (resp->vset[i]->pmid != rp->vset[i]->pmid)
+ fprintf(stderr, "Botch: LogControl: numval=%d vset[%d].pmid: got: 0x%x expect: 0x%x\n",
+ nv, i, resp->vset[i]->pmid, rp->vset[i]->pmid);
+ if (resp->vset[i]->valfmt != rp->vset[i]->valfmt)
+ fprintf(stderr, "Botch: LogControl: numval=%d vset[%d].valfmt: got: %d expect: %d\n",
+ nv, i, resp->vset[i]->valfmt, rp->vset[i]->valfmt);
+ if (resp->vset[i]->numval != rp->vset[i]->numval)
+ fprintf(stderr, "Botch: LogControl: numval=%d vset[%d].numval: got: %d expect: %d\n",
+ nv, i, resp->vset[i]->numval, rp->vset[i]->numval);
+ else {
+ for (j = 0; j < rp->vset[i]->numval; j++) {
+ if (resp->vset[i]->vlist[j].inst != rp->vset[i]->vlist[j].inst)
+ fprintf(stderr, "Botch: LogControl: numval=%d vset[%d][%d].inst: got: %d expect: %d\n",
+ nv, i, j, resp->vset[i]->vlist[j].inst, rp->vset[i]->vlist[j].inst);
+ if (resp->vset[i]->vlist[j].value.lval != rp->vset[i]->vlist[j].value.lval)
+ fprintf(stderr, "Botch: LogControl: numval=%d vset[%d][%d].value.lval: got: %d expect: %d\n",
+ nv, i, j, resp->vset[i]->vlist[j].value.lval, rp->vset[i]->vlist[j].value.lval);
+ }
+ }
+ }
+ }
+ pmFreeResult(resp);
+ }
+ }
+ }
+ }
+ rp->vset[0]->numval = sav_nv;
+ rp->numpmid = sav_np;
+
+/* PDU_LOG_STATUS */
+ logstat.ls_start.tv_sec = 13 * 60 * 60; /* 13 hrs after the epoch */
+ logstat.ls_start.tv_usec = 12345; /* and a bit */
+ logstat.ls_last.tv_sec = 13 * 60 * 60 + 10;
+ logstat.ls_last.tv_usec = 23456;
+ logstat.ls_timenow.tv_sec = 13 * 60 * 60 + 20;
+ logstat.ls_timenow.tv_usec = 34567;
+ logstat.ls_state = PM_LOG_MAYBE;
+ logstat.ls_vol = 1;
+ logstat.ls_size = 2048;
+ strcpy(logstat.ls_hostname, "foo");
+ strcpy(logstat.ls_fqdn, "foo.bar.com");
+ strcpy(logstat.ls_tz, "TZ-THERE");
+ strcpy(logstat.ls_tzlogger, "TZ-HERE");
+ if ((e = __pmSendLogStatus(fd[1], &logstat)) < 0) {
+ fprintf(stderr, "Error: SendLogStatus: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvLogStatus: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvLogStatus: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_LOG_STATUS) {
+ fprintf(stderr, "Error: RecvLogStatus: %s wrong type PDU!\n", __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmDecodeLogStatus(pb, &lsp)) < 0) {
+ fprintf(stderr, "Error: DecodeLogStatus: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if (lsp->ls_start.tv_sec != logstat.ls_start.tv_sec)
+ fprintf(stderr, "Botch: LogStatus: ls_staty.tv_sec: got: %d expect: %d\n",
+ lsp->ls_start.tv_sec, logstat.ls_start.tv_sec);
+ if (lsp->ls_start.tv_usec != logstat.ls_start.tv_usec)
+ fprintf(stderr, "Botch: LogStatus: ls_staty.tv_usec: got: %d expect: %d\n",
+ lsp->ls_start.tv_usec, logstat.ls_start.tv_usec);
+ if (lsp->ls_last.tv_sec != logstat.ls_last.tv_sec)
+ fprintf(stderr, "Botch: LogStatus: ls_staty.tv_sec: got: %d expect: %d\n",
+ lsp->ls_last.tv_sec, logstat.ls_last.tv_sec);
+ if (lsp->ls_last.tv_usec != logstat.ls_last.tv_usec)
+ fprintf(stderr, "Botch: LogStatus: ls_staty.tv_usec: got: %d expect: %d\n",
+ lsp->ls_last.tv_usec, logstat.ls_last.tv_usec);
+ if (lsp->ls_timenow.tv_sec != logstat.ls_timenow.tv_sec)
+ fprintf(stderr, "Botch: LogStatus: ls_staty.tv_sec: got: %d expect: %d\n",
+ lsp->ls_timenow.tv_sec, logstat.ls_timenow.tv_sec);
+ if (lsp->ls_timenow.tv_usec != logstat.ls_timenow.tv_usec)
+ fprintf(stderr, "Botch: LogStatus: ls_staty.tv_usec: got: %d expect: %d\n",
+ lsp->ls_timenow.tv_usec, logstat.ls_timenow.tv_usec);
+ if (lsp->ls_state != logstat.ls_state)
+ fprintf(stderr, "Botch: LogStatus: ls_state: got: 0x%x expect: 0x%x\n",
+ lsp->ls_state, logstat.ls_state);
+ if (lsp->ls_vol != logstat.ls_vol)
+ fprintf(stderr, "Botch: LogStatus: ls_vol: got: 0x%x expect: 0x%x\n",
+ lsp->ls_vol, logstat.ls_vol);
+ if (lsp->ls_size != logstat.ls_size)
+ fprintf(stderr, "Botch: LogStatus: ls_size: got: 0x%x expect: 0x%x\n",
+ (int)lsp->ls_size, (int)logstat.ls_size);
+ if (strcmp(lsp->ls_hostname, logstat.ls_hostname) != 0)
+ fprintf(stderr, "Botch: LogStatus: ls_hostname: got: \"%s\" expect: \"%s\"\n",
+ lsp->ls_hostname, logstat.ls_hostname);
+ if (strcmp(lsp->ls_fqdn, logstat.ls_fqdn) != 0)
+ fprintf(stderr, "Botch: LogStatus: ls_fqdn: got: \"%s\" expect: \"%s\"\n",
+ lsp->ls_fqdn, logstat.ls_fqdn);
+ if (strcmp(lsp->ls_tz, logstat.ls_tz) != 0)
+ fprintf(stderr, "Botch: LogStatus: ls_tz: got: \"%s\" expect: \"%s\"\n",
+ lsp->ls_tz, logstat.ls_tz);
+ if (strcmp(lsp->ls_tzlogger, logstat.ls_tzlogger) != 0)
+ fprintf(stderr, "Botch: LogStatus: ls_tzlogger: got: \"%s\" expect: \"%s\"\n",
+ lsp->ls_tzlogger, logstat.ls_tzlogger);
+ __pmUnpinPDUBuf(pb);
+ }
+ }
+ }
+
+/* PDU_LOG_REQUEST */
+ if ((e = __pmSendLogRequest(fd[1], LOG_REQUEST_SYNC)) < 0) {
+ fprintf(stderr, "Error: SendLogRequest: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmGetPDU(fd[0], ANY_SIZE, timeout, &pb)) < 0) {
+ fprintf(stderr, "Error: RecvLogRequest: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: RecvLogRequest: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != PDU_LOG_REQUEST) {
+ fprintf(stderr, "Error: RecvLogRequest: %s wrong type PDU!\n", __pmPDUTypeStr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmDecodeLogRequest(pb, &k)) < 0) {
+ fprintf(stderr, "Error: DecodeLogRequest: %s\n", pmErrStr(e));
+ exit(1);
+ }
+ else {
+ if (k != LOG_REQUEST_SYNC)
+ fprintf(stderr, "Botch: LogRequest: request: got: 0x%x expect: 0x%x\n",
+ k, LOG_REQUEST_SYNC);
+ }
+ }
+ }
+
+/* TRACE_PDU_ACK */
+ if ((e = __pmtracesendack(fd[1], 0x41)) < 0) {
+ fprintf(stderr, "Error: tracesendack: %s\n", pmtraceerrstr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmtracegetPDU(fd[0], TRACE_TIMEOUT_DEFAULT, &tpb)) < 0) {
+ fprintf(stderr, "Error: tracegetPDU: %s\n", pmtraceerrstr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: tracegetPDU: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != TRACE_PDU_ACK) {
+ fprintf(stderr, "Error: tracegetPDU: 0x%x wrong type PDU!\n", e);
+ exit(1);
+ }
+ else {
+ if ((e = __pmtracedecodeack(tpb, &k)) < 0) {
+ fprintf(stderr, "Error: tracedecodeack: %s\n", pmtraceerrstr(e));
+ exit(1);
+ }
+ else {
+ if (k != 0x41)
+ fprintf(stderr, "Botch: traceack: request: got: 0x%x expect: 0x%x\n",
+ k, 0x41);
+ }
+ }
+ }
+
+/* TRACE_PDU_DATA */
+ strcpy(mytag, "b1+b2");
+ for (i = 5; i > 0; i--) {
+ int proto;
+ double d;
+ mytag[i] = '\0';
+ if ((e = __pmtracesenddata(fd[1], mytag, i+1, TRACE_TYPE_OBSERVE, i * pi)) < 0) {
+ fprintf(stderr, "Error: tracesenddata: %s\n", pmtraceerrstr(e));
+ exit(1);
+ }
+ else {
+ if ((e = __pmtracegetPDU(fd[0], TRACE_TIMEOUT_DEFAULT, &tpb)) < 0) {
+ fprintf(stderr, "Error: tracegetPDU: %s\n", pmtraceerrstr(e));
+ exit(1);
+ }
+ else if (e == 0) {
+ fprintf(stderr, "Error: tracegetPDU: end-of-file!\n");
+ exit(1);
+ }
+ else if (e != TRACE_PDU_DATA) {
+ fprintf(stderr, "Error: tracegetPDU: 0x%x wrong type PDU!\n", e);
+ exit(1);
+ }
+ else {
+ if ((e = __pmtracedecodedata(tpb, &vp, &j, &k, &proto, &d)) < 0) {
+ fprintf(stderr, "Error: tracedecodedata: %s\n", pmtraceerrstr(e));
+ exit(1);
+ }
+ else {
+ if (strcmp(vp, mytag) != 0)
+ fprintf(stderr, "Botch: tracedata: tag: got: \"%s\" expect: \"%s\"\n",
+ vp, mytag);
+ if (j != i+1)
+ fprintf(stderr, "Botch: tracedata: taglen: got: 0x%x expect: 0x%x\n",
+ j, i);
+ if (k != TRACE_TYPE_OBSERVE)
+ fprintf(stderr, "Botch: tracedata: type: got: 0x%x expect: 0x%x\n",
+ k, TRACE_TYPE_OBSERVE);
+ if (d != i * pi)
+ fprintf(stderr, "Botch: tracedata: value: got: %g expect: %g\n",
+ d, i * pi);
+ free(vp);
+ }
+ }
+ }
+ }
+
+ /* done with rp by now */
+ for (i = 0; i < rp->numpmid; i++) {
+ if (rp->vset[i]->numval > 0 && rp->vset[i]->valfmt == PM_VAL_DPTR) {
+ for (j = 0; j < rp->vset[i]->numval; j++) {
+ if (rp->vset[i]->vlist[j].value.pval != NULL)
+ free(rp->vset[i]->vlist[j].value.pval);
+ }
+ }
+ free(rp->vset[i]);
+ }
+ free(rp);
+
+}
+
+int
+main(int argc, char **argv)
+{
+ int c;
+ int sts;
+ int errflag = 0;
+ int port = 4323; /* default port for remote connection */
+ char *endnum;
+ __pmID_int *pmidp;
+
+ __pmSetProgname(argv[0]);
+
+ while ((c = getopt(argc, argv, "D:i:Np:?")) != EOF) {
+ switch (c) {
+ 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;
+
+ case 'i': /* iterations */
+ iter = (int)strtol(optarg, &endnum, 10);
+ if (*endnum != '\0') {
+ fprintf(stderr, "%s: -i requires numeric argument\n", pmProgname);
+ errflag++;
+ }
+ break;
+
+ case 'N': /* TIMEOUT_NEVER */
+ timeout = TIMEOUT_NEVER;
+ fprintf(stderr, "+ Using TIMEOUT_NEVER instead of TIMEOUT_DEFAULT +\n");
+ break;
+
+ case 'p': /* port */
+ port = (int)strtol(optarg, &endnum, 10);
+ if (*endnum != '\0') {
+ fprintf(stderr, "%s: -p requires numeric argument\n", pmProgname);
+ errflag++;
+ }
+ break;
+
+ case '?':
+ default:
+ errflag++;
+ break;
+ }
+ }
+
+ if (errflag || optind < argc-1) {
+ fprintf(stderr, "Usage: %s [-N] [-D n] [-i iter] [-p port] [host]\n", pmProgname);
+ exit(1);
+ }
+
+ if ((e = pmLoadNameSpace(PM_NS_DEFAULT)) < 0) {
+ fprintf(stderr, "pmLoadNameSpace: %s\n", pmErrStr(e));
+ exit(1);
+ }
+
+ if (optind == argc) {
+ /* standalone, use a pipe */
+ if (pipe(fd) < 0) {
+ perror("pipe");
+ exit(1);
+ }
+ }
+ else {
+ /* remote connection, use a TCP/IP socket */
+ char *host = argv[optind];
+ if ((e = __pmAuxConnectPMCDPort(host, port)) < 0) {
+ fprintf(stderr, "__pmAuxConnectPMCDPort(%s,%d): %s\n", host, port, pmErrStr(e));
+ exit(1);
+ }
+ fd[0] = fd[1] = e;
+ standalone = 0;
+ }
+
+ if (__pmSetVersionIPC(fd[0], PDU_VERSION) < 0 ||
+ __pmSetVersionIPC(fd[1], PDU_VERSION) < 0) {
+ fprintf(stderr, "Error: __pmSetVersionIPC: %s\n", pmErrStr(-errno));
+ exit(1);
+ }
+
+ pmidlist[0] = (pmID)0;
+ pmidlist[1] = (pmID)0;
+ pmidp = (__pmID_int *)&pmidlist[1];
+ pmidp->domain = 123;
+ pmidp->cluster = 456;
+ pmidp->item = 789;
+ pmidlist[2] = (pmID)0;
+ pmidp = (__pmID_int *)&pmidlist[2];
+ pmidp->domain = 255;
+ pmidlist[3] = (pmID)0;
+ pmidp = (__pmID_int *)&pmidlist[3];
+ pmidp->cluster = 4095;
+ pmidlist[4] = (pmID)0;
+ pmidp = (__pmID_int *)&pmidlist[4];
+ pmidp->item = 1023;
+ pmidlist[5] = PM_ID_NULL;
+
+ for (pass = 0; pass < iter; pass++) {
+ fprintf(stderr, "+++++++++++++++++++++++++++\n");
+ fprintf(stderr, "+ Mode: PDU_BINARY Pass %d +\n", pass);
+ fprintf(stderr, "+++++++++++++++++++++++++++\n");
+
+ _z();
+ }
+
+ if (standalone) {
+ __pmCloseSocket(fd[0]);
+ __pmCloseSocket(fd[1]);
+ }
+
+ exit(0);
+}