Import now skips empty lines in files.bbs and now handles properly missing files

This commit is contained in:
Michiel Broek 2006-04-01 14:46:32 +00:00
parent 69914223a4
commit 95621765b6
2 changed files with 133 additions and 141 deletions

View File

@ -14,6 +14,10 @@ v0.83.17 27-Mar-2006
mbnntp: mbnntp:
Removed AREA:TAG kludge from posted articles. Removed AREA:TAG kludge from posted articles.
mbfile:
Import now skips empty lines in files.bbs.
Import now handles properly missing files.
v0.83.16 13-Mar-2006 - 27-Mar-2006 v0.83.16 13-Mar-2006 - 27-Mar-2006

View File

@ -43,16 +43,128 @@ extern int do_annon; /* Suppress announce files */
extern int do_novir; /* Suppress virus scanning */ extern int do_novir; /* Suppress virus scanning */
void test_file(char *, char *, char *);
/*
* Test filename in a directory case insensitive.
*/
void test_file(char *dirpath, char *search, char *result)
{
DIR *dp;
struct dirent *de;
result[0] = '\0';
Syslog('f', "test_file(%s, %s)", dirpath, search);
if ((dp = opendir(dirpath)) == NULL) {
WriteError("$Can't open directory %s", dirpath);
if (!do_quiet)
printf("\nCan't open directory %s: %s\n", dirpath, strerror(errno));
die(MBERR_INIT_ERROR);
}
while ((de = readdir(dp))) {
if (strcasecmp(de->d_name, search) == 0) {
/*
* Found the right file.
*/
strncpy(result, de->d_name, 80);
break;
}
}
closedir(dp);
}
/*
* Return 1 if imported, 0 if error.
*/
int flush_file(char *source, char *dest, char *lname, struct FILE_record f_db, int Area)
{
int Doit, rc;
char *temp2, *unarc, *tmpdir;
Syslog('f', "flush_file(%s, %s, %s, %d)", source, dest, lname, Area);
temp2 = calloc(PATH_MAX, sizeof(char));
tmpdir = calloc(PATH_MAX, sizeof(char));
snprintf(tmpdir, PATH_MAX, "%s/tmp/arc%d", getenv("MBSE_ROOT"), (int)getpid());
Doit = TRUE;
if ((unarc = unpacker(source)) == NULL) {
Syslog('+', "Unknown archive format %s", source);
snprintf(temp2, PATH_MAX, "%s/%s", tmpdir, f_db.Name);
if ((rc = file_cp(source, temp2))) {
WriteError("1 Can't copy file to %s, %s", temp2, strerror(rc));
if (!do_quiet)
printf("Can't copy file to %s, %s\n", temp2, strerror(rc));
Doit = FALSE;
} else {
if (do_novir == FALSE) {
if (!do_quiet) {
printf("Virscan \b\b\b\b\b\b\b\b\b\b");
fflush(stdout);
}
if (VirScan(tmpdir)) {
Doit = FALSE;
}
}
}
} else {
if (!do_quiet) {
printf("Unpacking \b\b\b\b\b\b\b\b\b\b");
fflush(stdout);
}
if (UnpackFile(source)) {
if (do_novir == FALSE) {
if (!do_quiet) {
printf("Virscan \b\b\b\b\b\b\b\b\b\b");
fflush(stdout);
}
if (VirScan(tmpdir)) {
Doit = FALSE;
}
}
} else {
Doit = FALSE;
}
}
rc = 0;
if (Doit) {
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)) {
if (AddFile(f_db, Area, dest, source, lname)) {
rc = 1;
}
} else {
if (AddFile(f_db, Area, dest, source, NULL)) {
rc = 1;
}
}
}
free(temp2);
free(tmpdir);
return rc;
}
void ImportFiles(int Area) void ImportFiles(int Area)
{ {
char *pwd, *temp, *fod, *temp2, *tmpdir, *String, *token, *dest, *unarc, *lname; char *pwd, *temp, *fod, *temp2, *tmpdir, *String, *token, *dest, *lname;
FILE *fbbs; FILE *fbbs;
DIR *dp; int Append = FALSE, Files = 0, i, line = 0, pos, x, y, Doit;
int Append = FALSE, Files = 0, rc, i, line = 0, pos, x, y, Doit;
int Imported = 0, Errors = 0, Present = FALSE; int Imported = 0, Errors = 0, Present = FALSE;
struct FILE_record f_db; struct FILE_record f_db;
struct stat statfile; struct stat statfile;
struct dirent *de;
if (!do_quiet) if (!do_quiet)
mbse_colour(CYAN, BLACK); mbse_colour(CYAN, BLACK);
@ -113,6 +225,9 @@ void ImportFiles(int Area)
die(MBERR_INIT_ERROR); die(MBERR_INIT_ERROR);
} }
/*
* Process files.bbs
*/
while (fgets(String, 4095, fbbs) != NULL) { while (fgets(String, 4095, fbbs) != NULL) {
/* /*
@ -128,76 +243,20 @@ void ImportFiles(int Area)
} }
/* /*
* Stop on an empty line * Skip empty lines.
*/ */
if (strlen(String) == 0) if (strlen(String) == 0)
break; continue;
if ((String[0] != ' ') && (String[0] != '\t')) { if ((String[0] != ' ') && (String[0] != '\t')) {
/* /*
* New file entry, check if there has been a file that is not yet saved. * New file entry, check if there has been a file that is not yet saved.
*/ */
if (Append && Present) { if (Append && Present) {
Doit = TRUE; if (flush_file(temp, dest, lname, f_db, Area))
if ((unarc = unpacker(temp)) == NULL) {
Syslog('+', "Unknown archive format %s", temp);
snprintf(temp2, PATH_MAX, "%s/tmp/arc%d/%s", getenv("MBSE_ROOT"), (int)getpid(), f_db.Name);
if ((rc = file_cp(temp, temp2))) {
WriteError("1 Can't copy file to %s, %s", temp2, strerror(rc));
if (!do_quiet)
printf("Can't copy file to %s, %s\n", temp2, strerror(rc));
Doit = FALSE;
} else {
if (do_novir == FALSE) {
if (!do_quiet) {
printf("Virscan \b\b\b\b\b\b\b\b\b\b");
fflush(stdout);
}
if (VirScan(tmpdir)) {
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_novir == FALSE) {
if (!do_quiet) {
printf("Virscan \b\b\b\b\b\b\b\b\b\b");
fflush(stdout);
}
if (VirScan(tmpdir)) {
Doit = FALSE;
}
}
} else {
Doit = FALSE;
}
}
if (Doit) {
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)) {
if (AddFile(f_db, Area, dest, temp, lname)) {
Imported++; Imported++;
} else { else
Errors++; Errors++;
}
} else {
if (AddFile(f_db, Area, dest, temp, NULL)) {
Imported++;
} else {
Errors++;
}
}
} else {
Errors++;
}
Append = FALSE; Append = FALSE;
Present = FALSE; Present = FALSE;
line = 0; line = 0;
@ -221,27 +280,7 @@ void ImportFiles(int Area)
Present = TRUE; Present = TRUE;
token = strtok(String, " \t\r\n\0"); token = strtok(String, " \t\r\n\0");
test_file(pwd, token, temp2);
/*
* Test filename against name on disk, first normal case,
* then lowercase and finally uppercase.
*/
if ((dp = opendir(pwd)) == NULL) {
WriteError("$Can't open directory %s", pwd);
if (!do_quiet)
printf("\nCan't open directory %s: %s\n", pwd, strerror(errno));
die(MBERR_INIT_ERROR);
}
while ((de = readdir(dp))) {
if (strcasecmp(de->d_name, token) == 0) {
/*
* Found the right file.
*/
strncpy(temp2, de->d_name, 80);
break;
}
}
closedir(dp);
if (strlen(temp2) == 0) { if (strlen(temp2) == 0) {
WriteError("Can't find file on disk, skipping: %s", token); WriteError("Can't find file on disk, skipping: %s", token);
@ -249,6 +288,7 @@ void ImportFiles(int Area)
printf("\nCan't find file on disk, skipping: %s\n", token); printf("\nCan't find file on disk, skipping: %s\n", token);
Append = FALSE; Append = FALSE;
Present = FALSE; Present = FALSE;
continue;
} else { } else {
/* /*
* Check type of filename and set the right values. * Check type of filename and set the right values.
@ -400,62 +440,10 @@ void ImportFiles(int Area)
* Flush the last file to the database * Flush the last file to the database
*/ */
if (Append) { if (Append) {
Doit = TRUE; if (flush_file(temp, dest, lname, f_db, Area))
if ((unarc = unpacker(temp)) == NULL) {
Syslog('+', "Unknown archive format %s", temp);
snprintf(temp2, PATH_MAX, "%s/tmp/arc%d/%s", getenv("MBSE_ROOT"), (int)getpid(), f_db.LName);
if ((rc = file_cp(temp, temp2))) {
WriteError("Can't copy file to %s, %s", temp2, strerror(rc));
Doit = FALSE;
} else {
if (do_novir == FALSE) {
if (!do_quiet) {
printf("Virscan \b\b\b\b\b\b\b\b\b\b");
fflush(stdout);
}
if (VirScan(tmpdir)) {
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_novir == FALSE) {
if (!do_quiet) {
printf("Virscan \b\b\b\b\b\b\b\b\b\b");
fflush(stdout);
}
if (VirScan(tmpdir)) {
Doit = FALSE;
}
}
} else {
Doit = FALSE;
}
}
if (Doit) {
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)) {
if (AddFile(f_db, Area, dest, temp, lname))
Imported++; Imported++;
else else
Errors++; Errors++;
} else {
if (AddFile(f_db, Area, dest, temp, NULL))
Imported++;
else
Errors++;
}
} else {
Errors++;
}
} }
clean_tmpwork(); clean_tmpwork();