void AdoptFile(int Area, char *File, char *Description) { FILE *fp; char *temp, *temp2, *tmpdir, *unarc, *pwd, *lname, *fileid; char Desc[256], TDesc[256]; int MustRearc = FALSE, UnPacked = FALSE; int IsVirus = FALSE, File_Id = FALSE; int i, j, k, lines = 0, File_id_cnt = 0; struct FILE_record f_db; Syslog('f', "Adopt(%d, %s, %s)", Area, FTND_SS(File), FTND_SS(Description)); if (!do_quiet) ftnd_colour(CYAN, BLACK); if (LoadAreaRec(Area) == FALSE) die(FTNERR_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(FTNERR_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("FTND_ROOT"), (int)getpid()); if (create_tmpwork()) { WriteError("Can't create %s", tmpdir); if (!do_quiet) printf("\nCan't create dir %s\n", tmpdir); die(FTNERR_INIT_ERROR); } snprintf(temp, PATH_MAX, "%s/%s", pwd, File); if (do_novir == FALSE) { if (!do_quiet) { printf("Virscan \b\b\b\b\b\b\b\b\b\b"); fflush(stdout); } IsVirus = VirScanFile(temp); } if (IsVirus) { WriteError("Virus found"); if (!do_quiet) printf("\nVirus found\n"); die(FTNERR_VIRUS_FOUND); } if ((unarc = unpacker(File))) { if (strlen(area.Archiver) && (strcmp(unarc, area.Archiver) == 0)) MustRearc = TRUE; UnPacked = UnpackFile(temp); if (!UnPacked) die(FTNERR_INIT_ERROR); } 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 */ fileid = calloc(PATH_MAX, sizeof(char)); snprintf(temp, PATH_MAX, "%s/tmp/arc%d", getenv("FTND_ROOT"), (int)getpid()); snprintf(fileid, PATH_MAX, "FILE_ID.DIZ"); if (getfilecase(temp, fileid)) { snprintf(temp, PATH_MAX, "%s/tmp/arc%d/%s", getenv("FTND_ROOT"), (int)getpid(), fileid); snprintf(temp2, PATH_MAX, "%s/tmp/FILE_ID.DIZ", getenv("FTND_ROOT")); if (file_cp(temp, temp2) == 0) { File_Id = TRUE; } } free(fileid); 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(FTNERR_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(FTNERR_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(FTNERR_GENERAL); } free(lname); } else { if (AddFile(f_db, Area, temp2, File, NULL) == FALSE) { die(FTNERR_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); } }
/* * 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); }