diff --git a/mbfido/mbfimport.c b/mbfido/mbfimport.c new file mode 100644 index 00000000..2861a0b0 --- /dev/null +++ b/mbfido/mbfimport.c @@ -0,0 +1,374 @@ +/***************************************************************************** + * + * $Id$ + * Purpose: File Database Maintenance - Import files with files.bbs + * + ***************************************************************************** + * Copyright (C) 1997-2001 + * + * Michiel Broek FIDO: 2:280/2802 + * Beekmansbos 10 + * 1971 BV IJmuiden + * the Netherlands + * + * This file is part of MBSE BBS. + * + * This BBS is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * MBSE BBS is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MBSE BBS; see the file COPYING. If not, write to the Free + * Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + *****************************************************************************/ + +#include "../lib/libs.h" +#include "../lib/structs.h" +#include "../lib/records.h" +#include "../lib/common.h" +#include "../lib/clcomm.h" +#include "../lib/dbcfg.h" +#include "virscan.h" +#include "mbfutil.h" +#include "mbfimport.h" + + + +extern int do_quiet; /* Supress screen output */ + + +void ImportFiles(int Area) +{ + char *sAreas, *pwd, *temp, *temp2, *String, *token, *dest, *unarc; + FILE *pAreas, *fbbs; + int Append = FALSE, Files = 0, i, j = 0, k = 0, x, Doit; + int Imported = 0, Errors = 0; + struct FILERecord fdb; + struct stat statfile; + + Syslog('-', "Import(%d)", Area); + + if (!do_quiet) + colour(CYAN, BLACK); + + sAreas = calloc(PATH_MAX, sizeof(char)); + + sprintf(sAreas, "%s/etc/fareas.data", getenv("MBSE_ROOT")); + if ((pAreas = fopen (sAreas, "r")) == NULL) { + WriteError("$Can't open %s", sAreas); + if (!do_quiet) + printf("Can't open %s\n", sAreas); + die(0); + } + + fread(&areahdr, sizeof(areahdr), 1, pAreas); + if (fseek(pAreas, ((Area - 1) * areahdr.recsize) + areahdr.hdrsize, SEEK_SET)) { + WriteError("$Can't seek record %d in %s", Area, sAreas); + if (!do_quiet) + printf("Can't seek record %d in %s\n", Area, sAreas); + fclose(pAreas); + free(sAreas); + die(0); + } + + if (fread(&area, areahdr.recsize, 1, pAreas) != 1) { + WriteError("$Can't read record %d in %s", Area, sAreas); + if (!do_quiet) + printf("Can't read record %d in %s\n", Area, sAreas); + fclose(pAreas); + free(sAreas); + die(0); + } + + fclose(pAreas); + free(sAreas); + + if (area.Available && !area.CDrom) { + temp = calloc(PATH_MAX, sizeof(char)); + temp2 = calloc(PATH_MAX, sizeof(char)); + pwd = calloc(PATH_MAX, sizeof(char)); + String = calloc(256, sizeof(char)); + dest = calloc(PATH_MAX, sizeof(char)); + + getcwd(pwd, PATH_MAX); + if (CheckFDB(Area, area.Path)) + die(0); + + IsDoing("Import files"); + + /* + * Find files.bbs + */ + sprintf(temp, "FILES.BBS"); + if ((fbbs = fopen(temp, "r")) == NULL) { + sprintf(temp, "files.bbs"); + if ((fbbs = fopen(temp, "r")) == NULL) { + sprintf(temp, "%s", area.FilesBbs); + if ((fbbs = fopen(temp, "r")) == NULL) { + WriteError("Can't find files.bbs anywhere"); + if (!do_quiet) + printf("Can't find files.bbs anywhere\n"); + die(0); + } + } + } + + while (fgets(String, 255, fbbs) != NULL) { + + if ((String[0] != ' ') && (String[0] != 't')) { + /* + * New file entry, check if there has been a file that is not yet saved. + */ + if (Append) { + Doit = TRUE; + if ((unarc = unpacker(temp)) == NULL) { + Syslog('+', "Unknown archive format %s", temp); + sprintf(temp2, "%s/tmp/arc/%s", getenv("MBSE_ROOT"), fdb.LName); + mkdirs(temp2); + if (file_cp(temp, temp2)) { + WriteError("Can't copy file to %s", temp2); + Doit = FALSE; + } else { + if (!do_quiet) { + printf("Virscan \b\b\b\b\b\b\b\b\b\b"); + fflush(stdout); + } + if (VirScan()) { + Doit = FALSE; + } + } + } else { + if (!do_quiet) { + printf("Unpacking \b\b\b\b\b\b\b\b\b\b"); + fflush(stdout); + } + if (UnpackFile(temp)) { + if (!do_quiet) { + printf("Virscan \b\b\b\b\b\b\b\b\b\b"); + fflush(stdout); + } + if (VirScan()) { + Doit = FALSE; + } + } else { + Doit = FALSE; + } + } + DeleteVirusWork(); + if (Doit) { + if (!do_quiet) { + printf("Adding \b\b\b\b\b\b\b\b\b\b"); + fflush(stdout); + } + if (AddFile(fdb, Area, dest, temp)) { + Imported++; + } else + Errors++; + } else { + Errors++; + } + Append = FALSE; + } + + /* + * Check diskspace + */ + if (!diskfree(CFG.freespace)) + die(101); + + Files++; + memset(&fdb, 0, sizeof(fdb)); + + token = strtok(String, " \t"); + strcpy(fdb.Name, token); + strcpy(fdb.LName, tl(token)); + Syslog('f', "File: %s (%s)", fdb.Name, fdb.LName); + + if (!do_quiet) { + printf("\rImport file: %s ", fdb.Name); + printf("Checking \b\b\b\b\b\b\b\b\b\b"); + fflush(stdout); + } + + IsDoing("Import %s", fdb.Name); + + token = strtok(NULL, "\0"); + i = strlen(token); + j = k = 0; + for (x = 0; x < i; x++) { + if ((token[x] == '\n') || (token[x] == '\r')) + token[x] = '\0'; + } + + Doit = FALSE; + for (x = 0; x < i; x++) { + if (!Doit) { + if (isalnum(token[x])) + Doit = TRUE; + } + if (Doit) { + if (k > 42) { + if (token[x] == ' ') { + fdb.Desc[j][k] = '\0'; + j++; + k = 0; + } else { + if (k == 49) { + fdb.Desc[j][k] = '\0'; + k = 0; + j++; + } + fdb.Desc[j][k] = token[x]; + k++; + } + } else { + fdb.Desc[j][k] = token[x]; + k++; + } + } + } + + sprintf(temp,"%s/%s", pwd, fdb.LName); + if (stat(temp,&statfile) != 0) { + sprintf(temp,"%s/%s", pwd, fdb.Name); + if (stat(temp,&statfile) != 0) { + WriteError("Cannot locate file on disk! Skipping... -> %s\n",temp); + Append = FALSE; + } + } + sprintf(dest, "%s/%s", area.Path, fdb.LName); + Append = TRUE; + fdb.Size = statfile.st_size; + fdb.FileDate = statfile.st_mtime; + fdb.Crc32 = file_crc(temp, FALSE); + strcpy(fdb.Uploader, CFG.sysop_name); + fdb.UploadDate = time(NULL); + } else { + /* + * Add multiple description lines + */ + token = strtok(String, "\0"); + i = strlen(token); + j++; + k = 0; + Doit = FALSE; + for (x = 0; x < i; x++) { + if ((token[x] == '\n') || (token[x] == '\r')) + token[x] = '\0'; + } + for (x = 0; x < i; x++) { + if (Doit) { + if (k > 42) { + if (token[x] == ' ') { + fdb.Desc[j][k] = '\0'; + j++; + k = 0; + } else { + if (k == 49) { + fdb.Desc[j][k] = '\0'; + k = 0; + j++; + } + fdb.Desc[j][k] = token[x]; + k++; + } + } else { + fdb.Desc[j][k] = token[x]; + k++; + } + } else { + /* + * Skip until + or | is found + */ + if ((token[x] == '+') || (token[x] == '|')) + Doit = TRUE; + } + } + } + } /* End of files.bbs */ + fclose(fbbs); + + /* + * Flush the last file to the database + */ + if (Append) { + Doit = TRUE; + if ((unarc = unpacker(temp)) == NULL) { + Syslog('+', "Unknown archive format %s", temp); + sprintf(temp2, "%s/tmp/arc/%s", getenv("MBSE_ROOT"), fdb.LName); + mkdirs(temp2); + if (file_cp(temp, temp2)) { + WriteError("Can't copy file to %s", temp2); + Doit = FALSE; + } else { + if (!do_quiet) { + printf("Virscan \b\b\b\b\b\b\b\b\b\b"); + fflush(stdout); + } + if (VirScan()) { + Doit = FALSE; + } + } + } else { + if (!do_quiet) { + printf("Unpacking \b\b\b\b\b\b\b\b\b\b"); + fflush(stdout); + } + if (UnpackFile(temp)) { + if (!do_quiet) { + printf("Virscan \b\b\b\b\b\b\b\b\b\b"); + fflush(stdout); + } + if (VirScan()) { + Doit = FALSE; + } + } else { + Doit = FALSE; + } + } + DeleteVirusWork(); + if (Doit) { + if (!do_quiet) { + printf("Adding \b\b\b\b\b\b\b\b\b\b"); + fflush(stdout); + } + if (AddFile(fdb, Area, dest, temp)) + Imported++; + else + Errors++; + } else { + Errors++; + } + } + + free(dest); + free(String); + free(pwd); + free(temp2); + free(temp); + } else { + if (!area.Available) { + WriteError("Area not available"); + if (!do_quiet) + printf("Area not available\n"); + } + if (area.CDrom) { + WriteError("Can't import on CD-ROM"); + if (!do_quiet) + printf("Can't import on CD-ROM\n"); + } + } + + if (!do_quiet) { + printf("\r \r"); + fflush(stdout); + } + Syslog('+', "Import Files [%5d] Imported [%5d] Errors [%5d]", Files, Imported, Errors); +} + diff --git a/mbfido/mbfimport.h b/mbfido/mbfimport.h new file mode 100644 index 00000000..0b5e788f --- /dev/null +++ b/mbfido/mbfimport.h @@ -0,0 +1,10 @@ +/* $Id$ */ + +#ifndef _MBFIMPORT_H +#define _MBFIMPORT_H + + +void ImportFiles(int); + +#endif +