This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
deb-mbse/mbfido/mbfadopt.c
2005-12-03 14:52:34 +00:00

335 lines
8.8 KiB
C

/*****************************************************************************
*
* $Id$
* Purpose: File Database Maintenance - Adopt file
*
*****************************************************************************
* Copyright (C) 1997-2004
*
* 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, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*****************************************************************************/
#include "../config.h"
#include "../lib/mbselib.h"
#include "../lib/users.h"
#include "../lib/mbsedb.h"
#include "virscan.h"
#include "mbfutil.h"
#include "mbflist.h"
extern int do_quiet; /* Suppress screen output */
extern int do_annon; /* Suppress announce file */
extern int do_novir; /* Suppress virus check */
void AdoptFile(int Area, char *File, char *Description)
{
FILE *fp;
char *temp, *temp2, *tmpdir, *unarc, *pwd, *lname;
char Desc[256], TDesc[256];
int IsArchive = FALSE, MustRearc = FALSE, UnPacked = FALSE;
int IsVirus = FALSE, File_Id = FALSE;
int i, j, k, lines = 0, File_id_cnt = 0, rc;
struct FILE_record f_db;
Syslog('f', "Adopt(%d, %s, %s)", Area, MBSE_SS(File), MBSE_SS(Description));
if (!do_quiet)
mbse_colour(CYAN, BLACK);
if (LoadAreaRec(Area) == FALSE)
die(MBERR_INIT_ERROR);
if (area.Available) {
temp = calloc(PATH_MAX, sizeof(char));
temp2 = calloc(PATH_MAX, sizeof(char));
pwd = calloc(PATH_MAX, sizeof(char));
tmpdir = calloc(PATH_MAX, sizeof(char));
if (CheckFDB(Area, area.Path))
die(MBERR_INIT_ERROR);
getcwd(pwd, PATH_MAX);
if (!do_quiet) {
printf("Adopt file: %s ", File);
printf("Unpacking \b\b\b\b\b\b\b\b\b\b");
fflush(stdout);
}
snprintf(tmpdir, PATH_MAX, "%s/tmp/arc%d", getenv("MBSE_ROOT"), (int)getpid());
if (create_tmpwork()) {
WriteError("Can't create %s", tmpdir);
if (!do_quiet)
printf("\nCan't create dir %s\n", tmpdir);
die(MBERR_INIT_ERROR);
}
snprintf(temp, PATH_MAX, "%s/%s", pwd, File);
if ((unarc = unpacker(File)) == NULL) {
Syslog('+', "No known archive: %s", File);
snprintf(temp2, PATH_MAX, "%s/tmp/arc%d/%s", getenv("MBSE_ROOT"), (int)getpid(), File);
if ((rc = file_cp(temp, temp2))) {
WriteError("Can't copy file to %s, %s", temp2, strerror(rc));
if (!do_quiet)
printf("\nCan't copy file to %s, %s\n", temp2, strerror(rc));
die(MBERR_INIT_ERROR);
} else {
if (do_novir == FALSE) {
if (!do_quiet) {
printf("Virscan \b\b\b\b\b\b\b\b\b\b");
fflush(stdout);
}
IsVirus = VirScan(tmpdir);
} else {
IsVirus = FALSE;
}
if (IsVirus) {
clean_tmpwork();
chdir(pwd);
WriteError("Virus found");
if (!do_quiet)
printf("\nVirus found\n");
die(MBERR_VIRUS_FOUND);
}
}
} else {
IsArchive = TRUE;
if (strlen(area.Archiver) && (strcmp(unarc, area.Archiver) == 0))
MustRearc = TRUE;
UnPacked = UnpackFile(temp);
if (!UnPacked)
die(MBERR_INIT_ERROR);
if (do_novir == FALSE) {
if (!do_quiet) {
printf("Virscan \b\b\b\b\b\b\b\b\b\b");
fflush(stdout);
}
IsVirus = VirScan(tmpdir);
} else {
IsVirus = FALSE;
}
if (IsVirus) {
clean_tmpwork();
chdir(pwd);
WriteError("Virus found");
if (!do_quiet)
printf("\nVirus found\n");
die(MBERR_VIRUS_FOUND);
}
}
if (!do_quiet) {
printf("Checking \b\b\b\b\b\b\b\b\b\b");
fflush(stdout);
}
memset(&f_db, 0, sizeof(f_db));
strcpy(f_db.Uploader, CFG.sysop_name);
f_db.UploadDate = time(NULL);
if (do_annon)
f_db.Announced = TRUE;
if (UnPacked) {
/*
* Try to get a FILE_ID.DIZ
*/
snprintf(temp, PATH_MAX, "%s/tmp/arc%d/FILE_ID.DIZ", getenv("MBSE_ROOT"), (int)getpid());
snprintf(temp2, PATH_MAX, "%s/tmp/FILE_ID.DIZ", getenv("MBSE_ROOT"));
if (file_cp(temp, temp2) == 0) {
File_Id = TRUE;
} else {
snprintf(temp, PATH_MAX, "%s/tmp/arc%d/file_id.diz", getenv("MBSE_ROOT"), (int)getpid());
if (file_cp(temp, temp2) == 0)
File_Id = TRUE;
}
if (File_Id) {
Syslog('f', "FILE_ID.DIZ found");
if ((fp = fopen(temp2, "r"))) {
/*
* Read no more then 25 lines
*/
while (((fgets(Desc, 255, fp)) != NULL) && (File_id_cnt < 25)) {
lines++;
/*
* Check if the FILE_ID.DIZ is in a normal layout.
* This should be max. 10 lines of max. 48 characters.
* We check at 51 characters and if the lines are longer,
* we discard the FILE_ID.DIZ file.
*/
if (strlen(Desc) > 51) {
File_id_cnt = 0;
File_Id = FALSE;
Syslog('!', "Discarding illegal formated FILE_ID.DIZ");
break;
}
if (strlen(Desc)) {
if (strlen(Desc) > 48)
Desc[48] = '\0';
j = 0;
for (i = 0; i < strlen(Desc); i++) {
if ((Desc[i] >= ' ') || (Desc[i] < 0)) {
f_db.Desc[File_id_cnt][j] = Desc[i];
j++;
}
}
File_id_cnt++;
}
}
fclose(fp);
unlink(temp2);
/*
* Strip empty lines at end of FILE_ID.DIZ
*/
while ((strlen(f_db.Desc[File_id_cnt-1]) == 0) && (File_id_cnt))
File_id_cnt--;
Syslog('f', "Got %d FILE_ID.DIZ lines", File_id_cnt);
for (i = 0; i < File_id_cnt; i++)
Syslog('f', "\"%s\"", f_db.Desc[i]);
}
}
}
if (!File_id_cnt) {
if (Description == NULL) {
WriteError("No FILE_ID.DIZ and no description on the commandline");
if (!do_quiet)
printf("\nNo FILE_ID.DIZ and no description on the commandline\n");
clean_tmpwork();
die(MBERR_COMMANDLINE);
} else {
/*
* Create description from the commandline.
*/
if (strlen(Description) < 48) {
/*
* Less then 48 chars, copy and ready.
*/
strcpy(f_db.Desc[0], Description);
File_id_cnt++;
} else {
/*
* More then 48 characters, break into multiple
* lines not longer then 48 characters.
*/
memset(&TDesc, 0, sizeof(TDesc));
strcpy(TDesc, Description);
while (strlen(TDesc) > 48) {
j = 48;
while (TDesc[j] != ' ')
j--;
strncat(f_db.Desc[File_id_cnt], TDesc, j);
File_id_cnt++;
k = strlen(TDesc);
j++; /* Correct space */
for (i = 0; i <= k; i++, j++)
TDesc[i] = TDesc[j];
}
strcpy(f_db.Desc[File_id_cnt], TDesc);
File_id_cnt++;
}
}
}
/*
* Import the file.
*/
chdir(pwd);
clean_tmpwork();
/*
* Work out the kind of filename, is it a long filename
* or a 8.3 DOS filename. The file on disk must become
* 8.3 for import.
*/
if (is_real_8_3(File)) {
Syslog('f', "Adopt, file is 8.3");
strcpy(f_db.Name, File);
strcpy(f_db.LName, File);
for (i = 0; i < strlen(File); i++)
if (isupper(f_db.LName[i]))
f_db.LName[i] = tolower(f_db.LName[i]);
} else {
Syslog('f', "Adopt, file is LFN");
strcpy(temp2, File);
name_mangle(temp2);
if (rename(File, temp2)) {
Syslog('+', "Can't rename %s to %s", File, temp2);
if (!do_quiet)
printf("\nCan't rename %s to %s\n", File, temp2);
die(MBERR_GENERAL);
}
strcpy(f_db.Name, temp2);
strcpy(f_db.LName, File);
}
f_db.Size = file_size(f_db.Name);
f_db.Crc32 = file_crc(f_db.Name, TRUE);
f_db.FileDate = file_time(f_db.Name);
snprintf(temp2, PATH_MAX, "%s/%s", area.Path, f_db.Name);
if (!do_quiet) {
printf("Adding \b\b\b\b\b\b\b\b\b\b");
fflush(stdout);
}
if (strcmp(f_db.Name, f_db.LName)) {
lname = calloc(PATH_MAX, sizeof(char));
snprintf(lname, PATH_MAX, "%s/%s", area.Path, f_db.LName);
if (AddFile(f_db, Area, temp2, f_db.Name, lname) == FALSE) {
die(MBERR_GENERAL);
}
free(lname);
} else {
if (AddFile(f_db, Area, temp2, File, NULL) == FALSE) {
die(MBERR_GENERAL);
}
}
Syslog('+', "File %s added to area %d", File, Area);
if (MustRearc) {
/* Here we should call the rearc function */
}
free(pwd);
free(temp2);
free(temp);
free(tmpdir);
} else {
WriteError("Area %d is not available", Area);
if (!do_quiet)
printf("\nArea %d is not available\n", Area);
}
if (!do_quiet) {
printf("\r \r");
fflush(stdout);
}
}