int Exec_Msg(int type, char **result, int key, char *arg, char *menuname) { *result=NULL; switch (type) { case same_direction: if (direction==DIRECTION_NEXT) Msg_Next(last_msg); else Msg_Previous(last_msg); break; case msg_area: Msg_Area(); break; case read_next: Msg_Next(last_msg); break; case read_previous: Msg_Previous(last_msg); break; case read_individual: Msg_Read_Individual(key); break; case msg_current: Msg_Current(); break; case read_original: Msg_Read_Original(); break; case read_reply: Msg_Read_Reply(); break; case msg_kill: Msg_Kill(-1L); break; case forward: Msg_Forward(NULL); break; case enter_message: Msg_Enter(); break; case msg_reply: Msg_Reply(); break; case msg_edit_user: Msg_Edit_User(); break; case read_nonstop: Msg_Nonstop(); break; case msg_list: Msg_List(menuname); break; case msg_scan: Msg_Scan(menuname); break; case msg_checkmail: Msg_Checkmail(menuname); break; case msg_inquir: Msg_Inquire(menuname); break; case msg_hurl: Msg_Hurl(); break; case msg_upload: Msg_Upload(); break; case msg_upload_qwk: QWK_Upload(); break; case xport: Msg_Xport(); break; case msg_change: Msg_Change(); break; case msg_tag: Msg_Tag(); break; case msg_browse: Msg_Browse(0, NULL, menuname); break; case msg_unreceive: Msg_Unreceive(last_msg, NULL); break; case msg_restrict: Msg_Restrict(); break; case msg_toggle_kludges: Msg_Toggle_Kludges(); break; #ifdef MAX_TRACKER case msg_track: TrackMenu(); break; #endif case msg_dload_attach: Msg_Attach_Download(); break; case msg_reply_area: Msg_ReplyArea(arg); break; default: logit(bad_menu_opt, type); return 0; } return 0; }
/* * Kill messages according to age and max messages. */ void KillArea(char *Path, char *Name, int DaysOld, int MaxMsgs, int Areanr) { unsigned int Number, TotalMsgs = 0, *Active, Counter = 0; int i, DelCount = 0, DelAge = 0, Done; time_t Today, MsgDate; IsDoing("Killing %ld", Areanr); Today = time(NULL) / 86400L; if (Msg_Open(Path)) { if (!do_quiet) { mbse_colour(LIGHTRED, BLACK); printf(" (Killing)"); mbse_colour(LIGHTMAGENTA, BLACK); fflush(stdout); } if (Msg_Lock(30L)) { TotalMsgs = Msg_Number(); if (TotalMsgs) { if ((Active = (unsigned int *)malloc((size_t)((TotalMsgs + 100L) * sizeof(unsigned int)))) != NULL) { i = 0; Number = Msg_Lowest(); do { Active[i++] = Number; } while (Msg_Next(&Number) == TRUE); } } else Active = NULL; Number = Msg_Lowest(); do { if (CFG.slow_util && do_quiet) msleep(1); if ((!do_quiet) && ((Counter % 10L) == 0)) { printf("%6u / %6u\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b", Counter, TotalMsgs); fflush(stdout); } if ((Counter % 10L) == 0) DoNop(); Counter++; msg_tot++; if (Msg_ReadHeader(Number) == TRUE) { Done = FALSE; if (DaysOld) { /* * GoldED doesn't fill the Msg.Arrived field, use the * written date instead. */ if (Msg.Arrived == 0L) MsgDate = Msg.Written / 86400L; else MsgDate = Msg.Arrived / 86400L; if ((Today - MsgDate) > DaysOld) { Msg_Delete(Number); Done = TRUE; DelAge++; msg_del++; if (Active != NULL) { for (i = 0; i < TotalMsgs; i++) { if (Active[i] == Number) Active[i] = 0L; } } } } if (Done == FALSE && (MaxMsgs) && Msg_Number() > MaxMsgs) { Msg_Delete(Number); DelCount++; msg_del++; if (Active != NULL) { for (i = 0; i < TotalMsgs; i++) { if (Active[i] == Number) Active[i] = 0L; } } } } } while (Msg_Next(&Number) == TRUE); if (Active != NULL) free(Active); Msg_UnLock(); } else { Syslog('+', "Can't lock msgbase %s", Path); } if (!do_quiet) { printf(" \b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); fflush(stdout); } Msg_Close(); Syslog('-', "%6d %6d %6d %6d %6d %s", TotalMsgs, DaysOld, DelAge, MaxMsgs, DelCount, Name); if (!do_quiet) { printf("\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b"); fflush(stdout); } } else Syslog('+', "Failed to open %s", Path); }
/* * Link messages in one area. * Returns -1 if error, else the number of linked messages. */ int Msg_Link(char *Path, int do_quiet, int slow_util) { int i, m, msg_link = 0; unsigned int Number, Prev, Next, Crc, Total; char Temp[128], *p; MSGLINK *Link; if (! Msg_Open(Path)) { return -1; } if (!do_quiet) { msg_colour(LIGHTRED, BLACK); printf(" (linking)"); msg_colour(LIGHTMAGENTA, BLACK); fflush(stdout); } if ((Total = Msg_Number()) != 0L) { if (Msg_Lock(30L)) { if ((Link = (MSGLINK *)malloc((Total + 1) * sizeof(MSGLINK))) != NULL) { memset(Link, 0, (Total + 1) * sizeof(MSGLINK)); Number = Msg_Lowest(); i = 0; do { Msg_ReadHeader(Number); strcpy(Temp, Msg.Subject); p = strupr(Temp); if (!strncmp(p, "RE:", 3)) { p += 3; if (*p == ' ') p++; } Link[i].Subject = StringCRC32(p); Link[i].Number = Number; i++; if (((i % 10) == 0) && (!do_quiet)) { printf("%6d / %6u\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b", i, Total); fflush(stdout); } } while(Msg_Next(&Number) == TRUE); if (!do_quiet) { printf("%6d / %6u\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b", i, Total); fflush(stdout); } Number = Msg_Lowest(); i = 0; do { Msg_ReadHeader(Number); Prev = Next = 0; Crc = Link[i].Subject; for (m = 0; m < Total; m++) { if (m == i) continue; if (Link[m].Subject == Crc) { if (m < i) Prev = Link[m].Number; else if (m > i) { Next = Link[m].Number; break; } } } if (((i % 10) == 0) && (!do_quiet)) { printf("%6d / %6u\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b", i, Total); fflush(stdout); } if (Msg.Original != Prev || Msg.Reply != Next) { Msg.Original = Prev; Msg.Reply = Next; Msg_WriteHeader(Number); msg_link++; } i++; } while(Msg_Next(&Number) == TRUE); if (!do_quiet) { printf("%6d / %6u\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b", i, Total); fflush(stdout); } free(Link); } if (!do_quiet) { printf(" \b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); fflush(stdout); } Msg_UnLock(); } else { Syslog('+', "Can't lock %s", Path); return -1; } } Msg_Close(); if (!do_quiet) { printf("\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b"); fflush(stdout); } return msg_link; }