int main(int argc, char **argv) { int errflag = 0; int sts; int c; __pmSetProgname(argv[0]); indomp = (__pmInDom_int *)&indom; while ((c = getopt(argc, argv, "D:")) != 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 '?': default: errflag++; break; } } if (errflag) { fprintf(stderr, "Usage: %s [-D...] [a|b|c|d|...|i 1|2|3}\n", pmProgname); exit(1); } while (optind < argc) { if (strcmp(argv[optind], "a") == 0) _a(0, 1, 1); else if (strcmp(argv[optind], "b") == 0) _b(); else if (strcmp(argv[optind], "c") == 0) _c(); else if (strcmp(argv[optind], "d") == 0) _a(1, 0, 1); else if (strcmp(argv[optind], "e") == 0) _e(0); else if (strcmp(argv[optind], "f") == 0) _e(3600); else if (strcmp(argv[optind], "g") == 0) _g(); else if (strcmp(argv[optind], "h") == 0) _h(); else if (strcmp(argv[optind], "i") == 0) { optind++; _i(atoi(argv[optind])); } else if (strcmp(argv[optind], "j") == 0) _j(); else fprintf(stderr, "torture_cache: no idea what to do with option \"%s\"\n", argv[optind]); optind++; } exit(0); }
int main(int argc, char **argv) { int c; int sts; int errflag = 0; int max, min; static char *usage = "[-D N]"; __pmSetProgname(argv[0]); while ((c = getopt(argc, argv, "D:")) != 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 '?': default: errflag++; break; } } if (errflag || optind != argc) { printf("Usage: %s %s\n", pmProgname, usage); exit(1); } printf("%d -> %s\n", PM_SEM_COUNTER, pmSemStr(PM_SEM_COUNTER)); printf("%d -> %s\n", PM_SEM_INSTANT, pmSemStr(PM_SEM_INSTANT)); printf("%d -> %s\n", PM_SEM_DISCRETE, pmSemStr(PM_SEM_DISCRETE)); printf("\nAnd now some error cases ...\n"); max = PM_SEM_COUNTER > PM_SEM_INSTANT ? PM_SEM_COUNTER : PM_SEM_INSTANT; if (PM_SEM_DISCRETE > max) max = PM_SEM_DISCRETE; min = PM_SEM_COUNTER < PM_SEM_INSTANT ? PM_SEM_COUNTER : PM_SEM_INSTANT; if (PM_SEM_DISCRETE < min) min = PM_SEM_DISCRETE; printf("out of range high -> %s\n", pmSemStr(max + 1)); printf("out of range low -> %s\n", pmSemStr(min + 1)); exit(0); }
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); }
static void ParseOptions(int argc, char *argv[], int *nports) { int c; int sts; int usage = 0; while ((c = pmgetopt_r(argc, argv, &opts)) != EOF) { switch (c) { case 'A': /* disable pmproxy service advertising */ __pmServerClearFeature(PM_SERVER_FEATURE_DISCOVERY); break; case 'C': /* path to NSS certificate database */ certdb = opts.optarg; break; case 'D': /* debug flag */ if ((sts = __pmParseDebug(opts.optarg)) < 0) { pmprintf("%s: unrecognized debug flag specification (%s)\n", pmProgname, opts.optarg); opts.errors++; } else { pmDebug |= sts; } break; case 'f': /* foreground, i.e. do _not_ run as a daemon */ run_daemon = 0; break; case 'i': /* one (of possibly several) interfaces for client requests */ __pmServerAddInterface(opts.optarg); break; case 'l': /* log file name */ logfile = opts.optarg; break; case 'L': /* Maximum size for PDUs from clients */ sts = (int)strtol(opts.optarg, NULL, 0); if (sts <= 0) { pmprintf("%s: -L requires a positive value\n", pmProgname); opts.errors++; } else { __pmSetPDUCeiling(sts); } break; case 'p': if (__pmServerAddPorts(opts.optarg) < 0) { pmprintf("%s: -p requires a positive numeric argument (%s)\n", pmProgname, opts.optarg); opts.errors++; } else { *nports += 1; } break; case 'P': /* password file for certificate database access */ dbpassfile = opts.optarg; break; case 'U': /* run as user username */ username = opts.optarg; break; case 'x': fatalfile = opts.optarg; break; case '?': usage = 1; break; default: opts.errors++; break; } } if (usage || opts.errors || opts.optind < argc) { pmUsageMessage(&opts); if (usage) exit(0); DontStart(); } }
int main(int argc, char **argv) { pthread_t tid1; pthread_t tid2; pthread_t tid3; int sts; char *msg; int errflag = 0; int c; int i; __pmSetProgname(argv[0]); while ((c = getopt(argc, argv, "D:")) != 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 '?': default: errflag++; break; } } if (errflag || optind == argc || argc-optind > 3) { fprintf(stderr, "Usage: %s [-D...] host1 [host2 [host3]]\n", pmProgname); exit(1); } ctx1 = pmNewContext(PM_CONTEXT_HOST, argv[optind]); if (ctx1 < 0) { printf("Error: pmNewContext(%s) -> %s\n", argv[optind], pmErrStr(ctx1)); exit(1); } optind++; if (optind < argc) { ctx2 = pmNewContext(PM_CONTEXT_HOST, argv[optind]); if (ctx2 < 0) { printf("Error: pmNewContext(%s) -> %s\n", argv[optind], pmErrStr(ctx2)); exit(1); } optind++; } else ctx2 = ctx1; if (optind < argc) { ctx3 = pmNewContext(PM_CONTEXT_HOST, argv[optind]); if (ctx3 < 0) { printf("Error: pmNewContext(%s) -> %s\n", argv[optind], pmErrStr(ctx2)); exit(1); } optind++; } else ctx3 = ctx2; sts = pmLookupName(NMETRIC, namelist, pmidlist); if (sts != NMETRIC) { if (sts < 0) printf("Error: pmLookupName -> %s\n", pmErrStr(sts)); else printf("Error: pmLookupName returned %d, expected %d\n", sts, (int)(NMETRIC)); for (i = 0; i < NMETRIC; i++) { printf(" %s -> %s\n", namelist[i], pmIDStr(pmidlist[i])); } exit(1); } for (i = 0; i < NMETRIC; i++) { if ((sts = pmLookupDesc(pmidlist[i], &desclist[i])) < 0) { printf("Error: pmLookupDesc(%s) -> %s\n", namelist[i], pmErrStr(sts)); exit(1); } } sts = pthread_barrier_init(&barrier, NULL, 3); if (sts != 0) { printf("pthread_barrier_init: sts=%d\n", sts); exit(1); } sts = pthread_create(&tid1, NULL, func1, NULL); if (sts != 0) { printf("thread_create: tid1: sts=%d\n", sts); exit(1); } sts = pthread_create(&tid2, NULL, func2, NULL); if (sts != 0) { printf("thread_create: tid2: sts=%d\n", sts); exit(1); } sts = pthread_create(&tid3, NULL, func3, NULL); if (sts != 0) { printf("thread_create: tid3: sts=%d\n", sts); exit(1); } pthread_join(tid1, (void *)&msg); if (msg != NULL) printf("tid1: %s\n", msg); pthread_join(tid2, (void *)&msg); if (msg != NULL) printf("tid2: %s\n", msg); pthread_join(tid3, (void *)&msg); if (msg != NULL) printf("tid3: %s\n", msg); exit(0); }
int QedApp::getopts(const char *options) { int unknown = 0; int c, sts, errflg = 0; char *endnum, *msg; do { switch ((c = getopt(my.argc, my.argv, options))) { case 'A': /* sample alignment */ my.Aflag = optarg; continue; case 'a': my.archives.append(optarg); break; case 'D': sts = __pmParseDebug(optarg); if (sts < 0) { pmprintf("%s: unrecognized debug flag specification (%s)\n", pmProgname, optarg); errflg++; } else pmDebug |= sts; break; case 'h': my.hosts.append(optarg); break; case 'L': /* local context */ my.Lflag = 1; break; case 'n': /* alternative PMNS */ my.pmnsfile = optarg; break; case 'O': /* sample offset */ my.Oflag = optarg; break; case 'p': /* existing pmtime port */ my.port = (int)strtol(optarg, &endnum, 10); if (*endnum != '\0' || c < 0) { pmprintf("%s: -p requires a numeric argument\n", pmProgname); errflg++; } break; case 'S': /* start run time */ my.Sflag = optarg; break; case 't': /* sampling interval */ if (pmParseInterval(optarg, &my.delta, &msg) < 0) { pmprintf("%s: cannot parse interval\n%s", pmProgname, msg); free(msg); errflg++; } continue; case 'T': /* run time */ my.Tflag = optarg; break; case 'V': /* version */ printf("%s %s\n", pmProgname, pmGetConfig("PCP_VERSION")); exit(0); case 'z': /* timezone from host */ if (my.tz != NULL) { pmprintf("%s: at most one of -Z and/or -z allowed\n", pmProgname); errflg++; } my.zflag++; break; case 'Z': /* $TZ timezone */ if (my.zflag) { pmprintf("%s: at most one of -Z and/or -z allowed\n", pmProgname); errflg++; } my.tz = optarg; break; default: unknown = 1; break; } } while (!unknown); return c; }
int main(int argc, char **argv) { int s, sts, op, host; unsigned int i; char name[4*8 + 7 + 1]; /* handles full IPv6 address, if supported */ int ipv4 = -1; int ipv6 = -1; int errflag = 0; int c; __pmSockAddr *inaddr; /* trim cmd name of leading directory components */ __pmSetProgname(argv[0]); while ((c = getopt(argc, argv, "46D:?")) != EOF) { switch (c) { case '4': /* ipv4 (default) */ ipv4 = 1; break; case '6': /* ipv6 */ ipv6 = 1; break; 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 '?': default: errflag++; break; } } if (errflag) { fprintf(stderr, "Usage: %s [options]\n\ \n\ Options:\n\ -4 do IPv4 (default)\n\ -6 do IPv6\n", pmProgname); return 1; } /* defaults */ if (ipv4 == -1) ipv4 = 1; if (ipv6 == -1) ipv6 = 0; sts = 0; for (op = 0; op < WORD_BIT; op++) if ((s = __pmAccAddOp(1 << op)) < 0) { printf("Bad op %d: %s\n", op, strerror(errno)); sts = s; } if (sts < 0) return 1; for (host = 0; host < WORD_BIT; host++) { if (ipv4) { sprintf(name, "155.%d.%d.%d", host * 3, 17+host, host); if ((s = __pmAccAddHost(name, ~(1 << host), ~(1 << host), host)) < 0) { printf("cannot add inet host for op%d: %s\n", host, strerror(s)); sts = s; } } if (ipv6) { sprintf(name, "fec0::%x:%x:%x:%x:%x:%x", host * 3, 17+host, host, host * 3, 17+host, host); if ((s = __pmAccAddHost(name, ~(1 << host), ~(1 << host), host)) < 0) { printf("cannot add IPv6 host for op%d: %s\n", host, strerror(s)); sts = s; } } } if (sts < 0) return 1; putc('\n', stderr); putc('\n', stderr); __pmAccDumpHosts(stderr); putc('\n', stderr); if (ipv4) { for (host = 0; host < WORD_BIT; host++) { int j; for (j = 0; j <= host; j++) { char buf[20]; sprintf(buf, "%d.%d.%d.%d", 155, host * 3, 17+host, host); if ((inaddr =__pmStringToSockAddr(buf)) == NULL) { printf("insufficient memory\n"); continue; } sts = __pmAccAddClient(inaddr, &i); __pmSockAddrFree(inaddr); if (sts < 0) { if (j == host && sts == PM_ERR_CONNLIMIT) continue; printf("add inet client from host %d (j=%d): %s\n", j, host, pmErrStr(sts)); continue; } else if (i != (~(1 << host))) printf("inet host %d: __pmAccAddClient returns denyOpsResult 0x%x (expected 0x%x)\n", host, i, ~(1 << host)); } } } if (ipv6) { for (host = 0; host < WORD_BIT; host++) { int j; for (j = 0; j <= host; j++) { char buf[4*8 + 7 + 1]; /* handles full IPv6 address */ sprintf(buf, "fec0::%x:%x:%x:%x:%x:%x", host * 3, 17+host, host, host * 3, 17+host, host); if ((inaddr =__pmStringToSockAddr(buf)) == NULL) { printf("insufficient memory\n"); continue; } sts = __pmAccAddClient(inaddr, &i); __pmSockAddrFree(inaddr); if (sts < 0) { if (j == host && sts == PM_ERR_CONNLIMIT) continue; printf("add IPv6 client from host %d (j=%d): %s\n", j, host, pmErrStr(sts)); continue; } else if (i != (~(1 << host))) printf("IPv6 host %d: __pmAccAddClient returns denyOpsResult 0x%x (expected 0x%x)\n", host, i, ~(1 << host)); } } } putc('\n', stderr); putc('\n', stderr); __pmAccDumpHosts(stderr); putc('\n', stderr); return 0; }
int main(int argc, char **argv) { int sts; int c; int help = 0; int oneline = 0; char *pmnsfile = PM_NS_DEFAULT; int errflag = 0; int aflag = 0; int eflag = 0; int allpmid = 0; int allindom = 0; char *filename; char *tp; char *name; int id; int next_type; char *endnum; __pmSetProgname(argv[0]); while ((c = getopt(argc, argv, "D:eHin:Opv:?")) != 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 'e': /* help text exists? */ eflag = 1; break; case 'H': /* help text */ help = 1; break; case 'i': aflag++; allindom = 1; break; case 'n': /* alternative namespace file */ pmnsfile = optarg; break; case 'O': /* oneline text */ oneline = 1; break; case 'p': aflag++; allpmid = 1; break; case 'v': /* version 2 only these days */ version = (int)strtol(optarg, &endnum, 10); if (*endnum != '\0') { fprintf(stderr, "%s: -v requires numeric argument\n", pmProgname); errflag++; } if (version != 2) { fprintf(stderr ,"%s: deprecated option - only version 2 is supported\n" , pmProgname); errflag++; } break; case '?': default: errflag++; break; } } if (optind == argc) { fprintf(stderr, "%s: missing helpfile argument\n\n", pmProgname); errflag = 1; } if (aflag && optind < argc-1) { fprintf(stderr, "%s: metricname arguments cannot be used with -i or -p\n\n", pmProgname); errflag = 1; } if (aflag == 0 && optind == argc-1 && oneline+help != 0) { fprintf(stderr, "%s: -O or -H require metricname arguments or -i or -p\n\n", pmProgname); errflag = 1; } if (eflag && (allpmid || allindom)) { fprintf(stderr, "%s: -e cannot be used with -i or -p\n\n", pmProgname); errflag = 1; } if (errflag || optind >= argc) { fprintf(stderr, "Usage: %s helpfile\n" " %s [options] helpfile [metricname ...]\n" "\n" "Options:\n" " -e exists check, only report metrics with no help text\n" " -H display verbose help text\n" " -i process all the instance domains\n" " -n pmnsfile use an alternative PMNS\n" " -O display the one line help summary\n" " -p process all the metrics (PMIDs)\n" " -v version deprecated (only version 2 format supported)\n" "\n" "No options implies silently check internal integrity of the helpfile.\n", pmProgname, pmProgname); exit(1); } filename = argv[optind++]; if ((handle = pmdaOpenHelp(filename)) < 0) { fprintf(stderr, "pmdaOpenHelp: failed to open \"%s\": ", filename); if (handle == -EINVAL) fprintf(stderr, "Bad format, not version %d PCP help text\n", version); else fprintf(stderr, "%s\n", pmErrStr(handle)); exit(1); } if ((sts = pmLoadASCIINameSpace(pmnsfile, 1)) < 0) { fprintf(stderr, "pmLoadASCIINameSpace(%s, 1): %s\n", pmnsfile, pmErrStr(sts)); exit(1); } if (help + oneline == 0 && (optind < argc || aflag)) /* if metric names, -p or -i => -O is default */ oneline = 1; if (optind == argc && aflag == 0) /* no metric names, process all entries */ aflag = 1; if (eflag) { if (optind == argc) { sts = pmTraversePMNS("", dometric); if (sts < 0) { fprintf(stderr, "Error: pmTraversePMNS(\"\", ...): %s\n", pmErrStr(sts)); } } else { for ( ; optind < argc; optind++) { sts = pmTraversePMNS(argv[optind], dometric); if (sts < 0) fprintf(stderr, "Error: pmTraversePMNS(\"%s\", ...): %s\n", argv[optind], pmErrStr(sts)); } } exit(0); } while (optind < argc || aflag) { if (aflag) { if (next(&id, &next_type) == 0) break; #ifdef PCP_DEBUG if ((pmDebug & DBG_TRACE_APPL0) && allindom+allpmid == 0) fprintf(stderr, "next_type=%d id=0x%x\n", next_type, id); #endif if (next_type == 2) { if (!allindom) continue; printf("\nInDom %s:", pmInDomStr((pmInDom)id)); } else { char **names; if (!allpmid) continue; printf("\nPMID %s", pmIDStr((pmID)id)); sts = pmNameAll(id, &names); if (sts > 0) { printf(" "); __pmPrintMetricNames(stdout, sts, names, " or "); free(names); } putchar(':'); } } else { next_type = 1; name = argv[optind++]; if ((sts = pmLookupName(1, &name, (pmID *)&id)) < 0) { printf("\n%s: %s\n", name, pmErrStr(sts)); continue; } if (id == PM_ID_NULL) { printf("\n%s: unknown metric\n", name); continue; } printf("\nPMID %s %s:", pmIDStr((pmID)id), name); } if (oneline) { if (next_type == 1) tp = pmdaGetHelp(handle, (pmID)id, PM_TEXT_ONELINE); else tp = pmdaGetInDomHelp(handle, (pmInDom)id, PM_TEXT_ONELINE); if (tp != NULL) printf(" %s", tp); putchar('\n'); } if (help) { if (next_type == 1) tp = pmdaGetHelp(handle, (pmID)id, PM_TEXT_HELP); else tp = pmdaGetInDomHelp(handle, (pmInDom)id, PM_TEXT_HELP); if (tp != NULL && *tp) printf("%s\n", tp); } } return 0; }
int main(int argc, char **argv) { int c; int sts; int errflag = 0; struct timeval delta = { 2, 500000 }; struct timeval now; __pmSetProgname(argv[0]); while ((c = getopt(argc, argv, "D:?")) != 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 '?': default: errflag++; break; } } if (errflag) { fprintf(stderr, "Usage: %s options ...\n\ \n\ Options\n\ -D debug standard PCP debug flag\n", pmProgname); exit(1); } __pmAFblock(); gettimeofday(&start, NULL); reg[0] = __pmAFregister(&delta, NULL, onevent); delta.tv_sec = 1; reg[1] = __pmAFregister(&delta, NULL, onevent); delta.tv_sec = 0; delta.tv_usec = 0; reg[2] = __pmAFregister(&delta, NULL, onevent); delta.tv_sec = 60; /* will never fire */ reg[3] = __pmAFregister(&delta, NULL, onevent); __pmAFunblock(); for ( ; ; ) { fflush(stderr); pause(); if (pmDebug & DBG_TRACE_AF) { gettimeofday(&now, NULL); fprintf(stderr, "returned from pause(): "); printstamp(&now); fputc('\n', stderr); } } }
int main(int argc, char *argv[]) { int ctx; int sts; int c; int a; int lflag = 0; int errflag = 0; static char *usage = "[-l] [-D debugopts]"; __pmSetProgname(argv[0]); while ((c = getopt(argc, argv, "D:l")) != 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 'l': /* linger when done */ lflag = 1; break; case '?': default: errflag++; break; } } if (errflag) { printf("Usage: %s %s\n", pmProgname, usage); exit(1); } fprintf(stderr, "Error expected ...\n"); if ((sts = __pmSetClientId("no context yet, bozo")) < 0) { fprintf(stderr, "__pmSetClientId(...): %s\n", pmErrStr(sts)); } if ((ctx = pmNewContext(PM_CONTEXT_HOST, "localhost")) < 0) { fprintf(stderr, "pmNewContext(..., \"localhost\"): %s\n", pmErrStr(ctx)); exit(1); } for (a = optind; a < argc; a++) { char *cp; cp = (char *)malloc(strlen(argv[a])+strlen(TAG)+1); strcpy(cp, TAG); strcat(cp, argv[a]); if ((sts = __pmSetClientId(cp)) < 0) { fprintf(stderr, "__pmSetClientId(%s): %s\n", cp, pmErrStr(sts)); } else { sts = system("pminfo -f pmcd.client.whoami"); if (sts != 0) fprintf(stderr, "Warning: pminfo command: exit status %d\n", sts); } free(cp); } if (lflag) pause(); exit(0); }
void getargs(int argc, char **argv) { #ifdef PCP_DEBUG static char *debug = "[-D N]"; #else static char *debug = ""; #endif static char *usage = " [-h hostname] [-n pmnsfile] " "[-i iterations] [-t refresh] [-v] " "metric [metric ...]"; int errflag = 0; char *endnum; int c; int i; int sts; __pmSetProgname(argv[0]); while ((c = getopt(argc, argv, "D:h:n:i:t:v")) != 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 'i': /* iterations */ iterations = (int)strtol(optarg, &endnum, 10); if (*endnum != '\0') { fprintf(stderr, "%s: -i requires numeric argument\n", pmProgname); errflag++; } break; case 'n': /* alternative name space file */ pmnsfile = optarg; break; case 't': refresh = (int)strtol(optarg, &endnum, 10); if (*endnum != '\0') { fprintf(stderr, "%s: -t requires numeric argument\n", pmProgname); errflag++; } break; case 'v': verbose = 1; break; case '?': default: errflag++; break; } } if (errflag) { USAGE: fprintf(stderr, "Usage: %s %s%s\n", pmProgname, debug, usage); exit(1); } /* non-flag args are argv[optind] ... argv[argc-1] */ if (optind >= argc) goto USAGE; /* note metrics and dump them out */ for (i = 0; i < argc - optind; i++) { metrics[i] = argv[optind+i]; if (strncmp(metrics[i], "hotproc.", 8) == 0) { if (i > 0 && !is_hotproc) { printf("%s: Error: all metrics should be from same agent\n", pmProgname); exit(1); } is_hotproc = 1; } else if (strncmp(metrics[i], "proc.", 5) == 0) { if (i > 0 && is_hotproc) { printf("%s: Error: all metrics should be from same agent\n", pmProgname); exit(1); } is_hotproc = 0; } else { printf("%s: Error: all metrics should be from " "proc or hotproc agent: %s\n", pmProgname, metrics[i]); exit(1); } printf("metrics[%d] = <%s>\n", i, metrics[i]); } nmetrics = i; if (nmetrics <= 0) goto USAGE; }
int main(int argc, char **argv) { int n; int c; int i; int sts; char *pmnsfile = PM_NS_DEFAULT; char *fname = NULL; char pathname[MAXPATHLEN]; FILE *inf; char buf[MAXENTRY+MAXLINE]; char *endnum; char *bp; char *p; int skip; help_idx_t hdr; while ((c = pmgetopt_r(argc, argv, &opts)) != EOF) { switch (c) { case 'D': /* debug flag */ if ((sts = __pmParseDebug(opts.optarg)) < 0) { pmprintf("%s: unrecognized debug flag specification (%s)\n", pmProgname, opts.optarg); opts.errors++; } else pmDebug |= sts; break; case 'n': /* alternative namespace file */ pmnsfile = opts.optarg; break; case 'o': /* alternative output file name */ fname = opts.optarg; break; case 'V': /* more chit-chat */ verbose++; break; case 'v': /* version 2 only these days */ version = (int)strtol(opts.optarg, &endnum, 10); if (*endnum != '\0') { pmprintf("%s: -v requires numeric argument\n", pmProgname); opts.errors++; } if (version != 2) { pmprintf("%s: deprecated option - only version 2 is supported\n", pmProgname); opts.errors++; } break; case '?': default: opts.errors++; break; } } if (opts.errors) { pmUsageMessage(&opts); exit(2); } if ((n = pmLoadNameSpace(pmnsfile)) < 0) { fprintf(stderr, "%s: pmLoadNameSpace: %s\n", pmProgname, pmErrStr(n)); exit(2); } do { if (opts.optind < argc) { filename = argv[opts.optind]; if ((inf = fopen(filename, "r")) == NULL) { perror(filename); exit(2); } if (fname == NULL) fname = filename; } else { if (fname == NULL) { fprintf(stderr, "%s: need either a -o option or a filename " "argument to name the output file\n", pmProgname); exit(2); } filename = "<stdin>"; inf = stdin; } if (version == 2 && f == NULL) { sprintf(pathname, "%s.pag", fname); if ((f = fopen(pathname, "w")) == NULL) { fprintf(stderr, "%s: fopen(\"%s\", ...) failed: %s\n", pmProgname, pathname, osstrerror()); exit(2); } /* header: 2 => pag cf 1 => dir */ fprintf(f, "PcPh2%c\n", '0' + version); } bp = buf; skip = 1; for ( ; ; ) { if (fgets(bp, MAXLINE, inf) == NULL) { skip = -1; *bp = '@'; } ln++; if (bp[0] == '#') continue; if (bp[0] == '@') { /* start of a new entry */ if (bp > buf) { /* really have a prior entry */ p = bp - 1; while (p > buf && *p == '\n') p--; *++p = '\n'; *++p = '\0'; newentry(buf); } if (skip == -1) break; skip = 0; bp++; /* skip '@' */ while (*bp && isspace((int)*bp)) bp++; if (bp[0] == '\0') { if (verbose) fprintf(stderr, "%s: [%s:%d] null entry?\n", pmProgname, filename, ln); skip = 1; bp = buf; if (!status) status = 1; } else { for (p = bp; *p; p++) ; memmove(buf, bp, p - bp + 1); for (bp = buf; *bp; bp++) ; } } if (skip) continue; for (p = bp; *p; p++) ; if (bp > buf && p[-1] != '\n') { *p++ = '\n'; *p = '\0'; fprintf(stderr, "%s: [%s:%d] long line split after ...\n%s", pmProgname, filename, ln, buf); ln--; if (!status) status = 1; } bp = p; if (bp > &buf[MAXENTRY]) { bp = &buf[MAXENTRY]; bp[-1] = '\0'; bp[-2] = '\n'; fprintf(stderr, "%s: [%s:%d] entry truncated after ... %s", pmProgname, filename, ln, &bp[-64]); skip = 1; if (!status) status = 1; } } fclose(inf); opts.optind++; } while (opts.optind < argc); if (f != NULL) { fclose(f); /* do the directory index ... */ sprintf(pathname, "%s.dir", fname); if ((f = fopen(pathname, "w")) == NULL) { fprintf(stderr, "%s: fopen(\"%s\", ...) failed: %s\n", pmProgname, pathname, osstrerror()); exit(2); } /* index header */ hdr.pmid = 0x50635068; /* "PcPh" */ /* "1" => dir, next char is version */ hdr.off_oneline = 0x31000000 | (('0' + version) << 16); hdr.off_text = thisindex + 1; /* # entries */ if (fwrite(&hdr, sizeof(hdr), 1, f) != 1 || ferror(f)) { fprintf(stderr, "%s: fwrite index failed: %s\n", pmProgname, osstrerror()); exit(2); } /* sort and write index */ qsort((void *)hindex, thisindex+1, sizeof(hindex[0]), idcomp); for (i = 0; i <= thisindex; i++) { if (fwrite(&hindex[i], sizeof(hindex[0]), 1, f) != 1 || ferror(f)) { fprintf(stderr, "%s: fwrite index failed: %s\n", pmProgname, osstrerror()); exit(2); } } } exit(status); }
int main(int argc, char* argv[]) { int sts = 0; int c; char buf[MAXHOSTNAMELEN]; QString source; pmProgname = basename(argv[0]); while ((c = getopt(argc, argv, "D:?")) != EOF) { switch (c) { case 'D': sts = __pmParseDebug(optarg); if (sts < 0) { pmprintf("%s: unrecognized debug flag specification (%s)\n", pmProgname, optarg); sts = 1; } else { pmDebug |= sts; sts = 0; } break; case '?': default: sts = 1; break; } } if (sts) { pmprintf("Usage: %s\n", pmProgname); pmflush(); exit(1); /*NOTREACHED*/ } (void)gethostname(buf, MAXHOSTNAMELEN); buf[MAXHOSTNAMELEN-1] = '\0'; source = buf; fprintf(stderr,"*** Compare metric descriptor with pminfo output ***\n"); QmcSource *src = QmcSource::getSource(PM_CONTEXT_HOST, source, false); if (src->status() < 0) { pmprintf("%s: Error: Unable to create context to \"%s\": %s\n", pmProgname, buf, pmErrStr(src->status())); pmflush(); return 1; } /* Linux hinv.ncpu PMID: 60.0.32 */ pmID hinv_ncpu = pmid_build(60, 0, 32); QmcDesc hinv_ncpu_pmc(hinv_ncpu); pmDesc hinv_ncpu_desc = hinv_ncpu_pmc.desc(); if (hinv_ncpu_pmc.status() < 0) { pmprintf("\n%s: Error: hinv.ncpu: %s\n", pmProgname, pmErrStr(hinv_ncpu_pmc.status())); pmflush(); sts = 1; } printf("hinv.ncpu\n"); __pmPrintDesc(stdout, &hinv_ncpu_desc); fflush(stdout); fflush(stderr); if (system("pminfo -d hinv.ncpu") < 0) { pmprintf("%s: Error: Unable to run pminfo\n", pmProgname); pmflush(); sts = 1; } fflush(stdout); fflush(stderr); fprintf(stderr, "\n*** Fetch a bad descriptor ***\n"); pmID bad = pmid_build(42,42,42); QmcDesc bad_pmc(bad); if (bad_pmc.status() < 0) { pmprintf("%s: Error: Bogus metric: %s\n", pmProgname, pmErrStr(bad_pmc.status())); pmflush(); } else sts = 1; return sts; }
static void ParseOptions(int argc, char *argv[], int *nports) { int c; int sts; char *endptr; int usage = 0; int val; endptr = pmGetConfig("PCP_PMCDCONF_PATH"); strncpy(configFileName, endptr, sizeof(configFileName)-1); while ((c = pmgetopt_r(argc, argv, &opts)) != EOF) { switch (c) { case 'A': /* disable pmcd service advertising */ __pmServerClearFeature(PM_SERVER_FEATURE_DISCOVERY); break; case 'c': /* configuration file */ strncpy(configFileName, opts.optarg, sizeof(configFileName)-1); break; case 'C': /* path to NSS certificate database */ certdb = opts.optarg; break; case 'D': /* debug flag */ sts = __pmParseDebug(opts.optarg); if (sts < 0) { pmprintf("%s: unrecognized debug flag specification (%s)\n", pmProgname, opts.optarg); opts.errors++; } pmDebug |= sts; break; case 'f': /* foreground, i.e. do _not_ run as a daemon */ run_daemon = 0; break; case 'i': /* one (of possibly several) interfaces for client requests */ __pmServerAddInterface(opts.optarg); break; case 'H': /* use the given name as the pmcd.hostname for this host */ _pmcd_hostname = opts.optarg; break; case 'l': /* log file name */ logfile = opts.optarg; break; case 'L': /* Maximum size for PDUs from clients */ val = (int)strtol(opts.optarg, NULL, 0); if (val <= 0) { pmprintf("%s: -L requires a positive value\n", pmProgname); opts.errors++; } else { __pmSetPDUCeiling(val); } break; case 'N': dupok = 0; /*FALLTHROUGH*/ case 'n': /* name space file name */ pmnsfile = opts.optarg; break; case 'p': if (__pmServerAddPorts(opts.optarg) < 0) { pmprintf("%s: -p requires a positive numeric argument (%s)\n", pmProgname, opts.optarg); opts.errors++; } else { *nports += 1; } break; case 'P': /* password file for certificate database access */ dbpassfile = opts.optarg; break; case 'q': val = (int)strtol(opts.optarg, &endptr, 10); if (*endptr != '\0' || val <= 0.0) { pmprintf("%s: -q requires a positive numeric argument\n", pmProgname); opts.errors++; } else { _creds_timeout = val; } break; case 's': /* path to local unix domain socket */ snprintf(sockpath, sizeof(sockpath), "%s", opts.optarg); break; case 'S': /* only allow authenticated clients */ __pmServerSetFeature(PM_SERVER_FEATURE_CREDS_REQD); break; case 't': val = (int)strtol(opts.optarg, &endptr, 10); if (*endptr != '\0' || val < 0.0) { pmprintf("%s: -t requires a positive numeric argument\n", pmProgname); opts.errors++; } else { _pmcd_timeout = val; } break; case 'T': val = (int)strtol(opts.optarg, &endptr, 10); if (*endptr != '\0' || val < 0) { pmprintf("%s: -T requires a positive numeric argument\n", pmProgname); opts.errors++; } else { _pmcd_trace_mask = val; } break; case 'U': username = opts.optarg; break; case 'x': fatalfile = opts.optarg; break; case '?': usage = 1; break; default: opts.errors++; break; } } if (usage || opts.errors || opts.optind < argc) { pmUsageMessage(&opts); if (usage) exit(0); DontStart(); } }
int main(int argc, char* argv[]) { int sts = 0; int c; char buf[MAXHOSTNAMELEN]; pmProgname = basename(argv[0]); while ((c = getopt(argc, argv, "D:?")) != EOF) { switch (c) { case 'D': sts = __pmParseDebug(optarg); if (sts < 0) { pmprintf("%s: unrecognized debug flag specification (%s)\n", pmProgname, optarg); sts = 1; } else { pmDebug |= sts; sts = 0; } break; case '?': default: sts = 1; break; } } if (sts) { pmprintf("Usage: %s\n", pmProgname); pmflush(); exit(1); /*NOTREACHED*/ } (void)gethostname(buf, MAXHOSTNAMELEN); buf[MAXHOSTNAMELEN-1] = '\0'; mesg("Create two fetch groups"); QmcGroup group1; pmflush(); QmcGroup group2; pmflush(); mesg("Add number of instances to both groups"); QmcMetric* numinsts1 = group1.addMetric("dynamic.numinsts"); pmflush(); if (numinsts1->status() < 0) exit(1); else numinsts1->dump(cout); QmcMetric* numinsts2 = group2.addMetric("dynamic.numinsts"); pmflush(); if (numinsts2->status() < 0) exit(1); else numinsts2->dump(cout); mesg("Fetch both groups"); group1.fetch(); numinsts1->dump(cout); group2.fetch(); numinsts2->dump(cout); mesg("Add dynamic metrics to both groups"); QmcMetric* discrete1 = group1.addMetric("dynamic.discrete", 0.0, true); pmflush(); if (discrete1->status() < 0) exit(1); else discrete1->dump(cout); QmcMetric* instant1 = group1.addMetric("dynamic.instant", 0.0, true); pmflush(); if (instant1->status() < 0) exit(1); else instant1->dump(cout); QmcMetric* counter1 = group1.addMetric("dynamic.counter", 0.0, true); pmflush(); if (counter1->status() < 0) exit(1); else counter1->dump(cout); QmcMetric* discrete2 = group2.addMetric("dynamic.discrete"); pmflush(); if (discrete2->status() < 0) exit(1); else discrete2->dump(cout); QmcMetric* instant2 = group2.addMetric("dynamic.instant"); pmflush(); if (instant2->status() < 0) exit(1); else instant2->dump(cout); QmcMetric* counter2 = group2.addMetric("dynamic.counter"); pmflush(); if (counter2->status() < 0) exit(1); else counter2->dump(cout); mesg("Fetch both groups"); group1.fetch(); dump(numinsts1, discrete1, instant1, counter1); group2.fetch(); dump(numinsts2, discrete2, instant2, counter2); mesg("Add an instance"); store(ADD_INST, "1"); mesg("Fetch first group"); group1.fetch(); dump(numinsts1, discrete1, instant1, counter1); mesg("Update indom for first group"); update(discrete1, instant1, counter1); mesg("Fetch first group"); group1.fetch(); dump(numinsts1, discrete1, instant1, counter1); mesg("Fetch first group"); group1.fetch(); dump(numinsts1, discrete1, instant1, counter1); mesg("Fetch first group"); group1.fetch(); dump(numinsts1, discrete1, instant1, counter1); mesg("Add another instance"); store(ADD_INST, "5"); mesg("Fetch first group"); group1.fetch(); dump(numinsts1, discrete1, instant1, counter1); mesg("Update indom for first group"); update(discrete1, instant1, counter1); mesg("Fetch first group"); group1.fetch(); dump(numinsts1, discrete1, instant1, counter1); mesg("Fetch first group"); group1.fetch(); dump(numinsts1, discrete1, instant1, counter1); mesg("Delete first instance"); store(DEL_INST, "1"); mesg("Fetch first group"); group1.fetch(); dump(numinsts1, discrete1, instant1, counter1); mesg("Update indom for first group"); update(discrete1, instant1, counter1); mesg("Fetch first group"); group1.fetch(); dump(numinsts1, discrete1, instant1, counter1); mesg("Fetch second group"); group2.fetch(); dump(numinsts2, discrete2, instant2, counter2); mesg("Update indom for second group"); update(discrete2, instant2, counter2); mesg("Fetch second group"); group2.fetch(); dump(numinsts2, discrete2, instant2, counter2); mesg("Fetch second group"); group2.fetch(); dump(numinsts2, discrete2, instant2, counter2); mesg("Delete second instance, add new instance"); store(DEL_INST, "5"); store(ADD_INST, "3"); mesg("Fetch first group"); group1.fetch(); dump(numinsts1, discrete1, instant1, counter1); mesg("Update indom for first group"); update(discrete1, instant1, counter1); mesg("Fetch first group"); group1.fetch(); dump(numinsts1, discrete1, instant1, counter1); mesg("Fetch first group"); group1.fetch(); dump(numinsts1, discrete1, instant1, counter1); mesg("Fetch second group"); group2.fetch(); dump(numinsts2, discrete2, instant2, counter2); mesg("Update indom for second group"); update(discrete2, instant2, counter2); mesg("Fetch second group"); group2.fetch(); dump(numinsts2, discrete2, instant2, counter2); mesg("Fetch second group"); group2.fetch(); dump(numinsts2, discrete2, instant2, counter2); mesg("Delete third instance"); store(DEL_INST, "3"); mesg("Fetch first group"); group1.fetch(); dump(numinsts1, discrete1, instant1, counter1); mesg("Update indom for first group"); update(discrete1, instant1, counter1); mesg("Fetch first group"); group1.fetch(); dump(numinsts1, discrete1, instant1, counter1); mesg("Fetch second group"); group2.fetch(); dump(numinsts2, discrete2, instant2, counter2); mesg("Update indom for second group"); update(discrete2, instant2, counter2); mesg("Fetch second group"); group2.fetch(); dump(numinsts2, discrete2, instant2, counter2); mesg("Add second instance again"); store(ADD_INST, "5"); mesg("Fetch first group"); group1.fetch(); dump(numinsts1, discrete1, instant1, counter1); mesg("Update indom for first group"); update(discrete1, instant1, counter1); mesg("Fetch first group"); group1.fetch(); dump(numinsts1, discrete1, instant1, counter1); mesg("Fetch second group"); group2.fetch(); dump(numinsts2, discrete2, instant2, counter2); mesg("Update indom for second group"); update(discrete2, instant2, counter2); mesg("Fetch second group"); group2.fetch(); dump(numinsts2, discrete2, instant2, counter2); return 0; }
int main(int argc, char **argv) { int sts; int ch; int errflag = 0; int a, b, c; __pmSetProgname(argv[0]); while ((ch = getopt(argc, argv, "D:?")) != EOF) { switch (ch) { #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 '?': default: errflag++; break; } } if (errflag || optind != argc-2) { fprintf(stderr, "Usage: %s archive1 archive2\n", pmProgname); exit(1); } a = pmNewContext(PM_CONTEXT_ARCHIVE, argv[optind]); if (a < 0) { fprintf(stderr, "%s: first pmNewContext(..., %s): %s\n", pmProgname, argv[optind], pmErrStr(a)); exit(1); } pmDestroyContext(a); b = pmNewContext(PM_CONTEXT_HOST, "localhost"); if (b < 0) { fprintf(stderr, "%s: pmNewContext(..., localhost): %s\n", pmProgname, pmErrStr(b)); exit(1); } c = pmNewContext(PM_CONTEXT_ARCHIVE, argv[optind+1]); if (c < 0) { fprintf(stderr, "%s: second pmNewContext(..., %s): %s\n", pmProgname, argv[optind+1], pmErrStr(c)); exit(1); } exit(0); }
int main(int argc, char **argv) { int c; int sts; int sep = __pmPathSeparator(); int use_localtime = 0; int isdaemon = 0; char *pmnsfile = PM_NS_DEFAULT; char *username; char *logfile = "pmlogger.log"; /* default log (not archive) file name */ char *endnum; int i; task_t *tp; optcost_t ocp; __pmFdSet readyfds; char *p; char *runtime = NULL; int ctx; /* handle corresponding to ctxp below */ __pmContext *ctxp; /* pmlogger has just this one context */ int niter; pid_t target_pid = 0; __pmGetUsername(&username); /* * Warning: * If any of the pmlogger options change, make sure the * corresponding changes are made to pmnewlog when pmlogger * options are passed through from the control file */ while ((c = pmgetopt_r(argc, argv, &opts)) != EOF) { switch (c) { case 'c': /* config file */ if (access(opts.optarg, F_OK) == 0) configfile = opts.optarg; else { /* does not exist as given, try the standard place */ char *sysconf = pmGetConfig("PCP_VAR_DIR"); int sz = strlen(sysconf)+strlen("/config/pmlogger/")+strlen(opts.optarg)+1; if ((configfile = (char *)malloc(sz)) == NULL) __pmNoMem("config file name", sz, PM_FATAL_ERR); snprintf(configfile, sz, "%s%c" "config%c" "pmlogger%c" "%s", sysconf, sep, sep, sep, opts.optarg); if (access(configfile, F_OK) != 0) { /* still no good, error handling happens below */ free(configfile); configfile = opts.optarg; } } break; case 'D': /* debug flag */ sts = __pmParseDebug(opts.optarg); if (sts < 0) { pmprintf("%s: unrecognized debug flag specification (%s)\n", pmProgname, opts.optarg); opts.errors++; } else pmDebug |= sts; break; case 'h': /* hostname for PMCD to contact */ pmcd_host_conn = opts.optarg; break; case 'l': /* log file name */ logfile = opts.optarg; break; case 'L': /* linger if not primary logger */ linger = 1; break; case 'm': /* note for port map file */ note = opts.optarg; isdaemon = ((strcmp(note, "pmlogger_check") == 0) || (strcmp(note, "pmlogger_daily") == 0)); break; case 'n': /* alternative name space file */ pmnsfile = opts.optarg; break; case 'p': target_pid = (int)strtol(opts.optarg, &endnum, 10); if (*endnum != '\0') { pmprintf("%s: invalid process identifier (%s)\n", pmProgname, opts.optarg); opts.errors++; } else if (!__pmProcessExists(target_pid)) { pmprintf("%s: PID error - no such process (%d)\n", pmProgname, target_pid); opts.errors++; } break; case 'P': /* this is the primary pmlogger */ primary = 1; isdaemon = 1; break; case 'r': /* report sizes of pmResult records */ rflag = 1; break; case 's': /* exit size */ sts = ParseSize(opts.optarg, &exit_samples, &exit_bytes, &exit_time); if (sts < 0) { pmprintf("%s: illegal size argument '%s' for exit size\n", pmProgname, opts.optarg); opts.errors++; } else if (exit_time.tv_sec > 0) { __pmAFregister(&exit_time, NULL, run_done_callback); } break; case 'T': /* end time */ runtime = opts.optarg; break; case 't': /* change default logging interval */ if (pmParseInterval(opts.optarg, &delta, &p) < 0) { pmprintf("%s: illegal -t argument\n%s", pmProgname, p); free(p); opts.errors++; } break; case 'U': /* run as named user */ username = opts.optarg; isdaemon = 1; break; case 'u': /* flush output buffers after each fetch */ /* * all archive write I/O is unbuffered now, so maintain -u * for backwards compatibility only */ break; case 'v': /* volume switch after given size */ sts = ParseSize(opts.optarg, &vol_switch_samples, &vol_switch_bytes, &vol_switch_time); if (sts < 0) { pmprintf("%s: illegal size argument '%s' for volume size\n", pmProgname, opts.optarg); opts.errors++; } else if (vol_switch_time.tv_sec > 0) { vol_switch_afid = __pmAFregister(&vol_switch_time, NULL, vol_switch_callback); } break; case 'V': archive_version = (int)strtol(opts.optarg, &endnum, 10); if (*endnum != '\0' || archive_version != PM_LOG_VERS02) { pmprintf("%s: -V requires a version number of %d\n", pmProgname, PM_LOG_VERS02); opts.errors++; } break; case 'x': /* recording session control fd */ rsc_fd = (int)strtol(opts.optarg, &endnum, 10); if (*endnum != '\0' || rsc_fd < 0) { pmprintf("%s: -x requires a non-negative numeric argument\n", pmProgname); opts.errors++; } else { time(&rsc_start); } break; case 'y': use_localtime = 1; break; case '?': default: opts.errors++; break; } } if (primary && pmcd_host != NULL) { pmprintf( "%s: -P and -h are mutually exclusive; use -P only when running\n" "%s on the same (local) host as the PMCD to which it connects.\n", pmProgname, pmProgname); opts.errors++; } if (!opts.errors && opts.optind != argc - 1) { pmprintf("%s: insufficient arguments\n", pmProgname); opts.errors++; } if (opts.errors) { pmUsageMessage(&opts); exit(1); } if (rsc_fd != -1 && note == NULL) { /* add default note to indicate running with -x */ static char xnote[10]; snprintf(xnote, sizeof(xnote), "-x %d", rsc_fd); note = xnote; } /* if we are running as a daemon, change user early */ if (isdaemon) __pmSetProcessIdentity(username); __pmOpenLog("pmlogger", logfile, stderr, &sts); if (sts != 1) { fprintf(stderr, "%s: Warning: log file (%s) creation failed\n", pmProgname, logfile); /* continue on ... writing to stderr */ } /* base name for archive is here ... */ archBase = argv[opts.optind]; if (pmcd_host_conn == NULL) pmcd_host_conn = "local:"; /* initialise access control */ if (__pmAccAddOp(PM_OP_LOG_ADV) < 0 || __pmAccAddOp(PM_OP_LOG_MAND) < 0 || __pmAccAddOp(PM_OP_LOG_ENQ) < 0) { fprintf(stderr, "%s: access control initialisation failed\n", pmProgname); exit(1); } if (pmnsfile != PM_NS_DEFAULT) { if ((sts = pmLoadASCIINameSpace(pmnsfile, 1)) < 0) { fprintf(stderr, "%s: Cannot load namespace from \"%s\": %s\n", pmProgname, pmnsfile, pmErrStr(sts)); exit(1); } } if ((ctx = pmNewContext(PM_CONTEXT_HOST, pmcd_host_conn)) < 0) { fprintf(stderr, "%s: Cannot connect to PMCD on host \"%s\": %s\n", pmProgname, pmcd_host_conn, pmErrStr(ctx)); exit(1); } pmcd_host = (char *)pmGetContextHostName(ctx); if (strlen(pmcd_host) == 0) { fprintf(stderr, "%s: pmGetContextHostName(%d) failed\n", pmProgname, ctx); exit(1); } if (rsc_fd == -1) { /* no -x, so register client id with pmcd */ __pmSetClientIdArgv(argc, argv); } /* * discover fd for comms channel to PMCD ... */ if ((ctxp = __pmHandleToPtr(ctx)) == NULL) { fprintf(stderr, "%s: botch: __pmHandleToPtr(%d) returns NULL!\n", pmProgname, ctx); exit(1); } pmcdfd = ctxp->c_pmcd->pc_fd; PM_UNLOCK(ctxp->c_lock); if (configfile != NULL) { if ((yyin = fopen(configfile, "r")) == NULL) { fprintf(stderr, "%s: Cannot open config file \"%s\": %s\n", pmProgname, configfile, osstrerror()); exit(1); } } else { /* **ANY** Lex would read from stdin automagically */ configfile = "<stdin>"; } __pmOptFetchGetParams(&ocp); ocp.c_scope = 1; __pmOptFetchPutParams(&ocp); /* prevent early timer events ... */ __pmAFblock(); if (yyparse() != 0) exit(1); if (configfile != NULL) fclose(yyin); yyend(); #ifdef PCP_DEBUG fprintf(stderr, "Config parsed\n"); #endif fprintf(stderr, "Starting %slogger for host \"%s\" via \"%s\"\n", primary ? "primary " : "", pmcd_host, pmcd_host_conn); #ifdef PCP_DEBUG if (pmDebug & DBG_TRACE_LOG) { fprintf(stderr, "optFetch Cost Parameters: pmid=%d indom=%d fetch=%d scope=%d\n", ocp.c_pmid, ocp.c_indom, ocp.c_fetch, ocp.c_scope); fprintf(stderr, "\nAfter loading config ...\n"); for (tp = tasklist; tp != NULL; tp = tp->t_next) { if (tp->t_numvalid == 0) continue; fprintf(stderr, " state: %sin log, %savail, %s, %s", PMLC_GET_INLOG(tp->t_state) ? "" : "not ", PMLC_GET_AVAIL(tp->t_state) ? "" : "un", PMLC_GET_MAND(tp->t_state) ? "mand" : "adv", PMLC_GET_ON(tp->t_state) ? "on" : "off"); fprintf(stderr, " delta: %ld usec", (long)1000 * tp->t_delta.tv_sec + tp->t_delta.tv_usec); fprintf(stderr, " numpmid: %d\n", tp->t_numpmid); for (i = 0; i < tp->t_numpmid; i++) { fprintf(stderr, " %s (%s):\n", pmIDStr(tp->t_pmidlist[i]), tp->t_namelist[i]); } __pmOptFetchDump(stderr, tp->t_fetch); } } #endif if (!primary && tasklist == NULL && !linger) { fprintf(stderr, "Nothing to log, and not the primary logger instance ... good-bye\n"); exit(1); } if ((sts = __pmLogCreate(pmcd_host, archBase, archive_version, &logctl)) < 0) { fprintf(stderr, "__pmLogCreate: %s\n", pmErrStr(sts)); exit(1); } else { /* * try and establish $TZ from the remote PMCD ... * Note the label record has been set up, but not written yet */ char *name = "pmcd.timezone"; pmID pmid; pmResult *resp; __pmtimevalNow(&epoch); sts = pmUseContext(ctx); if (sts >= 0) sts = pmLookupName(1, &name, &pmid); if (sts >= 0) sts = pmFetch(1, &pmid, &resp); if (sts >= 0) { if (resp->vset[0]->numval > 0) { /* pmcd.timezone present */ strcpy(logctl.l_label.ill_tz, resp->vset[0]->vlist[0].value.pval->vbuf); /* prefer to use remote time to avoid clock drift problems */ epoch = resp->timestamp; /* struct assignment */ if (! use_localtime) pmNewZone(logctl.l_label.ill_tz); } #ifdef PCP_DEBUG else if (pmDebug & DBG_TRACE_LOG) { fprintf(stderr, "main: Could not get timezone from host %s\n", pmcd_host); } #endif pmFreeResult(resp); } } /* do ParseTimeWindow stuff for -T */ if (runtime) { struct timeval res_end; /* time window end */ struct timeval start; struct timeval end; struct timeval last_delta; char *err_msg; /* parsing error message */ time_t now; struct timeval now_tv; time(&now); now_tv.tv_sec = now; now_tv.tv_usec = 0; start = now_tv; end.tv_sec = INT_MAX; end.tv_usec = INT_MAX; sts = __pmParseTime(runtime, &start, &end, &res_end, &err_msg); if (sts < 0) { fprintf(stderr, "%s: illegal -T argument\n%s", pmProgname, err_msg); exit(1); } last_delta = res_end; tsub(&last_delta, &now_tv); __pmAFregister(&last_delta, NULL, run_done_callback); last_stamp = res_end; } fprintf(stderr, "Archive basename: %s\n", archBase); #ifndef IS_MINGW /* detach yourself from the launching process */ if (isdaemon) setpgid(getpid(), 0); #endif /* set up control port */ init_ports(); __pmFD_ZERO(&fds); for (i = 0; i < CFD_NUM; ++i) { if (ctlfds[i] >= 0) __pmFD_SET(ctlfds[i], &fds); } #ifndef IS_MINGW __pmFD_SET(pmcdfd, &fds); #endif if (rsc_fd != -1) __pmFD_SET(rsc_fd, &fds); numfds = maxfd() + 1; if ((sts = do_preamble()) < 0) fprintf(stderr, "Warning: problem writing archive preamble: %s\n", pmErrStr(sts)); sts = 0; /* default exit status */ parse_done = 1; /* enable callback processing */ __pmAFunblock(); for ( ; ; ) { int nready; #ifdef PCP_DEBUG if ((pmDebug & DBG_TRACE_APPL2) && (pmDebug & DBG_TRACE_DESPERATE)) { fprintf(stderr, "before __pmSelectRead(%d,...): run_done_alarm=%d vol_switch_alarm=%d log_alarm=%d\n", numfds, run_done_alarm, vol_switch_alarm, log_alarm); } #endif niter = 0; while (log_alarm && niter++ < 10) { __pmAFblock(); log_alarm = 0; #ifdef PCP_DEBUG if (pmDebug & DBG_TRACE_APPL2) fprintf(stderr, "delayed callback: log_alarm\n"); #endif for (tp = tasklist; tp != NULL; tp = tp->t_next) { if (tp->t_alarm) { tp->t_alarm = 0; do_work(tp); } } __pmAFunblock(); } if (vol_switch_alarm) { __pmAFblock(); vol_switch_alarm = 0; #ifdef PCP_DEBUG if (pmDebug & DBG_TRACE_APPL2) fprintf(stderr, "delayed callback: vol_switch_alarm\n"); #endif newvolume(VOL_SW_TIME); __pmAFunblock(); } if (run_done_alarm) { #ifdef PCP_DEBUG if (pmDebug & DBG_TRACE_APPL2) fprintf(stderr, "delayed callback: run_done_alarm\n"); #endif run_done(0, NULL); /*NOTREACHED*/ } __pmFD_COPY(&readyfds, &fds); nready = __pmSelectRead(numfds, &readyfds, NULL); #ifdef PCP_DEBUG if ((pmDebug & DBG_TRACE_APPL2) && (pmDebug & DBG_TRACE_DESPERATE)) { fprintf(stderr, "__pmSelectRead(%d,...) done: nready=%d run_done_alarm=%d vol_switch_alarm=%d log_alarm=%d\n", numfds, nready, run_done_alarm, vol_switch_alarm, log_alarm); } #endif __pmAFblock(); if (nready > 0) { /* handle request on control port */ for (i = 0; i < CFD_NUM; ++i) { if (ctlfds[i] >= 0 && __pmFD_ISSET(ctlfds[i], &readyfds)) { if (control_req(ctlfds[i])) { /* new client has connected */ __pmFD_SET(clientfd, &fds); if (clientfd >= numfds) numfds = clientfd + 1; } } } if (clientfd >= 0 && __pmFD_ISSET(clientfd, &readyfds)) { /* process request from client, save clientfd in case client * closes connection, resetting clientfd to -1 */ int fd = clientfd; if (client_req()) { /* client closed connection */ __pmFD_CLR(fd, &fds); __pmCloseSocket(clientfd); clientfd = -1; numfds = maxfd() + 1; qa_case = 0; } } #ifndef IS_MINGW if (pmcdfd >= 0 && __pmFD_ISSET(pmcdfd, &readyfds)) { /* * do not expect this, given synchronous commumication with the * pmcd ... either pmcd has terminated, or bogus PDU ... or its * Win32 and we are operating under the different conditions of * our AF.c implementation there, which has to deal with a lack * of signal support on Windows - race condition exists between * this check and the async event timer callback. */ __pmPDU *pb; __pmPDUHdr *php; sts = __pmGetPDU(pmcdfd, ANY_SIZE, TIMEOUT_NEVER, &pb); if (sts <= 0) { if (sts < 0) fprintf(stderr, "Error: __pmGetPDU: %s\n", pmErrStr(sts)); disconnect(sts); } else { php = (__pmPDUHdr *)pb; fprintf(stderr, "Error: Unsolicited %s PDU from PMCD\n", __pmPDUTypeStr(php->type)); disconnect(PM_ERR_IPC); } if (sts > 0) __pmUnpinPDUBuf(pb); } #endif if (rsc_fd >= 0 && __pmFD_ISSET(rsc_fd, &readyfds)) { /* * some action on the recording session control fd * end-of-file means launcher has quit, otherwise we * expect one of these commands * V<number>\n - version * F<folio>\n - folio name * P<name>\n - launcher's name * R\n - launcher can replay * D\n - detach from launcher * Q\n - quit pmlogger */ char rsc_buf[MAXPATHLEN]; char *rp = rsc_buf; char myc; int fake_x = 0; for (rp = rsc_buf; ; rp++) { if (read(rsc_fd, &myc, 1) <= 0) { #ifdef PCP_DEBUG if (pmDebug & DBG_TRACE_APPL2) fprintf(stderr, "recording session control: eof\n"); #endif if (rp != rsc_buf) { *rp = '\0'; fprintf(stderr, "Error: incomplete recording session control message: \"%s\"\n", rsc_buf); } fake_x = 1; break; } if (rp >= &rsc_buf[MAXPATHLEN]) { fprintf(stderr, "Error: absurd recording session control message: \"%100.100s ...\"\n", rsc_buf); fake_x = 1; break; } if (myc == '\n') { *rp = '\0'; break; } *rp = myc; } #ifdef PCP_DEBUG if (pmDebug & DBG_TRACE_APPL2) { if (fake_x == 0) fprintf(stderr, "recording session control: \"%s\"\n", rsc_buf); } #endif if (fake_x) do_dialog('X'); else if (strcmp(rsc_buf, "Q") == 0 || strcmp(rsc_buf, "D") == 0 || strcmp(rsc_buf, "?") == 0) do_dialog(rsc_buf[0]); else if (rsc_buf[0] == 'F') folio_name = strdup(&rsc_buf[1]); else if (rsc_buf[0] == 'P') rsc_prog = strdup(&rsc_buf[1]); else if (strcmp(rsc_buf, "R") == 0) rsc_replay = 1; else if (rsc_buf[0] == 'V' && rsc_buf[1] == '0') { /* * version 0 of the recording session control ... * this is all we grok at the moment */ ; } else { fprintf(stderr, "Error: illegal recording session control message: \"%s\"\n", rsc_buf); do_dialog('X'); } } } else if (vol_switch_flag) { newvolume(VOL_SW_SIGHUP); vol_switch_flag = 0; } else if (nready < 0 && neterror() != EINTR) fprintf(stderr, "Error: select: %s\n", netstrerror()); __pmAFunblock(); if (target_pid && !__pmProcessExists(target_pid)) exit(EXIT_SUCCESS); if (exit_code) break; } exit(exit_code); }
int main(int argc, char *argv[]) { int fd; int port = 1214; /* default port assigned to kazaa what ever that is! */ int hang = 0; int i, sts; int c; int newfd; struct sockaddr_in myAddr; struct linger noLinger = {1, 0}; char *endnum; int errflag = 0; __pmSetProgname(argv[0]); while ((c = getopt(argc, argv, "D:hp:?")) != 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 'h': /* hang after accept */ hang = 1; break; case 'p': port = (int)strtol(optarg, &endnum, 10); if (*endnum != '\0') { fprintf(stderr, "%s: port argument must be a numeric internet port number\n", pmProgname); exit(1); } break; case '?': default: errflag++; break; } } if (errflag || optind != argc) { fprintf(stderr, "Usage: %s [-D n] [-h] [-p port]\n", pmProgname); exit(1); } fd = socket(AF_INET, SOCK_STREAM, 0); if (fd < 0) { perror("socket"); exit(1); } if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *) &i, sizeof(i)) < 0) { perror("setsockopt(nodelay)"); exit(1); } /* Don't linger on close */ if (setsockopt(fd, SOL_SOCKET, SO_LINGER, (char *) &noLinger, sizeof(noLinger)) < 0) { perror("setsockopt(nolinger)"); exit(1); } memset(&myAddr, 0, sizeof(myAddr)); myAddr.sin_family = AF_INET; myAddr.sin_addr.s_addr = htonl(INADDR_ANY); myAddr.sin_port = htons(port); sts = bind(fd, (struct sockaddr*)&myAddr, sizeof(myAddr)); if (sts < 0) { fprintf(stderr, "bind(%d): %s\n", port, strerror(errno)); exit(1); } sts = listen(fd, 5); /* Max. of 5 pending connection requests */ if (sts == -1) { perror("listen"); exit(1); } newfd = accept(fd, (struct sockaddr *)0, 0); if (newfd < 0) { fprintf(stderr, "%s: accept: %s\n", pmProgname, strerror(errno)); exit(1); } if (hang) { /* wait for a signal ... */ pause(); exit(0); } /* drain input */ while ((sts = read(newfd, &c, 1)) == 1) ; if (sts < 0) { /* * ECONNRESET is expected when client exits w/out closing * socket. */ if (errno != ECONNRESET) fprintf(stderr, "%s: read error: %s\n", pmProgname, pmErrStr(-errno)); } exit(0); }
int main(int argc, char **argv) { int c; int sts; int errflag = 0; static char *usage = "[-D debug] type value iunit ounit\n" "\n" "iunit and ounit are in the 6-integer format:\n" "dimspace:dimtime:dimcount:scalespace:scaletime:scalecount\n"; pmUnits iu; pmUnits ou; int type; int vbase; pmAtomValue iv; pmAtomValue ov; char *vp; char *q; __pmSetProgname(argv[0]); /* stop at type arg, so value may have leading "-" */ putenv("POSIXLY_CORRECT=yes"); while ((c = getopt(argc, argv, "D:")) != 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 '?': default: errflag++; break; } } if (errflag || argc - optind != 4) { fprintf(stderr, "Usage: %s %s\n", pmProgname, usage); exit(1); } /* non-flag args are argv[optind] ... argv[argc-1] */ type = atoi(argv[optind]); optind++; if (strncmp(argv[optind], "0x", 2) == 0) { vp = &argv[optind][2]; vbase = 16; } else { vp = argv[optind]; vbase = 10; } q = vp; switch (type) { case PM_TYPE_32: iv.l = strtol(vp, &q, vbase); break; case PM_TYPE_U32: iv.ul = strtoul(vp, &q, vbase); break; case PM_TYPE_64: iv.ll = strtoll(vp, &q, vbase); break; case PM_TYPE_U64: iv.ull = strtoull(vp, &q, vbase); break; case PM_TYPE_FLOAT: sts = sscanf(vp, "%f", &iv.f); if (sts == 1) q = ""; break; case PM_TYPE_DOUBLE: sts = sscanf(vp, "%lf", &iv.d); if (sts == 1) q = ""; break; default: case PM_TYPE_STRING: iv.cp = vp; q = ""; break; case PM_TYPE_AGGREGATE: case PM_TYPE_AGGREGATE_STATIC: iv.vbp = (pmValueBlock *)malloc(PM_VAL_HDR_SIZE+strlen(vp)); iv.vbp->vlen = PM_VAL_HDR_SIZE+strlen(vp); iv.vbp->vtype = type; strncpy(iv.vbp->vbuf, vp, strlen(vp)); q = ""; break; case PM_TYPE_EVENT: // ignore the value, force 0 event records iv.vbp = (pmValueBlock *)malloc(sizeof(pmEventArray)-sizeof(pmEventRecord)); iv.vbp->vlen = sizeof(pmEventArray)-sizeof(pmEventRecord); iv.vbp->vtype = type; memset((void *)iv.vbp->vbuf, 0, sizeof(int)); q = ""; break; case PM_TYPE_HIGHRES_EVENT: // ignore the value, force 0 event records iv.vbp = (pmValueBlock *)malloc(sizeof(pmHighResEventArray)-sizeof(pmHighResEventRecord)); iv.vbp->vlen = sizeof(pmHighResEventArray)-sizeof(pmHighResEventRecord); iv.vbp->vtype = type; memset((void *)iv.vbp->vbuf, 0, sizeof(int)); q = ""; break; } optind++; if (*q != '\0') { fprintf(stderr, "Value botched @ %s\n", q); exit(1); } vp = argv[optind]; iu.dimSpace = strtol(vp, &q, 10); if (*q != ':') goto bad_in; vp = ++q; iu.dimTime = strtol(vp, &q, 10); if (*q != ':') goto bad_in; vp = ++q; iu.dimCount = strtol(vp, &q, 10); if (*q != ':') goto bad_in; vp = ++q; iu.scaleSpace = strtol(vp, &q, 10); if (*q != ':') goto bad_in; vp = ++q; iu.scaleTime = strtol(vp, &q, 10); if (*q != ':') goto bad_in; vp = ++q; iu.scaleCount = strtol(vp, &q, 10); if (*q != '\0') goto bad_in; optind++; vp = argv[optind]; ou.dimSpace = strtol(vp, &q, 10); if (*q != ':') goto bad_out; vp = ++q; ou.dimTime = strtol(vp, &q, 10); if (*q != ':') goto bad_out; vp = ++q; ou.dimCount = strtol(vp, &q, 10); if (*q != ':') goto bad_out; vp = ++q; ou.scaleSpace = strtol(vp, &q, 10); if (*q != ':') goto bad_out; vp = ++q; ou.scaleTime = strtol(vp, &q, 10); if (*q != ':') goto bad_out; vp = ++q; ou.scaleCount = strtol(vp, &q, 10); if (*q != '\0') goto bad_out; printf("type=%d input units=%s value=%s\n", type, pmUnitsStr(&iu), pmAtomStr(&iv, type)); if ((sts = pmConvScale(type, &iv, &iu, &ov, &ou)) < 0) printf("pmConvScale Error: %s\n", pmErrStr(sts)); else printf("output units=%s value=%s\n", pmUnitsStr(&ou), pmAtomStr(&ov, type)); exit(0); bad_in: fprintf(stderr, "Input units botch @ %s\n", q); exit(1); bad_out: fprintf(stderr, "Output units botch @ %s\n", q); exit(1); }
int main(int argc, char **argv) { int sts; int first = 1; int c; int j; int force = 0; int asis = 0; int dupok = 0; __pmnsNode *tmp; umask((mode_t)022); /* anything else is pretty silly */ while ((c = pmgetopt_r(argc, argv, &opts)) != EOF) { switch (c) { case 'a': asis = 1; break; case 'd': /* duplicate PMIDs are OK */ dupok = 1; break; case 'D': /* debug flag */ if ((sts = __pmParseDebug(opts.optarg)) < 0) { pmprintf("%s: unrecognized debug flag specification (%s)\n", pmProgname, opts.optarg); opts.errors++; } else { pmDebug |= sts; } break; case 'f': /* force ... unlink file first */ force = 1; break; case 'v': verbose++; break; case '?': default: opts.errors++; break; } } if (opts.errors || opts.optind > argc - 2) { pmUsageMessage(&opts); exit(1); } if (force) unlink(argv[argc-1]); if (access(argv[argc-1], F_OK) == 0) { fprintf(stderr, "%s: Error: output PMNS file \"%s\" already exists!\nYou must either remove it first, or use -f\n", pmProgname, argv[argc-1]); exit(1); } /* * from here on, ignore SIGHUP, SIGINT and SIGTERM to protect * the integrity of the new ouput file */ __pmSetSignalHandler(SIGHUP, SIG_IGN); __pmSetSignalHandler(SIGINT, SIG_IGN); __pmSetSignalHandler(SIGTERM, SIG_IGN); if ((outf = fopen(argv[argc-1], "w+")) == NULL) { fprintf(stderr, "%s: Error: cannot create output PMNS file \"%s\": %s\n", pmProgname, argv[argc-1], osstrerror()); exit(1); } if (!asis) sortargs(&argv[opts.optind], argc - opts.optind - 1); j = opts.optind; while (j < argc-1) { if (verbose) printf("%s:\n", argv[j]); if ((sts = pmLoadASCIINameSpace(argv[j], dupok)) < 0) { fprintf(stderr, "%s: Error: pmLoadNameSpace(%s): %s\n", pmProgname, argv[j], pmErrStr(sts)); exit(1); } { __pmnsTree *t; t = __pmExportPMNS(); if (t == NULL) { /* sanity check - shouldn't ever happen */ fprintf(stderr, "Exported PMNS is NULL !"); exit(1); } tmp = t->root; } if (first) { root = tmp; first = 0; } else { pmns_traverse(tmp, 0, "", merge); } j++; } pmns_output(root, outf); fclose(outf); /* * now load the merged PMNS to check for errors ... */ if ((sts = pmLoadASCIINameSpace(argv[argc-1], dupok)) < 0) { fprintf(stderr, "%s: Error: pmLoadNameSpace(%s): %s\n", pmProgname, argv[argc-1], pmErrStr(sts)); exit(1); } exit(0); }
int main(int argc, char **argv) { int c; int sts; int e_sts = 0; int errflag = 0; int ahtype = 0; int verbose = 0; int quick = 0; char *host = NULL; /* pander to gcc */ pmResult *result; pmResult *prev = NULL; struct timeval start = { 0,0 }; struct timeval end; int tzh; off_t trunc_size = 0; __pmSetProgname(argv[0]); while ((c = getopt(argc, argv, "a:D:t:qv?")) != EOF) { switch (c) { case 'a': /* archive name */ if (ahtype != 0) { fprintf(stderr, "%s: at most one of -a and/or -h allowed\n", pmProgname); errflag++; } ahtype = PM_CONTEXT_ARCHIVE; host = optarg; break; #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 't': /* truncate */ trunc_size = atol(optarg); break; case 'q': /* quick */ quick = 1; break; case 'v': /* verbose */ verbose++; break; case '?': default: errflag++; break; } } if (errflag || optind < argc) { fprintf(stderr, "Usage: %s options ...\n\ \n\ Options\n\ -a archive metrics source is an archive log\n\ -t size truncate archive to size bytes\n\ -q quick (read last 3 records, not the whole archive)\n\ -v verbose\n", pmProgname); exit(1); } if (ahtype != PM_CONTEXT_ARCHIVE) { fprintf(stderr, "%s: -a is not optional!\n", pmProgname); exit(1); } /* truncate if -t specified, _before_ opening archive */ if (trunc_size != 0) { if (access(host, W_OK) == 0) { if (truncate(host, trunc_size) != 0) { fprintf(stderr, "%s: file %s exists, but cannot truncate\n", pmProgname, host); exit(1); } } else { char path[MAXPATHLEN]; sprintf(path, "%s.0", host); if (access(path, W_OK) == 0) { if (truncate(path, trunc_size) != 0) { fprintf(stderr, "%s: file %s exists, but cannot truncate\n", pmProgname, path); exit(1); } } else { fprintf(stderr, "%s: cannot find writeable %s or %s\n", pmProgname, host, path); exit(1); } } } if ((sts = pmNewContext(ahtype, host)) < 0) { fprintf(stderr, "%s: Cannot open archive \"%s\": %s\n", pmProgname, host, pmErrStr(sts)); exit(1); } /* force -z (timezone of archive */ if ((tzh = pmNewContextZone()) < 0) { fprintf(stderr, "%s: Cannot set context timezone: %s\n", pmProgname, pmErrStr(tzh)); exit(1); } sts = pmGetArchiveEnd(&end); if (sts < 0) { printf("pmGetArchiveEnd: %s\n", pmErrStr(sts)); } else { if (verbose) { printf("pmGetArchiveEnd time: "); printstamp(&end); printf("\n"); } } sts = pmSetMode(PM_MODE_BACK, &end, 0); if (sts < 0) { printf("pmSetMode PM_MODE_BACK: %s\n", pmErrStr(sts)); exit(1); } sts = pmFetchArchive(&result); if (sts < 0) { printf("pmFetchArchive: %s\n", pmErrStr(sts)); e_sts = 1; } else { if (verbose) { printf("last result time (direct): "); printstamp(&result->timestamp); printf("\n"); } if (result->timestamp.tv_sec != end.tv_sec || result->timestamp.tv_usec != end.tv_usec) { printf("Mismatch: end="); printstamp(&end); printf(" direct="); printstamp(&result->timestamp); printf("\n"); e_sts = 1; } start.tv_sec = result->timestamp.tv_sec; start.tv_usec = result->timestamp.tv_usec; pmFreeResult(result); } if (quick && e_sts == 0) { int i; for (i = 0; i < 2; i++) { sts = pmFetchArchive(&result); if (sts >= 0) { start.tv_sec = result->timestamp.tv_sec; start.tv_usec = result->timestamp.tv_usec; pmFreeResult(result); } } } else { /* start from the epoch and move forward */ start.tv_sec = 0; start.tv_usec = 0; } sts = pmSetMode(PM_MODE_FORW, &start, 0); if (sts < 0) { printf("pmSetMode PM_MODE_FORW: %s\n", pmErrStr(sts)); exit(1); } while ((sts = pmFetchArchive(&result)) >= 0) { if (prev != NULL) pmFreeResult(prev); prev = result; } if (verbose) printf("pmFetchArchive: %s\n", pmErrStr(sts)); if (prev == NULL) { printf("no results!\n"); } else { if (verbose) { printf("last result time (serial): "); printstamp(&prev->timestamp); printf("\n"); } if (prev->timestamp.tv_sec != end.tv_sec || prev->timestamp.tv_usec != end.tv_usec) { printf("Mismatch: end="); printstamp(&end); printf(" serial="); printstamp(&prev->timestamp); printf("\n"); e_sts = 1; } pmFreeResult(prev); } exit(e_sts); }
int main(int argc, char **argv) { int sep = __pmPathSeparator(); int sts; int c; char *p; char pmnsfile[MAXPATHLEN]; char outfname[MAXPATHLEN]; struct stat sbuf; if ((p = getenv("PMNS_DEFAULT")) != NULL) { strncpy(pmnsfile, p, MAXPATHLEN); pmnsfile[MAXPATHLEN-1]= '\0'; } else { snprintf(pmnsfile, sizeof(pmnsfile), "%s%c" "pmns" "%c" "root", pmGetConfig("PCP_VAR_DIR"), sep, sep); } while ((c = pmgetopt_r(argc, argv, &opts)) != EOF) { switch (c) { case 'd': /* duplicate PMIDs are OK */ fprintf(stderr, "%s: Warning: -d deprecated, duplicate PMNS names allowed by default\n", pmProgname); break; case 'D': /* debug flag */ if ((sts = __pmParseDebug(opts.optarg)) < 0) { fprintf(stderr, "%s: unrecognized debug flag specification (%s)\n", pmProgname, opts.optarg); opts.errors++; } else { pmDebug |= sts; } break; case 'n': /* alternative name space file */ strncpy(pmnsfile, opts.optarg, MAXPATHLEN); pmnsfile[MAXPATHLEN-1]= '\0'; break; case '?': default: opts.errors++; break; } } if (opts.errors || opts.optind > argc - 1) { pmUsageMessage(&opts); exit(1); } if ((sts = pmLoadASCIINameSpace(pmnsfile, 1)) < 0) { fprintf(stderr, "%s: Error: pmLoadASCIINameSpace(%s, 1): %s\n", pmProgname, pmnsfile, pmErrStr(sts)); exit(1); } { __pmnsTree *t; t = __pmExportPMNS(); if (t == NULL) { /* sanity check - shouldn't ever happen */ fprintf(stderr, "Exported PMNS is NULL !"); exit(1); } root = t->root; } while (opts.optind < argc) { delpmns(root, fullname = argv[opts.optind]); opts.optind++; } /* * from here on, ignore SIGHUP, SIGINT and SIGTERM to protect * the integrity of the new ouput file */ __pmSetSignalHandler(SIGHUP, SIG_IGN); __pmSetSignalHandler(SIGINT, SIG_IGN); __pmSetSignalHandler(SIGTERM, SIG_IGN); snprintf(outfname, sizeof(outfname), "%s.new", pmnsfile); if ((outf = fopen(outfname, "w")) == NULL) { fprintf(stderr, "%s: Error: cannot open PMNS file \"%s\" for writing: %s\n", pmProgname, outfname, osstrerror()); exit(1); } if (stat(pmnsfile, &sbuf) == 0) { /* * preserve the mode and ownership of any existing PMNS file */ chmod(outfname, sbuf.st_mode & ~S_IFMT); #if defined(HAVE_CHOWN) if (chown(outfname, sbuf.st_uid, sbuf.st_gid) < 0) fprintf(stderr, "%s: chown(%s, ...) failed: %s\n", pmProgname, outfname, osstrerror()); #endif } pmns_output(root, outf); fclose(outf); /* rename the PMNS */ if (rename2(outfname, pmnsfile) == -1) { fprintf(stderr, "%s: cannot rename \"%s\" to \"%s\": %s\n", pmProgname, outfname, pmnsfile, osstrerror()); /* remove the new PMNS */ unlink(outfname); exit(1); } exit(0); }
static int parseargs(int argc, char *argv[]) { int c; int sts; char *endnum; char *msg; struct timeval interval; while ((c = pmgetopt_r(argc, argv, &opts)) != EOF) { switch (c) { case 'A': /* output time alignment */ Aarg = opts.optarg; break; case 'D': /* debug flag */ sts = __pmParseDebug(opts.optarg); if (sts < 0) { pmprintf("%s: unrecognized debug flag specification (%s)\n", pmProgname, opts.optarg); opts.errors++; } else pmDebug |= sts; break; case 's': /* number of samples to write out */ sarg = (int)strtol(opts.optarg, &endnum, 10); if (*endnum != '\0' || sarg < 0) { pmprintf("%s: -s requires numeric argument\n", pmProgname); opts.errors++; } break; case 'S': /* start time for reduction */ Sarg = opts.optarg; break; case 'T': /* end time for reduction */ Targ = opts.optarg; break; case 't': /* output sample interval */ if (pmParseInterval(opts.optarg, &interval, &msg) < 0) { pmprintf("%s", msg); free(msg); opts.errors++; } else targ = tv2double(&interval); break; case 'v': /* number of samples per volume */ varg = (int)strtol(opts.optarg, &endnum, 10); if (*endnum != '\0' || varg < 0) { pmprintf("%s: -v requires numeric argument\n", pmProgname); opts.errors++; } break; case 'Z': /* use timezone from command line */ if (zarg) { pmprintf("%s: at most one of -Z and/or -z allowed\n", pmProgname); opts.errors++; } tz = opts.optarg; break; case 'z': /* use timezone from archive */ if (tz != NULL) { pmprintf("%s: at most one of -Z and/or -z allowed\n", pmProgname); opts.errors++; } zarg++; break; case '?': default: opts.errors++; break; } } if (opts.errors == 0 && opts.optind > argc-2) { pmprintf("%s: Error: insufficient arguments\n", pmProgname); opts.errors++; } return -opts.errors; }
int main(int argc, char **argv) { int c; int sts; char *endnum; iflag = isatty(0); while ((c = pmgetopt_r(argc, argv, &opts)) != EOF) { switch (c) { case 'D': /* debug flag */ sts = __pmParseDebug(opts.optarg); if (sts < 0) { fprintf(stderr, "%s: unrecognized debug flag specification (%s)\n", pmProgname, opts.optarg); opts.errors++; } else pmDebug |= sts; break; case 'e': /* echo input */ eflag++; break; case 'f': /* skip .dbpmdarc processing */ fflag++; break; case 'i': /* be interactive */ iflag = 1; break; case 'n': /* alternative name space file */ pmnsfile = opts.optarg; break; case 'q': sts = (int)strtol(opts.optarg, &endnum, 10); if (*endnum != '\0' || sts <= 0.0) { pmprintf("%s: -q requires a positive numeric argument\n", pmProgname); opts.errors++; } else { _creds_timeout = sts; } break; case 'U': /* run under alternate user account */ __pmSetProcessIdentity(opts.optarg); break; default: case '?': opts.errors++; break; } } if ((c = argc - opts.optind) > 0) { if (c > 1) opts.errors++; else { /* pid was specified */ if (primary) { pmprintf("%s: you may not specify both -P and a pid\n", pmProgname); opts.errors++; } else { pid = (int)strtol(argv[opts.optind], &endnum, 10); if (*endnum != '\0') { pmprintf("%s: pid must be a numeric process id\n", pmProgname); opts.errors++; } } } } if (opts.errors) { pmUsageMessage(&opts); exit(1); } if (pmnsfile == PM_NS_DEFAULT) { if ((sts = pmLoadNameSpace(pmnsfile)) < 0) { fprintf(stderr, "%s: Cannot load default namespace: %s\n", pmProgname, pmErrStr(sts)); exit(1); } } else { if ((sts = pmLoadASCIINameSpace(pmnsfile, 1)) < 0) { fprintf(stderr, "%s: Cannot load namespace from \"%s\": %s\n", pmProgname, pmnsfile, pmErrStr(sts)); exit(1); } } /* initialize the "fake context" ... */ setup_context(); setlinebuf(stdout); setlinebuf(stderr); #ifdef HAVE_ATEXIT atexit(cleanup); #endif for ( ; ; ) { initmetriclist(); yyparse(); if (yywrap()) { if (iflag) putchar('\n'); break; } __pmSetInternalState(PM_STATE_PMCS); switch (stmt_type) { case OPEN: profile_changed = 1; break; case CLOSE: switch (connmode) { case CONN_DSO: closedso(); break; case CONN_DAEMON: closepmda(); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } connmode = NO_CONN; break; case DESC: switch (connmode) { case CONN_DSO: dodso(PDU_DESC_REQ); break; case CONN_DAEMON: dopmda(PDU_DESC_REQ); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; case FETCH: switch (connmode) { case CONN_DSO: dodso(PDU_FETCH); break; case CONN_DAEMON: dopmda(PDU_FETCH); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; case INSTANCE: switch (connmode) { case CONN_DSO: dodso(PDU_INSTANCE_REQ); break; case CONN_DAEMON: dopmda(PDU_INSTANCE_REQ); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; case STORE: switch (connmode) { case CONN_DSO: dodso(PDU_RESULT); break; case CONN_DAEMON: dopmda(PDU_RESULT); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; case HELP: dohelp(param.number, param.pmid); break; case WATCH: break; case DBG: pmDebug = param.number; break; case QUIT: goto done; case STATUS: dostatus(); break; case INFO: switch (connmode) { case CONN_DSO: dodso(PDU_TEXT_REQ); break; case CONN_DAEMON: dopmda(PDU_TEXT_REQ); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; case NAMESPACE: if (cmd_namespace != NULL) free(cmd_namespace); cmd_namespace = strdup(param.name); if (cmd_namespace == NULL) { fprintf(stderr, "%s: No memory for new namespace\n", pmProgname); exit(1); } pmUnloadNameSpace(); strcpy(cmd_namespace, param.name); if ((sts = pmLoadASCIINameSpace(cmd_namespace, 1)) < 0) { fprintf(stderr, "%s: Cannot load namespace from \"%s\": %s\n", pmProgname, cmd_namespace, pmErrStr(sts)); pmUnloadNameSpace(); if (pmnsfile == PM_NS_DEFAULT) { fprintf(stderr, "%s: Reload default namespace\n", pmProgname); if ((sts = pmLoadNameSpace(pmnsfile)) < 0) { fprintf(stderr, "%s: Cannot load default namespace: %s\n", pmProgname, pmErrStr(sts)); exit(1); } } else { fprintf(stderr, "%s: Reload namespace from \"%s\"\n", pmProgname, pmnsfile); if ((sts = pmLoadASCIINameSpace(pmnsfile, 1)) < 0) { fprintf(stderr, "%s: Cannot load namespace from \"%s\"" ": %s\n", pmProgname, pmnsfile, pmErrStr(sts)); exit(1); } } } break; case EOL: break; case PMNS_NAME: switch (connmode) { case CONN_DSO: dodso(PDU_PMNS_IDS); break; case CONN_DAEMON: dopmda(PDU_PMNS_IDS); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; case PMNS_PMID: switch (connmode) { case CONN_DSO: dodso(PDU_PMNS_NAMES); break; case CONN_DAEMON: dopmda(PDU_PMNS_NAMES); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; case PMNS_CHILDREN: switch (connmode) { case CONN_DSO: dodso(PDU_PMNS_CHILD); break; case CONN_DAEMON: dopmda(PDU_PMNS_CHILD); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; case PMNS_TRAVERSE: switch (connmode) { case CONN_DSO: dodso(PDU_PMNS_TRAVERSE); break; case CONN_DAEMON: dopmda(PDU_PMNS_TRAVERSE); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; case ATTR: switch (connmode) { case CONN_DSO: dodso(PDU_AUTH); break; case CONN_DAEMON: dopmda(PDU_AUTH); break; case NO_CONN: yywarn("No PMDA currently opened"); break; } break; default: printf("Unexpected result (%d) from parser?\n", stmt_type); break; } __pmSetInternalState(PM_STATE_APPL); } done: cleanup(); exit(0); }