/* * Show filelist from current area, called from the menu. */ void Copy_Home() { char *File, *temp1, *temp2; int err, Found = FALSE; struct _fdbarea *fdb_area = NULL; File = calloc(81, sizeof(char)); temp1 = calloc(PATH_MAX, sizeof(char)); temp2 = calloc(PATH_MAX, sizeof(char)); Enter(1); /* Please enter filename: */ pout(YELLOW, BLACK, (char *) Language(245)); colour(CFG.InputColourF, CFG.InputColourB); GetstrC(File, 80); Enter(2); if ((strcmp(File, "")) == 0) { /* No filename entered, Aborting. */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(246)); Enter(2); Pause(); free(File); free(temp1); free(temp2); return; } if (*(File) == '/' || *(File) == ' ') { /* Illegal Filename! */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(247)); Enter(2); Pause(); free(File); free(temp1); free(temp2); return; } if (Access(exitinfo.Security, area.DLSec) == FALSE) { pout(YELLOW, BLACK, (char *) Language(236)); Enter(2); Pause(); free(File); free(temp1); free(temp2); return; } if ((fdb_area = mbsedb_OpenFDB(iAreaNumber, 30)) == NULL) { free(File); free(temp1); free(temp2); return; } while (fread(&fdb, fdbhdr.recsize, 1, fdb_area->fp) == 1) { if ((strcasecmp(File, fdb.Name) == 0) || (strcasecmp(File, fdb.LName) == 0)) { Found = TRUE; if (((fdb.Size + Quota()) > (CFG.iQuota * 1048576))) { /* You have not enough diskspace free to copy this file */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(279)); Enter(1); Syslog('+', "Copy homedir, not enough quota"); } else { snprintf(temp1, PATH_MAX, "%s/%s", area.Path, fdb.LName); /* Use real longname here */ snprintf(temp2, PATH_MAX, "%s/%s/wrk/%s", CFG.bbs_usersdir, exitinfo.Name, File); colour(CFG.TextColourF, CFG.TextColourB); /* Start copy: */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(289)); PUTSTR(File); PUTCHAR(' '); Syslog('b', "Copy from : %s", temp1); Syslog('b', "Copy to : %s", temp2); if ((err = file_cp(temp1, temp2))) { /* Failed! */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(353)); WriteError("Copy %s to homedir failed, code %d", File, err); } else { /* Ok */ PUTSTR((char *) Language(200)); Syslog('+', "Copied %s from area %d to homedir", File, iAreaNumber); } Enter(1); } } } mbsedb_CloseFDB(fdb_area); if (!Found) { /* File does not exist, please try again ... */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(296)); Enter(1); } Pause(); free(File); free(temp1); free(temp2); }
/* we have a timestamp */ DBGPRINTF("kernel timestamp is %ld %ld\n", secs, usecs); if(!pModConf->bKeepKernelStamp) { bufsize= strlen((char*)buf); memmove(buf+3, buf+i, bufsize - i + 1); } clock_gettime(CLOCK_MONOTONIC, &monotonic); clock_gettime(CLOCK_REALTIME, &realtime); secOffs = realtime.tv_sec - monotonic.tv_sec; usecOffs = (realtime.tv_nsec - monotonic.tv_nsec) / 1000; if(usecOffs < 0) { secOffs--; usecOffs += 1000000l; } usecs += usecOffs; if(usecs > 999999l) { secs++; usecs -= 1000000l; } secs += secOffs; tv.tv_sec = secs; tv.tv_usec = usecs; tp = &tv; done: Syslog(pModConf, pri, buf, tp); } #else /* now comes the BSD "code" (just a shim) */ static void submitSyslog(modConfData_t *pModConf, syslog_pri_t pri, uchar *buf) { Syslog(pModConf, pri, buf, NULL); }
/* * Upload files from the user. * Returns: * 0 - All seems well * 1 - No transfer protocol selected. * 2 - Transfer failed */ int upload(up_list **upload_list) { char *temp; struct dirent *dp; DIR *dirp; struct stat statfile; struct timeval starttime, endtime; struct timezone tz; unsigned int Size = 0; int err, Count = 0, rc = 0, want1k = FALSE, wantg = FALSE; up_list *tmp, *ta; /* * If user has no default protocol, make sure he has one. */ if (!ForceProtocol()) { return 1; } temp = calloc(PATH_MAX, sizeof(char)); /* Please start your upload now */ snprintf(temp, PATH_MAX, "%s, %s", sProtAdvice, (char *) Language(283)); pout(CFG.HiliteF, CFG.HiliteB, temp); Enter(2); Syslog('+', "Upload using %s", sProtName); snprintf(temp, PATH_MAX, "%s/%s/upl", CFG.bbs_usersdir, exitinfo.Name); if (chdir(temp)) { WriteError("$Can't chdir to %s", temp); free(temp); return 1; } sleep(2); if (uProtInternal) { if ((strncasecmp(sProtName, "zmodem", 6) == 0) || (strncasecmp(sProtName, "ymodem", 6) == 0) || (strncasecmp(sProtName, "xmodem", 6) == 0)) { if (strncasecmp(sProtName, "zmodem", 6) == 0) { zmodem_requested = TRUE; protocol = ZM_ZMODEM; } else { zmodem_requested = FALSE; } if (strncasecmp(sProtName, "ymodem", 6) == 0) protocol = ZM_YMODEM; if (strncasecmp(sProtName, "xmodem", 6) == 0) protocol = ZM_XMODEM; if (strstr(sProtName, "-1K") && (protocol != ZM_ZMODEM)) { Syslog('x', "%s: want 1K blocks", protname()); want1k = TRUE; } if ((strstr(sProtName, "-G")) && (protocol == ZM_YMODEM)) { Syslog('x', "%s: want Ymodem-G", protname()); wantg = TRUE; } rc = zmrcvfiles(want1k, wantg); Syslog('b', "Begin dir processing"); if ((dirp = opendir(".")) == NULL) { WriteError("$Upload: can't open ./upl"); Home(); rc = 1; } else { while ((dp = readdir(dirp)) != NULL) { if (*(dp->d_name) != '.') { if (rc == 0) { stat(dp->d_name, &statfile); Syslog('b', "Uploaded \"%s\", %ld bytes", dp->d_name, statfile.st_size); snprintf(temp, PATH_MAX, "%s/%s/upl/%s", CFG.bbs_usersdir, exitinfo.Name, dp->d_name); chmod(temp, 0660); /* * Add uploaded file to the list */ tmp = (up_list *)malloc(sizeof(up_list)); tmp->next = NULL; tmp->filename = xstrcpy(temp); tmp->size = Size; if (*upload_list == NULL) { *upload_list = tmp; } else { for (ta = *upload_list; ta; ta = ta->next) { if (ta->next == NULL) { ta->next = (up_list *)tmp; break; } } } } else { Syslog('+', "Remove failed %s result %d", dp->d_name, unlink(dp->d_name)); } } } closedir(dirp); } } else { Syslog('!', "Internal protocol %s not supported", sProtName); free(temp); return 1; } } else { /* * External protocol */ gettimeofday(&starttime, &tz); Altime(7200); alarm_set(7190); err = execute_str(sProtUp, (char *)"", NULL, NULL, NULL, NULL); if (rawport() != 0) { WriteError("Unable to set raw mode"); } if (err) { WriteError("$Upload error %d, prot: %s", err, sProtUp); rc = 2; } Altime(0); alarm_off(); alarm_on(); gettimeofday(&endtime, &tz); /* * With external protocols we don't know anything about what we got. * Just check the files in the users upload directory. */ if ((dirp = opendir(".")) == NULL) { WriteError("$Upload: can't open ./upl"); Home(); rc = 1; } else { while ((dp = readdir(dirp)) != NULL) { if (*(dp->d_name) != '.') { stat(dp->d_name, &statfile); Syslog('+', "Uploaded \"%s\", %ld bytes", dp->d_name, statfile.st_size); Count++; Size += statfile.st_size; snprintf(temp, PATH_MAX, "%s/%s/upl/%s", CFG.bbs_usersdir, exitinfo.Name, dp->d_name); chmod(temp, 0660); /* * Add uploaded file to the list */ tmp = (up_list *)malloc(sizeof(up_list)); tmp->next = NULL; tmp->filename = xstrcpy(temp); tmp->size = Size; if (*upload_list == NULL) { *upload_list = tmp; } else { for (ta = *upload_list; ta; ta = ta->next) { if (ta->next == NULL) { ta->next = (up_list *)tmp; break; } } } } } closedir(dirp); Syslog('+', "Upload %s in %d file(s)", transfertime(starttime, endtime, (unsigned int)Size, FALSE), Count); } } free(temp); Syslog('b', "Done, return rc=%d", rc); return rc; }
/* * Show filelist from current area, called from the menu. */ void File_List() { int FileCount = 0; unsigned FileBytes = 0; _Tag T; struct _fdbarea *fdb_area = NULL; char temp[81]; iLineCount = 0; WhosDoingWhat(FILELIST, NULL); Syslog('+', "Listing File Area # %d", iAreaNumber); if (Access(exitinfo.Security, area.LTSec) == FALSE) { Enter(1); /* You don't have enough security to list this area */ pout(YELLOW, BLACK, (char *) Language(236)); Enter(2); Pause(); return; } InitTag(); if ((fdb_area = mbsedb_OpenFDB(iAreaNumber, 30)) == NULL) return; if (utf8) chartran_init((char *)"CP437", (char *)"UTF-8", 'b'); clear(); Header(); if (iLC(2) == 1) { mbsedb_CloseFDB(fdb_area); chartran_close(); return; } while (fread(&fdb, fdbhdr.recsize, 1, fdb_area->fp) == 1) { memset(&T, 0, sizeof(T)); T.Area = iAreaNumber; T.Active = FALSE; T.Size = fdb.Size; strncpy(T.SFile, fdb.Name, 12); strncpy(T.LFile, chartran(fdb.LName), 80); SetTag(T); if (ShowOneFile() == 1) { mbsedb_CloseFDB(fdb_area); chartran_close(); return; } if (fdb.Deleted) { /* D E L E T E D */ /* Uploaded by: */ snprintf(temp, 81, " -- %-12s %s [%4d] %s%s\n", fdb.Name, (char *) Language(239), fdb.TimesDL, (char *) Language(238), fdb.Uploader); PUTSTR(temp); } FileCount++; /* Increase File Counter by 1 */ FileBytes += fdb.Size; /* Increase File Byte Count */ } Mark(); Enter(1); /* Total Files: */ snprintf(temp, 81, "%s%d / %d bytes", (char *) Language(242), FileCount, FileBytes); pout(LIGHTCYAN, BLACK, temp); Enter(2); chartran_close(); iLineCount = 0; mbsedb_CloseFDB(fdb_area); Pause(); }
/* * 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 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; }
/* * 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); }
/* * Select filearea, called from menu. */ void FileArea_List(char *Option) { FILE *pAreas; int iAreaCount = 6, Recno = 1, iOldArea, iAreaNum = 0; int iGotArea = FALSE; /* Flag to check if user typed in area */ int offset; char *temp; /* * Save old area, incase he picks a invalid area */ iOldArea = iAreaNumber; if ((pAreas = OpenFareas(FALSE)) == NULL) return; /* * Count howmany records there are */ fseek(pAreas, 0, SEEK_END); iAreaNum = (ftell(pAreas) - areahdr.hdrsize) / areahdr.recsize; /* * If there are menu options, select area direct. */ if (strlen(Option) != 0) { if (strcmp(Option, "F+") == 0) { while (TRUE) { iAreaNumber++; if (iAreaNumber > iAreaNum) iAreaNumber = 1; offset = areahdr.hdrsize + ((iAreaNumber - 1) * areahdr.recsize); if (fseek(pAreas, offset, 0) != 0) { printf("Can't move pointer here"); } fread(&area, areahdr.recsize, 1, pAreas); if ((Access(exitinfo.Security, area.LTSec)) && (area.Available) && (strlen(area.Password) == 0)) break; } } if (strcmp(Option, "F-") == 0) { while (TRUE) { iAreaNumber--; if (iAreaNumber < 1) iAreaNumber = iAreaNum; offset = areahdr.hdrsize + ((iAreaNumber - 1) * areahdr.recsize); if (fseek(pAreas, offset, 0) != 0) { printf("Can't move pointer here"); } fread(&area, areahdr.recsize, 1, pAreas); if ((Access(exitinfo.Security, area.LTSec)) && (area.Available) && (strlen(area.Password) == 0)) break; } } SetFileArea(iAreaNumber); Syslog('+', "File area %lu %s", iAreaNumber, sAreaDesc); fclose(pAreas); return; } /* * Interactive mode */ clear(); Enter(1); /* File Areas */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(298)); Enter(2); temp = calloc(81, sizeof(char)); fseek(pAreas, areahdr.hdrsize, 0); while (fread(&area, areahdr.recsize, 1, pAreas) == 1) { if ((Access(exitinfo.Security, area.LTSec)) && (area.Available)) { area.Name[31] = '\0'; snprintf(temp, 81, "%5d", Recno); pout(WHITE, BLACK, temp); snprintf(temp, 81, " %c ", 46); pout(LIGHTBLUE, BLACK, temp); snprintf(temp, 81, "%-31s", area.Name); pout(CYAN, BLACK, temp); iAreaCount++; if ((iAreaCount % 2) == 0) { Enter(1); } else { PUTCHAR(' '); } } Recno++; if ((iAreaCount / 2) == rows) { /* More (Y/n/=/Area #): */ pout(CFG.MoreF, CFG.MoreB, (char *) Language(207)); /* * Ask user for Area or enter to continue */ colour(CFG.InputColourF, CFG.InputColourB); GetstrC(temp, 7); if (toupper(*(temp)) == Keystroke(207, 1)) break; if ((strcmp(temp, "")) != 0) { iGotArea = TRUE; break; } iAreaCount = 2; } } /* * If user type in area above during area listing * don't ask for it again */ if (!iGotArea) { Enter(1); /* Select Area: */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(232)); colour(CFG.InputColourF, CFG.InputColourB); GetstrC(temp, 80); } /* * Check if user pressed ENTER */ if ((strcmp(temp, "")) == 0) { fclose(pAreas); return; } iAreaNumber = atoi(temp); /* * Do a check in case user enters a negative value */ if (iAreaNumber < 1) iAreaNumber = 1; offset = areahdr.hdrsize + ((iAreaNumber - 1) * areahdr.recsize); if (fseek(pAreas, offset, 0) != 0) printf("Can't move pointer there."); else fread(&area, areahdr.recsize, 1, pAreas); /* * Do a check if area is greater or less number than allowed, * security access level, is oke, and the area is active. */ if (iAreaNumber > iAreaNum || iAreaNumber < 1 || (Access(exitinfo.Security, area.LTSec) == FALSE) || (strlen(area.Name) == 0)) { Enter(1); /* Invalid area specified - Please try again ...*/ pout(LIGHTRED, BLACK, (char *) Language(233)); Enter(2); Pause(); fclose(pAreas); iAreaNumber = iOldArea; SetFileArea(iAreaNumber); free(temp); return; } SetFileArea(iAreaNumber); Syslog('+', "File area %lu %s", iAreaNumber, sAreaDesc); /* * Check if file area has a password, if it does ask user for it */ if ((strlen(area.Password)) > 2) { Enter(2); /* Please enter Area Password: */ pout(WHITE, BLACK, (char *) Language(299)); colour(CFG.InputColourF, CFG.InputColourB); GetstrC(temp, 20); Enter(1); if ((strcmp(temp, area.Password)) != 0) { /* Password is incorrect */ pout(LIGHTRED, BLACK, (char *) Language(234)); Syslog('!', "Incorrect File Area # %d password given: %s", iAreaNumber, temp); SetFileArea(iOldArea); } else { /* Password is correct */ pout(WHITE, BLACK, (char *) Language(235)); } Enter(2); Pause(); } free(temp); fclose(pAreas); }
/* * Count nr of oneline records in the database. * Creates the database if it doesn't exist. */ int CountOneline(void) { FILE *fil; char ffile[PATH_MAX]; int count; struct tm *l_date; char buf[12]; time_t Time; Time = time(NULL); l_date = localtime(&Time); snprintf(buf, 12, "%02d-%02d-%04d", l_date->tm_mday, l_date->tm_mon+1, l_date->tm_year+1900); snprintf(ffile, PATH_MAX, "%s/etc/oneline.data", getenv("FTND_ROOT")); if ((fil = fopen(ffile, "r")) == NULL) { if ((fil = fopen(ffile, "a+")) != NULL) { Syslog('+', "created new %s", ffile); olhdr.hdrsize = sizeof(olhdr); olhdr.recsize = sizeof(ol); fwrite(&olhdr, sizeof(olhdr), 1, fil); memset(&ol, 0, sizeof(ol)); snprintf(ol.UserName, 36, "Sysop"); snprintf(ol.DateOfEntry, 12, "%s", buf); ol.Available = TRUE; snprintf(ol.Oneline, 81, "\"640K ought to be enough for anybody.\" Bill Gates '81"); fwrite(&ol, sizeof(ol), 1, fil); snprintf(ol.Oneline, 81, "\"Build a watch in 179 easy steps\" by C. Forsberg."); fwrite(&ol, sizeof(ol), 1, fil); snprintf(ol.Oneline, 81, "\"Keyboard? How quaint!\" - Scotty"); fwrite(&ol, sizeof(ol), 1, fil); snprintf(ol.Oneline, 81, "\"Luke... Luke... Use the MOUSE, Luke\" - Obi Wan Gates"); fwrite(&ol, sizeof(ol), 1, fil); snprintf(ol.Oneline, 81, "\"Suicide Hotline...please hold.\""); fwrite(&ol, sizeof(ol), 1, fil); snprintf(ol.Oneline, 81, "(A)bort, (R)etry, (P)retend this never happened..."); fwrite(&ol, sizeof(ol), 1, fil); snprintf(ol.Oneline, 81, "A Smith & Wesson *ALWAYS* beats 4 Aces."); fwrite(&ol, sizeof(ol), 1, fil); snprintf(ol.Oneline, 81, "A dirty book is rarely dusty."); fwrite(&ol, sizeof(ol), 1, fil); snprintf(ol.Oneline, 81, "An Elephant; A Mouse built to government specifications."); fwrite(&ol, sizeof(ol), 1, fil); snprintf(ol.Oneline, 81, "At a store: In God we trust; all others pay cash."); fwrite(&ol, sizeof(ol), 1, fil); fclose(fil); chmod(ffile, 0660); return 10; } else return -1; } count = 0; fread(&olhdr, sizeof(olhdr), 1, fil); while (fread(&ol, olhdr.recsize, 1, fil) == 1) { count++; } fclose(fil); return count; }
void PurgeOneline(void) { FILE *pOneline, *fp; int recno = 0, iCount = 0; char *sFileName, temp[81]; clr_index(); set_color(WHITE, BLACK); ftnd_mvprintw( 5, 6, "8.7.2 ONELINERS PURGE"); set_color(CYAN, BLACK); working(1, 0, 0); if (config_read() == -1) { working(2, 0, 0); return; } IsDoing("Purge Oneliners"); sFileName = calloc(PATH_MAX, sizeof(char)); snprintf(sFileName, PATH_MAX, "%s/etc/oneline.data", getenv("FTND_ROOT")); if ((pOneline = fopen(sFileName, "r")) == NULL) { free(sFileName); return; } fread(&olhdr, sizeof(olhdr), 1, pOneline); while (fread(&ol, olhdr.recsize, 1, pOneline) == 1) { recno++; if (!ol.Available) iCount++; } snprintf(temp, 81, "%d records, %d records to purge", recno, iCount); ftnd_mvprintw(7, 6, temp); if (iCount == 0) { ftnd_mvprintw(9, 6, "Press any key"); readkey(9, 20, LIGHTGRAY, BLACK); free(sFileName); return; } if (yes_no((char *)"Purge deleted records") == TRUE) { working(1, 0, 0); recno = iCount = 0; fseek(pOneline, olhdr.hdrsize, 0); fp = fopen("tmp.1", "a"); fwrite(&olhdr, sizeof(olhdr), 1, fp); while (fread(&ol, olhdr.recsize, 1, pOneline) == 1) { recno++; if (ol.Available) fwrite(&ol, olhdr.recsize, 1, fp); else iCount++; } fclose(fp); fclose(pOneline); if ((rename("tmp.1", sFileName)) != 0) working(2, 0, 0); unlink("tmp.1"); free(sFileName); Syslog('+', "Purged %d out of %d oneliners", iCount, recno); } }
static int tcp_rblk(char *buf, int *len) { int c; *len = 0; /* * Wait up to 3 minutes for the header */ c = GETCHAR(180); if (tty_status) goto to; if (c != TCP_BLKSTRT) { WriteError("tcp_rblk: got %d instead of block header", c); return c; } /* * Get block type */ c = GETCHAR(120); if (tty_status) goto to; rx_type = c; if (c != TCP_CMD && c != TCP_DATA) { WriteError("tcp_rblk: got %d character instead of DATA/CMD", c); return c; } /* * Get block length */ c = GETCHAR(120); if (tty_status) goto to; *len = c << 8; c = GETCHAR(120); if (tty_status) goto to; *len += c; if (*len > TCP_BLKSIZE) { WriteError("TCP: remote sends too large block: %d bytes", len); return 1; } /* * Get actual data block */ if (*len != 0) { GET(buf, *len, 120); if (tty_status) goto to; } else { WriteError("TCP: remote sends empty frame"); } /* * Get block trailer */ c = GETCHAR(120); if (tty_status) goto to; if (c != TCP_BLKEND) { WriteError("TCP: got %d instead of block trailer", c); return c; } if (rx_type == TCP_CMD) { buf[*len] = '\0'; Syslog('a', "tcp_rblk: cmd: %s", buf); } else Syslog('a', "tcp_rblk: data: %d bytes", *len); to: if (tty_status) WriteError("TCP: receive error: %s", ttystat[tty_status]); return tty_status; }
static int sendtfile(char *ln, char *rn) { int rc=0; struct stat st; struct flock fl; int bufl, sverr; int offset; fl.l_type = F_RDLCK; fl.l_whence = 0; fl.l_start = 0L; fl.l_len = 0L; if ((in = fopen(ln,"r")) == NULL) { sverr = errno; if ((sverr == ENOENT) || (sverr == EINVAL)) { Syslog('+', "TCP: file %s doesn't exist, removing", FTND_SS(ln)); return 0; } else { WriteError("$TCP: can't open file %s, skipping", FTND_SS(ln)); return 1; } } if (fcntl(fileno(in), F_SETLK, &fl) != 0) { WriteError("$TCP: can't lock file %s, skipping", FTND_SS(ln)); fclose(in); return 1; } if (stat(ln, &st) != 0) { WriteError("$TCP: can't access \"%s\", skipping", FTND_SS(ln)); fclose(in); return 1; } if (st.st_size > 0) { Syslog('+', "TCP: send \"%s\" as \"%s\"", FTND_SS(ln), FTND_SS(rn)); Syslog('+', "TCP: size %lu bytes, dated %s", (unsigned int)st.st_size, date(st.st_mtime)); gettimeofday(&starttime, &tz); } else { Syslog('+', "TCP: file \"%s\" has 0 size, skiped",ln); return 0; } snprintf(txbuf,TCP_BLKSIZE, "S %s %u %u",rn,(unsigned int)st.st_size,(unsigned int)st.st_mtime+(unsigned int)(st.st_mtime%2)); bufl = strlen(txbuf); rc = tcp_sblk(txbuf, bufl, TCP_CMD); rc = tcp_rblk(rxbuf, &bufl); if (strncmp(rxbuf,"RS",2) == 0) { Syslog('+', "TCP: file %s already received, skipping",rn); return 0; } else if (strncmp(rxbuf,"RN",2) == 0) { Syslog('+', "TCP: remote refused file, aborting",rn); return 2; } else if (strncmp(rxbuf,"ROK",3) == 0) { if (bufl > 3 && rxbuf[3]==' ') { offset = strtol(rxbuf+4,(char **)NULL,10); if (fseek(in,offset,SEEK_SET) != 0) { WriteError("$TCP: can't seek offset %ld in file %s", offset, ln); return 1; } } else offset = 0; } else return rc; while ((bufl = fread(&txbuf, 1, TCP_DATSIZE, in)) != 0) { if ((rc = tcp_sblk(txbuf, bufl, TCP_DATA)) > 0) break; } fclose(in); if (rc == 0){ strcpy(txbuf, "EOF"); rc = tcp_sblk(txbuf, 3, TCP_CMD); rc = tcp_rblk(rxbuf, &bufl); } if (rc == 0 && strncmp(rxbuf,"FOK",3) == 0) { gettimeofday(&endtime, &tz); Syslog('a', "st_size %d, offset %d",st.st_size,offset); Syslog('+', "TCP: OK %s", transfertime(starttime, endtime, st.st_size-offset, TRUE)); sentbytes += (unsigned int)st.st_size - offset; return 0; } else if(strncmp(rxbuf,"FERROR",6) == 0){ WriteError("TCP: remote file error",ln); return rc==0?1:rc; } else return rc==0?1:rc; }
/* * Put a lock on a directory. */ int lockdir(char *directory) { char *Tmpfile, *lockfile; FILE *fp; pid_t oldpid; Tmpfile = calloc(PATH_MAX, sizeof(char)); lockfile = calloc(PATH_MAX, sizeof(char)); snprintf(Tmpfile, PATH_MAX, "%s/", directory); strcpy(lockfile, Tmpfile); snprintf(Tmpfile + strlen(Tmpfile), PATH_MAX, "%s%u", TMPNAME, getpid()); snprintf(lockfile + strlen(lockfile), PATH_MAX - strlen(lockfile), "%s", LCKNAME); if ((fp = fopen(Tmpfile, "w")) == NULL) { WriteError("$Can't create lockfile \"%s\"", Tmpfile); free(Tmpfile); free(lockfile); return FALSE; } fprintf(fp, "%10u\n", getpid()); fclose(fp); while (TRUE) { if (link(Tmpfile, lockfile) == 0) { unlink(Tmpfile); free(Tmpfile); free(lockfile); return TRUE; } if ((fp = fopen(lockfile, "r")) == NULL) { WriteError("$Can't open lockfile \"%s\"", Tmpfile); unlink(Tmpfile); free(Tmpfile); free(lockfile); return FALSE; } if (fscanf(fp, "%u", &oldpid) != 1) { WriteError("$Can't read old pid from \"%s\"", Tmpfile); fclose(fp); unlink(Tmpfile); free(Tmpfile); free(lockfile); return FALSE; } fclose(fp); if (kill(oldpid,0) == -1) { if (errno == ESRCH) { Syslog('+', "Stale lock found for pid %u", oldpid); unlink(lockfile); /* no return, try lock again */ } else { WriteError("$Kill for %u failed",oldpid); unlink(Tmpfile); free(Tmpfile); free(lockfile); return FALSE; } } else { Syslog('+', "mbfido already running, pid=%u", oldpid); unlink(Tmpfile); free(Tmpfile); free(lockfile); return FALSE; } } }
void task_rtc(void * ptr) { OS_DateAndTime dt; UINT32 year, mon, date, day, hour, min, sec; char bcd_str[20]; while(1) { // First get the user command Syslog("Input any command: \ns - Set Time\np - Print Time\nq - Quit"); OS_SemWait(&input_ready); switch(input_str[0]) { case 's': Syslog("Please Input Year: "); OS_SemWait(&input_ready); if(!bcda2bcdi(input_str, &year) && (year < 0 || year > 99)) { goto error_exit; } Syslog("Please Input Month: "); OS_SemWait(&input_ready); if(!bcda2bcdi(input_str, &mon) && (mon < 1 || mon > 12)) { goto error_exit; } Syslog("Please Input Date: "); OS_SemWait(&input_ready); if(!bcda2bcdi(input_str, &date) && (date < 1 || date > 31)) { goto error_exit; } Syslog("Please Input Day[1:Sunday ... 7:Saturday]: "); OS_SemWait(&input_ready); if(!bcda2bcdi(input_str, &day) && (day < 1 || day > 7)) { goto error_exit; } Syslog("Please Input Hour [0 - 23]: "); OS_SemWait(&input_ready); if(!bcda2bcdi(input_str, &hour) && (day < 0 || day > 23)) { goto error_exit; } Syslog("Please Input Minutes [0 - 59]: "); OS_SemWait(&input_ready); if(!bcda2bcdi(input_str, &min) && (min < 0 || min > 59)) { goto error_exit; } Syslog("Please Input Seconds [0 - 59]: "); OS_SemWait(&input_ready); if(!bcda2bcdi(input_str, &sec) && (sec < 0 || sec > 59)) { goto error_exit; } // Copy into OS_DateAndTime structure dt.year = year; dt.mon = mon; dt.date = date; dt.day = day; dt.hour = hour; dt.min = min; dt.sec = sec; while(1) { Syslog("Do you want to set the time ? [y/n]"); OS_SemWait(&input_ready); if((input_str[0]=='y') || (input_str[0]=='n')) { break; } } if(input_str[0]=='y') { if(OS_SetDateAndTime(&dt) == SUCCESS) { Syslog("Date and Time set successfully..."); } else { Syslog("Date and Time set FAILED..."); goto error_exit; } } break; case 'p': if(OS_GetDateAndTime(&dt) != SUCCESS) { Syslog("Getting Date and Time FAILED..."); goto error_exit; } Syslog("\n\n"); SyslogStr(NULL, weekdays[dt.day - 1]); SyslogStr(NULL, "\t"); bcdi2bcda(dt.mon, bcd_str); SyslogStr(NULL, bcd_str); SyslogStr(NULL, "/"); bcdi2bcda(dt.date, bcd_str); SyslogStr(NULL, bcd_str); SyslogStr(NULL, "/"); bcdi2bcda(dt.year, bcd_str); SyslogStr(NULL, bcd_str); SyslogStr(NULL, " "); bcdi2bcda(dt.hour, bcd_str); SyslogStr(NULL, bcd_str); SyslogStr(NULL, ":"); bcdi2bcda(dt.min, bcd_str); SyslogStr(NULL, bcd_str); SyslogStr(NULL, ":"); bcdi2bcda(dt.sec, bcd_str); SyslogStr("", bcd_str); Syslog("\n"); #if OS_ENABLE_CPU_STATS==1 && ENABLE_SYNC_TIMER==1 Syslog32("Current SYNC Counter Value - ", sync_intr_counter); #endif Syslog32("Current Counter Value - ", test_counter); Syslog("\n"); break; case 'q': goto exit; default: break; } } exit: return; error_exit: Syslog("Critical Error. Exiting..."); }
/* submit a message to imklog Syslog() API. In this function, we check if * a kernel timestamp is present and, if so, extract and strip it. * Note that this is heavily Linux specific and thus is not compiled or * used for BSD. * Special thanks to Lennart Poettering for suggesting on how to convert * the kernel timestamp to a realtime timestamp. This method depends on * the fact the the kernel timestamp is written using the monotonic clock. * Shall that change (very unlikely), this code must be changed as well. Note * that due to the way we generate the delta, we are unable to write the * absolutely correct timestamp (system call overhead of the clock calls * prevents us from doing so). However, the difference is very minor. * rgerhards, 2011-06-24 */ static void submitSyslog(modConfData_t *pModConf, syslog_pri_t pri, uchar *buf) { long secs; long usecs; long secOffs; long usecOffs; unsigned i; unsigned bufsize; struct timespec monotonic, realtime; struct timeval tv; struct timeval *tp = NULL; if(!pModConf->bParseKernelStamp) goto done; if(buf[3] != '[') goto done; DBGPRINTF("imklog: kernel timestamp detected, extracting it\n"); /* we now try to parse the timestamp. iff it parses, we assume * it is a timestamp. Otherwise we know for sure it is no ts ;) */ i = 4; /* space or first digit after '[' */ while(buf[i] && isspace(buf[i])) ++i; /* skip space */ secs = 0; while(buf[i] && isdigit(buf[i])) { secs = secs * 10 + buf[i] - '0'; ++i; } if(buf[i] != '.') { DBGPRINTF("no dot --> no kernel timestamp\n"); goto done; /* no TS! */ } ++i; /* skip dot */ usecs = 0; while(buf[i] && isdigit(buf[i])) { usecs = usecs * 10 + buf[i] - '0'; ++i; } if(buf[i] != ']') { DBGPRINTF("no trailing ']' --> no kernel timestamp\n"); goto done; /* no TS! */ } ++i; /* skip ']' */ /* we have a timestamp */ DBGPRINTF("kernel timestamp is %ld %ld\n", secs, usecs); if(!pModConf->bKeepKernelStamp) { bufsize= strlen((char*)buf); memmove(buf+3, buf+i, bufsize - i + 1); } clock_gettime(CLOCK_MONOTONIC, &monotonic); clock_gettime(CLOCK_REALTIME, &realtime); secOffs = realtime.tv_sec - monotonic.tv_sec; usecOffs = (realtime.tv_nsec - monotonic.tv_nsec) / 1000; if(usecOffs < 0) { secOffs--; usecOffs += 1000000l; } usecs += usecOffs; if(usecs > 999999l) { secs++; usecs -= 1000000l; } secs += secOffs; tv.tv_sec = secs; tv.tv_usec = usecs; tp = &tv; done: Syslog(pModConf, pri, buf, tp); }
/* * Delete files from home directory */ void Delete_Home() { char *temp, *temp1, msg[81]; int i; temp = calloc(PATH_MAX, sizeof(char)); temp1 = calloc(PATH_MAX, sizeof(char)); snprintf(temp, PATH_MAX, "%s/%s/wrk/", CFG.bbs_usersdir, exitinfo.Name); Enter(1); /* Please enter filename to delete: */ pout(LIGHTBLUE, BLACK, (char *) Language(292)); colour(CFG.InputColourF, CFG.InputColourB); GetstrC(temp1, 80); if (strcmp(temp1, "") == 0) { free(temp); free(temp1); return; } if (temp1[0] == '.') { Enter(1); /* Sorry you may not delete hidden files ...*/ pout(LIGHTRED, BLACK, (char *) Language(293)); } else { strcat(temp, temp1); if ((access(temp, R_OK)) == 0) { Enter(1); /* Delete file: */ /* Are you Sure? [Y/n]: */ snprintf(msg, 81, "%s %s, %s", (char *) Language(368), temp1, (char *) Language(369)); pout(LIGHTGREEN, BLACK, msg); i = toupper(Readkey()); if (i == Keystroke(369, 0) || i == 13) { i = unlink(temp); if (i == -1) { Enter(1); /* Unable to delete file ... */ pout(LIGHTRED, BLACK, (char *) Language(294)); } else { Syslog('+', "Delete %s from homedir", temp1); } } else { Enter(2); /* Aborting ... */ pout(DARKGRAY, BLACK, (char *) Language(116)); } } else { Enter(1); /* Invalid filename, please try again ... */ pout(LIGHTRED, BLACK, (char *) Language(295)); } } Enter(2); free(temp); free(temp1); Pause(); }
/* * Function will upload to users home directory */ int Upload_Home() { char *temp, *arc; int rc = 0, Count = 0; up_list *up = NULL, *tmpf; WhosDoingWhat(UPLOAD, NULL); temp = calloc(PATH_MAX, sizeof(char)); clear(); Enter(2); rc = upload(&up); if (rc) { Syslog('+', "Upload home failed, rc=%d", rc); Home(); return 1; } Syslog('b', "Start checking uploaded files"); Enter(2); pout(CFG.UnderlineColourF, CFG.UnderlineColourB, (char *)"Checking your upload(s)"); Enter(2); for (tmpf = up; tmpf; tmpf = tmpf->next) { snprintf(temp, PATH_MAX, "%s/%s/upl", CFG.bbs_usersdir, exitinfo.Name); chdir(temp); Syslog('b', "Checking upload %s", tmpf->filename); if ((arc = GetFileType(tmpf->filename)) == NULL) { /* * If the filetype is unknown, it is probably * a textfile or so. Import it direct. */ Syslog('b', "Unknown file type"); ImportHome(basename(tmpf->filename)); Count++; } else { /* * We figured out the type of the uploaded file. */ Syslog('b', "File type is %s", arc); /* * MS-DOS executables are handled direct. */ if ((strcmp("EXE", arc) == 0) || (strcmp("COM", arc) == 0)) { if (!ScanDirect(basename(tmpf->filename))) { ImportHome(basename(tmpf->filename)); Count++; } } else { switch(ScanArchive(basename(tmpf->filename), arc)) { case 0: ImportHome(basename(tmpf->filename)); Count++; break; case 1: break; case 2: break; case 3: /* * No valid unarchiver found, just import */ ImportHome(basename(tmpf->filename)); Count++; break; } } } } Home(); ReadExitinfo(); exitinfo.Uploads += Count; mib_uploads += Count; WriteExitinfo(); tidy_upload(&up); Pause(); free(temp); return rc; }
void ImportOneline(void) { FILE *Imp, *pOneline; int recno = 0, skipped = 0; struct tm *l_date; char *temp, buf[12]; time_t Time; clr_index(); set_color(WHITE, BLACK); ftnd_mvprintw(5, 6, "8.7.3 IMPORT ONELINERS"); set_color(CYAN, BLACK); temp = calloc(PATH_MAX, sizeof(char)); memset(temp, 0, sizeof(temp)); strcpy(temp, edit_str(21, 6,64, temp, (char *)"The ^full path and filename^ of the file to import")); if (strlen(temp) == 0) { free(temp); return; } working(1, 0, 0); if (config_read() == -1) { working(2, 0, 0); free(temp); return; } if ((Imp = fopen(temp, "r")) == NULL) { working(2, 0, 0); ftnd_mvprintw(21, 6, temp); readkey(22, 6, LIGHTGRAY, BLACK); free(temp); return; } snprintf(temp, PATH_MAX, "%s/etc/oneline.data", getenv("FTND_ROOT")); /* * Check if database exists, if not create a new one */ if ((pOneline = fopen(temp, "r" )) == NULL) { if ((pOneline = fopen(temp, "w")) != NULL) { olhdr.hdrsize = sizeof(olhdr); olhdr.recsize = sizeof(ol); fwrite(&olhdr, sizeof(olhdr), 1, pOneline); fclose(pOneline); } } else fclose(pOneline); /* * Open database for appending */ if ((pOneline = fopen(temp, "a+")) == NULL) { working(2, 0, 0); fclose(Imp); ftnd_mvprintw(21, 6, temp); readkey(22, 6, LIGHTGRAY, BLACK); free(temp); return; } Time = time(NULL); l_date = localtime(&Time); snprintf(buf, 12, "%02d-%02d-%04d", l_date->tm_mday, l_date->tm_mon+1, l_date->tm_year+1900); while ((fgets(temp, 80, Imp)) != NULL) { Striplf(temp); if ((strlen(temp) > 0) && (strlen(temp) < 69)) { memset(&ol, 0, sizeof(ol)); strcpy(ol.Oneline, temp); strcpy(ol.UserName, CFG.sysop_name); strcpy(ol.DateOfEntry, buf); ol.Available = TRUE; fwrite(&ol, sizeof(ol), 1, pOneline); recno++; } else { skipped++; } } fclose(Imp); fclose(pOneline); snprintf(temp, 81, "Imported %d oneliners, skipped %d long/empty lines", recno, skipped); Syslog('+', temp); ftnd_mvprintw(21, 6, temp); readkey(21, 7 + strlen(temp), LIGHTGRAY, BLACK); free(temp); }
void auth_pass(char *cmd) { char *p, *temp; FILE *fp; int FoundName = FALSE; if (! got_username) { WriteError("Got AUTHINFO PASS before AUTHINFO USER"); send_nntp("482 Authentication rejected"); return; } p = strtok(cmd, " \0"); p = strtok(NULL, " \0"); p = strtok(NULL, " \0"); temp = calloc(PATH_MAX, sizeof(char)); snprintf(temp, PATH_MAX, "%s/etc/users.data", getenv("FTND_ROOT")); if ((fp = fopen(temp,"r+")) == NULL) { /* * This should not happen */ WriteError("$Can't open %s", temp); send_nntp("482 Authentication rejected"); free(temp); got_username = FALSE; return; } free(temp); grecno = 0; fread(&usrconfighdr, sizeof(usrconfighdr), 1, fp); while (fread(&usrconfig, usrconfighdr.recsize, 1, fp) == 1) { if (strcmp(usrconfig.Name, username) == 0) { FoundName = TRUE; usercharset=usrconfig.Charset; break; } grecno++; } if (!FoundName) { fclose(fp); Syslog('+', "Unknown user \"%s\", reject", username); send_nntp("482 Authentication rejected"); got_username = FALSE; memset(&usrconfig, 0, sizeof(usrconfig)); return; } if (strcasecmp(usrconfig.Password, p)) { Syslog('+', "Password error, reject user \"%s\"", username); send_nntp("482 Authentication rejected"); fclose(fp); got_username = FALSE; memset(&usrconfig, 0, sizeof(usrconfig)); return; } /* * Update user record */ usrconfig.tLastLoginDate = time(NULL); /* Login date is current date */ usrconfig.iTotalCalls++; /* Increase calls */ /* * Update user record. */ if (fseek(fp, usrconfighdr.hdrsize + (grecno * usrconfighdr.recsize), 0) != 0) { WriteError("Can't seek in %s/etc/users.data", getenv("FTND_ROOT")); } else { fwrite(&usrconfig, sizeof(usrconfig), 1, fp); } fclose(fp); /* * User logged in, tell it to the server. Check if a location is * set, if Ask User location for new users is off, this field is * empty but we have to send something to the server. */ if (strlen(usrconfig.sLocation)) UserCity(mypid, usrconfig.Name, usrconfig.sLocation); else UserCity(mypid, usrconfig.Name, (char *)"N/A"); IsDoing("Logged in"); Syslog('+', "User %s logged in", username); authorized = TRUE; got_username = FALSE; send_nntp("281 Authentication accepted"); }
static int tty_read(char *buf, int size, int tot) { int rc; fd_set readfds, writefds, exceptfds; struct timeval seltimer; if (size == 0) return 0; tty_status = 0; FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds); FD_SET(0,&readfds); FD_SET(0,&exceptfds); seltimer.tv_sec=tot; seltimer.tv_usec=0; rc = select(1,&readfds,&writefds,&exceptfds,&seltimer); if (rc < 0) { if (hanged_up) { tty_status=STAT_HANGUP; WriteError("tty_read: hanged_up flag"); } else { WriteError("$tty_read: select for read failed"); tty_status = STAT_ERROR; } } else if (rc == 0) { tty_status = STAT_TIMEOUT; } else { /* rc > 0 */ if (FD_ISSET(0,&exceptfds)) { Syslog('!', "$tty_read: exeption error"); tty_status = STAT_ERROR; } } if (tty_status) { return -tty_status; } if (!FD_ISSET(0,&readfds)) { WriteError("tty_read: Cannot be: select returned but read fd not set"); tty_status = STAT_ERROR; return -tty_status; } rc = read(0,buf,size); if (rc <= 0) { Syslog('t', "tty_read: return %d",rc); if (hanged_up || (errno == EPIPE) || (errno == ECONNRESET)) { tty_status = STAT_HANGUP; WriteError("tty_read: hanged_up flag"); } else { tty_status = STAT_ERROR; Syslog('!', "tty_read: error flag"); } rc=-tty_status; } return rc; }
/* * View a file in the current area, menu 103. * If a file name is given, display direct, * else ask for filename to view. */ void ViewFile(char *name) { char *File, *temp, *arc; int count, total, rc, found = FALSE; FILE *fp; struct _fdbarea *fdb_area = NULL; Syslog('+', "ViewFile(%s)", printable(name, 0)); if (Access(exitinfo.Security, area.LTSec) == FALSE) { Enter(1); /* You don't have enough security to list this area */ pout(YELLOW, BLACK, (char *) Language(236)); Enter(2); Pause(); return; } File = calloc(PATH_MAX, sizeof(char)); if ((name != NULL) && strlen(name)) { strcpy(File, name); } else { Enter(2); /* Please enter filename: */ pout(YELLOW, BLACK, (char *) Language(245)); colour(CFG.InputColourF, CFG.InputColourB); GetstrC(File, 80); if ((strcmp(File, "")) == 0) { free(File); return; } if (*(File) == '.' || *(File) == '*' || *(File) == ' ' || *(File) == '/') { Enter(1); /* Illegal Filename! */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(247)); Enter(2); Pause(); free(File); return; } Strlen = strlen(File); Strlen--; if (*(File + Strlen) == '.' || *(File + Strlen) == '/' || *(File + Strlen) == ' ') { Enter(1); /* Illegal Filename! */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(247)); Enter(2); Pause(); free(File); return; } if ((!strcmp(File, "files.bbs")) || (!strcmp(File, "00index")) || (strstr(File, (char *)".html"))) { Enter(1); /* Illegal Filename! */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(247)); Enter(2); Pause(); free(File); return; } } /* * Now check if this file is present */ if ((fdb_area = mbsedb_OpenFDB(iAreaNumber, 30)) == NULL) { free(File); return; } while (fread(&fdb, fdbhdr.recsize, 1, fdb_area->fp) == 1) { if (((strcasecmp(File, fdb.Name) == 0) || (strcasecmp(File, fdb.LName) == 0)) && (!fdb.Deleted)) { found = TRUE; break; } } mbsedb_CloseFDB(fdb_area); if (!found) { Enter(1); /* File does not exist, please try again ... */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(296)); Enter(2); free(File); Pause(); return; } snprintf(File, PATH_MAX, "%s/%s", sAreaPath, fdb.LName); arc = GetFileType(File); Syslog('+', "File to view: %s, type %s", fdb.LName, printable(arc, 0)); if (arc != NULL) { found = FALSE; temp = calloc(PATH_MAX, sizeof(char)); snprintf(temp, PATH_MAX, "%s/etc/archiver.data", getenv("MBSE_ROOT")); if ((fp = fopen(temp, "r")) != NULL) { fread(&archiverhdr, sizeof(archiverhdr), 1, fp); while (fread(&archiver, archiverhdr.recsize, 1, fp) == 1) { if ((strcmp(arc, archiver.name) == 0) && (archiver.available)) { found = TRUE; break; } } fclose(fp); } if (!found || (strlen(archiver.varc) == 0)) { Syslog('+', "No archiver view for %s available", File); Enter(1); /* Archiver not available */ pout(CFG.HiliteF, CFG.HiliteB, Language(442)); Enter(2); free(File); free(temp); Pause(); return; } /* * Archiver viewer is available. Make a temp file which we will * display to the user. */ snprintf(temp, PATH_MAX, "%s/%s/temptxt", CFG.bbs_usersdir, exitinfo.Name); rc = execute_str(archiver.varc, File, NULL, (char *)"/dev/null", temp, (char *)"/dev/null"); Syslog('+', "Display temp file %s", temp); DisplayTextFile(temp); unlink(temp); free(temp); } else { /* * Most likely a textfile, first check. */ total = count = 0; if ((fp = fopen(File, "r"))) { while (TRUE) { rc = fgetc(fp); if (rc == EOF) break; total++; if (isascii(rc)) count++; } fclose(fp); } if (((count * 10) / total) < 8) { Syslog('+', "This is not a ASCII textfile"); Enter(1); pout(CFG.HiliteF, CFG.HiliteB, Language(17)); Enter(2); Pause(); free(File); return; } Syslog('+', "Display text file %s", File); DisplayTextFile(File); } free(File); }
/* * 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("FTND_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("FTND_ROOT"), Area); if ((fp1 = fopen(temp, "r")) != NULL) { /* * Old area available, upgrade. */ snprintf(temp, PATH_MAX, "%s/var/fdb/file%d.data", getenv("FTND_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("FTND_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("FTND_ROOT"), Area); unlink(temp); } // Old area type upgrade. /* * Current area, check */ if ((fdb_area = ftnddb_OpenFDB(Area, 30)) == NULL) WriteError("InitFDB(): database area %d might be corrupt", Area); else ftnddb_CloseFDB(fdb_area); } } fclose(fil); } free(temp); }
/* * 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; }
extern int InitMsyms() { auto int rtn, tmp; FILE *ksyms; char buf[128]; char *p; /* Initialize the kernel module symbol table. */ FreeModules(); ksyms = fopen(KSYMS, "r"); if ( ksyms == NULL ) { if ( errno == ENOENT ) Syslog(LOG_INFO, "No module symbols loaded - " "kernel modules not enabled.\n"); else Syslog(LOG_ERR, "Error loading kernel symbols " \ "- %s\n", strerror(errno)); fclose(ksyms); return(0); } if ( debugging ) fprintf(stderr, "Loading kernel module symbols - " "Source: %s\n", KSYMS); while ( fgets(buf, sizeof(buf), ksyms) != NULL ) { if (num_syms > 0 && index(buf, '[') == NULL) continue; p = index(buf, ' '); if ( p == NULL ) continue; if ( buf[strlen(buf)-1] == '\n' ) buf[strlen(buf)-1] = '\0'; /* overlong lines will be ignored above */ AddSymbol(buf); } fclose(ksyms); have_modules = 1; /* Sort the symbol tables in each module. */ for (rtn = tmp = 0; tmp < num_modules; ++tmp) { rtn += sym_array_modules[tmp].num_syms; if ( sym_array_modules[tmp].num_syms < 2 ) continue; qsort(sym_array_modules[tmp].sym_array, \ sym_array_modules[tmp].num_syms, \ sizeof(struct sym_table), symsort); } if ( rtn == 0 ) Syslog(LOG_INFO, "No module symbols loaded."); else Syslog(LOG_INFO, "Loaded %d %s from %d module%s", rtn, \ (rtn == 1) ? "symbol" : "symbols", \ num_modules, (num_modules == 1) ? "." : "s."); return(1); }
/* * Upload a file. */ int Upload() { int Area, rc; unsigned int OldArea; char *arc, *temp; up_list *up = NULL, *tmpf; WhosDoingWhat(UPLOAD, NULL); Enter(1); Area = OldArea = iAreaNumber; /* * If there is a special upload area for the current area * then select it. */ if (area.Upload) Area = area.Upload; SetFileArea(Area); Syslog('+', "Upload area is %d %s", Area, area.Name); /* * Check upload access for the real upload directory. */ if (!Access(exitinfo.Security, area.UPSec)) { Enter(1); /* You do not have enough access to upload to this area */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(278)); Enter(2); SetFileArea(OldArea); Pause(); return 0; } clear(); Enter(2); rc = upload(&up); if (rc) { Syslog('+', "Upload failed, rc=%d", rc); SetFileArea(OldArea); return 0; } Syslog('b', "upload done, start checks"); Enter(2); pout(CFG.UnderlineColourF, CFG.UnderlineColourB, (char *)"Checking your upload(s)"); Enter(1); temp = calloc(PATH_MAX, sizeof(char)); for (tmpf = up; tmpf; tmpf = tmpf->next) { snprintf(temp, PATH_MAX, "%s/%s/upl", CFG.bbs_usersdir, exitinfo.Name); chdir(temp); Syslog('b', "Checking upload %s", tmpf->filename); if ((arc = GetFileType(tmpf->filename)) == NULL) { /* * If the filetype is unknown, it is probably * a textfile or so. Import it direct. */ Syslog('b', "Unknown file type"); if (!ScanDirect(basename(tmpf->filename))) ImportFile(tmpf->filename, Area, FALSE, tmpf->size); } else { /* * We figured out the type of the uploaded file. */ Syslog('b', "File type is %s", arc); /* * MS-DOS executables are handled direct. */ if ((strcmp("EXE", arc) == 0) || (strcmp("COM", arc) == 0)) { if (!ScanDirect(basename(tmpf->filename))) ImportFile(tmpf->filename, Area, FALSE, tmpf->size); } else { switch (ScanArchive(basename(tmpf->filename), arc)) { case 0: ImportFile(tmpf->filename, Area, TRUE, tmpf->size); break; case 1: break; case 2: break; case 3: /* * No valid unarchiver found, just import after scanning, * may catch macro viri. */ if (!ScanDirect(basename(tmpf->filename))) ImportFile(tmpf->filename, Area, FALSE, tmpf->size); break; } } } } tidy_upload(&up); free(temp); Home(); SetFileArea(OldArea); Pause(); return 1; }
/* * Move a file */ void Move(int From, int To, char *File) { char *frompath, *topath, *temp1, *fromlink, *tolink, *fromthumb, *tothumb; struct FILE_record f_db; int rc = FALSE, Found = FALSE; struct _fdbarea *src_area = NULL; IsDoing("Move file"); ftnd_colour(LIGHTRED, BLACK); if (From == To) { WriteError("Area numbers are the same"); if (!do_quiet) printf("Can't move to the same area\n"); die(FTNERR_COMMANDLINE); } /* * Check From area */ if (LoadAreaRec(From) == FALSE) { WriteError("Can't load record %d", From); die(FTNERR_INIT_ERROR); } if (!area.Available) { WriteError("Area %d not available", From); if (!do_quiet) printf("Area %d not available\n", From); die(FTNERR_COMMANDLINE); } if (CheckFDB(From, area.Path)) die(FTNERR_GENERAL); /* * Find the file in the "from" area, check LFN and 8.3 names. */ if ((src_area = ftnddb_OpenFDB(From, 30)) == NULL) die(FTNERR_GENERAL); while (fread(&f_db, fdbhdr.recsize, 1, src_area->fp) == 1) { if ((strcmp(f_db.LName, File) == 0) || strcmp(f_db.Name, File) == 0) { Found = TRUE; break; } } temp1 = calloc(PATH_MAX, sizeof(char)); // not serious if (!Found) { WriteError("File %s not found in area %d", File, From); if (!do_quiet) printf("File %s not found in area %d\n", File, From); free(temp1); die(FTNERR_GENERAL); } frompath = xstrcpy(area.Path); frompath = xstrcat(frompath, (char *)"/"); frompath = xstrcat(frompath, f_db.Name); fromlink = xstrcpy(area.Path); fromlink = xstrcat(fromlink, (char *)"/"); fromlink = xstrcat(fromlink, f_db.LName); fromthumb = xstrcpy(area.Path); fromthumb = xstrcat(fromthumb, (char *)"/."); fromthumb = xstrcat(fromthumb, f_db.Name); /* * Check Destination area */ if (LoadAreaRec(To) == FALSE) { WriteError("Can't load record %d", To); die(FTNERR_GENERAL); } if (!area.Available) { WriteError("Area %d not available", To); if (!do_quiet) printf("Area %d not available\n", To); die(FTNERR_GENERAL); } if (CheckFDB(To, area.Path)) die(FTNERR_GENERAL); topath = xstrcpy(area.Path); topath = xstrcat(topath, (char *)"/"); topath = xstrcat(topath, f_db.Name); tolink = xstrcpy(area.Path); tolink = xstrcat(tolink, (char *)"/"); tolink = xstrcat(tolink, f_db.LName); tothumb = xstrcpy(area.Path); tothumb = xstrcat(tothumb, (char *)"/."); tothumb = xstrcat(tothumb, f_db.Name); if (file_exist(topath, F_OK) == 0) { WriteError("File %s already exists in area %d", File, To); if (!do_quiet) printf("File %s already exists in area %d\n", File, To); die(FTNERR_COMMANDLINE); } rc = AddFile(f_db, To, topath, frompath, tolink); if (rc) { unlink(fromlink); unlink(frompath); /* * Try to move thumbnail if it exists */ if (file_exist(fromthumb, R_OK) == 0) { file_mv(fromthumb, tothumb); } } if (ftnddb_LockFDB(src_area, 30)) { f_db.Deleted = TRUE; fseek(src_area->fp, - fdbhdr.recsize, SEEK_CUR); fwrite(&f_db, fdbhdr.recsize, 1, src_area->fp); ftnddb_UnlockFDB(src_area); } ftnddb_PackFDB(src_area); ftnddb_CloseFDB(src_area); ftnd_colour(CYAN, BLACK); Syslog('+', "Move %s from %d to %d %s", File, From, To, rc ? "successfull":"failed"); if (!do_quiet) printf("Move %s from %d to %d %s\n", File, From, To, rc ? "successfull":"failed"); free(temp1); free(frompath); free(fromlink); free(fromthumb); free(topath); free(tolink); free(tothumb); }
/* * Download files to the user. * Returns: * 0 - All seems well * 1 - No transfer protocol selected * 2 - No files to download. */ int download(down_list *download_list) { down_list *tmpf; int err, maxrc = 0, Count = 0; char *temp, *symTo, *symFrom; unsigned int Size = 0; struct dirent *dp; DIR *dirp; struct timeval starttime, endtime; struct timezone tz; Syslog('b', "download()"); for (tmpf = download_list; tmpf; tmpf = tmpf->next) { Syslog('b', "%s,%s,%ld,%ld,%ld,%s,%s,%s", tmpf->local, tmpf->remote, tmpf->cps, tmpf->area, tmpf->size, tmpf->kfs ?"KFS":"KEEP", tmpf->sent ?"SENT":"N/A", tmpf->failed ?"FAILED":"N/A"); } /* * If user has no default protocol, make sure he has one. */ if (!ForceProtocol()) { return 1; } symTo = calloc(PATH_MAX, sizeof(char)); symFrom = calloc(PATH_MAX, sizeof(char)); temp = calloc(PATH_MAX, sizeof(char)); /* * Build symlinks into the users tag directory. */ chdir("./tag"); for (tmpf = download_list; tmpf; tmpf = tmpf->next) { if (!tmpf->sent && !tmpf->failed) { snprintf(symFrom, PATH_MAX, "%s/%s/tag/%s", CFG.bbs_usersdir, exitinfo.Name, tmpf->remote); Syslog('b', "test \"%s\" \"%s\"", symFrom, tmpf->local); if (strcmp(symFrom, tmpf->local)) { Syslog('b', "different, need a symlink"); unlink(tmpf->remote); snprintf(symFrom, PATH_MAX, "%s", tmpf->remote); snprintf(symTo, PATH_MAX, "%s", tmpf->local); if (symlink(symTo, symFrom)) { WriteError("$Can't create symlink %s %s %d", symTo, symFrom, errno); tmpf->failed = TRUE; } else { Syslog('b', "Created symlink %s -> %s", symFrom, symTo); } tmpf->kfs = FALSE; } else { Syslog('b', "the same, file is in tag directory"); } /* * Check if file or symlink is really there. */ snprintf(symFrom, PATH_MAX, "%s", tmpf->remote); if ((access(symFrom, F_OK)) != 0) { WriteError("File or symlink %s check failed, unmarking download", symFrom); tmpf->failed = TRUE; } else { Count++; Size += tmpf->size; } } } Home(); if (!Count) { /* * Nothing to download */ free(temp); free(symTo); free(symFrom); return 2; } clear(); /* File(s) : */ pout(YELLOW, BLACK, (char *) Language(349)); snprintf(temp, PATH_MAX, "%d", Count); PUTSTR(temp); Enter(1); /* Size : */ pout( CYAN, BLACK, (char *) Language(350)); snprintf(temp, PATH_MAX, "%u", Size); PUTSTR(temp); Enter(1); /* Protocol : */ pout( CYAN, BLACK, (char *) Language(351)); snprintf(temp, PATH_MAX, "%s", sProtName); PUTSTR(temp); Enter(1); Syslog('+', "Download files start, protocol: %s", sProtName); PUTSTR(sProtAdvice); Enter(2); /* * Wait a while before download */ sleep(2); if (uProtInternal) { snprintf(temp, PATH_MAX, "%s/%s/tag", CFG.bbs_usersdir, exitinfo.Name); chdir(temp); if (strncasecmp(sProtName, "zmodem-8k", 9) == 0) { maxrc = zmsndfiles(download_list, TRUE); Home(); } else if (strncasecmp(sProtName, "zmodem", 6) == 0) { maxrc = zmsndfiles(download_list, FALSE); Home(); } else if ((strncasecmp(sProtName, "xmodem", 6) == 0) || (strncasecmp(sProtName, "ymodem", 6) == 0)) { if (strncasecmp(sProtName, "xmodem", 6) == 0) protocol = ZM_XMODEM; else protocol = ZM_YMODEM; if (strstr(sProtName, "1K") || strstr(sProtName, "1k")) maxrc = ymsndfiles(download_list, TRUE); else maxrc = ymsndfiles(download_list, FALSE); Home(); } else { Syslog('!', "Warning internal protocol %s not supported", sProtName); maxrc = 1; } } else { gettimeofday(&starttime, &tz); /* * Transfer the files. Set the Client/Server time at the maximum * time the user has plus 10 minutes. The overall timer 10 seconds * less. Not a nice but working solution. */ alarm_set(((exitinfo.iTimeLeft + 10) * 60) - 10); Altime((exitinfo.iTimeLeft + 10) * 60); snprintf(temp, PATH_MAX, "%s/%s/tag", CFG.bbs_usersdir, exitinfo.Name); if ((dirp = opendir(temp)) == NULL) { WriteError("$Download: Can't open dir: %s", temp); free(temp); } else { chdir(temp); free(temp); temp = NULL; while ((dp = readdir(dirp)) != NULL ) { if (*(dp->d_name) != '.') { if (temp != NULL) { temp = xstrcat(temp, (char *)" "); temp = xstrcat(temp, dp->d_name); } else { temp = xstrcpy(dp->d_name); } } } if (temp != NULL) { if ((err = execute_str(sProtDn, temp, NULL, NULL, NULL, NULL))) { WriteError("$Download error %d, prot: %s", err, sProtDn); } /* * Restore rawport */ rawport(); free(temp); } else { WriteError("No filebatch created"); } closedir(dirp); } purgeline(200); /* Wait a while, some Wintendo programs ignore input for a few seconds */ Altime(0); alarm_off(); alarm_on(); Home(); gettimeofday(&endtime, &tz); /* * Checking the successfull sent files, they are missing from * the ./tag directory. Failed files are still there. */ Count = Size = 0; for (tmpf = download_list; tmpf && (maxrc < 2); tmpf = tmpf->next) { if (!tmpf->sent && !tmpf->failed) { snprintf(symTo, PATH_MAX, "./tag/%s", tmpf->remote); /* * If symlink is gone the file is sent. */ if ((access(symTo, R_OK)) != 0) { Syslog('+', "File %s from area %d sent ok", tmpf->remote, tmpf->area); tmpf->sent = TRUE; Size += tmpf->size; Count++; } else { Syslog('+', "Failed to sent %s from area %d", Tag.LFile, Tag.Area); } } } /* * Work out transfer rate in seconds by dividing the * Size of the File by the amount of time it took to download * the file. */ Syslog('+', "Download %s in %d file(s)", transfertime(starttime, endtime, (unsigned int)Size, TRUE), Count); } free(symTo); free(symFrom); for (tmpf = download_list; tmpf; tmpf = tmpf->next) { Syslog('b', "%s,%s,%ld,%ld,%ld,%s,%s,%s", tmpf->local, tmpf->remote, tmpf->cps, tmpf->area, tmpf->size, tmpf->kfs ?"KFS":"KEEP", tmpf->sent ?"SENT":"N/A", tmpf->failed ?"FAILED":"N/A"); } Syslog('b', "download() rc=%d", maxrc); return maxrc; }
/* * Check TIC group AREAS file if requested area exists. * If so, create tic area and if SendUplink is TRUE, * send the uplink a FileMgr request to connect this area. * The tic group record (fgroup) must be in memory. * Return codes: * 0 - All Seems Well * 1 - Some error * * The current nodes record may be destroyed after this, * make sure it is saved. */ int CheckTicGroup(char *Area, int SendUplink, faddr *f) { char *temp, *buf, *tag = NULL, *desc = NULL, *p, *raid = NULL, *flow = NULL; FILE *ap, *mp, *fp; int offset, AreaNr; int i, rc = 0, Found = FALSE; sysconnect System; faddr *From, *To; struct _fdbarea *fdb_area = NULL; temp = calloc(PATH_MAX, sizeof(char)); Syslog('f', "Checking file group \"%s\" \"%s\"", fgroup.Name, fgroup.Comment); snprintf(temp, PATH_MAX, "%s/%s", CFG.alists_path , fgroup.AreaFile); if ((ap = fopen(temp, "r")) == NULL) { WriteError("Filegroup %s: area taglist %s not found", fgroup.Name, temp); free(temp); return 1; } buf = calloc(4097, sizeof(char)); if (fgroup.FileGate) { /* * filegate.zxx format */ while (fgets(buf, 4096, ap)) { /* * Each filegroup starts with "% FDN: Filegroup Description" */ if (strlen(buf) && !strncmp(buf, "% FDN:", 6)) { tag = strtok(buf, "\t \r\n\0"); p = strtok(NULL, "\t \r\n\0"); p = strtok(NULL, "\r\n\0"); desc = p; while ((*desc == ' ') || (*desc == '\t')) desc++; if (!strcmp(desc, fgroup.Comment)) { while (fgets(buf, 4096, ap)) { if (!strncasecmp(buf, "Area ", 5)) { tag = strtok(buf, "\t \r\n\0"); tag = strtok(NULL, "\t \r\n\0"); if (!strcasecmp(tag, Area)) { raid = strtok(NULL, "\t \r\n\0"); flow = strtok(NULL, "\t \r\n\0"); p = strtok(NULL, "\r\n\0"); desc = p; while ((*desc == ' ') || (*desc == '\t')) desc++; Syslog('f', "Found area \"%s\" \"%s\" \"%s\" \"%s\"", tag, raid, flow, desc); Found = TRUE; break; } } if (strlen(buf) && !strncmp(buf, "% FDN:", 6)) { /* * All entries in group are seen, the area wasn't there. */ break; } } } if (Found) break; } } } else { /* * Normal taglist format */ while (fgets(buf, 4096, ap)) { if (strlen(buf) && isalnum(buf[0])) { tag = strtok(buf, "\t \r\n\0"); p = strtok(NULL, "\r\n\0"); if (p == NULL) p = tag; /* If no description after the TAG, use TAG as description */ desc = p; while ((*desc == ' ') || (*desc == '\t')) desc++; if (strcasecmp(tag, Area) == 0) { Syslog('f', "Found tag \"%s\" desc \"%s\"", tag, desc); Found = TRUE; break; } } } } if (!Found) { Syslog('f', "Area %s not found in taglist", Area); free(buf); fclose(ap); free(temp); return 1; } /* * Some people write taglists with lowercase tagnames... */ for (i = 0; i < strlen(tag); i++) tag[i] = toupper(tag[i]); Syslog('m', "Found tag \"%s\" desc \"%s\"", tag, desc); /* * Area is in AREAS file, now create area. * If needed, connect at uplink. */ if (SendUplink && SearchNode(fgroup.UpLink)) { if (nodes.UplFmgrBbbs) snprintf(temp, PATH_MAX, "file +%s", tag); else snprintf(temp, PATH_MAX, "+%s", tag); From = fido2faddr(fgroup.UseAka); To = fido2faddr(fgroup.UpLink); if (UplinkRequest(To, From, TRUE, temp)) { WriteError("Can't send netmail to uplink"); fclose(ap); free(buf); free(temp); tidy_faddr(From); tidy_faddr(To); return 1; } tidy_faddr(From); tidy_faddr(To); } /* * Open tic area and set filepointer to the end to append * a new record. */ snprintf(temp, PATH_MAX, "%s/etc/tic.data", getenv("MBSE_ROOT")); if ((mp = fopen(temp, "r+")) == NULL) { WriteError("$Can't open %s", temp); fclose(ap); free(buf); free(temp); return 1; } fread(&tichdr, sizeof(tichdr), 1, mp); fseek(mp, 0, SEEK_END); memset(&tic, 0, sizeof(tic)); Syslog('f', "TIC area open, filepos %ld", ftell(mp)); /* * Open files area, and find a free slot */ snprintf(temp, PATH_MAX, "%s/etc/fareas.data", getenv("MBSE_ROOT")); if ((fp = fopen(temp, "r+")) == NULL) { WriteError("$Can't open %s", temp); fclose(ap); fclose(mp); free(buf); free(temp); return 1; } fread(&areahdr, sizeof(areahdr), 1, fp); Syslog('f', "File area is open"); /* * Verify the file is large enough */ fseek(fp, 0, SEEK_END); offset = areahdr.hdrsize + ((fgroup.StartArea -1) * (areahdr.recsize)); Syslog('+', "file end at %ld, offset needed %ld", ftell(fp), offset); if (ftell(fp) < offset) { Syslog('f', "Database too small, expanding..."); memset(&area, 0, sizeof(area)); while (TRUE) { fwrite(&area, sizeof(area), 1, fp); if (ftell(fp) >= areahdr.hdrsize + ((fgroup.StartArea -1) * (areahdr.recsize))) break; } } if (fseek(fp, offset, SEEK_SET)) { WriteError("$Can't seek in %s to position %ld", temp, offset); fclose(ap); fclose(mp); fclose(fp); free(buf); free(temp); return 1; } /* * Search a free record */ Syslog('f', "Start search record"); while (fread(&area, sizeof(area), 1, fp) == 1) { if (!area.Available) { fseek(fp, - areahdr.recsize, SEEK_CUR); rc = 1; break; } } if (!rc) { Syslog('f', "No free slot, append after last record"); fseek(fp, 0, SEEK_END); if (ftell(fp) < areahdr.hdrsize + ((fgroup.StartArea -1) * (areahdr.recsize))) { Syslog('f', "Database too small, expanding..."); memset(&area, 0, sizeof(area)); while (TRUE) { fwrite(&area, sizeof(area), 1, fp); if (ftell(fp) >= areahdr.hdrsize + ((fgroup.StartArea -1) * (areahdr.recsize))) break; } } rc = 1; } AreaNr = ((ftell(fp) - areahdr.hdrsize) / (areahdr.recsize)) + 1; Syslog('f', "Found free slot at %ld", AreaNr); /* * Create the records */ memset(&area, 0, sizeof(area)); strncpy(area.Name, desc, 44); strcpy(temp, tag); temp = tl(temp); for (i = 0; i < strlen(temp); i++) if (temp[i] == '.') temp[i] = '/'; snprintf(area.Path, 81, "%s/%s", fgroup.BasePath, temp); area.DLSec = fgroup.DLSec; area.UPSec = fgroup.UPSec; area.LTSec = fgroup.LTSec; area.New = area.Dupes = area.Free = area.AddAlpha = area.FileFind = area.Available = area.FileReq = TRUE; strncpy(area.BbsGroup, fgroup.BbsGroup, 12); strncpy(area.NewGroup, fgroup.AnnGroup, 12); strncpy(area.Archiver, fgroup.Convert, 5); area.Upload = fgroup.Upload; fwrite(&area, sizeof(area), 1, fp); fclose(fp); /* * Create download path */ snprintf(temp, PATH_MAX, "%s/foobar", area.Path); if (!mkdirs(temp, 0775)) WriteError("Can't create %s", temp); /* * Create download database */ if ((fdb_area = mbsedb_OpenFDB(AreaNr, 30))) mbsedb_CloseFDB(fdb_area); /* * Setup new TIC area. */ strncpy(tic.Name, tag, 20); strncpy(tic.Comment, desc, 55); tic.FileArea = AreaNr; strncpy(tic.Group, fgroup.Name, 12); tic.AreaStart = time(NULL); tic.Aka = fgroup.UseAka; strncpy(tic.Convert, fgroup.Convert, 5); strncpy(tic.Banner, fgroup.Banner, 14); tic.Replace = fgroup.Replace; tic.DupCheck = fgroup.DupCheck; tic.Secure = fgroup.Secure; tic.Touch = fgroup.Touch; tic.VirScan = fgroup.VirScan; tic.Announce = fgroup.Announce; tic.UpdMagic = fgroup.UpdMagic; tic.FileId = fgroup.FileId; tic.ConvertAll = fgroup.ConvertAll; tic.SendOrg = fgroup.SendOrg; tic.Active = TRUE; tic.LinkSec.level = fgroup.LinkSec.level; tic.LinkSec.flags = fgroup.LinkSec.flags; tic.LinkSec.notflags = fgroup.LinkSec.notflags; fwrite(&tic, sizeof(tic), 1, mp); memset(&System, 0, sizeof(System)); System.aka = fgroup.UpLink; if (flow && !strcmp(flow, "*&")) /* * Areas direction HQ's go the other way */ System.sendto = TRUE; else /* * Normal distribution areas. */ System.receivefrom = TRUE; fwrite(&System, sizeof(System), 1, mp); memset(&System, 0, sizeof(System)); for (i = 1; i < (tichdr.syssize / sizeof(System)); i++) fwrite(&System, sizeof(System), 1, mp); fclose(mp); fclose(ap); free(buf); free(temp); if (f == NULL) Mgrlog("Auto created TIC area %s, group %s, bbs area %ld", tic.Name, tic.Group, AreaNr); else Mgrlog("Auto created TIC area %s, group %s, bbs area %ld, for node %s", tic.Name, tic.Group, AreaNr, ascfnode(f, 0x1f)); return 0; }
/* * Change character set. */ void Chg_Charset() { int i; char *temp; temp = calloc(81, sizeof(char)); ReadExitinfo(); Syslog('+', "Old character set %s", getftnchrs(exitinfo.Charset)); while(TRUE) { Enter(1); /* Select your preferred character set */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(23)); Enter(2); colour(LIGHTBLUE, BLACK); for (i = (FTNC_NONE + 1); i <= FTNC_MAXCHARS; i++) { colour(LIGHTBLUE, BLACK); snprintf(temp, 81, "%2d ", i); PUTSTR(temp); colour(LIGHTCYAN, BLACK); snprintf(temp, 81, "%-9s ", getftnchrs(i)); PUTSTR(temp); colour(LIGHTMAGENTA, BLACK); snprintf(temp, 81, "%s\r\n", getchrsdesc(i)); PUTSTR(temp); } Enter(1); /* Select character set (Enter to Quit): */ pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(24)); Getnum(temp, 2); if (((strcmp(temp, "")) == 0) && (exitinfo.Charset != FTNC_NONE)) { free(temp); return; } i = atoi(temp); if ((i > FTNC_NONE) && (i <= FTNC_MAXCHARS)) { exitinfo.Charset = i; Syslog('+', "New character set %s", getftnchrs(exitinfo.Charset)); WriteExitinfo(); setlocale(LC_CTYPE, getlocale(exitinfo.Charset)); utf8 = (exitinfo.Charset == FTNC_UTF8); Syslog('b', "setlocale(LC_CTYPE, NULL) returns \"%s\"", printable(setlocale(LC_CTYPE, NULL), 0)); Enter(2); colour(LIGHTGREEN, BLACK); /* Character set now set to: */ snprintf(temp, 81, "%s%s", (char *) Language(25), getftnchrs(i)); PUTSTR(temp); free(temp); Enter(2); Pause(); return; } Enter(2); /* Invalid selection, please try again! */ pout(LIGHTRED, BLACK, (char *) Language(265)); Enter(2); } }
/* * Return values: * 0 - Success * 1 - Some error * 2 - Orphaned tic */ int ProcessTic(fa_list **sbl, orphans **opl) { int First, Listed = FALSE, DownLinks = 0, MustRearc = FALSE; int UnPacked = FALSE, IsArchive = FALSE, rc, i, j, k; char *Temp, *unarc = NULL, *cmd = NULL; char temp1[PATH_MAX], temp2[PATH_MAX], sbe[24], TDesc[1024]; unsigned int crc, crc2, Kb; sysconnect Link; FILE *fp; struct utimbuf ut; int BBS_Imp = FALSE, DidBanner = FALSE; faddr *p_from; qualify *qal = NULL, *tmpq; orphans *topl; if (TIC.TicIn.PathError) { WriteError("Our Aka is in the path"); tic_bad++; return 1; } Temp = calloc(PATH_MAX, sizeof(char)); if (!do_quiet) { ftnd_colour(LIGHTGREEN, BLACK); printf("Checking \b\b\b\b\b\b\b\b\b\b"); fflush(stdout); } if (TIC.Orphaned) { fill_orphans(opl, TIC.TicName, TIC.TicIn.Area, TIC.TicIn.File, TRUE, FALSE); Syslog('+', "File not in inbound: %s", TIC.TicIn.File); free(Temp); return 2; } snprintf(Temp, PATH_MAX, "%s/%s", TIC.Inbound, TIC.TicIn.File); crc = file_crc(Temp, CFG.slow_util && do_quiet); TIC.FileSize = file_size(Temp); TIC.FileDate = file_time(Temp); if (TIC.TicIn.Size) { if (TIC.TicIn.Size != TIC.FileSize) WriteError("Size is %ld, expected %ld", TIC.FileSize, TIC.TicIn.Size); } else { /* * No filesize in TIC file, add filesize. */ TIC.TicIn.Size = TIC.FileSize; } if (TIC.Crc_Int) { if (crc != TIC.Crc_Int) { Syslog('!', "CRC: expected %08lX, the file is %08lX", TIC.Crc_Int, crc); fill_orphans(opl, TIC.TicName, TIC.TicIn.Area, TIC.TicIn.File, FALSE, TRUE); if (check_crc) { Syslog('+', "Bad CRC, will check this ticfile later"); free(Temp); return 1; } else { Syslog('!', "CRC: error, recalculating crc"); ReCalcCrc(Temp); } } } else { Syslog('+', "CRC: missing, calculating CRC"); ReCalcCrc(Temp); } /* * Load and check the .TIC area. */ if (!SearchTic(TIC.TicIn.Area)) { UpdateNode(); Syslog('f', "Unknown file area %s", TIC.TicIn.Area); p_from = fido2faddr(TIC.Aka); if (!create_ticarea(TIC.TicIn.Area, p_from)) { Bad((char *)"Unknown file area %s", TIC.TicIn.Area); free(Temp); tidy_faddr(p_from); return 1; } tidy_faddr(p_from); /* * Try to load the .TIC area again. */ if (!SearchTic(TIC.TicIn.Area)) { Bad((char *)"Reload of new created file area %s failed", TIC.TicIn.Area); free(Temp); return 1; } } if ((tic.Secure) && (!TIC.TicIn.Hatch)) { First = TRUE; while (GetTicSystem(&Link, First)) { First = FALSE; if (Link.aka.zone) { if ((Link.aka.zone == TIC.Aka.zone) && (Link.aka.net == TIC.Aka.net) && (Link.aka.node == TIC.Aka.node) && (Link.aka.point== TIC.Aka.point) && (Link.receivefrom)) Listed = TRUE; } } if (!Listed) { Bad((char *)"%s NOT connected to %s", aka2str(TIC.Aka), TIC.TicIn.Area); free(Temp); return 1; } } if ((!SearchNode(TIC.Aka)) && (!TIC.TicIn.Hatch)) { Bad((char *)"%s NOT known", aka2str(TIC.Aka)); free(Temp); return 1; } if (!TIC.TicIn.Hatch) { if (strcasecmp(TIC.TicIn.Pw, nodes.Fpasswd)) { Bad((char *)"Pwd error, got %s, expected %s", TIC.TicIn.Pw, nodes.Fpasswd); free(Temp); return 1; } } else { if (strcasecmp(TIC.TicIn.Pw, CFG.hatchpasswd)) { Bad((char *)"Password error in local Hatch"); WriteError("WARNING: it might be a Trojan in your inbound"); free(Temp); return 1; } } if (Magic_DeleteFile()) { snprintf(temp1, PATH_MAX, "%s/%s", TIC.Inbound, TIC.TicName); file_rm(temp1); Syslog('+', "Deleted file %s", temp1); file_rm(Temp); free(Temp); return 0; } if (Magic_MoveFile()) { if (!SearchTic(TIC.TicIn.Area)) { Bad((char *)"Unknown Area: %s", TIC.TicIn.Area); free(Temp); return 1; } } strncpy(T_File.Echo, tic.Name, 20); strncpy(T_File.Group, tic.Group, 12); TIC.KeepNum = tic.KeepLatest; Magic_Keepnum(); if (!tic.FileArea) { Syslog('+', "Passthru TIC area!"); strcpy(TIC.BBSpath, CFG.ticout); strcpy(TIC.BBSdesc, tic.Comment); } else { snprintf(Temp, PATH_MAX, "%s/etc/fareas.data", getenv("FTND_ROOT")); if ((fp = fopen(Temp, "r")) == NULL) { WriteError("Can't access fareas.data area: %ld", tic.FileArea); free(Temp); return 1; } fread(&areahdr, sizeof(areahdr), 1, fp); if (fseek(fp, ((tic.FileArea -1) * areahdr.recsize) + areahdr.hdrsize, SEEK_SET)) { fclose(fp); WriteError("Can't seek area %ld in fareas.data", tic.FileArea); free(Temp); return 1; } if (fread(&area, areahdr.recsize, 1, fp) != 1) { fclose(fp); WriteError("Can't read area %ld in fareas.data", tic.FileArea); free(Temp); return 1; } fclose(fp); strcpy(TIC.BBSpath, area.Path); strcpy(TIC.BBSdesc, area.Name); /* * If the File area has a special announce group, change * the group to that name. */ if (strlen(area.NewGroup)) strncpy(T_File.Group, area.NewGroup, 12); } strncpy(T_File.Comment, tic.Comment, 55); /* * Check if the destination area really exists, it may be that * the area is not linked to an existing BBS area. */ if (tic.FileArea && access(TIC.BBSpath, W_OK)) { WriteError("No write access to \"%s\"", TIC.BBSpath); Bad((char *)"Dest directory not available"); free(Temp); return 1; } if ((tic.DupCheck) && (check_dupe)) { snprintf(Temp, PATH_MAX, "%s%s", TIC.TicIn.Area, TIC.TicIn.Crc); crc2 = 0xffffffff; crc2 = upd_crc32(Temp, crc2, strlen(Temp)); if (CheckDupe(crc2, D_FILEECHO, CFG.tic_dupes)) { Bad((char *)"Duplicate file"); tic_dup++; free(Temp); return 1; } } /* * Count the actual downlinks for this area and build the list of * systems qualified to receive this file. */ First = TRUE; while (GetTicSystem(&Link, First)) { First = FALSE; if ((Link.aka.zone) && (Link.sendto) && (!Link.pause)) { DownLinks++; p_from = fido2faddr(Link.aka); if (TIC.TicIn.Hatch) { fill_qualify(&qal, Link.aka, FALSE, in_list(p_from, sbl, TRUE)); } else { fill_qualify(&qal, Link.aka, ((TIC.Aka.zone == Link.aka.zone) && (TIC.Aka.net == Link.aka.net) && (TIC.Aka.node == Link.aka.node) && (TIC.Aka.point == Link.aka.point)), in_list(p_from, sbl, TRUE)); } tidy_faddr(p_from); } } T_File.Size = TIC.FileSize; T_File.SizeKb = TIC.FileSize / 1024; /* * Update the uplink's counters. */ Kb = TIC.FileSize / 1024; if (SearchNode(TIC.Aka)) { StatAdd(&nodes.FilesRcvd, 1L); StatAdd(&nodes.F_KbRcvd, Kb); UpdateNode(); SearchNode(TIC.Aka); } /* * Update the fileecho and group counters. */ StatAdd(&fgroup.Files, 1L); StatAdd(&fgroup.KBytes, Kb); fgroup.LastDate = time(NULL); StatAdd(&tic.Files, 1L); StatAdd(&tic.KBytes, Kb); tic.LastAction = time(NULL); UpdateTic(); if (!do_quiet) { printf("Unpacking \b\b\b\b\b\b\b\b\b\b"); fflush(stdout); } /* * Check if this is an archive, and if so, which compression method * is used for this file. */ if (strlen(tic.Convert) || tic.FileId || tic.ConvertAll || strlen(tic.Banner)) { /* * Create tmp workdir */ if (create_tmpwork()) { free(Temp); tidy_qualify(&qal); return 1; } if ((unarc = unpacker(TIC.TicIn.File)) == NULL) Syslog('+', "Unknown archive format %s", TIC.TicIn.File); else { IsArchive = TRUE; if ((strlen(tic.Convert) && (strcmp(unarc, tic.Convert) == 0)) || (tic.ConvertAll)) MustRearc = TRUE; } } /* * Copy the file if there are downlinks and we send the * original file, but want to rearc it for ourself, or if * it's a passthru area. */ if (((tic.SendOrg) && (MustRearc || strlen(tic.Banner))) || (!tic.FileArea)) { snprintf(temp1, PATH_MAX, "%s/%s", TIC.Inbound, TIC.TicIn.File); snprintf(temp2, PATH_MAX, "%s/%s", CFG.ticout, TIC.TicIn.File); if ((rc = file_cp(temp1, temp2) == 0)) { TIC.SendOrg = TRUE; } else { WriteError("Copy %s to %s failed: %s", temp1, temp2, strerror(rc)); } } if (MustRearc && IsArchive) { snprintf(temp2, PATH_MAX, "%s/tmp/arc%d", getenv("FTND_ROOT"), (int)getpid()); if (!checkspace(temp2, TIC.TicIn.File, UNPACK_FACTOR)) { Bad((char *)"Not enough free diskspace left"); free(Temp); tidy_qualify(&qal); clean_tmpwork(); return 1; } if (chdir(temp2) != 0) { WriteError("$Can't change to %s", temp2); free(Temp); tidy_qualify(&qal); clean_tmpwork(); return 1; } if (!getarchiver(unarc)) { WriteError("Can't get archiver for %s", unarc); chdir(TIC.Inbound); free(Temp); tidy_qualify(&qal); clean_tmpwork(); return 1; } if (strlen(archiver.funarc) == 0) { Syslog('!', "No unarc command available"); } else { cmd = xstrcpy(archiver.funarc); snprintf(temp1, PATH_MAX, "%s/%s", TIC.Inbound, TIC.TicIn.File); if (execute_str(cmd, temp1, (char *)NULL, (char *)"/dev/null", (char *)"/dev/null", (char *)"/dev/null") == 0) { UnPacked = TRUE; } else { chdir(TIC.Inbound); Bad((char *)"Archive maybe corrupt"); free(Temp); clean_tmpwork(); return 1; } free(cmd); } } /* * Scan file for viri. */ if (tic.VirScan) { snprintf(temp1, PATH_MAX, "%s/%s", TIC.Inbound, TIC.TicIn.File); if (!do_quiet) { printf("Virscan \b\b\b\b\b\b\b\b\b\b"); fflush(stdout); } if (VirScanFile(temp1)) { chdir(TIC.Inbound); Bad((char *)"Possible virus found!"); free(Temp); tidy_qualify(&qal); clean_tmpwork(); return 1; } if (!do_quiet) { printf("Checking \b\b\b\b\b\b\b\b\b\b"); fflush(stdout); } } if (tic.FileId && tic.FileArea && IsArchive) { if (UnPacked) { snprintf(temp1, PATH_MAX, "%s/tmp/arc%d", getenv("FTND_ROOT"), (int)getpid()); snprintf(Temp, PATH_MAX, "FILE_ID.DIZ"); if (getfilecase(temp1, Temp)) { Syslog('f', "Found %s", Temp); snprintf(temp1, PATH_MAX, "%s/tmp/arc%d/%s", getenv("FTND_ROOT"), (int)getpid(), Temp); snprintf(temp2, PATH_MAX, "%s/tmp/FILE_ID.DIZ", getenv("FTND_ROOT")); } else { Syslog('f', "Didn't find a FILE_ID.DIZ"); } } else { if (!getarchiver(unarc)) { chdir(TIC.Inbound); } else { cmd = xstrcpy(archiver.iunarc); if (cmd == NULL) { WriteError("No unarc command available"); } else { snprintf(temp1, PATH_MAX, "%s/tmp", getenv("FTND_ROOT")); chdir(temp1); snprintf(temp1, PATH_MAX, "%s/%s FILE_ID.DIZ", TIC.Inbound, TIC.TicIn.File); if (execute_str(cmd, temp1, (char *)NULL, (char *)"/dev/null", (char *)"/dev/null", (char *)"/dev/null")) { snprintf(temp1, PATH_MAX, "%s/%s file_id.diz", TIC.Inbound, TIC.TicIn.File); execute_str(cmd, temp1, (char *)NULL, (char *)"/dev/null", (char *)"/dev/null", (char *)"/dev/null"); } free(cmd); } } /* if getarchiver */ } /* if not unpacked */ } /* if need FILE_ID.DIZ and not passthru */ /* * Create internal file description, priority is FILE_ID.DIZ, * 2nd LDesc, and finally the standard description. */ if (!Get_File_Id()) { if (TIC.TicIn.TotLDesc > 2) { for (i = 0; i < TIC.TicIn.TotLDesc; i++) { strncpy(TIC.File_Id[i], TIC.TicIn.LDesc[i], 48); } TIC.File_Id_Ct = TIC.TicIn.TotLDesc; } else { /* * Format the description line (max 255 chars) in parts of 48 characters. */ if (strlen(TIC.TicIn.Desc) <= 48) { strcpy(TIC.File_Id[0], TIC.TicIn.Desc); TIC.File_Id_Ct++; } else { memset(&TDesc, 0, sizeof(TDesc)); strcpy(TDesc, TIC.TicIn.Desc); while (strlen(TDesc) > 48) { j = 48; while ((TDesc[j] != ' ') && (j > 0)) j--; if (j == 0) { Syslog('f', "Panic, no spaces"); j = 47; } strncpy(TIC.File_Id[TIC.File_Id_Ct], TDesc, j); Syslog('f', "%2d/%2d: \"%s\"", TIC.File_Id_Ct, j, TIC.File_Id[TIC.File_Id_Ct]); TIC.File_Id_Ct++; k = strlen(TDesc); j++; /* Correct space */ for (i = 0; i <= k; i++, j++) TDesc[i] = TDesc[j]; if (TIC.File_Id_Ct == 23) break; } strncpy(TIC.File_Id[TIC.File_Id_Ct], TDesc, 48); Syslog('f', "%2d/%2d: \"%s\"", TIC.File_Id_Ct, strlen(TIC.File_Id[TIC.File_Id_Ct]), TIC.File_Id[TIC.File_Id_Ct]); TIC.File_Id_Ct++; } } } /* not get FILE_ID.DIZ */ /* * Now check if other (older) ticfiles point to this file, * if found mark it to purge later. */ for (topl = *opl; topl; topl = topl->next) { if ((strcmp(topl->Area, TIC.TicIn.Area) == 0) && (strcmp(topl->FileName, TIC.TicIn.File) == 0)) { topl->Purged = TRUE; } } /* * Rearc file if it is an unpacked archive. */ if ((MustRearc) && (UnPacked) && (tic.FileArea)) { if (Rearc(tic.Convert)) { /* * Get new filesize for import and announce */ snprintf(temp1, PATH_MAX, "%s/%s", TIC.Inbound, TIC.NewFile); TIC.FileSize = file_size(temp1); T_File.Size = TIC.FileSize; T_File.SizeKb = TIC.FileSize / 1024; /* * Calculate the CRC if we must send the new archived file. */ if (!TIC.SendOrg) { ReCalcCrc(temp1); } } else { WriteError("Rearc failed"); } /* if Rearc() */ } /* * Change banner if needed. */ if ((strlen(tic.Banner)) && IsArchive) { cmd = xstrcpy(archiver.barc); if ((cmd == NULL) || (!strlen(cmd))) { Syslog('+', "No banner command for %s", archiver.name); } else { snprintf(temp1, PATH_MAX, "%s/%s", TIC.Inbound, TIC.NewFile); snprintf(Temp, PATH_MAX, "%s/etc/%s", getenv("FTND_ROOT"), tic.Banner); if (execute_str(cmd, temp1, (char *)NULL, Temp, (char *)"/dev/null", (char *)"/dev/null")) { WriteError("Changing the banner failed"); } else { Syslog('+', "New banner %s", tic.Banner); TIC.FileSize = file_size(temp1); T_File.Size = TIC.FileSize; T_File.SizeKb = TIC.FileSize / 1024; ReCalcCrc(temp1); DidBanner = TRUE; } } } clean_tmpwork(); chdir(TIC.Inbound); /* * If the file is converted, we set the date of the original * received file as the file creation date. */ snprintf(Temp, PATH_MAX, "%s/%s", TIC.Inbound, TIC.NewFile); if ((MustRearc || DidBanner) && CFG.ct_KeepDate) { if ((tic.Touch) && (tic.FileArea)) { ut.actime = mktime(localtime(&TIC.FileDate)); ut.modtime = mktime(localtime(&TIC.FileDate)); utime(Temp, &ut); Syslog('-', "Restamp filedate %s to %s", Temp, rfcdate(ut.modtime)); } } /* * Now make sure the file timestamp is updated. The file may be restamped, * altered by banners etc. */ TIC.FileDate = file_time(Temp); /* * If not passthru, import in the BBS. */ if (tic.FileArea) { Syslog('+', "Import: %s (%s) Area: %s", TIC.NewFile, TIC.NewFullName, TIC.TicIn.Area); BBS_Imp = Add_BBS(&qal); if (!BBS_Imp) { Bad((char *)"File Import Error"); free(Temp); tidy_qualify(&qal); clean_tmpwork(); return 1; } } chdir(TIC.Inbound); /* * Create file announce record */ if (tic.FileArea) { if (strlen(TIC.TicIn.Magic)) magic_update(TIC.TicIn.Magic, TIC.NewFile); else Magic_UpDateAlias(); for (i = 0; i < TIC.File_Id_Ct; i++) strncpy(T_File.LDesc[i], TIC.File_Id[i], 48); T_File.TotLdesc = TIC.File_Id_Ct; T_File.Announce = tic.Announce; strncpy(T_File.Name, TIC.NewFile, 12); strncpy(T_File.LName, TIC.NewFullName, 80); T_File.Fdate = TIC.FileDate; Add_ToBeRep(T_File); } if (TIC.SendOrg && !tic.FileArea) { /* * If it's a passthru area we don't need the * file in the inbound anymore so it can be * deleted. */ snprintf(temp1, PATH_MAX, "%s/%s", TIC.Inbound, TIC.TicIn.File); if (file_rm(temp1) == 0) Syslog('f', "Deleted %s", temp1); } if (DownLinks) { First = TRUE; /* * Add all our system aka's to the seenby lines in the same zone, * omit aka's already in the seenby list. */ for (i = 0; i < 39; i++) { if (CFG.akavalid[i] && (tic.Aka.zone == CFG.aka[i].zone)) { p_from = fido2faddr(CFG.aka[i]); if (! in_list(p_from, sbl, TRUE)) { if (CFG.aka[i].point) snprintf(sbe, 24, "%u:%u/%u.%u", CFG.aka[i].zone, CFG.aka[i].net, CFG.aka[i].node, CFG.aka[i].point); else snprintf(sbe, 24, "%u:%u/%u", CFG.aka[i].zone, CFG.aka[i].net, CFG.aka[i].node); fill_list(sbl, sbe, NULL); } tidy_faddr(p_from); } } /* * Add seen-by lines for all systems that will receive this file. */ for (tmpq = qal; tmpq; tmpq = tmpq->next) { if (tmpq->send) { if (CFG.aka[i].point) snprintf(sbe, 24, "%u:%u/%u.%u", tmpq->aka.zone, tmpq->aka.net, tmpq->aka.node, tmpq->aka.point); else snprintf(sbe, 24, "%u:%u/%u", tmpq->aka.zone, tmpq->aka.net, tmpq->aka.node); fill_list(sbl, sbe, NULL); } } uniq_list(sbl); sort_list(sbl); /* * Now forward this file to the qualified downlinks. */ for (tmpq = qal; tmpq; tmpq = tmpq->next) { if (tmpq->send) { ForwardFile(tmpq->aka, *sbl); tic_out++; } } } Magic_ExecCommand(); Magic_CopyFile(); Magic_UnpackFile(); Magic_AdoptFile(); snprintf(Temp, PATH_MAX, "%s/%s", TIC.Inbound, TIC.TicName); if (unlink(Temp)) { WriteError("$Can't delete %s", Temp); } free(Temp); tidy_qualify(&qal); return 0; }