void chained(__pmHashCtl *h) { __pmHashNode *n; for (n = __pmHashWalk(h, PM_HASH_WALK_START); n != NULL; n = __pmHashWalk(h, PM_HASH_WALK_NEXT)) { dumpnode(n->key, (long)n->data); } }
int __pmUnparseHostAttrsSpec( pmHostSpec *hosts, int count, __pmHashCtl *attrs, char *string, size_t size) { __pmHashNode *node; int off = 0, len = size; /* offset in string and space remaining */ int sts, first; if ((node = __pmHashSearch(PCP_ATTR_PROTOCOL, attrs)) != NULL) { if ((sts = pmsprintf(string, len, "%s://", (char *)node->data)) >= len) return -E2BIG; len -= sts; off += sts; } else if (__pmHashSearch(PCP_ATTR_UNIXSOCK, attrs) != NULL) { if ((sts = pmsprintf(string, len, "unix:/")) >= len) return -E2BIG; len -= sts; off += sts; } else if (__pmHashSearch(PCP_ATTR_LOCAL, attrs) != NULL) { if ((sts = pmsprintf(string, len, "local:/")) >= len) return -E2BIG; len -= sts; off += sts; } if ((sts = unparseHostSpec(hosts, count, string + off, len, 0)) >= len) return sts; len -= sts; off += sts; first = 1; for (node = __pmHashWalk(attrs, PM_HASH_WALK_START); node != NULL; node = __pmHashWalk(attrs, PM_HASH_WALK_NEXT)) { if (node->key == PCP_ATTR_PROTOCOL || node->key == PCP_ATTR_UNIXSOCK || node->key == PCP_ATTR_LOCAL) continue; if ((sts = pmsprintf(string + off, len, "%c", first ? '?' : '&')) >= len) return -E2BIG; len -= sts; off += sts; first = 0; if ((sts = unparseAttribute(node, string + off, len)) >= len) return -E2BIG; len -= sts; off += sts; } return off; }
static int build_dsoattrs(pmdaInterface *dispatch, __pmHashCtl *attrs) { __pmHashNode *node; char name[32]; char *namep; int sts = 0; #ifdef HAVE_GETUID snprintf(name, sizeof(name), "%u", getuid()); name[sizeof(name)-1] = '\0'; if ((namep = strdup(name)) != NULL) __pmHashAdd(PCP_ATTR_USERID, namep, attrs); #endif #ifdef HAVE_GETGID snprintf(name, sizeof(name), "%u", getgid()); name[sizeof(name)-1] = '\0'; if ((namep = strdup(name)) != NULL) __pmHashAdd(PCP_ATTR_GROUPID, namep, attrs); #endif snprintf(name, sizeof(name), "%u", getpid()); name[sizeof(name)-1] = '\0'; if ((namep = strdup(name)) != NULL) __pmHashAdd(PCP_ATTR_PROCESSID, namep, attrs); if (dispatch->version.six.attribute != NULL) { for (node = __pmHashWalk(attrs, PM_HASH_WALK_START); node != NULL; node = __pmHashWalk(attrs, PM_HASH_WALK_NEXT)) { if ((sts = dispatch->version.six.attribute( 0, node->key, node->data, node->data ? strlen(node->data)+1 : 0, dispatch->version.six.ext)) < 0) break; } } return sts; }
int pass3(__pmContext *ctxp, char *archname, pmOptions *opts) { struct timeval timespan; int sts; pmResult *result; struct timeval last_stamp; struct timeval delta_stamp; l_ctxp = ctxp; l_archname = archname; if (vflag) fprintf(stderr, "%s: start pass3\n", archname); if ((sts = pmSetMode(PM_MODE_FORW, &opts->start, 0)) < 0) { fprintf(stderr, "%s: pmSetMode failed: %s\n", l_archname, pmErrStr(sts)); return STS_FATAL; } /* check which timestamp print format we should be using */ timespan = opts->finish; tsub(×pan, &opts->start); if (timespan.tv_sec > 86400) /* seconds per day: 60*60*24 */ dayflag = 1; sts = 0; last_stamp = opts->start; for ( ; ; ) { /* * we need the next record with no fancy checks or record * skipping in libpcp, so use __pmLogRead() in preference * to pmFetchArchive() */ if ((sts = __pmLogRead(l_ctxp->c_archctl->ac_log, l_ctxp->c_mode, NULL, &result, PMLOGREAD_NEXT)) < 0) break; result_count++; delta_stamp = result->timestamp; tsub(&delta_stamp, &last_stamp); #ifdef PCP_DEBUG if (pmDebug & DBG_TRACE_APPL0) { int i; int sum_val = 0; int cnt_noval = 0; int cnt_err = 0; pmValueSet *vsp; fprintf(stderr, "%s.%d:[", l_archname, l_ctxp->c_archctl->ac_vol); print_stamp(stderr, &result->timestamp); for (i = 0; i < result->numpmid; i++) { vsp = result->vset[i]; if (vsp->numval > 0) sum_val += vsp->numval; else if (vsp->numval == 0) cnt_noval++; else cnt_err++; } fprintf(stderr, "] delta(stamp)=%.3fsec", __pmtimevalToReal(&delta_stamp)); fprintf(stderr, " numpmid=%d sum(numval)=%d", result->numpmid, sum_val); if (cnt_noval > 0) fprintf(stderr, " count(numval=0)=%d", cnt_noval); if (cnt_err > 0) fprintf(stderr, " count(numval<0)=%d", cnt_err); fputc('\n', stderr); } #endif if (delta_stamp.tv_sec < 0) { /* time went backwards! */ fprintf(stderr, "%s.%d:[", l_archname, l_ctxp->c_archctl->ac_vol); print_stamp(stderr, &result->timestamp); fprintf(stderr, "]: timestamp went backwards, prior timestamp: "); print_stamp(stderr, &last_stamp); fprintf(stderr, "\n"); } last_stamp = result->timestamp; if ((opts->finish.tv_sec > result->timestamp.tv_sec) || ((opts->finish.tv_sec == result->timestamp.tv_sec) && (opts->finish.tv_usec >= result->timestamp.tv_usec))) { if (result->numpmid == 0) { /* * MARK record ... make sure wrap check is not done * at next fetch (mimic interp.c from libpcp) */ __pmHashNode *hptr; checkData *checkdata; int k; for (hptr = __pmHashWalk(&hashlist, PM_HASH_WALK_START); hptr != NULL; hptr = __pmHashWalk(&hashlist, PM_HASH_WALK_NEXT)) { checkdata = (checkData *)hptr->data; for (k = 0; k < checkdata->listsize; k++) { checkdata->instlist[k]->lasttime.tv_sec = 0; } } mark_count++; } else docheck(result); pmFreeResult(result); } else { pmFreeResult(result); sts = PM_ERR_EOL; break; } } if (sts != PM_ERR_EOL) { fprintf(stderr, "[after "); print_stamp(stderr, &last_stamp); fprintf(stderr, "]: pmFetch: error: %s\n", pmErrStr(sts)); return STS_FATAL; } return STS_OK; }