diff --git a/mbfido/mbfile.c b/mbfido/mbfile.c index 7eb2707d..1f5fb997 100644 --- a/mbfido/mbfile.c +++ b/mbfido/mbfile.c @@ -124,8 +124,15 @@ int main(int argc, char **argv) cmd = xstrcat(cmd, argv[i]); } } - if (!strncmp(argv[i], "l", 1)) + if (!strncmp(argv[i], "l", 1)) { do_list = TRUE; + if (argc > (i + 1)) { + i++; + Area = atoi(argv[i]); + cmd = xstrcat(cmd, (char *)" "); + cmd = xstrcat(cmd, argv[i]); + } + } if (!strncmp(argv[i], "p", 1)) do_pack = TRUE; if (!strncmp(argv[i], "c", 1)) @@ -173,7 +180,7 @@ int main(int argc, char **argv) Index(); if (do_list) - ListFileAreas(); + ListFileAreas(Area); die(0); return 0; diff --git a/mbfido/mbflist.c b/mbfido/mbflist.c index 44056c28..1fed33b9 100644 --- a/mbfido/mbflist.c +++ b/mbfido/mbflist.c @@ -42,37 +42,115 @@ extern int do_quiet; /* Supress screen output */ -void ListFileAreas(void) +void ListFileAreas(int Area) { FILE *pAreas, *pFile; int i, iAreas, fcount, tcount = 0; int iTotal = 0; long fsize, tsize = 0; - char *sAreas, *fAreas; + char *sAreas, *fAreas, flags[6]; + /* + * If nothing to display allowed, return at once. + */ + if (do_quiet) + return; + + colour(LIGHTRED, BLACK); sAreas = calloc(PATH_MAX, sizeof(char)); fAreas = calloc(PATH_MAX, sizeof(char)); - IsDoing("List fileareas"); - if (!do_quiet) { - colour(3, 0); - printf(" Area Files MByte File Group Area name\n"); - printf("----- ----- ----- ------------ --------------------------------------------\n"); - colour(7, 0); - } - 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); + printf("Can't open %s\n", sAreas); die(0); } fread(&areahdr, sizeof(areahdr), 1, pAreas); fseek(pAreas, 0, SEEK_END); iAreas = (ftell(pAreas) - areahdr.hdrsize) / areahdr.recsize; + + if (Area) { + IsDoing("List area %d", Area); + + if (fseek(pAreas, ((Area - 1) * areahdr.recsize) + areahdr.hdrsize, SEEK_SET)) { + WriteError("$Can't seek area %d", Area); + printf("Can't seek area %d\n", Area); + return; + } + if (fread(&area, areahdr.recsize, 1, pAreas) != 1) { + WriteError("$Can't read record for area %d", Area); + printf("Can't read record for area %d\n", Area); + return; + } + + if (area.Available) { + + /* + * Open the file database, create new one if it doesn't exist. + */ + sprintf(fAreas, "%s/fdb/fdb%d.data", getenv("MBSE_ROOT"), Area); + if ((pFile = fopen(fAreas, "r+")) == NULL) { + Syslog('!', "Creating new %s", fAreas); + if ((pFile = fopen(fAreas, "a+")) == NULL) { + WriteError("$Can't create %s", fAreas); + die(0); + } + } + + fcount = 0; + fsize = 0L; + colour(CYAN, BLACK); + printf("File listing of area %d, %s\n\n", Area, area.Name); + printf("File name Kbytes File date Dnlds Flags Description\n"); + printf("------------ ------ ---------- ----- ----- ------------------------------------\n"); + colour(LIGHTGRAY, BLACK); + + while (fread(&file, sizeof(file), 1, pFile) == 1) { + sprintf(flags, "-----"); + if (file.Free) + flags[0] = 'F'; + if (file.Deleted) + flags[1] = 'D'; + if (file.Missing) + flags[2] = 'M'; + if (file.NoKill) + flags[3] = 'N'; + if (file.Announced) + flags[4] = 'A'; + + if (strlen(file.Desc[0]) > 36) + file.Desc[0][36] = '\0'; + printf("%-12s %6ld %s %5ld %s %s\n", + file.Name, file.Size / 1024, StrDateDMY(file.FileDate), + file.TimesDL + file.TimesFTP + file.TimesReq, flags, file.Desc[0]); + fcount++; + fsize = fsize + file.Size; + } + fsize = fsize / 1024; + + colour(CYAN, BLACK); + printf("-------------------------------------------------------------------------------\n"); + printf("%d file%s, %ld Kbytes\n", fcount, (fcount == 1) ? "":"s", fsize); + + } else { + WriteError("Area %d is not available", Area); + printf("Area %d is not available\n", Area); + return; + } + + free(sAreas); + free(fAreas); + return; + } + + IsDoing("List fileareas"); + colour(CYAN, BLACK); + printf(" Area Files MByte File Group Area name\n"); + printf("----- ----- ----- ------------ --------------------------------------------\n"); + colour(LIGHTGRAY, BLACK); for (i = 1; i <= iAreas; i++) { fseek(pAreas, ((i-1) * areahdr.recsize) + areahdr.hdrsize, SEEK_SET); @@ -80,11 +158,10 @@ void ListFileAreas(void) if (area.Available) { - sprintf(fAreas, "%s/fdb/fdb%d.data", getenv("MBSE_ROOT"), i); - /* - * Open the file database, create new one if it doesn't excist. + * Open the file database, create new one if it doesn't exist. */ + sprintf(fAreas, "%s/fdb/fdb%d.data", getenv("MBSE_ROOT"), i); if ((pFile = fopen(fAreas, "r+")) == NULL) { Syslog('!', "Creating new %s", fAreas); if ((pFile = fopen(fAreas, "a+")) == NULL) { @@ -103,24 +180,15 @@ void ListFileAreas(void) tcount += fcount; tsize += fsize; - if (!do_quiet) - printf("%5d %5d %5ld %-12s %s\n", i, fcount, fsize, area.BbsGroup, area.Name); + printf("%5d %5d %5ld %-12s %s\n", i, fcount, fsize, area.BbsGroup, area.Name); iTotal++; } } - if (!do_quiet) { - colour(3, 0); - printf("----- ----- ----- ---------------------------------------------------------\n"); - printf("%5d %5d %5ld \n", iTotal, tcount, tsize); - } - + colour(CYAN, BLACK); + printf("----- ----- ----- ---------------------------------------------------------\n"); + printf("%5d %5d %5ld \n", iTotal, tcount, tsize); fclose(pAreas); - if (!do_quiet) { - printf("\r \r"); - fflush(stdout); - } - free(sAreas); free(fAreas); } diff --git a/mbfido/mbflist.h b/mbfido/mbflist.h index 3b494937..def21ec1 100644 --- a/mbfido/mbflist.h +++ b/mbfido/mbflist.h @@ -3,6 +3,6 @@ #ifndef _MBFLIST_H_ #define _MBFLIST_H -void ListFileAreas(void); /* List fileareas */ +void ListFileAreas(int); /* List fileareas */ #endif diff --git a/mbfido/mbfutil.c b/mbfido/mbfutil.c index f5d368da..cf7c796c 100644 --- a/mbfido/mbfutil.c +++ b/mbfido/mbfutil.c @@ -119,7 +119,7 @@ void Help(void) printf(" im import Import files in current dir to area\n"); printf(" in index Create filerequest index\n"); printf(" k kill Kill/move old files\n"); - printf(" l list List file areas\n"); + printf(" l list [area] List file areas or one area\n"); // printf(" m move Move file from to area\n"); printf(" p pack Pack filebase\n"); // printf(" r rearc [file] [arc] Rearc file(s) in area\n");