int main(int argc, char **argv) { pthread_t tid1; pthread_t tid2; int sts; char *msg; unsigned int in[PDU_MAX+1]; unsigned int out[PDU_MAX+1]; int i; char msgbuf[PM_MAXERRMSGLEN]; setvbuf(stdout, NULL, _IONBF, 0); if (argc != 1) { printf("Usage: multithread4\n"); exit(1); } for (i = 0; i <= PDU_MAX; i++) { in[i] = out[i] = 0; } __pmSetPDUCntBuf(in, out); if ((sts = pmLoadNameSpace(PM_NS_DEFAULT)) < 0) { printf("%s: pmLoadNameSpace: %s\n", argv[0], pmErrStr_r(sts, msgbuf, PM_MAXERRMSGLEN)); 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); } 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); printf("Total PDU counts\n"); printf("in:"); for (i = 0; i <= PDU_MAX; i++) printf(" %d", in[i]); putchar('\n'); printf("out:"); for (i = 0; i <= PDU_MAX; i++) printf(" %d", out[i]); putchar('\n'); exit(0); }
static void * func2(void *arg) { int sts; char *fn = "func2"; int i; char msgbuf[PM_MAXERRMSGLEN]; for (i = 0; i < ITER; i++) { pmUnloadNameSpace(); if ((sts = pmLoadNameSpace(PM_NS_DEFAULT)) < 0) { printf("%s: pmLoadNameSpace[%d]: %s\n", fn, i, pmErrStr_r(sts, msgbuf, PM_MAXERRMSGLEN)); exit(1); } } pthread_exit(NULL); }
/* get ready to run evaluator */ void agentInit(void) { Task *t; int sts; /* Set up local name space for agent */ /* Only load PMNS if it's default and hence not already loaded */ if (pmnsfile == PM_NS_DEFAULT && (sts = pmLoadNameSpace(pmnsfile)) < 0) { fprintf(stderr, "%s: agentInit: cannot load metric namespace: %s\n", pmProgname, pmErrStr(sts)); exit(1); } /* allocate pmResult's and send pmDescs for secret agent mode */ t = taskq; while (t) { newResult(t); sendDescs(t); t = t->next; } }
/* * main */ int main(int argc, char **argv) { int sts; set_proc_fmt(); printf("pid=%" FMT_PID " ppid=%" FMT_PID "\n", getpid(), getppid()); getargs(argc, argv); if (pmnsfile != PM_NS_DEFAULT) { if ((sts = pmLoadNameSpace(pmnsfile)) < 0) { printf("%s: Cannot load pmnsfile from \"%s\": %s\n", pmProgname, pmnsfile, pmErrStr(sts)); exit(1); } } if ((sts = pmNewContext(PM_CONTEXT_HOST, host)) < 0) { printf("%s: Cannot connect to PMCD on host \"%s\": %s\n", pmProgname, host, pmErrStr(sts)); exit(1); } test_PMNS(); test_desc(); test_instance(); test_prof_fetch(); if (!is_hotproc) test_store(); if ((sts = pmWhichContext()) < 0) { printf("%s: pmWhichContext: %s\n", pmProgname, pmErrStr(sts)); exit(1); } pmDestroyContext(sts); exit(0); }
int main(int argc, char **argv) { int c; int i; int sts; int errflag = 0; int type = 0; int verbose = 0; char *host = NULL; /* pander to gcc */ int mode = PM_MODE_INTERP; /* mode for archives */ char *configfile = NULL; char *start = NULL; char *finish = NULL; char *align = NULL; char *offset = NULL; char *logfile = NULL; pmLogLabel label; /* get hostname for archives */ int zflag = 0; /* for -z */ char *tz = NULL; /* for -Z timezone */ int tzh; /* initial timezone handle */ char local[MAXHOSTNAMELEN]; char *pmnsfile = PM_NS_DEFAULT; int samples = -1; double delta = 1.0; char *endnum; struct timeval startTime; struct timeval endTime; struct timeval appStart; struct timeval appEnd; struct timeval appOffset; pmSetProgname(argv[0]); while ((c = getopt(argc, argv, "a:A:c:D:h:l:Ln:O:s:S:t:T:U:VzZ:?")) != EOF) { switch (c) { case 'a': /* archive name */ if (type != 0) { fprintf(stderr, "%s: at most one of -a, -h, -L and -U allowed\n", pmGetProgname()); errflag++; } type = PM_CONTEXT_ARCHIVE; host = optarg; break; case 'A': /* time alignment */ align = optarg; break; case 'c': /* configfile */ if (configfile != NULL) { fprintf(stderr, "%s: at most one -c option allowed\n", pmGetProgname()); errflag++; } configfile = optarg; break; case 'D': /* debug options */ sts = pmSetDebug(optarg); if (sts < 0) { fprintf(stderr, "%s: unrecognized debug options specification (%s)\n", pmGetProgname(), optarg); errflag++; } break; case 'h': /* contact PMCD on this hostname */ if (type != 0) { fprintf(stderr, "%s: at most one of -a, -h, -L and -U allowed\n", pmGetProgname()); errflag++; } host = optarg; type = PM_CONTEXT_HOST; break; case 'L': /* LOCAL, no PMCD */ if (type != 0) { fprintf(stderr, "%s: at most one of -a, -h, -L and -U allowed\n", pmGetProgname()); errflag++; } host = NULL; type = PM_CONTEXT_LOCAL; putenv("PMDA_LOCAL_PROC="); /* if proc PMDA needed */ putenv("PMDA_LOCAL_SAMPLE="); /* if sampledso PMDA needed */ break; case 'l': /* logfile */ logfile = optarg; break; case 'n': /* alternative name space file */ pmnsfile = optarg; break; case 'O': /* sample offset time */ offset = optarg; break; case 's': /* sample count */ samples = (int)strtol(optarg, &endnum, 10); if (*endnum != '\0' || samples < 0) { fprintf(stderr, "%s: -s requires numeric argument\n", pmGetProgname()); errflag++; } break; case 'S': /* start time */ start = optarg; break; case 't': /* delta seconds (double) */ delta = strtod(optarg, &endnum); if (*endnum != '\0' || delta <= 0.0) { fprintf(stderr, "%s: -t requires floating point argument\n", pmGetProgname()); errflag++; } break; case 'T': /* terminate time */ finish = optarg; break; case 'U': /* uninterpolated archive log */ if (type != 0) { fprintf(stderr, "%s: at most one of -a, -h, -L and -U allowed\n", pmGetProgname()); errflag++; } type = PM_CONTEXT_ARCHIVE; mode = PM_MODE_FORW; host = optarg; break; case 'V': /* verbose */ verbose++; break; case 'z': /* timezone from host */ if (tz != NULL) { fprintf(stderr, "%s: at most one of -Z and/or -z allowed\n", pmGetProgname()); errflag++; } zflag++; break; case 'Z': /* $TZ timezone */ if (zflag) { fprintf(stderr, "%s: at most one of -Z and/or -z allowed\n", pmGetProgname()); errflag++; } tz = optarg; break; case '?': default: errflag++; break; } } if (zflag && type == 0) { fprintf(stderr, "%s: -z requires an explicit -a, -h or -U option\n", pmGetProgname()); errflag++; } if (errflag) { fprintf(stderr, "Usage: %s options ...\n\ \n\ Options\n\ -a archive metrics source is an archive log\n\ -A align time alignment\n\ -c configfile file to load configuration from\n\ -D debug standard PCP debug options\n\ -h host metrics source is PMCD on host\n\ -l logfile redirect diagnostics and trace output\n\ -L use local context instead of PMCD\n\ -n pmnsfile use an alternative PMNS\n\ -O offset offset sample time\n\ -s samples terminate after this many iterations\n\ -S start start at this time\n\ -t delta sample interval in seconds(float) [default 1.0]\n\ -T finish finish at this time\n\ -U archive metrics source is an uninterpolated archive log\n\ -V verbose/diagnostic output\n\ -z set reporting timezone to local time for host from -a, -h or -U\n\ -Z timezone set reporting timezone\n", pmGetProgname()); exit(1); } if (logfile != NULL) { pmOpenLog(pmGetProgname(), logfile, stderr, &sts); if (sts < 0) { fprintf(stderr, "%s: Could not open logfile \"%s\"\n", pmGetProgname(), logfile); } } if (pmnsfile != PM_NS_DEFAULT && (sts = pmLoadNameSpace(pmnsfile)) < 0) { printf("%s: Cannot load namespace from \"%s\": %s\n", pmGetProgname(), pmnsfile, pmErrStr(sts)); exit(1); } if (type == 0) { type = PM_CONTEXT_HOST; gethostname(local, sizeof(local)); host = local; } if ((sts = pmNewContext(type, host)) < 0) { if (type == PM_CONTEXT_HOST) fprintf(stderr, "%s: Cannot connect to PMCD on host \"%s\": %s\n", pmGetProgname(), host, pmErrStr(sts)); else fprintf(stderr, "%s: Cannot open archive \"%s\": %s\n", pmGetProgname(), host, pmErrStr(sts)); exit(1); } if (type == PM_CONTEXT_ARCHIVE) { if ((sts = pmGetArchiveLabel(&label)) < 0) { fprintf(stderr, "%s: Cannot get archive label record: %s\n", pmGetProgname(), pmErrStr(sts)); exit(1); } if (mode != PM_MODE_INTERP) { if ((sts = pmSetMode(mode, &label.ll_start, 0)) < 0) { fprintf(stderr, "%s: pmSetMode: %s\n", pmGetProgname(), pmErrStr(sts)); exit(1); } } startTime = label.ll_start; sts = pmGetArchiveEnd(&endTime); if (sts < 0) { fprintf(stderr, "%s: pmGetArchiveEnd: %s\n", pmGetProgname(), pmErrStr(sts)); exit(1); } } else { gettimeofday(&startTime, NULL); endTime.tv_sec = INT_MAX; } if (zflag) { if ((tzh = pmNewContextZone()) < 0) { fprintf(stderr, "%s: Cannot set context timezone: %s\n", pmGetProgname(), pmErrStr(tzh)); exit(1); } if (type == PM_CONTEXT_ARCHIVE) printf("Note: timezone set to local timezone of host \"%s\" from archive\n\n", label.ll_hostname); else printf("Note: timezone set to local timezone of host \"%s\"\n\n", host); } else if (tz != NULL) { if ((tzh = pmNewZone(tz)) < 0) { fprintf(stderr, "%s: Cannot set timezone to \"%s\": %s\n", pmGetProgname(), tz, pmErrStr(tzh)); exit(1); } printf("Note: timezone set to \"TZ=%s\"\n\n", tz); } else tzh = pmNewContextZone(); /* non-flag args are argv[optind] ... argv[argc-1] */ while (optind < argc) { printf("extra argument[%d]: %s\n", optind, argv[optind]); optind++; } if (align != NULL && type != PM_CONTEXT_ARCHIVE) { fprintf(stderr, "%s: -A option only supported for PCP archives, alignment request ignored\n", pmGetProgname()); align = NULL; } sts = pmParseTimeWindow(start, finish, align, offset, &startTime, &endTime, &appStart, &appEnd, &appOffset, &endnum); if (sts < 0) { fprintf(stderr, "%s: %s\n", pmGetProgname(), endnum); exit(1); } if ((sts = pmLookupName(2, namelist, pmidlist)) < 0) { fprintf(stderr, "%s: pmLookupName failed: %s\n", pmGetProgname(), pmErrStr(sts)); exit(1); } /* goto the start */ if ((sts = pmSetMode(PM_MODE_INTERP, &appStart, (int)(delta * 1000))) < 0) { fprintf(stderr, "%s: pmSetMode failed: %s\n", pmGetProgname(), pmErrStr(sts)); exit(1); } pmCtime(&appStart.tv_sec, timebuf); printf("archive %s\nstartTime: %19.19s.%06d\n", host, timebuf, (int)appStart.tv_usec); pmCtime(&appEnd.tv_sec, timebuf); printf("endTime : %19.19s.%06d\nsamples=%d delta=%dms\n", timebuf, (int)appEnd.tv_usec, samples, (int)(delta * 1000)); /* play forwards over the mark */ for (i=0; i < samples; i++) { if ((sts = pmFetch(2, pmidlist, &result)) < 0) { fprintf(stderr, "%s: pmFetch failed: %s\n", pmGetProgname(), pmErrStr(sts)); exit(1); } check_result("forwards ", result); curpos = result->timestamp; /* struct cpy */ pmFreeResult(result); } /* rewind back over the mark */ if ((sts = pmSetMode(PM_MODE_INTERP, &curpos, (int)(delta * -1000))) < 0) { fprintf(stderr, "%s: pmSetMode failed: %s\n", pmGetProgname(), pmErrStr(sts)); exit(1); } for (i=0; i < samples; i++) { if ((sts = pmFetch(2, pmidlist, &result)) < 0) { fprintf(stderr, "%s: pmFetch failed: %s\n", pmGetProgname(), pmErrStr(sts)); exit(1); } check_result("rewinding", result); pmFreeResult(result); } return 0; }
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); }
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 = pmLoadNameSpace(pmnsfile)) < 0) { fprintf(stderr, "%s: Error: pmLoadNameSpace(%s): %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); }
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); }