void MakeArc() { char *cmd; if (!getarchiver((char *)"ZIP")) { WriteError("ZIP Archiver not available"); return; } cmd = xstrcpy(archiver.farc); if (cmd == NULL) { WriteError("ZIP archive command not available"); return; } Nopper(); if (!do_quiet) printf("Creating allfiles.zip\n"); if (!execute_str(cmd, (char *)"allfiles.zip allfiles.txt allfiles.utf", (char *)NULL, (char *)"/dev/null", (char *)"/dev/null", (char *)"/dev/null") == 0) WriteError("Create allfiles.zip failed"); Nopper(); if (!do_quiet) printf("Creating newfiles.zip\n"); if (!execute_str(cmd, (char *)"newfiles.zip newfiles.txt newfiles.utf", (char *)NULL, (char *)"/dev/null", (char *)"/dev/null", (char *)"/dev/null") == 0) WriteError("Create newfiles.zip failed"); free(cmd); cmd = NULL; }
/* * Buffered file copy, filetime is preserved. */ int file_cp(char *from, char *to) { char *line; FILE *stfrom, *stto; int dummy, bread; static int error; struct stat sb; struct utimbuf ut; stfrom = fopen(from, "r"); if (stfrom == NULL) return errno; stto = fopen(to, "w"); if (stto == NULL) { error = errno; fclose(stfrom); return error; } line = malloc(16384); do { bread = fread(line, 1, 16384, stfrom); dummy = fwrite(line, 1, bread, stto); if (bread != dummy) { error = errno; fclose(stfrom); fclose(stto); unlink(to); free(line); return error; } Nopper(); // For large files on slow systems } while (bread != 0); free(line); fclose(stfrom); if (fclose(stto) != 0) { error = errno; unlink(to); return error; } /* * copy successfull, now copy file- and modification-time */ if (stat(from, &sb) == 0) { ut.actime = mktime(localtime(&sb.st_atime)); ut.modtime = mktime(localtime(&sb.st_mtime)); if (utime(to, &ut) != 0) { error = errno; unlink(to); return error; } chmod(to, sb.st_mode); } return 0; }
unsigned char testkey(int y, int x) { int rc; unsigned char ch = 0; Nopper(); locate(y, x); rc = Waitchar(&ch, 50); if (rc == 1) { if (ch == KEY_ESCAPE) rc = Escapechar(&ch); } if (rc == 1) return ch; else return '\0'; }
static int tcp_sblk(char *buf, int len, int typ) { Nopper(); if (typ == TCP_CMD) Syslog('a', "tcp_sblk: cmd: %s", buf); else Syslog('a', "tcp_sblk: data: %d bytes", len); PUTCHAR(TCP_BLKSTRT); PUTCHAR(typ); PUTCHAR((len >> 8) & 0x0ff); PUTCHAR(len & 0x0ff); PUT(buf, len); PUTCHAR(TCP_BLKEND); FLUSHOUT(); if (tty_status) WriteError("TCP: send error: %s", ttystat[tty_status]); return tty_status; }
/* * Calculate the 32 bit CRC of a file. Return -1 if file not found. */ int file_crc(char *path, int slow) { static int crc; int bread; FILE *fp; char *line; if ((fp = fopen(path, "r")) == NULL) return -1; line = malloc(32768); crc = 0xffffffff; do { bread = fread(line, 1, 32768, fp); crc = upd_crc32(line, crc, bread); Nopper(); // For large files on slow systems. } while (bread > 0); free(line); fclose(fp); return crc ^ 0xffffffff; }
void Masterlist() { FILE *fp, *np, *fu, *nu, *pAreas, *pHeader; int AreaNr = 0, z, x = 0, New; unsigned int AllFiles = 0, AllKBytes = 0, NewFiles = 0, NewKBytes = 0; unsigned int AllAreaFiles, AllAreaBytes, popdown, down, NewAreaFiles, NewAreaBytes; char *sAreas, temp[PATH_MAX], pop[81]; struct _fdbarea *fdb_area = NULL; sAreas = calloc(PATH_MAX, sizeof(char)); IsDoing("Create Allfiles list"); snprintf(sAreas, PATH_MAX, "%s/etc/fareas.data", getenv("MBSE_ROOT")); if(( pAreas = fopen (sAreas, "r")) == NULL) { WriteError("Can't open File Areas File: %s", sAreas); mbse_colour(LIGHTGRAY, BLACK); die(MBERR_GENERAL); } fread(&areahdr, sizeof(areahdr), 1, pAreas); if (!do_quiet) printf("Processing file areas\n"); if ((fp = fopen("allfiles.tmp", "a+")) == NULL) { WriteError("$Can't open allfiles.tmp"); die(MBERR_GENERAL); } if ((np = fopen("newfiles.tmp", "a+")) == NULL) { WriteError("$Can't open newfiles.tmp"); fclose(fp); die(MBERR_GENERAL); } if ((fu = fopen("allfiles.ump", "a+")) == NULL) { WriteError("$Can't open allfiles.ump"); fclose(fp); fclose(np); die(MBERR_GENERAL); } if ((nu = fopen("newfiles.ump", "a+")) == NULL) { WriteError("$Can't open newfiles.ump"); fclose(fp); fclose(np); fclose(fu); die(MBERR_GENERAL); } chartran_init((char *)"CP437", (char *)"UTF-8", 'B'); TopBox(fp, fu, TRUE); TopBox(np, nu, TRUE); snprintf(temp, 81, "All available files at %s", CFG.bbs_name); MidLine(temp, fp, fu, TRUE); snprintf(temp, 81, "New available files since %d days at %s", CFG.newdays, CFG.bbs_name); MidLine(temp, np, nu, TRUE); BotBox(fp, fu, TRUE); BotBox(np, nu, TRUE); snprintf(temp, PATH_MAX, "%s/etc/header.txt", getenv("MBSE_ROOT")); if (( pHeader = fopen(temp, "r")) != NULL) { Syslog('+', "Inserting %s", temp); while( fgets(temp, 80 ,pHeader) != NULL) { Striplf(temp); fprintf(fp, "%s\r\n", temp); fprintf(np, "%s\r\n", temp); fprintf(fu, "%s\r\n", chartran(temp)); fprintf(nu, "%s\r\n", chartran(temp)); } fclose(pHeader); } while (fread(&area, areahdr.recsize, 1, pAreas) == 1) { AreaNr++; AllAreaFiles = 0; AllAreaBytes = 0; NewAreaFiles = 0; NewAreaBytes = 0; if (area.Available && (area.LTSec.level <= CFG.security.level)) { Nopper(); if ((fdb_area = mbsedb_OpenFDB(AreaNr, 30)) == 0) { WriteError("Can't open Area %d (%s)! Skipping ...", AreaNr, area.Name); } else { popdown = 0; while (fread(&fdb, fdbhdr.recsize, 1, fdb_area->fp) == 1) { if (!fdb.Deleted) { /* * The next is to reduce system load. */ x++; if (CFG.slow_util && do_quiet && ((x % 3) == 0)) msleep(1); AllFiles++; AllAreaFiles++; AllAreaBytes += fdb.Size; down = fdb.TimesDL; if (down > popdown) { popdown = down; snprintf(pop, 81, "%s", fdb.Name); } if (((t_start - fdb.UploadDate) / 84400) <= CFG.newdays) { NewFiles++; NewAreaFiles++; NewAreaBytes += fdb.Size; } } } AllKBytes += AllAreaBytes / 1024; NewKBytes += NewAreaBytes / 1024; /* * If there are files to report do it. */ if (AllAreaFiles) { TopBox(fp, fu, TRUE); TopBox(np, nu, NewAreaFiles); snprintf(temp, 81, "Area %d - %s", AreaNr, area.Name); MidLine(temp, fp, fu, TRUE); MidLine(temp, np, nu, NewAreaFiles); snprintf(temp, 81, "File Requests allowed"); MidLine(temp, fp, fu, area.FileReq); MidLine(temp, np, nu, area.FileReq && NewAreaFiles); snprintf(temp, 81, "%d KBytes in %d files", AllAreaBytes / 1024, AllAreaFiles); MidLine(temp, fp, fu, TRUE); snprintf(temp, 81, "%d KBytes in %d files", NewAreaBytes / 1024, NewAreaFiles); MidLine(temp, np, nu, NewAreaFiles); if (popdown) { snprintf(temp, 81, "Most popular file is %s", pop); MidLine(temp, fp, fu, TRUE); } BotBox(fp, fu, TRUE); BotBox(np, nu, NewAreaFiles); fseek(fdb_area->fp, fdbhdr.hdrsize, SEEK_SET); while (fread(&fdb, fdbhdr.recsize, 1, fdb_area->fp) == 1) { if (!fdb.Deleted) { New = (((t_start - fdb.UploadDate) / 84400) <= CFG.newdays); snprintf(temp, 81, "%s", fdb.LName); WriteFiles(fp, fu, np, nu, New, temp); snprintf(temp, 81, "%-12s%10u K %s [%04d] Uploader: %s", fdb.Name, (int)(fdb.Size / 1024), StrDateDMY(fdb.UploadDate), fdb.TimesDL, strlen(fdb.Uploader)?fdb.Uploader:""); WriteFiles(fp, fu, np, nu, New, temp); for (z = 0; z < 25; z++) { if (strlen(fdb.Desc[z])) { if ((fdb.Desc[z][0] == '@') && (fdb.Desc[z][1] == 'X')) { snprintf(temp, 81, " %s", fdb.Desc[z]+4); } else { snprintf(temp, 81, " %s", fdb.Desc[z]); } WriteFiles(fp, fu, np, nu, New, temp); } } if (strlen(fdb.Magic)) { snprintf(temp, 81, " Magic filerequest: %s", fdb.Magic); WriteFiles(fp, fu, np, nu, New, temp); } WriteFiles(fp, fu, np, nu, New, (char *)""); } } } mbsedb_CloseFDB(fdb_area); } } } /* End of While Loop Checking for Areas Done */ fclose(pAreas); TopBox(fp, fu, TRUE); TopBox(np, nu, TRUE); snprintf(temp, 81, "Total %d files, %d KBytes", AllFiles, AllKBytes); MidLine(temp, fp, fu, TRUE); snprintf(temp, 81, "Total %d files, %d KBytes", NewFiles, NewKBytes); MidLine(temp, np, nu, TRUE); MidLine((char *)"", fp, fu, TRUE); MidLine((char *)"", np, nu, TRUE); snprintf(temp, 81, "Created by MBSE BBS v%s (%s-%s) at %s", VERSION, OsName(), OsCPU(), StrDateDMY(t_start)); MidLine(temp, fp, fu, TRUE); MidLine(temp, np, nu, TRUE); BotBox(fp, fu, TRUE); BotBox(np, nu, TRUE); snprintf(temp, PATH_MAX, "%s/etc/footer.txt", getenv("MBSE_ROOT")); if(( pHeader = fopen(temp, "r")) != NULL) { Syslog('+', "Inserting %s", temp); while( fgets(temp, 80 ,pHeader) != NULL) { Striplf(temp); fprintf(fp, "%s\r\n", temp); fprintf(np, "%s\r\n", temp); fprintf(fu, "%s\r\n", chartran(temp)); fprintf(nu, "%s\r\n", chartran(temp)); } fclose(pHeader); } fclose(fp); fclose(np); fclose(fu); fclose(nu); chartran_close(); if ((rename("allfiles.tmp", "allfiles.txt")) == 0) unlink("allfiles.tmp"); if ((rename("newfiles.tmp", "newfiles.txt")) == 0) unlink("newfiles.tmp"); if ((rename("allfiles.ump", "allfiles.utf")) == 0) unlink("allfiles.ump"); if ((rename("newfiles.ump", "newfiles.utf")) == 0) unlink("newfiles.ump"); Syslog('+', "Allfiles: %ld, %ld MBytes", AllFiles, AllKBytes / 1024); Syslog('+', "Newfiles: %ld, %ld MBytes", NewFiles, NewKBytes / 1024); free(sAreas); }
void DoMsgBase() { FILE *pAreas; char *sAreas, *Name; int arearec; int Del = 0; sAreas = calloc(PATH_MAX, sizeof(char)); Name = calloc(PATH_MAX, sizeof(char )); IsDoing("Msg Maintenance"); if (do_area) Syslog('+', "Processing message area %ld", do_area); else Syslog('+', "Processing all message areas"); if (do_kill) { Syslog('-', " Total Max. Days/Killed Max. Nr/Killed Area name"); Syslog('-', "------ ------ ------ ------ ------ ----------------------------------"); } snprintf(sAreas, PATH_MAX, "%s/etc/mareas.data", getenv("MBSE_ROOT")); if(( pAreas = fopen (sAreas, "r")) == NULL) { WriteError("$Can't open %s", sAreas); die(MBERR_GENERAL); } fread(&msgshdr, sizeof(msgshdr), 1, pAreas); if (do_area) { if (fseek(pAreas, (msgshdr.recsize + msgshdr.syssize) * (do_area - 1), SEEK_CUR) == 0) { fread(&msgs, msgshdr.recsize, 1, pAreas); if (msgs.Active) { if (enoughspace(CFG.freespace) == 0) die(MBERR_DISK_FULL); if (!do_quiet) { mbse_colour(CYAN, BLACK); printf("\r%5d .. %-40s", do_area, msgs.Name); fflush(stdout); } are_tot++; mkdirs(msgs.Base, 0770); if (do_kill) KillArea(msgs.Base, msgs.Name, msgs.DaysOld, msgs.MaxMsgs, do_area); if (do_pack || msg_del) PackArea(msgs.Base, do_area); if (do_link) LinkArea(msgs.Base, do_area); if (processed) are_proc++; } } } else { arearec = 0; while (fread(&msgs, msgshdr.recsize, 1, pAreas) == 1) { fseek(pAreas, msgshdr.syssize, SEEK_CUR); arearec++; if (msgs.Active) { if (enoughspace(CFG.freespace) == 0) die(MBERR_DISK_FULL); Nopper(); if (!do_quiet) { mbse_colour(CYAN, BLACK); printf("\r%5d .. %-40s", arearec, msgs.Name); fflush(stdout); } are_tot++; mkdirs(msgs.Base, 0770); processed = FALSE; if (do_kill) KillArea(msgs.Base, msgs.Name, msgs.DaysOld, msgs.MaxMsgs, arearec); if (do_pack || (Del != msg_del)) { PackArea(msgs.Base, arearec); } Del = msg_del; if (do_link) LinkArea(msgs.Base, arearec); if (processed) are_proc++; } } } fclose(pAreas); if (!do_area) { snprintf(sAreas, PATH_MAX, "%s/etc/users.data", getenv("MBSE_ROOT")); if ((pAreas = fopen (sAreas, "r")) == NULL) { WriteError("$Can't open %s", sAreas); die(MBERR_GENERAL); } fread(&usrconfighdr, sizeof(usrconfighdr), 1, pAreas); while (fread(&usrconfig, usrconfighdr.recsize, 1, pAreas) == 1) { if (usrconfig.Email && strlen(usrconfig.Name)) { Nopper(); snprintf(Name, PATH_MAX, "User %s email area: mailbox", usrconfig.Name); if (!do_quiet) { mbse_colour(CYAN, BLACK); printf("\r .. %-40s", Name); fflush(stdout); } snprintf(sAreas, PATH_MAX, "%s/%s/mailbox", CFG.bbs_usersdir, usrconfig.Name); are_tot++; processed = FALSE; if (do_kill) KillArea(sAreas, Name, 0, CFG.defmsgs, 0); if (do_pack || (Del != msg_del)) { PackArea(sAreas, 0); } Del = msg_del; if (do_link) LinkArea(sAreas, 0); if (processed) are_proc++; snprintf(sAreas, PATH_MAX, "%s/%s/archive", CFG.bbs_usersdir, usrconfig.Name); snprintf(Name, 80, "User %s email area: archive", usrconfig.Name); are_tot++; processed = FALSE; if (do_kill) KillArea(sAreas, Name, 0, CFG.defmsgs, 0); if (do_pack || (Del != msg_del)) PackArea(sAreas, 0); Del = msg_del; if (do_link) LinkArea(sAreas, 0); if (processed) are_proc++; snprintf(sAreas, PATH_MAX, "%s/%s/trash", CFG.bbs_usersdir, usrconfig.Name); snprintf(Name, 80, "User %s email area: trash", usrconfig.Name); are_tot++; processed = FALSE; if (do_kill) KillArea(sAreas, Name, CFG.defdays, CFG.defmsgs, 0); if (do_pack || (Del != msg_del)) PackArea(sAreas, 0); Del = msg_del; if (do_link) LinkArea(sAreas, 0); if (processed) are_proc++; } } fclose(pAreas); } if (do_link) RemoveSema((char *)"msglink"); free(sAreas); free(Name); die(MBERR_OK); }
int get_xover(char *grpname, int startnr, int endnr, List **art) { char cmd[81], *ptr, *ptr2, *resp, *p; int retval, dupe, done = FALSE; int nr; unsigned int crc; POverview pov; snprintf(cmd, 81, "XOVER %d-%d\r\n", startnr, endnr); if ((retval = nntp_cmd(cmd, 224))) { switch (retval) { case 412: WriteError("No newsgroup selected"); return RETVAL_NOXOVER; case 502: WriteError("Permission denied"); return RETVAL_NOXOVER; case 420: Syslog('m', "No articles in group %s", grpname); return RETVAL_OK; } } while (done == FALSE) { resp = nntp_receive(); if ((strlen(resp) == 1) && (strcmp(resp, ".") == 0)) { done = TRUE; } else { Marker(); Nopper(); pov = xoverview; ptr = resp; ptr2 = ptr; /* * First item is the message number. */ while (*ptr2 != '\0' && *ptr2 != '\t') ptr2++; if (*ptr2 != '\0') *(ptr2) = '\0'; nr = atol(ptr); ptr = ptr2; ptr++; /* * Search the message-id */ while (*ptr != '\0' && pov != NULL && strcmp(pov->header, "Message-ID:") != 0) { /* * goto the next field, past the tab. */ pov = pov->next; while (*ptr != '\t' && *ptr != '\0') ptr++; if (*ptr != '\0') ptr++; } if (*ptr != '\0' && pov != NULL) { /* * Found it, now find start of msgid */ while (*ptr != '\0' && *ptr != '<') ptr++; if(ptr != '\0') { ptr2 = ptr; while(*ptr2 != '\0' && *ptr2 != '>') ptr2++; if (*ptr2 != '\0') { *(ptr2+1) = '\0'; p = xstrcpy(ptr); p = xstrcat(p, grpname); crc = str_crc32(p); dupe = CheckDupe(crc, D_NEWS, CFG.nntpdupes); fill_artlist(art, ptr, nr, dupe); free(p); if (CFG.slow_util && do_quiet) msleep(1); } } } } } return RETVAL_OK; }
/* * Scan for new news available at the nntp server. */ void ScanNews(void) { List *art = NULL; POverview tmp, old; FILE *pAreas; char *sAreas; struct msgareashdr Msgshdr; struct msgareas Msgs; IsDoing((char *)"Scan News"); if (nntp_connect() == -1) { WriteError("Can't connect to newsserver"); return; } if (get_xoverview()) { return; } if (!do_quiet) { mbse_colour(LIGHTGREEN, BLACK); printf("Scan for new news articles\n"); } sAreas = calloc(PATH_MAX, sizeof(char)); snprintf(sAreas, PATH_MAX, "%s/etc/mareas.data", getenv("MBSE_ROOT")); if(( pAreas = fopen (sAreas, "r")) == NULL) { WriteError("$Can't open Messages Areas File."); return; } fread(&Msgshdr, sizeof(Msgshdr), 1, pAreas); while (fread(&Msgs, Msgshdr.recsize, 1, pAreas) == 1) { fseek(pAreas, Msgshdr.syssize, SEEK_CUR); #ifdef USE_NEWSGATE if ((Msgs.Active) && strlen(Msgs.Newsgroup)) { #else if ((Msgs.Active) && strlen(Msgs.Newsgroup) && (Msgs.Type == NEWS)) { #endif if (IsSema((char *)"upsalarm")) { Syslog('+', "Detected upsalarm semafore, aborting newsscan"); break; } Syslog('m', "Scan newsgroup: %s", Msgs.Newsgroup); if (!do_quiet) { mbse_colour(CYAN, BLACK); printf("\r%-40s", Msgs.Newsgroup); fflush(stdout); } Nopper(); if (do_one_group(&art, Msgs.Newsgroup, Msgs.Tag, Msgs.MaxArticles) == RETVAL_ERROR) break; /* * To be safe, update the dupes database after each area. */ CloseDupes(); } } fclose(pAreas); free(sAreas); for (tmp = xoverview; tmp; tmp = old) { old = tmp->next; if (tmp->header) free(tmp->header); if (tmp->field) free(tmp->field); free(tmp); } nntp_close(); do_flush = TRUE; if (!do_quiet) printf("\r \r"); } int do_one_group(List **art, char *grpname, char *ftntag, int maxarticles) { List *tmp; char temp[128], *resp; int retval, fetched = 0; int total, start, end; Syslog('m', "do_one_group(%s, %s)", grpname, ftntag); IsDoing((char *)"Scan %s", grpname); snprintf(temp, 128, "GROUP %s\r\n", grpname); nntp_send(temp); resp = nntp_receive(); retval = atoi(strtok(resp, " ")); if (retval == 480) { /* * We must login */ if (nntp_auth() == FALSE) { WriteError("Authorisation failure"); nntp_close(); return RETVAL_NOAUTH; } nntp_send(temp); resp = nntp_receive(); retval = atoi(strtok(resp, " ")); } if (retval != 211) { if (retval == 411) { WriteError("No such newsgroup: %s", grpname); return RETVAL_UNEXPECTEDANS; } WriteError("Unknown response %d to GROUP command", retval); return RETVAL_ERROR; } total = atol(strtok(NULL, " ")); start = atol(strtok(NULL, " ")); end = atol(strtok(NULL, " '\0'")); Syslog('m', "GROUP total %d, start %d, end %d, max %d", total, start, end, maxarticles); if ((maxarticles) && (total > maxarticles)) { start = end - maxarticles; total = maxarticles; Syslog('m', "NEW: total %d, start %d, end %d", total, start, end); } if (!total) { Syslog('+', "Fetched 0 articles from %s", grpname); return RETVAL_NOARTICLES; } retval = get_xover(grpname, start, end, art); if (retval != RETVAL_OK) { tidy_artlist(art); return retval; } if (!do_learn) { for (tmp = *art; tmp; tmp = tmp->next) { if (!tmp->isdupe) { /* * If the message isn't a dupe, it must be new for us. */ get_article(tmp->msgid, ftntag); fetched++; } } } tidy_artlist(art); if ((maxarticles) && (fetched == maxarticles)) Syslog('!', "Warning: the max. articles value in newsgroup %s might be to low", grpname); Syslog('+', "Fetched %d article%s from %s", fetched, (fetched == 1) ? "":"s", grpname); return RETVAL_OK; }
void Marker(void) { /* * Keep the connection with the server alive */ Nopper(); /* * Release system resources when running in the background */ if (CFG.slow_util && do_quiet) msleep(1); if (do_quiet) return; switch (marker) { case 0: printf(">---"); break; case 1: printf(">>--"); break; case 2: printf(">>>-"); break; case 3: printf(">>>>"); break; case 4: printf("<>>>"); break; case 5: printf("<<>>"); break; case 6: printf("<<<>"); break; case 7: printf("<<<<"); break; case 8: printf("-<<<"); break; case 9: printf("--<<"); break; case 10: printf("---<"); break; case 11: printf("----"); break; } printf("\b\b\b\b"); fflush(stdout); if (marker < 11) marker++; else marker = 0; }
/* * Receive a file with ZMODEM protocol * Assumes file name frame is in secbuf */ int rzfile(void) { int c, n; Eofseen=FALSE; rxbytes = 0l; if ((c = procheader(secbuf))) { return (tryzhdrtype = c); } n = 20; for (;;) { stohdr(rxbytes); zshhdr(ZRPOS, Txhdr); nxthdr: switch (c = zgethdr(Rxhdr)) { default: Syslog('z', "rzfile: Wrong header %d", c); if ( --n < 0) { Syslog('+', "Zmodem: wrong header %d", c); return TERROR; } continue; case ZCAN: Syslog('+', "Zmodem: sender CANcelled"); return TERROR; case ZNAK: if ( --n < 0) { Syslog('+', "Zmodem: Got ZNAK"); return TERROR; } continue; case TIMEOUT: if ( --n < 0) { Syslog('z', "Zmodem: TIMEOUT"); return TERROR; } continue; case ZFILE: zrdata(secbuf, MAXBLOCK); continue; case ZEOF: if (rclhdr(Rxhdr) != rxbytes) { /* * Ignore eof if it's at wrong place - force * a timeout because the eof might have gone * out before we sent our zrpos. */ errors = 0; goto nxthdr; } if (closeit(1)) { tryzhdrtype = ZFERR; Syslog('+', "Zmodem: error closing file"); return TERROR; } fout = NULL; Syslog('z', "rzfile: normal EOF"); return c; case HANGUP: Syslog('+', "Zmodem: Lost Carrier"); return TERROR; case TERROR: /* Too much garbage in header search error */ if (--n < 0) { Syslog('+', "Zmodem: Too many errors"); return TERROR; } zmputs(Attn); continue; case ZSKIP: Modtime = 1; closeit(1); Syslog('+', "Zmodem: Sender SKIPPED file"); return c; case ZDATA: if (rclhdr(Rxhdr) != rxbytes) { if ( --n < 0) { Syslog('+', "Zmodem: Data has bad address"); return TERROR; } zmputs(Attn); continue; } moredata: Nopper(); alarm_on(); switch (c = zrdata(secbuf, MAXBLOCK)) { case ZCAN: Syslog('+', "Zmodem: sender CANcelled"); return TERROR; case HANGUP: Syslog('+', "Zmodem: Lost Carrier"); return TERROR; case TERROR: /* CRC error */ if (--n < 0) { Syslog('+', "Zmodem: Too many errors"); return TERROR; } zmputs(Attn); continue; case TIMEOUT: if ( --n < 0) { Syslog('+', "Zmodem: TIMEOUT"); return TERROR; } continue; case GOTCRCW: n = 20; putsec(secbuf, Rxcount); rxbytes += Rxcount; stohdr(rxbytes); PUTCHAR(XON); zshhdr(ZACK, Txhdr); goto nxthdr; case GOTCRCQ: n = 20; putsec(secbuf, Rxcount); rxbytes += Rxcount; stohdr(rxbytes); zshhdr(ZACK, Txhdr); goto moredata; case GOTCRCG: n = 20; putsec(secbuf, Rxcount); rxbytes += Rxcount; goto moredata; case GOTCRCE: n = 20; putsec(secbuf, Rxcount); rxbytes += Rxcount; goto nxthdr; } } } }
/* * Init files database. Since version 0.51.2 the format is changed. * Check this and automagic upgrade the database. */ void InitFDB(void) { int records, i; int Area = 0; char *temp, Magic[21]; FILE *fp1, *fp2, *fil, *ft, *fp; DIR *dp; struct dirent *de; struct OldFILERecord old; struct stat sb; struct _fdbarea *fdb_area = NULL; records = CountFilearea(); if (records <= 0) return; temp = calloc(PATH_MAX, sizeof(char)); snprintf(temp, PATH_MAX, "%s/etc/fareas.data", getenv("MBSE_ROOT")); if ((fil = fopen(temp, "r")) != NULL) { fread(&areahdr, sizeof(areahdr), 1, fil); while (fread(&area, areahdr.recsize, 1, fil)) { Area++; if (area.Available) { snprintf(temp, PATH_MAX, "%s/var/fdb/fdb%d.data", getenv("MBSE_ROOT"), Area); if ((fp1 = fopen(temp, "r")) != NULL) { /* * Old area available, upgrade. */ snprintf(temp, PATH_MAX, "%s/var/fdb/file%d.data", getenv("MBSE_ROOT"), Area); if ((fp2 = fopen(temp, "w+")) == NULL) { WriteError("$Can't create %s", temp); } else { fdbhdr.hdrsize = sizeof(fdbhdr); fdbhdr.recsize = sizeof(fdb); fwrite(&fdbhdr, sizeof(fdbhdr), 1, fp2); while (fread(&old, sizeof(old), 1, fp1)) { Nopper(); memset(&fdb, 0, fdbhdr.recsize); strncpy(fdb.Name, old.Name, sizeof(fdb.Name) -1); strncpy(fdb.LName, old.LName, sizeof(fdb.LName) -1); snprintf(temp, PATH_MAX, "%s/etc/tic.data", getenv("MBSE_ROOT")); if ((ft = fopen(temp, "r")) != NULL) { fread(&tichdr, sizeof(tichdr), 1, ft); while (fread(&tic, tichdr.recsize, 1, ft)) { if (StringCRC32(tic.Name) == old.TicAreaCRC) { strncpy(fdb.TicArea, tic.Name, sizeof(fdb.TicArea) -1); break; } fseek(ft, tichdr.syssize, SEEK_CUR); } fclose(ft); } fdb.Size = old.Size; fdb.Crc32 = old.Crc32; strncpy(fdb.Uploader, old.Uploader, sizeof(fdb.Uploader) -1); fdb.UploadDate = old.UploadDate; fdb.FileDate = old.FileDate; fdb.LastDL = old.LastDL; fdb.TimesDL = old.TimesDL + old.TimesFTP + old.TimesReq; strncpy(fdb.Password, old.Password, sizeof(fdb.Password) -1); for (i = 0; i < 25; i++) strncpy(fdb.Desc[i], old.Desc[i], 48); /* * Search the magic directory to see if this file is a magic file. */ snprintf(temp, 81, "%s", CFG.req_magic); if ((dp = opendir(temp)) != NULL) { while ((de = readdir(dp))) { if (de->d_name[0] != '.') { snprintf(temp, PATH_MAX, "%s/%s", CFG.req_magic, de->d_name); /* * Only regular files without execute permission are magic requests. */ if ((lstat(temp, &sb) != -1) && (S_ISREG(sb.st_mode)) && (! (sb.st_mode & S_IXUSR))) { if ((fp = fopen(temp, "r"))) { fgets(Magic, sizeof(Magic) -1, fp); Striplf(Magic); if ((strcasecmp(Magic, fdb.Name) == 0) || (strcasecmp(Magic, fdb.LName) == 0)) { strncpy(fdb.Magic, de->d_name, sizeof(fdb.Magic) -1); } fclose(fp); } } } } closedir(dp); } else { WriteError("$Can't open directory %s", temp); } fdb.Deleted = old.Deleted; fdb.NoKill = old.NoKill; fdb.Announced = old.Announced; fdb.Double = old.Double; fwrite(&fdb, fdbhdr.recsize, 1, fp2); } fclose(fp2); Syslog('+', "Upgraded file area database %d", Area); } fclose(fp1); snprintf(temp, PATH_MAX, "%s/var/fdb/fdb%d.data", getenv("MBSE_ROOT"), Area); unlink(temp); } // Old area type upgrade. /* * Current area, check */ if ((fdb_area = mbsedb_OpenFDB(Area, 30)) == NULL) WriteError("InitFDB(): database area %d might be corrupt", Area); else mbsedb_CloseFDB(fdb_area); } } fclose(fil); } free(temp); }
/* * Scan for new files, called from menu. */ int NewfileScan(int AskStart) { FILE *pAreas; int ifDate, itDate; char *temp, *Date; int Found, Count = 0; _Tag T; struct _fdbarea *fdb_area = NULL; Date = calloc(81, sizeof(char)); temp = calloc(81, sizeof(char)); iLineCount = 2; arecno = 1; /* Reset Area Number to One */ if (AskStart) { Enter(2); /* Search for new since your last call [Y/n]: */ pout(LIGHTCYAN, BLACK, (char *) Language(273)); colour(CFG.InputColourF, CFG.InputColourB); if (toupper(Readkey()) == Keystroke(273, 1)) { Enter(1); /* Enter new date to search for [DD-MM-YYYY]: */ pout(GREEN, BLACK, (char *) Language(274)); colour(CFG.InputColourF, CFG.InputColourB); GetDate(temp, 10); } else { strcpy(temp, LastLoginDate); } } else { strcpy(temp, LastLoginDate); } Syslog('+', "NewfileScan() since %s", temp); clear(); /* File Search by Date */ pout(WHITE, BLACK, (char *) Language(275)); Enter(2); Date[0] = temp[6]; /* Swap the date around */ Date[1] = temp[7]; /* Instead of DD-MM-YYYY */ Date[2] = temp[8]; /* Let it equal YYYYMMDD */ Date[3] = temp[9]; /* Swap the date around */ Date[4] = temp[3]; /* Swap the date around */ Date[5] = temp[4]; /* because when you convert */ Date[6] = temp[0]; /* a string to an int you */ Date[7] = temp[1]; /* loose the front Zero */ Date[8] = '\0'; /* making the number smaller */ itDate = atol(Date); InitTag(); if ((pAreas = OpenFareas(FALSE)) == NULL) return 0; while (fread(&area, areahdr.recsize, 1, pAreas) == 1) { if ((Access(exitinfo.Security, area.LTSec)) && (area.Available) && (strlen(area.Password) == 0) && (area.New)) { if ((fdb_area = mbsedb_OpenFDB(arecno, 30))) { Sheader(); Found = FALSE; Nopper(); while (fread(&fdb, fdbhdr.recsize, 1, fdb_area->fp) == 1) { strcpy(temp, StrDateDMY(fdb.UploadDate)); /* Realloc Space for Date */ Date[0] = temp[6]; /* Swap the date around */ Date[1] = temp[7]; /* Instead of DD-MM-YYYY */ Date[2] = temp[8]; /* Let it equal YYYYMMDD */ Date[3] = temp[9]; /* Swap the date around */ Date[4] = temp[3]; /* Swap the date around */ Date[5] = temp[4]; /* because when you convert */ Date[6] = temp[0]; /* a string to an int you */ Date[7] = temp[1]; /* loose the front Zero */ Date[8] = '\0'; /* making the number smaller */ /* and invalid to this cause */ ifDate = atol(Date); if (ifDate >= itDate) { if (!Found) { Enter(2); if (iLC(2) == 1) { free(Date); free(temp); mbsedb_CloseFDB(fdb_area); fclose(pAreas); return 1; } Found = TRUE; } memset(&T, 0, sizeof(T)); T.Area = arecno; T.Active = FALSE; T.Size = fdb.Size; strncpy(T.SFile, fdb.Name, 12); strncpy(T.LFile, fdb.LName, 80); SetTag(T); Count++; if (ShowOneFile() == 1) { free(Date); free(temp); mbsedb_CloseFDB(fdb_area); fclose(pAreas); return 1; } } /* End of if */ } /* End of while */ mbsedb_CloseFDB(fdb_area); /* * Add 2 blank lines after found files. */ if (Found) { Enter(2); if (iLC(2) == 1) { free(Date); free(temp); fclose(pAreas); return 1; } } } /* End of open filebase */ } /* End of check new files scan */ arecno++; /* Go to next file area */ } /* End of Main */ if (Count) Syslog('+', "Found %d new files", Count); fclose(pAreas); Enter(1); if (Count) Mark(); else Pause(); free(temp); free(Date); return 1; }
/* * Search for a file, called from the menu. */ int FilenameScan() { FILE *pAreas; int Found, Count = 0; char mask[256]; char *Name; _Tag T; unsigned int OldArea; struct _fdbarea *fdb_area = NULL; Name = calloc(81, sizeof(char)); OldArea = iAreaNumber; iLineCount = 2; /* Reset Line Counter to Zero */ arecno = 1; /* Reset Area Number to One */ Enter(2); /* Accepts wildcards such as : *.zip, *.gz, *.* */ pout(WHITE, BLACK, (char *) Language(269)); Enter(2); /* Enter filename to search for : */ pout(LIGHTCYAN, BLACK, (char *) Language(271)); colour(CFG.InputColourF, CFG.InputColourB); GetstrC(Name, 80); if ((strcmp(Name, "")) == 0) { free(Name); return 0; } strcpy(mask, re_mask(Name, TRUE)); Syslog('+', "FilenameScan(): \"%s\" -> \"%s\"", Name, mask); free(Name); re_comp(mask); clear(); /* File Search by Filename */ pout(WHITE, BLACK, (char *) Language(272)); Enter(1); InitTag(); if ((pAreas = OpenFareas(FALSE)) == NULL) return 0; while (fread(&area, areahdr.recsize, 1, pAreas) == 1) { if ((Access(exitinfo.Security, area.LTSec)) && (area.Available) && (strlen(area.Password) == 0)) { if ((fdb_area = mbsedb_OpenFDB(arecno, 30))) { Found = FALSE; Sheader(); Nopper(); while (fread(&fdb, fdbhdr.recsize, 1, fdb_area->fp) == 1) { if (re_exec(fdb.Name) || re_exec(fdb.LName)) { if (!Found) { Enter(2); if (iLC(2) == 1) { SetFileArea(OldArea); return 1; } Found = TRUE; } memset(&T, 0, sizeof(T)); T.Area = arecno; T.Active = FALSE; T.Size = fdb.Size; strncpy(T.SFile, fdb.Name, 12); strncpy(T.LFile, fdb.LName, 81); SetTag(T); Count++; if (ShowOneFile() == 1) { SetFileArea(OldArea); return 1; } } } /* End of while */ mbsedb_CloseFDB(fdb_area); if (Found) { Enter(2); if (iLC(2) == 1) { SetFileArea(OldArea); return 1; } } } /* End Check for LTSec */ } /* if access */ arecno++; /* Go to next file area */ } /* End of Main */ Syslog('+', "Found %d files", Count); fclose(pAreas); Enter(1); if (Count) Mark(); else Pause(); SetFileArea(OldArea); return 1; }
/* * Search for keyword, called from menu. */ int KeywordScan() { FILE *pAreas; int i, z, y, Found, Count = 0; char *Name, *tmpname, *BigDesc, temp[81]; _Tag T; unsigned int OldArea; struct _fdbarea *fdb_area = NULL; Name = calloc(81, sizeof(char)); tmpname = calloc(81, sizeof(char)); BigDesc = calloc(1230, sizeof(char)); OldArea = iAreaNumber; iLineCount = 2; /* Reset Line Counter to Zero */ arecno = 1; /* Reset Area Number to One */ Enter(2); /* Enter keyword to use for Search: */ pout(LIGHTCYAN, BLACK, (char *) Language(267)); colour(CFG.InputColourF, CFG.InputColourB); GetstrC(Name, 80); if ((strcmp(Name, "")) == 0) return 0; strcpy(tmpname, tl(Name)); strcpy(Name, ""); y = strlen(tmpname); for (z = 0; z < y; z++) { if (tmpname[z] != '*') { snprintf(temp, 81, "%c", tmpname[z]); strcat(Name, temp); } } Syslog('+', "KeywordScan(): \"%s\"", Name); clear(); /* File search by keyword */ pout(WHITE, BLACK, (char *) Language(268)); Enter(1); InitTag(); if ((pAreas = OpenFareas(FALSE)) == NULL) return 0; while (fread(&area, areahdr.recsize, 1, pAreas) == 1) { if ((Access(exitinfo.Security, area.LTSec)) && (area.Available) && (strlen(area.Password) == 0)) { if ((fdb_area = mbsedb_OpenFDB(arecno, 30))) { Nopper(); Found = FALSE; Sheader(); while (fread(&fdb, fdbhdr.recsize, 1, fdb_area->fp) == 1) { for (i = 0; i < 25; i++) snprintf(BigDesc, 1230, "%s%s", BigDesc, *(fdb.Desc + i)); if ((strstr(fdb.Name,Name) != NULL) || (strstr(tl(BigDesc), Name) != NULL)) { if (!Found) { Enter(2); if (iLC(2) == 1) { free(BigDesc); free(Name); free(tmpname); SetFileArea(OldArea); return 1; } Found = TRUE; } memset(&T, 0, sizeof(T)); T.Area = arecno; T.Active = FALSE; T.Size = fdb.Size; strncpy(T.SFile, fdb.Name, 12); strncpy(T.LFile, fdb.LName, 80); SetTag(T); Count++; if (ShowOneFile() == 1) { free(BigDesc); free(Name); free(tmpname); SetFileArea(OldArea); return 1; } } strcpy(BigDesc, ""); /* Clear BigDesc */ } /* while */ mbsedb_CloseFDB(fdb_area); if (Found) { Enter(2); if (iLC(2) == 1) { free(BigDesc); free(Name); free(tmpname); SetFileArea(OldArea); return 1; } } } /* End check for LTSec */ } /* if access */ arecno++; /* Go to next file area */ } /* End of Main */ Syslog('+', "Found %d files", Count); free(BigDesc); free(Name); free(tmpname); fclose(pAreas); Enter(1); if (Count) Mark(); else Pause(); SetFileArea(OldArea); return 1; }
int Fs_Edit() { unsigned char ch; int i, Changed = FALSE; char *filname, *tmpname; FILE *fd; Syslog('b', "FSEDIT: Entering FullScreen editor"); if (utf8) chartran_init((char *)"CP437", (char *)"UTF-8", 'B'); clear(); InsMode = TRUE; TopVisible = 1; Col = 1; Row = 1; Refresh(); while (TRUE) { Nopper(); alarm_on(); ch = Readkey(); CurRow = Row + TopVisible - 1; switch (ch) { case KEY_ENTER: if (Col == 1) { /* Enter at beginning of line */ for (i = Line; i >= CurRow; i--) { snprintf(Message[i+1], TEXTBUFSIZE +1, "%s", Message[i]); } Message[i+1][0] = '\0'; } else { for (i = Line; i > CurRow; i--) { snprintf(Message[i+1], TEXTBUFSIZE +1, "%s", Message[i]); } Message[CurRow+1][0] = '\0'; if (Col <= strlen(Message[CurRow])) { /* Enter in middle of line */ for (i = Col-1; i <= strlen(Message[CurRow]); i++) { snprintf(Message[CurRow+1] + strlen(Message[CurRow+1]), 5, "%c", Message[CurRow][i]); } Message[CurRow][Col-1] = '\0'; } /* else Enter at end of line */ } Line++; Row++; Col = 1; if (Row >= (rows -1)) ScrollDown(); Refresh(); Changed = TRUE; break; case ('N' - 64): /* Insert line, scroll down */ for (i = Line; i >= CurRow; i--) snprintf(Message[i+1], TEXTBUFSIZE +1, "%s", Message[i]); Message[CurRow][0] = '\0'; Line++; Col = 1; Refresh(); Changed = TRUE; break; case ('Y' - 64): /* Erase line, scroll up */ if (Line == CurRow) { /* Erasing last line */ if ((Line > 1) || (strlen(Message[CurRow]) > 0)) { Message[CurRow][0] = '\0'; if (Line > 1) { Line--; if (Row == 1) ScrollUp(); Row--; } if (Col > strlen(Message[CurRow])) Col = strlen(Message[CurRow]); Refresh(); Changed = TRUE; } else Beep(); } else { /* Erasing line in the middle */ for (i = CurRow; i < Line; i++) { snprintf(Message[i], TEXTBUFSIZE +1, "%s", Message[i+1]); } Message[i+1][0] = '\0'; Line--; if (Col > strlen(Message[CurRow]) + 1) Col = strlen(Message[CurRow]) + 1; Refresh(); Changed = TRUE; } break; case KEY_UP: case ('E' - 64): FsMove(KEY_UP); break; case KEY_DOWN: case ('X' - 64): FsMove(KEY_DOWN); break; case KEY_LEFT: case ('S' - 64): FsMove(KEY_LEFT); break; case KEY_RIGHT: case ('D' - 64): FsMove(KEY_RIGHT); break; case KEY_DEL: if (Col <= strlen(Message[CurRow])) { /* * If before the end of the line... */ Setcursor(); for (i = Col; i <= strlen(Message[CurRow]); i++) { Message[CurRow][i-1] = Message[CurRow][i]; PUTCHAR(Message[CurRow][i]); } PUTCHAR(' '); PUTCHAR('\b'); Message[CurRow][i-1] = '\0'; Setcursor(); } else if (((strlen(Message[CurRow]) + strlen(Message[CurRow+1]) < 75) || (strlen(Message[CurRow]) == 0)) && (CurRow < Line)) { for (i = 0; i < strlen(Message[CurRow+1]); i++) snprintf(Message[CurRow] + strlen(Message[CurRow]), 5, "%c", Message[CurRow+1][i]); for (i = CurRow+1; i < Line; i++) snprintf(Message[i], TEXTBUFSIZE +1, "%s", Message[i+1]); Message[Line][0] = '\0'; Line--; Refresh(); } else Beep(); /* * Trap the extra code so it isn't * inserted in the text */ if (ch == KEY_DEL) Readkey(); break; case KEY_BACKSPACE: case KEY_RUBOUT: if (Col == 1 && CurRow == 1) { /* BS on first character in message */ Beep(); } else if (Col == 1) { /* BS at beginning of line */ if ((strlen(Message[CurRow-1]) + strlen(Message[CurRow]) < 75) || strlen(Message[CurRow]) == 0) { Col = strlen(Message[CurRow-1]) + 1; strcat(Message[CurRow-1], Message[CurRow]); for ( i = CurRow; i < Line; i++) snprintf(Message[i], TEXTBUFSIZE +1, "%s", Message[i+1]); Message[i+1][0] = '\0'; Line--; if (Row == 1) ScrollUp(); Row--; Refresh(); Changed = TRUE; } else { i = strlen(Message[CurRow-1]) + strlen(Message[CurRow]); Beep(); } } else { if (Col == strlen(Message[CurRow]) + 1) { /* BS at end of line */ BackErase(); Col--; Message[CurRow][Col-1] = '\0'; Changed = TRUE; } else { /* BS in middle of line */ Col--; Setcursor(); for (i = Col; i <= strlen(Message[CurRow]); i++) { Message[CurRow][i-1] = Message[CurRow][i]; PUTCHAR(Message[CurRow][i]); } PUTCHAR(' '); PUTCHAR('\b'); Message[CurRow][strlen(Message[CurRow])] = '\0'; Setcursor(); Changed = TRUE; } } break; case KEY_INS: /* Toggle Insert Mode */ case ('V' - 64): InsMode = !InsMode; Show_Ins(); colour(CFG.TextColourF, CFG.TextColourB); Setcursor(); /* * Trap the extra code so it isn't * inserted in the text */ if (ch == KEY_INS) Readkey(); break; case ('L' - 64): /* Refresh screen */ Refresh(); break; case ('R' - 64): /* Read from file */ Syslog('b', "FSEDIT: Read from file"); tmpname = calloc(PATH_MAX, sizeof(char)); filname = calloc(PATH_MAX, sizeof(char)); Enter(1); /* Please enter filename: */ pout(YELLOW, BLACK, (char *) Language(245)); colour(CFG.InputColourF, CFG.InputColourB); GetstrLC(filname, 80); if ((strcmp(filname, "") == 0)) { Enter(2); /* No filename entered, aborting */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(246)); Enter(1); Pause(); free(filname); free(tmpname); Refresh(); break; } if (*(filname) == '/' || *(filname) == ' ') { Enter(2); /* Illegal filename */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(247)); Enter(1); Pause(); free(tmpname); free(filname); Refresh(); break; } snprintf(tmpname, PATH_MAX, "%s/%s/wrk/%s", CFG.bbs_usersdir, exitinfo.Name, filname); if ((fd = fopen(tmpname, "r")) == NULL) { WriteError("$Can't open %s", tmpname); Enter(2); /* File does not exist, please try again */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(296)); Enter(1); Pause(); } else { while ((fgets(filname, 80, fd)) != NULL) { for (i = 0; i < strlen(filname); i++) { if (*(filname + i) == '\0') break; if (*(filname + i) == '\n') *(filname + i) = '\0'; if (*(filname + i) == '\r') *(filname + i) = '\0'; } /* * Make sure that any tear or origin lines are * made invalid. */ if (strncmp(filname, (char *)"--- ", 4) == 0) filname[1] = 'v'; if (strncmp(filname, (char *)" * Origin:", 10) == 0) filname[1] = '+'; snprintf(Message[Line], TEXTBUFSIZE +1, "%s", filname); Line++; if ((Line - 1) == TEXTBUFSIZE) break; } fclose(fd); Changed = TRUE; Syslog('+', "FSEDIT: Inserted file %s", tmpname); } free(tmpname); free(filname); Col = 1; Refresh(); break; case KEY_ESCAPE: /* Editor menu */ Top_Menu(); ch = toupper(Readkey()); if (ch == 'A' || ch == 'S') { Syslog('b', "FSEDIT: %s message (%c)", (ch == 'S' && Changed) ? "Saving" : "Aborting", ch); clear(); chartran_close(); if (ch == 'S' && Changed) { Syslog('+', "FSEDIT: Message will be saved"); return TRUE; } else { Syslog('+', "FSEDIT: Message aborted"); return FALSE; } } if (ch == 'H') { Full_Help(); ch = Readkey(); Refresh(); } else Top_Help(); colour(CFG.TextColourF, CFG.TextColourB); Setcursor(); break; default: if ((ch > 31) || traduce((char *)&ch) ) { /* * Normal printable characters or hi-ascii */ if (Col == strlen(Message[CurRow]) + 1) { /* * Append to line */ snprintf(Message[CurRow] + strlen(Message[CurRow]), 5, "%c", ch); if (strlen(Message[CurRow]) > 79){ Col = FsWordWrap(); Row++; Refresh(); } else { Col++; PUTCHAR(ch); } Changed = TRUE; } else { /* * Insert or overwrite */ if (InsMode) { for (i = strlen(Message[CurRow]); i >= (Col-1); i--) { /* * Shift characters right */ Message[CurRow][i+1] = Message[CurRow][i]; } Message[CurRow][Col-1] = ch; Col++; if (strlen(Message[CurRow]) > 80) { i = FsWordWrap(); if (Col > strlen(Message[CurRow])+1) { Col = Col - strlen(Message[CurRow]); if (Col > 1) Col--; Row++; } if (Row > (rows -1)) ScrollDown(); else Refresh(); } else { locate(Row + 1, 1); PUTSTR(Message[CurRow]); Setcursor(); } Changed = TRUE; } else { Message[CurRow][Col-1] = ch; PUTCHAR(ch); Col++; Changed = TRUE; } } } } } chartran_close(); WriteError("FsEdit(): Impossible to be here"); return FALSE; }
void Uploads() { FILE *pAreas; char *sAreas; int Count = 0, i = 0, j, k; struct _fdbarea *fdb_area = NULL; sAreas = calloc(PATH_MAX, sizeof(char)); Syslog('+', "Checking for uploads"); IsDoing("Check uploads"); if (!do_quiet) { mbse_colour(CYAN, BLACK); printf(" Checking uploads...\n"); } snprintf(sAreas, PATH_MAX, "%s/etc/fareas.data", getenv("MBSE_ROOT")); if ((pAreas = fopen(sAreas, "r")) == NULL) { WriteError("$Can't open %s", sAreas); free(sAreas); return; } fread(&areahdr, sizeof(areahdr), 1, pAreas); while (fread(&area, areahdr.recsize, 1, pAreas) == 1) { i++; if (CFG.slow_util && do_quiet) msleep(1); if ((area.Available) && strlen(area.NewGroup)) { if (!do_quiet) { printf("\r %4d => %-44s", i, area.Name); fflush(stdout); } if ((fdb_area = mbsedb_OpenFDB(i, 30))) { while (fread(&fdb, fdbhdr.recsize, 1, fdb_area->fp) == 1) { Nopper(); if (!fdb.Announced) { Syslog('m', " %d %s", i, fdb.Name); memset(&T_File, 0, sizeof(T_File)); if (strlen(fdb.TicArea)) strncpy(T_File.Echo, fdb.TicArea, sizeof(T_File.Echo) -1); else snprintf(T_File.Echo, 21, "AREA %d", i); strncpy(T_File.Group, area.NewGroup, sizeof(T_File.Group) -1); strncpy(T_File.Comment, area.Name, sizeof(T_File.Comment) -1); strncpy(T_File.Name, fdb.Name, sizeof(T_File.Name) -1); strncpy(T_File.LName, fdb.LName, sizeof(T_File.LName) -1); if (strlen(fdb.Magic)) strncpy(T_File.Magic, fdb.Magic, sizeof(T_File.Magic) -1); T_File.Size = fdb.Size; T_File.SizeKb = fdb.Size / 1024; T_File.Fdate = fdb.FileDate; snprintf(T_File.Crc, 9, "%08x", fdb.Crc32); snprintf(T_File.Desc, 256, "%s %s %s %s", fdb.Desc[0], fdb.Desc[1], fdb.Desc[2], fdb.Desc[3]); k = 0; for (j = 0; j < 25; j++) { if (strlen(fdb.Desc[j])) { snprintf(T_File.LDesc[k], 49, "%s", fdb.Desc[j]); T_File.LDesc[k][48] = '\0'; k++; } } T_File.TotLdesc = k; T_File.Announce = TRUE; if (Add_ToBeRep(T_File)) Count++; /* * Mark file is announced. */ fdb.Announced = TRUE; 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); } } } if (!do_quiet) { printf("\r \r"); if (Count) printf(" %d new uploads\n", Count); fflush(stdout); } if (Count) Syslog('+', "%d new uploads", Count); fclose(pAreas); free(sAreas); }
/* * Process one message from message packet. * * 0 - no more messages * 1 - more messages * 2 - bad file * 3 - bad message header * 4 - unable to open temp file * 5 - unexpected end of packet * >10 - import error */ int getmessage(FILE *pkt, faddr *p_from, faddr *p_to) { char buf[MAX_LINE_LENGTH +1], *orig = NULL, *p, *l, *r, *subj = NULL; int tmp, rc, maxrc = 0, result, flags, cost; static faddr f, t; faddr *o; time_t mdate = 0L; FILE *fp; unsigned char buffer[0x0e]; Nopper(); result = fread(&buffer, 1, sizeof(buffer), pkt); if (result == 0) { Syslog('m', "Zero bytes message, assume end of pkt"); return 0; } switch (tmp = (buffer[0x01] << 8) + buffer[0x00]) { case 0: if (result == 2) return 0; else { Syslog('!', "Junk after logical end of packet, skipped"); return 5; } case 2: break; default:Syslog('!', "bad message type: 0x%04x",tmp); return 2; } if (result != 14) { Syslog('!', "Unexpected end of packet"); return 5; } memset(&f, 0, sizeof(f)); memset(&t, 0, sizeof(t)); f.node = (buffer[0x03] << 8) + buffer[0x02]; t.node = (buffer[0x05] << 8) + buffer[0x04]; f.net = (buffer[0x07] << 8) + buffer[0x06]; t.net = (buffer[0x09] << 8) + buffer[0x08]; flags = (buffer[0x0b] << 8) + buffer[0x0a]; cost = (buffer[0x0d] << 8) + buffer[0x0c]; /* * Read the DateTime, toUserName, fromUserName and subject fields * from the packed message. The stringlength is +1 for the right * check. This is different then in ifmail's original code. */ if (aread(buf, sizeof(buf)-1, pkt)) { if (strlen(buf) > 20) Syslog('!', "date too long (%d) \"%s\"", strlen(buf), printable(buf, 0)); mdate = parsefdate(buf, NULL); if (aread(buf, sizeof(buf)-1, pkt)) { Syslog('!', "date not null-terminated: \"%s\"",buf); return 3; } } if (aread(buf, sizeof(buf)-1, pkt)) { if (strlen(buf) > 36) Syslog('!', "to name too long (%d) \"%s\"", strlen(buf), printable(buf, 0)); t.name = xstrcpy(buf); if (aread(buf, sizeof(buf)-1, pkt)) { if (*(p=t.name+strlen(t.name)-1) == '\n') *p = '\0'; Syslog('!', "to name not null-terminated: \"%s\"",buf); return 3; } } if (aread(buf, sizeof(buf)-1, pkt)) { if (strlen(buf) > 36) Syslog('!', "from name too long (%d) \"%s\"", strlen(buf), printable(buf, 0)); f.name = xstrcpy(buf); if (aread(buf, sizeof(buf)-1, pkt)) { if (*(p=f.name+strlen(f.name)-1) == '\n') *p = '\0'; Syslog('!', "from name not null-terminated: \"%s\"",buf); return 3; } } if (aread(buf, sizeof(buf)-1, pkt)) { if (strlen(buf) > 72) Syslog('!', "subject too long (%d) \"%s\"", strlen(buf), printable(buf, 0)); subj = xstrcpy(buf); if (aread(buf, sizeof(buf)-1, pkt)) { if (*(p=subj+strlen(subj)-1) == '\n') *p = '\0'; subj = xstrcat(subj,(char *)"\\n"); subj = xstrcat(subj,buf); Syslog('!', "subj not null-terminated: \"%s\"",buf); return 3; } } if (feof(pkt) || ferror(pkt)) { Syslog('!', "Could not read message header, aborting"); return 3; } if ((fp = tmpfile()) == NULL) { WriteError("$unable to open temporary file"); return 4; } /* * Read the text from the .pkt file */ while (aread(buf,sizeof(buf)-1,pkt)) { fputs(buf, fp); /* * Extract info from Origin line if found. */ if (!strncmp(buf," * Origin:",10)) { p=buf+10; while (*p == ' ') p++; if ((l=strrchr(p,'(')) && (r=strrchr(p,')')) && (l < r)) { *l = '\0'; *r = '\0'; l++; if ((o = parsefnode(l))) { f.point = o->point; f.node = o->node; f.net = o->net; f.zone = o->zone; if (o->domain) f.domain=o->domain; o->domain=NULL; tidy_faddr(o); } } else if (*(l=p+strlen(p)-1) == '\n') *l='\0'; for (l=p+strlen(p)-1;*l == ' ';l--) *l='\0'; orig = xstrcpy(p); } } rc = importmsg(p_from, &f, &t, orig, subj, mdate, flags, cost, fp, p_to->zone); if (rc) rc+=10; if (rc > maxrc) maxrc = rc; fclose(fp); if(f.name) free(f.name); f.name=NULL; if(t.name) free(t.name); t.name=NULL; if(f.domain) free(f.domain); f.domain=NULL; if(t.domain) free(t.domain); t.domain=NULL; if (subj) free(subj); subj = NULL; if (orig) free(orig); orig = NULL; if (feof(pkt) || ferror(pkt)) { WriteError("Unexpected end of packet"); return 5; } return 1; }