int main(int ac, char **av) { int r = 0; int i; char *arg = NULL; char *file = NULL; LogFo = stderr; LoadDiabloConfig(ac, av); for (i = 1; i < ac; ++i) { char *ptr = av[i]; if (*ptr != '-') { arg = ptr; continue; } ptr += 2; switch(ptr[-1]) { case 'C': if (*ptr == 0) ++i; break; case 'd': DebugOpt = atoi(*ptr ? ptr : av[++i]); break; case 'F': ForceOpt = 1; break; case 'f': file = (*ptr) ? ptr : av[++i]; break; case 'H': ShowFileHeader = 1; break; case 'h': HeadOnly = 1; break; case 'q': QuietOpt = 1; break; case 's': StripCR = 0; break; case 'V': PrintVersion(); break; case 'v': VerifyOnly = 1; LogFo = stdout; break; default: fprintf(stderr, "dreadart: Illegal option: %s\n", ptr - 2); Usage(av[0]); } } if (arg == NULL && file == NULL) Usage(av[0]); HistoryOpen(NULL, HGF_READONLY); LoadSpoolCtl(0, 1); if (arg == NULL) { char buf[8192]; char msgid[MAXMSGIDLEN]; FILE *fi = (strcmp(file, "-") == 0) ? stdin : fopen(file, "r"); if (fi) { while (fgets(buf, sizeof(buf), fi) != NULL) { hash_t hv; char *m; if (strncmp(buf, "DUMP ", 5) == 0) { History h = { 0 }; if (sscanf(buf + 5, "%s gm=%d ex=%hd boff=%d bsize=%d", msgid, &h.gmt, &h.exp, &h.boffset, &h.bsize) == 5) { char *p; h.hv.h1 = (int32)strtoul(msgid, &p, 16); if (*p == '.') h.hv.h2 = (int32)strtoul(p + 1, &p, 16); if (*p == '.') h.iter = (int16)strtoul(p + 1, NULL, 16); r = LookupHash(h.hv, NULL, &h); } } else if ((m = strchr(buf, '<')) != NULL) { char *p; if ((p = strchr(m, '>')) == NULL) continue; *++p = 0; hv = hhash(m); r = LookupHash(hv, m, NULL); } else if (sscanf(buf, "%x.%x", &hv.h1, &hv.h2) == 2) { r = LookupHash(hv, NULL, NULL); } } if (fi != stdin) fclose(fi); } else { fprintf(stderr, "Unable to open %s (%s)\n", file, strerror(errno)); } } else { hash_t hv; char *msgid = NULL; if (arg[0] == '<') { msgid = arg; hv = hhash(arg); r = LookupHash(hv, msgid, NULL); } else if (arg[0] == 'D' && arg[1] == '.') { int32 dummy; if (sscanf(arg + 2, "%x/%x.%x", &dummy, &hv.h1, &hv.h2) != 3) { fprintf(stderr, "argument error\n"); exit(1); } r = LookupHash(hv, msgid, NULL); } else if (sscanf(arg, "%x.%x", &hv.h1, &hv.h2) == 2) { r = LookupHash(hv, msgid, NULL); } else { char fname[PATH_MAX]; char *p = fname; History h = { 0 }; *p = 0; if (*arg != '/') { sprintf(p, "%s/", PatExpand(SpoolHomePat)); p += strlen(p); } if (sscanf(arg, "%[^:]:%d,%d", p, &h.boffset, &h.bsize) == 3) { DumpArticle(fname, &h, NULL); } else { printf("Unknown argument: %s\n", arg); } } } exit(r); }
int main(int argc, char **argv) { extern char *optarg; extern int optind; char *progname = *argv; char *HistoryFile; int SleepTime = 5; int Opened = 0; char ch; struct stat st; int PrevIno = -1; int Force = 0; char *map = NULL; off_t mapsize = 0; int All = 0; optind = 1; while ((ch = getopt(argc, argv, "afsV")) != -1) { switch(ch) { case 'a': All = 1; break; case 'f': Force = 1; break; case 's': SleepTime = strtol(optarg, NULL, 0); break; case 'V': PrintVersion(); break; default: usage(argv[0]); } } argv += optind; if (*argv == NULL) usage(progname); HistoryFile = *argv; if (!Force && geteuid() != 0) { printf("This daemon must be run as root due to the use of mlock()\n"); printf("which is only allowed to be executed by the root user\n"); exit(1); } while (1) { if (!Opened) { if (stat(HistoryFile, &st) == 0) PrevIno = st.st_ino; if (All) { int fd; mapsize = st.st_size; fd = open(HistoryFile, O_RDONLY); if (fd == -1) { perror("history open"); exit(1); } map = xmap(NULL, mapsize, PROT_READ, MAP_SHARED, fd, 0); close(fd); mlock(map, mapsize); } else { HistoryOpen(HistoryFile, HGF_MLOCK); } Opened = 1; } sleep(SleepTime); if (stat(HistoryFile, &st) != 0 || st.st_ino != PrevIno || (All && st.st_size != mapsize)) { if (All && map != NULL) { munlock(map, mapsize); xunmap((void *)map, mapsize); } else { HistoryClose(); } Opened = 0; printf("New history\n"); } } }
int main(int ac, char **av) { int flags = 0; int uflag = 0; int aflag = 0; uint16 spoolObj = (uint16)-1; char *historyFileName = NULL; LoadDiabloConfig(ac, av); FileAry = calloc(sizeof(char *), FileMax); { int i; for (i = 1; i < ac; ++i) { char *ptr = av[i]; if (*ptr != '-') { if (FileIdx == FileMax) { FileMax = FileMax * 2; FileAry = realloc(FileAry, sizeof(char *) * FileMax); } FileAry[FileIdx++] = ptr; continue; } ptr += 2; switch(ptr[-1]) { case 'a': aflag = 1; break; case 'C': if (*ptr == 0) ++i; break; case 'd': DebugOpt = (*ptr) ? strtol(ptr, NULL, 0) : strtol(av[++i], NULL, 0); break; case 'e': UnExpireOpt = 1; break; case 'F': historyFileName = (*ptr) ? ptr : av[++i]; break; case 'f': flags |= HGF_FAST | HGF_NOSEARCH; break; case 'h': NewHSize = bsizetol((*ptr) ? ptr : av[++i]); if ((NewHSize ^ (NewHSize - 1)) != (NewHSize << 1) - 1) { fprintf(stderr, "specified history size is not a power of 2\n"); exit(1); } break; case 'n': ForReal = 0; break; case 'Q': RequeueOpt = 1; break; case 'q': QuietOpt = 1; break; case 'S': spoolObj = (*ptr) ? strtol(ptr, NULL, 10) : strtol(av[++i], NULL, 10); break; case 't': if (*ptr == 'b') { ptr++; GmtStart = timeConv(*ptr ? ptr : av[++i]); } else if (*ptr == 'e') { ptr++; GmtEnd = timeConv(*ptr ? ptr : av[++i]); } else { fprintf(stderr, "Invalid option: %s\n", &ptr[-2]); Usage(); } break; case 'u': uflag = 1; break; case 'V': PrintVersion(); break; case 'v': VerboseOpt = (*ptr) ? strtol(ptr, NULL, 0) : 1; break; default: Usage(); } } } if (!UnExpireOpt && !aflag && FileIdx == 0 && spoolObj == (uint16)-1) Usage(); if (flags & HGF_FAST || UnExpireOpt) { struct stat st; if (historyFileName == NULL) { fprintf(stderr, "You cannot run fastmode/unexpire without specifying a filename!\n"); exit(1); } if (stat(historyFileName, &st) == 0 && uflag == 0) { fprintf(stderr, "-f history files may not previously exist unless you also specify -u\n"); fprintf(stderr, "WARNING! -f -u is NOT suggested!\n"); exit(1); } if (uflag) flags &= ~HGF_NOSEARCH; } if (VerboseOpt) { if (GmtStart != 0 && GmtEnd != 0) printf("Scanning directories from D.%08x to D.%08x\n", GmtStart, GmtEnd); else if (GmtStart == 0 && GmtEnd != 0) printf("Scanning directories from earliest to D.%08x\n", GmtEnd); else if (GmtStart != 0 && GmtEnd == 0) printf("Scanning directories from D.%08x to latest\n", GmtStart); } if (UnExpireOpt) { hisfd = open(historyFileName, O_RDWR); if (hisfd == -1) { fprintf(stderr, "Unable to open history (%s): %s\n", historyFileName, strerror(errno)); exit(1); } } LoadSpoolCtl(0, 1); if (RequeueOpt) { ForReal = 0; QuietOpt = 1; } else { /* * historyFileName can be NULL and causes the default dhistory path * to be used. */ HistoryOpen(historyFileName, flags); } { int i; for (i = 0; i < FileIdx; ++i) { struct stat st; if (VerboseOpt > 1) printf("Check: %s\n", FileAry[i]); if (stat(FileAry[i], &st) == 0) { if (S_ISDIR(st.st_mode)) { int gmt; if (sscanf(FileAry[i], "D.%x", &gmt) == 1) { ScanSpoolDirectory(FileAry[i], gmt, spoolObj); } else { fprintf(stderr, "Illegal path format for dir: %s\n", FileAry[i]); } } else { int gmt; int iter; if (sscanf(FileAry[i], "D.%x/B.%x", &gmt, &iter) == 2) { ScanSpoolFile(FileAry[i], gmt, iter, spoolObj); } else { fprintf(stderr, "Illegal path format for file: %s\n", FileAry[i]); } } } else { printf("Unable to stat: %s (%s)\n", FileAry[i], strerror(errno)); } } } if (aflag || spoolObj != (uint16)-1) { ScanSpoolObject(spoolObj); } printf("diload: %d/%d entries loaded (%d duplicate)\n", LoadCount, LoadCount + LoadDupCount, LoadDupCount); if (!RequeueOpt) { int r = HistoryClose(); if (r == RCOK) return(0); else return(1); } return(0); /* not reached */ }
int main(int ac, char **av) { char *id = NULL; int i; int r = 0; LoadDiabloConfig(ac, av); for (i = 1; i < ac; ++i) { char *ptr = av[i]; if (*ptr != '-') { id = ptr; } else { ptr += 2; switch(ptr[-1]) { case 'C': if (*ptr == 0) ++i; break; case 'f': ScanFile = *ptr ? ptr : ptr + 1; ScanOpt = 1; break; case 'h': DHistoryPat = *ptr ? ptr : ptr + 1; break; case 'q': QuietOpt = 1; break; case 's': ScanOpt = 1; break; case 'V': PrintVersion(); break; default: Usage(); } } } if (ScanOpt == 0 && id == NULL) Usage(); HistoryOpen(NULL, HGF_READONLY); LoadSpoolCtl(0, 1); if (ScanOpt == 0) { r += DILookup(id); } else { char buf[1024]; FILE *f; if (ScanFile == NULL) f = stdin; else f = fopen(ScanFile, "r"); if (f == NULL) { fprintf(stderr, "Unable to open %s (%s)\n", ScanFile, strerror(errno)); exit(1); } while (fgets(buf, sizeof(buf), f) != NULL) { char *p = strrchr(buf, ' '); if (p) { *p++ = '\0'; printf("%s", buf); } else p = buf; r += DILookup(p); } if (ScanFile != NULL) fclose(f); } return(r); }