/******************************************************** * File: toss.c * Created at Sun Jan 28 22:10:33 MSK 2001 by raorn // raorn@binec.ru * TOSS * $Id: toss.c,v 1.11 2002/10/28 00:11:07 raorn Exp $ *******************************************************/ #include "crashecho.h" bool Compare(uchar * str, uchar * recog) { ulong c, d; uchar comp; uchar buf[5]; d = 0; for (c = 0; d < strlen(recog); c++) { if (recog[d] == '$') { strncpy(buf, &recog[d + 1], 2); buf[2] = 0; comp = hextodec(buf); if (str[c] != comp) return (FALSE); d += 3; } else { if (str[c] != recog[d] && recog[d] != '?') return (FALSE); d++; } } return (TRUE); } struct Packer *DetectPacker(uchar * file) { FILE *fh; uchar buf[40]; struct Packer *tmppacker; if (!(fh = fopen(file, "rb"))) { LogWrite(1, SYSTEMERR, "Unable to open %s", file); LogWrite(1, SYSTEMERR, "Error: %s", strerror(errno)); return (NULL); } fread(buf, 40, 1, fh); fclose(fh); for (tmppacker = (struct Packer *) config.PackerList.First; tmppacker; tmppacker = tmppacker->Next) if (Compare(buf, tmppacker->Recog)) return (tmppacker); return (NULL); } void LogTossResults(void) { struct Area *area; printf("\n"); for (area = (struct Area *) config.AreaList.First; area; area = area->Next) { if (ctrlc) return; if (area->NewDupes) LogWrite(3, TOSSINGINFO, "Area %s -- %lu messages (%lu dupes)", area->Tagname, area->NewTexts, area->NewDupes); else if (area->NewTexts) LogWrite(3, TOSSINGINFO, "Area %s -- %lu messages", area->Tagname, area->NewTexts); } printf("\n"); LogWrite(1, TOSSINGINFO, " Total -> Read messages: %6lu Written messages: %6lu", toss_total, toss_written); LogWrite(1, TOSSINGINFO, "Imported -> Imported messages: %6lu Carbon copies: %6lu", toss_import, toss_cc); LogWrite(1, TOSSINGINFO, " Bad -> Bad messages: %6lu Duplicate messages: %6lu", toss_bad, toss_dupes); printf("\n"); } bool UnpackDir(uchar *dir, uchar *dest) { struct Packer *tmppacker; uchar buf[200], buf2[200]; int arcres, arcrc; struct jbList ArcFEList; struct FileEntry *fe; LogWrite(6, TOSSINGINFO, "In UnpackDir(%s, %s)", dir, dest); if (!ReadDir(dir, &ArcFEList, IsArc)) { LogWrite(1, SYSTEMERR, "Failed to read directory \"%s\"", dir); LogWrite(1, SYSTEMERR, "Error: %s", strerror(errno)); return (FALSE); } LogWrite(2, TOSSINGINFO, "Unpacking arcmail bundles in %s...", dir); SortFEList(&ArcFEList); for (fe = (struct FileEntry *) ArcFEList.First; fe; fe = fe->Next) { MakeFullPath(dir, fe->Name, buf, 200); if (fe->Size == 0) { LogWrite(1, TOSSINGINFO, "Deleting zero length bundle %s", fe->Name); unlink(buf); continue; } if (!(tmppacker = (struct Packer *) DetectPacker(buf))) { LogWrite(1, TOSSINGINFO, "Failed to recognize archive type of %s", fe->Name); BadFile(buf); continue; } printf("\n"); LogWrite(2, TOSSINGINFO, "Unarchiving %s using %s", fe->Name, tmppacker->Name); printf("\n"); /* TODO ``UNPACKMASK *.[Pp][Kk][Tt]'' config keyword */ ExpandPacker(tmppacker->Unpacker, buf2, 200, buf, ""); LogWrite(6, DEBUG, "Executing `%s'", buf2); arcres = ChDirExecute(dest, buf2, &arcrc); printf("\n"); if (arcres == -1) { LogWrite(1, SYSTEMERR, "Can't unpack %s into \"%s\"", fe->Name, dest); exitprg = TRUE; /* XXX no need */ jbFreeList(&ArcFEList); return (FALSE); } if (arcres || arcrc) { if (arcres) LogWrite(1, SYSTEMERR, "Unarchiving failed: %lu", arcrc); else LogWrite(1, SYSTEMERR, "Unarchiving failed"); BadFile(buf); continue; } unlink(buf); } jbFreeList(&ArcFEList); return (TRUE); } bool TossDir(uchar * dir, bool no_security, bool no_echomail) { struct FileEntry *fe; struct jbList PktFEList; uchar buf[200]; LogWrite(3, ACTIONINFO, "Tossing packets in %s...", dir); /* Search for pkt files */ if (!ReadDir(dir, &PktFEList, IsPkt)) { LogWrite(1, SYSTEMERR, "Failed to read directory \"%s\"", dir); LogWrite(1, SYSTEMERR, "Error: %s", strerror(errno)); return (FALSE); } SortFEList(&PktFEList); if (nomem) { jbFreeList(&PktFEList); return (FALSE); } /* Process pkt files */ for (fe = (struct FileEntry *) PktFEList.First; fe; fe = fe->Next) { MakeFullPath(dir, fe->Name, buf, 200); if (!ReadPkt(buf, fe, HandleMessage, no_security, no_echomail)) { jbFreeList(&PktFEList); return (FALSE); } unlink(buf); } jbFreeList(&PktFEList); return TRUE; }