void QuickScan_Email(void) { int FoundMsg = FALSE; int i; char temp[81]; iLineCount = 2; WhosDoingWhat(READ_POST, NULL); if (EmailBase.Total == 0) { Enter(1); /* There are no messages in this area. */ pout(WHITE, BLACK, (char *) Language(205)); Enter(2); sleep(3); return; } clear(); /* # From To Subject */ poutCR(YELLOW, BLUE, (char *) Language(220)); if (Msg_Open(sMailpath)) { for (i = EmailBase.Lowest; i <= EmailBase.Highest; i++) { if (Msg_ReadHeader(i)) { snprintf(temp, 81, "%-6u", Msg.Id); pout(WHITE, BLACK, temp); snprintf(temp, 81, "%s ", padleft(Msg.From, 20, ' ')); pout(CYAN, BLACK, temp); snprintf(temp, 81, "%s ", padleft(Msg.To, 20, ' ')); pout(GREEN, BLACK, temp); snprintf(temp, 81, "%s", padleft(Msg.Subject, 31, ' ')); pout(MAGENTA, BLACK, temp); Enter(1); FoundMsg = TRUE; if (LC(1)) break; } } Msg_Close(); } if(!FoundMsg) { Enter(1); /* There are no messages in this area. */ pout(LIGHTGREEN, BLACK, (char *) Language(205)); Enter(2); sleep(3); } iLineCount = 2; Pause(); }
/* * Edit signature file, called by menu 319 */ void signature(void) { memset(&sLiNE, 0, sizeof(sLiNE)); if (loadsignature()) { while (TRUE) { if (editsignature() == TRUE) break; } } Enter(2); /* Returning to */ pout(CFG.MoreF, CFG.MoreB, (char *) Language(117)); poutCR(CFG.MoreF, CFG.MoreB, CFG.bbs_name); sleep(2); }
/* * Load signature file in memory for editing. */ int loadsignature(void) { char *temp; FILE *fp; int i; temp = calloc(PATH_MAX, sizeof(char)); snprintf(temp, PATH_MAX, "%s/%s/.signature", CFG.bbs_usersdir, exitinfo.Name); if ((fp = fopen(temp, "r")) == NULL) { WriteError("$Can't load %s", temp); free(temp); return FALSE; } clear(); /* Edit message signature */ pout(WHITE, BLACK, (char *) Language(107)); Enter(2); Syslog('+', "%s will edit his .signature", exitinfo.sUserName); i = 0; while (fgets(temp, LENSIGLINES+1, fp)) { Striplf(temp); strcpy(sLiNE[i], temp); i++; } fclose(fp); free(temp); toprow(); for (i = 0; i < MAXSIGLINES; i++) { snprintf(temp, 80, "%d:", i+1); pout(LIGHTRED, BLACK, temp); poutCR(CFG.MoreF, CFG.MoreB, sLiNE[i]); } botrow(); return TRUE; }
/* * Function will download a specific file */ int DownloadDirect(char *Name, int Wait) { int rc = 0; int Size; down_list *dl = NULL; if ((Size = file_size(Name)) == -1) { WriteError("No file %s", Name); pout(CFG.HiliteF, CFG.HiliteB, (char *)"File not found"); Enter(2); Pause(); } Syslog('+', "Download direct %s", Name); add_download(&dl, Name, basename(Name), 0, Size, FALSE); WhosDoingWhat(DOWNLOAD, NULL); if ((rc = download(dl))) { /* * Error */ Syslog('+', "Download failed rc=%d", rc); poutCR(LIGHTRED, BLACK, (char *)Language(353)); } else { /* * Update the users record. The file is free, so only statistics. */ ReadExitinfo(); exitinfo.Downloads++; /* Increase download counter */ mib_downloads++; WriteExitinfo(); } if (Wait) Pause(); return rc; }
void error_popmail(char *umsg) { pop3_close(); poutCR(LIGHTRED, BLACK, umsg); }
void Oneliner_Add() { FILE *pOneline; char *sFileName; int x; char temp[81]; Oneliner_Check(); sFileName = calloc(PATH_MAX, sizeof(char)); snprintf(sFileName, PATH_MAX, "%s/etc/oneline.data", getenv("MBSE_ROOT")); if ((pOneline = fopen(sFileName, "a+")) == NULL) { WriteError("Can't open file: %s", sFileName); return; } free(sFileName); memset(&ol, 0, sizeof(ol)); clear(); /* MBSE BBS Oneliners will randomly appear on the main menu. */ poutCR(WHITE, BLACK, Language(341)); Enter(1); /* Obscene or libellous oneliners will be deleted!! */ poutCR(WHITE, BLUE, Language(342)); Enter(1); /* Please enter your oneliner below. You have 75 characters.*/ poutCR(LIGHTRED, BLACK, Language(343)); pout(WHITE, BLACK, (char *)"> "); colour(CFG.InputColourF, CFG.InputColourB); GetstrC(temp, 75); if ((strcmp(temp, "")) == 0) { fclose(pOneline); return; } else { x = strlen(temp); if (x >= 78) temp[78] = '\0'; strcpy(ol.Oneline, temp); } Enter(1); /* Oneliner added */ pout(CYAN, BLACK, Language(344)); Enter(2); Pause(); Syslog('!', "User added oneliner:"); Syslog('!', ol.Oneline); snprintf(ol.UserName,36,"%s", exitinfo.sUserName); snprintf(ol.DateOfEntry,12,"%02d-%02d-%04d",l_date->tm_mday,l_date->tm_mon+1,l_date->tm_year+1900); ol.Available = TRUE; fwrite(&ol, sizeof(ol), 1, pOneline); fclose(pOneline); }
/* * List Oneliners */ void Oneliner_List() { FILE *pOneline; int recno = 0, Colour = 1; char *sFileName, msg[81]; clear(); sFileName = calloc(PATH_MAX, sizeof(char)); snprintf(sFileName, PATH_MAX, "%s/etc/oneline.data", getenv("MBSE_ROOT")); if ((pOneline = fopen(sFileName, "r+")) == NULL) { WriteError("Can't open file: %s", sFileName); return; } fread(&olhdr, sizeof(olhdr), 1, pOneline); if ((SYSOP == TRUE) || (exitinfo.Security.level >= CFG.sysop_access)) { /* # A Date User Description */ pout(LIGHTGREEN, BLACK, Language(345)); } else { /* # Description */ pout(LIGHTGREEN, BLACK, Language(346)); } Enter(1); colour(GREEN, BLACK); if (utf8) chartran_init((char *)"CP437", (char *)"UTF-8", 'B'); PUTSTR(chartran(sLine_str())); chartran_close(); while (fread(&ol, olhdr.recsize, 1, pOneline) == 1) { if ((SYSOP == TRUE) || (exitinfo.Security.level >= CFG.sysop_access)) { snprintf(msg, 81, "%2d", recno); pout(WHITE, BLACK, msg); snprintf(msg, 81, "%2d ", ol.Available); pout(LIGHTBLUE, BLACK, msg); pout(LIGHTCYAN, BLACK, ol.DateOfEntry); snprintf(msg, 81, "%-15s ", ol.UserName); pout(CYAN, BLACK, msg); snprintf(msg, 81, "%-.48s", ol.Oneline); poutCR(Colour, BLACK, msg); } else { snprintf(msg, 81, "%2d ", recno); pout(WHITE, BLACK, msg); snprintf(msg, 81, "%-.76s", ol.Oneline); poutCR(Colour, BLACK, msg); } recno++; Colour++; if (Colour >= 16) Colour = 1; } fclose(pOneline); Enter(1); Pause(); free(sFileName); }
/* * Download files already tagged, called from the menu. */ void Download(void) { FILE *tf, *fd; int rc = 0, i, Count = 0, OldArea; char *local, *temp; int Size = 0, CostSize = 0, dsize; struct _fdbarea *fdb_area = NULL; down_list *dl = NULL, *tmpf; Enter(2); OldArea = iAreaNumber; WhosDoingWhat(DOWNLOAD, NULL); /* * Clean users tag directory. */ temp = calloc(PATH_MAX, sizeof(char)); snprintf(temp, PATH_MAX, "-rf %s/%s/tag", CFG.bbs_usersdir, exitinfo.Name); execute_pth((char *)"rm", temp, (char *)"/dev/null", (char *)"/dev/null", (char *)"/dev/null"); snprintf(temp, PATH_MAX, "%s/%s/tag", CFG.bbs_usersdir, exitinfo.Name); CheckDir(temp); if ((tf = fopen("taglist", "r+")) == NULL) { Syslog('+', "Download command but no files marked"); /* No files marked for download. */ pout(LIGHTRED, BLACK, (char *) Language(258)); Enter(2); Pause(); return; } local = calloc(PATH_MAX, sizeof(char)); /* Checking your marked downloads, please wait... */ pout(LIGHTMAGENTA, BLACK, (char *) Language(255)); Enter(2); ReadExitinfo(); while (fread(&Tag, sizeof(Tag), 1, tf) == 1) { if (Tag.Active) { SetFileArea(Tag.Area); /* * Check password for selected file FIXME: Where??? */ memset(&fdb, 0, sizeof(fdb)); if ((fdb_area = mbsedb_OpenFDB(Tag.Area, 30)) != NULL) { while (fread(&fdb, fdbhdr.recsize, 1, fdb_area->fp) == 1) { if (strcmp(fdb.LName, Tag.LFile) == 0) break; } mbsedb_CloseFDB(fdb_area); } if (strcmp(fdb.LName, Tag.LFile) == 0) { Syslog('b', "Found file %s in area %d", fdb.LName, Tag.Area); if (fdb.Deleted) { /* Sorry that file is unavailable for download */ snprintf(temp, 81, "%s (%s)", (char *) Language(248), fdb.LName); poutCR(CFG.HiliteF, CFG.HiliteB, temp); Tag.Active = FALSE; Syslog('+', "File %s in area %d unavailable for download, deleted", fdb.LName, Tag.Area); } } if (Tag.Active) { /* * Create/Append file description list while we're * busy checking. If the users doesn't want it we * can unlink it aftwerwards. We also insert CR * characters to please the poor DOS (M$oft) users. */ snprintf(local, PATH_MAX, "./tag/filedesc.%d", exitinfo.Downloads % 256); if ((fd = fopen(local, "a")) != NULL) { fprintf(fd, "%s (%s)\r\n", fdb.LName, fdb.Name); for (i = 0; i < 25; i++) { if (strlen(fdb.Desc[i]) > 1) fprintf(fd, " %s\r\n", fdb.Desc[i]); } fprintf(fd, "\r\n"); fclose(fd); Syslog('b', "Added info to %s", local); } else { WriteError("Can't add info to %s", local); } snprintf(local, PATH_MAX, "%s/%s", sAreaPath, Tag.LFile); add_download(&dl, local, Tag.LFile, Tag.Area, fdb.Size, FALSE); Home(); } if (!Tag.Active) { /* * Update the download active flag in the * taglist */ fseek(tf, - sizeof(Tag), SEEK_CUR); fwrite(&Tag, sizeof(Tag), 1, tf); Syslog('b', "Download file %s marked inactive in taglist", Tag.LFile); } else { /* * Count file and sizes. */ Count++; Size += fdb.Size; if (!area.Free) CostSize += fdb.Size; } } } fclose(tf); /* * If anything left to download... */ if (!Count) { SetFileArea(OldArea); unlink("taglist"); /* No files marked for download */ pout(LIGHTRED, BLACK, (char *) Language(258)); Enter(2); Pause(); free(temp); free(local); tidy_download(&dl); Syslog('+', "No files left to download"); return; } /* * Add descriptions file to the queue. */ snprintf(local, PATH_MAX, "%s/%s/tag/filedesc.%d", CFG.bbs_usersdir, exitinfo.Name, exitinfo.Downloads % 256); dsize = file_size(local); snprintf(temp, PATH_MAX, "filedesc.%d", exitinfo.Downloads % 256); add_download(&dl, local, temp, 0, dsize, TRUE); free(local); /* You have */ /* files( */ /* bytes) marked for download */ snprintf(temp, PATH_MAX, "%s %d %s%d %s", (char *) Language(249), Count, (char *) Language(280), Size, (char *) Language(281)); pout(YELLOW, BLACK, temp); Enter(2); if (!CheckBytesAvailable(CostSize)) { SetFileArea(OldArea); free(temp); tidy_download(&dl); return; } Pause(); if ((rc = download(dl))) { /* * Download error */ Syslog('+', "Download error rc=%d", rc); free(temp); tidy_download(&dl); return; } /* * Checking the successfull sent files, they are missing from * the ./tag directory. Failed files are still there. */ PUTCHAR('\r'); /* Updating download counters, please wait ... */ pout(LIGHTCYAN, BLACK, (char *) Language(352)); Count = Size = 0; /* * Update downloadcounters, don't log anything because the state * of sucessfull sent files is already logged by the download * function. */ if ((tf = fopen("taglist", "r+")) != NULL) { while (fread(&Tag, sizeof(Tag), 1, tf) == 1) { PUTCHAR('.'); if (Tag.Active) { for (tmpf = dl; tmpf; tmpf = tmpf->next) { if (strcmp(tmpf->remote, Tag.LFile) == 0) { if (tmpf->sent) { Tag.Active = FALSE; fseek(tf, - sizeof(Tag), SEEK_CUR); fwrite(&Tag, sizeof(Tag), 1, tf); /* * Update the download counter and the last download date. */ SetFileArea(Tag.Area); if ((fdb_area = mbsedb_OpenFDB(Tag.Area, 30))) { while (fread(&fdb, fdbhdr.recsize, 1, fdb_area->fp) == 1) { if (strcmp(fdb.LName, Tag.LFile) == 0) break; } Size += fdb.Size; fdb.TimesDL++; fdb.LastDL = time(NULL); if (mbsedb_LockFDB(fdb_area, 30)) { fseek(fdb_area->fp, - fdbhdr.recsize, SEEK_CUR); fwrite(&fdb, fdbhdr.recsize, 1, fdb_area->fp); mbsedb_UnlockFDB(fdb_area); } mbsedb_CloseFDB(fdb_area); Count++; } } break; } } } } fclose(tf); } Enter(2); /* * Update the users record. */ ReadExitinfo(); exitinfo.Downloads += Count; /* Increase download counter */ mib_downloads += Count; exitinfo.DownloadK += (Size / 1024); /* Increase amount download today */ mib_kbdownload += (Size / 1024); /* * Minus the amount downloaded today from downloadktoday * if less than zero, it won't let the user download anymore. */ if (LIMIT.DownK || LIMIT.DownF) { exitinfo.DownloadKToday -= (Size / 1024); } WriteExitinfo(); Pause(); SetFileArea(OldArea); free(temp); tidy_download(&dl); }
/* * Edit signature file with a simple line editor. */ int editsignature(void) { FILE *fp; int i, x; char *temp, *temp1; temp = calloc(PATH_MAX, sizeof(char)); temp1 = calloc(PATH_MAX, sizeof(char)); snprintf(temp, PATH_MAX, "%s/%s/.signature", CFG.bbs_usersdir, exitinfo.Name); while (TRUE) { Enter(1); /* Functions available: */ poutCR(CFG.HiliteF, CFG.HiliteB, (char *) Language(113)); Enter(1); /* (L)ist, (R)eplace text, (E)dit line, (A)bort, (S)ave */ pout(YELLOW, RED, (char *) Language(114)); Enter(2); /* Select: */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(115)); alarm_on(); i = toupper(Readkey()); Enter(1); if (i == Keystroke(114, 3)) { /* Aborting... */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(116)); Syslog('+', "User aborted .signature editor"); free(temp); free(temp1); return TRUE; } else if (i == Keystroke(114, 2)) { Enter(1); /* Edit which line: */ snprintf(temp, 80, " %s", (char *) Language(118)); pout(CFG.HiliteF, CFG.HiliteB, temp); colour(CFG.InputColourF, CFG.InputColourB); GetstrC(temp, 3); if ((strcmp(temp, "")) == 0) break; i = atoi(temp); if ((i < 1) || (i > MAXSIGLINES)) { Enter(1); /* Line does not exist. */ poutCR(LIGHTRED, BLACK, (char *) Language(119)); break; } x = strlen(sLiNE[i-1]); snprintf(temp, 80, "%d:", i); pout(LIGHTRED, BLACK, temp); pout(CFG.InputColourF, CFG.InputColourB, sLiNE[i-1]); GetstrP(sLiNE[i-1], LENSIGLINES-1, x); } else if (i == Keystroke(114, 0)) { /* List lines */ toprow(); for (i = 0; i < MAXSIGLINES; i++) { snprintf(temp, 80, "%d:", i+1); pout(LIGHTRED, BLACK, temp); poutCR(CFG.MoreF, CFG.MoreB, sLiNE[i]); } botrow(); } else if (i == Keystroke(114, 4)) { Enter(1); /* Saving... */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(340)); /* Open TextFile for Writing NextUser Info */ snprintf(temp, PATH_MAX, "%s/%s/.signature", CFG.bbs_usersdir, exitinfo.Name); if ((fp = fopen(temp, "w")) == NULL) { WriteError("$Can't open %s", temp); free(temp); free(temp1); return TRUE; } for (i = 0; i < MAXSIGLINES; i++) { if (strlen(sLiNE[i])) fprintf(fp, "%s\n", sLiNE[i]); } fclose(fp); Syslog('+', "User Saved .signature"); free(temp); free(temp1); return TRUE; } else if (i == Keystroke(114, 1)) { Enter(1); /* Edit which line: */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(118)); colour(CFG.InputColourF, CFG.InputColourB); GetstrC(temp, 3); if ((strcmp(temp, "")) == 0) break; i = atoi(temp); if ((i < 1) || (i > MAXSIGLINES)) { Enter(1); /* Line does not exist. */ poutCR(LIGHTRED, BLACK, (char *) Language(119)); break; } Enter(1); /* Line reads: */ poutCR(CFG.MoreF, CFG.MoreB, (char *) Language(186)); snprintf(temp, 81, "%d:%s", i, sLiNE[i-1]); poutCR(CFG.MoreF, CFG.MoreB, temp); Enter(1); /* Text to replace: */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(195)); colour(CFG.InputColourF, CFG.InputColourB); GetstrC(temp, LENSIGLINES-1); if ((strcmp(temp, "")) == 0) break; /* Replacement text: */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(196)); colour(CFG.InputColourF, CFG.InputColourB); GetstrC(temp1, LENSIGLINES-1); if ((strcmp(temp1, "")) == 0) break; strreplace(sLiNE[i-1], temp, temp1); } else Enter(1); } free(temp); free(temp1); return FALSE; }