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");