diff --git a/TODO b/TODO
index 260612e3..91de2a6a 100644
--- a/TODO
+++ b/TODO
@@ -119,6 +119,8 @@ mbfido:
older entry to update the info with the later received file. Else
just handle the record as a dupe (In test again).
+ N: Hatch statistics are not updated.
+
mbcico:
L: Implement binkp option ND.
diff --git a/mbsetup/Makefile b/mbsetup/Makefile
index 18c3b26f..dd8c8f6d 100644
--- a/mbsetup/Makefile
+++ b/mbsetup/Makefile
@@ -84,7 +84,7 @@ ledit.o: ../config.h ../lib/mbselib.h ../lib/users.h ../lib/msg.h screen.h mutil
m_farea.o: ../config.h ../lib/mbselib.h screen.h mutil.h ledit.h m_global.h m_fgroup.h m_archive.h m_farea.h m_fgroup.h m_ngroup.h
m_fido.o: ../config.h ../lib/mbselib.h screen.h mutil.h ledit.h stlist.h m_global.h m_fido.h
m_limits.o: ../config.h ../lib/mbselib.h ../lib/users.h screen.h mutil.h ledit.h stlist.h m_global.h m_limits.h
-m_menu.o: ../config.h ../lib/mbselib.h mutil.h screen.h ledit.h m_lang.h m_menu.h
+m_menu.o: ../config.h ../lib/mbselib.h mutil.h screen.h ledit.h m_lang.h m_global.h m_menu.h
m_ngroup.o: ../config.h ../lib/mbselib.h screen.h mutil.h ledit.h stlist.h m_global.h m_ngroup.h
m_service.o: ../config.h ../lib/mbselib.h screen.h mutil.h ledit.h stlist.h m_global.h m_service.h
m_tty.o: ../config.h ../lib/mbselib.h screen.h mutil.h ledit.h stlist.h m_modem.h m_global.h m_tty.h
diff --git a/mbsetup/m_bbs.c b/mbsetup/m_bbs.c
index 23ed0e1f..1094b0e4 100644
--- a/mbsetup/m_bbs.c
+++ b/mbsetup/m_bbs.c
@@ -92,21 +92,6 @@ void bbs_menu(void)
int bbs_doc(FILE *fp, FILE *toc, int page)
{
- FILE *wp;
-
- if ((wp = open_webdoc((char *)"bbs.html", (char *)"BBS Setup", NULL))) {
- fprintf(wp, "Main\n");
- fprintf(wp, "
\n");
- fclose(wp);
- }
-
page = newpage(fp, page);
addtoc(fp, toc, 8, 0, page, (char *)"BBS setup");
diff --git a/mbsetup/m_farea.c b/mbsetup/m_farea.c
index 17b948ee..53910ca9 100644
--- a/mbsetup/m_farea.c
+++ b/mbsetup/m_farea.c
@@ -835,7 +835,8 @@ int bbs_file_doc(FILE *fp, FILE *toc, int page)
fprintf(wp, "\n");
fprintf(wp, "\n");
}
- add_webtable(wp, tic.Name, tic.Comment);
+ fprintf(wp, "%s | %s |
\n",
+ tic.Name, tic.Name, tic.Comment);
tics++;
}
fseek(ti, tichdr.syssize, SEEK_CUR);
diff --git a/mbsetup/m_fgroup.c b/mbsetup/m_fgroup.c
index 772de91f..84d6be5c 100644
--- a/mbsetup/m_fgroup.c
+++ b/mbsetup/m_fgroup.c
@@ -772,8 +772,7 @@ int tic_group_doc(FILE *fp, FILE *toc, int page)
fprintf(wp, "\n");
fprintf(wp, "\n");
}
- sprintf(temp, "Area %d", i);
- add_webtable(wp, temp, area.Name);
+ fprintf(wp, "Area %d | %s |
\n", i, i, area.Name);
refs++;
}
}
@@ -800,7 +799,8 @@ int tic_group_doc(FILE *fp, FILE *toc, int page)
fprintf(wp, "\n");
fprintf(wp, "\n");
}
- add_webtable(wp, tic.Name, tic.Comment);
+ fprintf(wp, "%s | %s |
\n",
+ tic.Name, tic.Name, tic.Comment);
refs++;
}
fseek(ti, tichdr.syssize, SEEK_CUR);
@@ -830,7 +830,9 @@ int tic_group_doc(FILE *fp, FILE *toc, int page)
fprintf(wp, "\n");
fprintf(wp, "\n");
}
- add_webtable(wp, aka2str(nodes.Aka[0]), nodes.Sysop);
+ fprintf(wp, "%s | %s |
\n",
+ nodes.Aka[0].zone, nodes.Aka[0].net, nodes.Aka[0].node, nodes.Aka[0].point,
+ nodes.Aka[0].domain, aka2str(nodes.Aka[0]), nodes.Sysop);
refs++;
}
}
@@ -844,6 +846,11 @@ int tic_group_doc(FILE *fp, FILE *toc, int page)
fprintf(wp, "\n");
fprintf(wp, "\n");
}
+ fprintf(wp, "
\n");
+ fprintf(wp, "Group Statistics
\n");
+ add_statcnt(wp, (char *)"processed files", fgroup.Files);
+ add_statcnt(wp, (char *)"KBytes of files", fgroup.KBytes);
+ close_webdoc(wp);
}
fprintf(fp, " Group name %s\n", fgroup.Name);
diff --git a/mbsetup/m_hatch.c b/mbsetup/m_hatch.c
index 7b171e2a..2484e2d3 100644
--- a/mbsetup/m_hatch.c
+++ b/mbsetup/m_hatch.c
@@ -557,82 +557,120 @@ void InitHatch(void)
int tic_hatch_doc(FILE *fp, FILE *toc, int page)
{
- char temp[PATH_MAX], *tmp = NULL;
- FILE *no;
- int i, j, All;
+ char temp[PATH_MAX], *tmp = NULL;
+ FILE *wp, *ip, *no;
+ int i, j, nr = 0, All;
- sprintf(temp, "%s/etc/hatch.data", getenv("MBSE_ROOT"));
- if ((no = fopen(temp, "r")) == NULL)
- return page;
+ sprintf(temp, "%s/etc/hatch.data", getenv("MBSE_ROOT"));
+ if ((no = fopen(temp, "r")) == NULL)
+ return page;
- page = newpage(fp, page);
- addtoc(fp, toc, 10, 3, page, (char *)"Hatch manager");
- j = 1;
+ page = newpage(fp, page);
+ addtoc(fp, toc, 10, 3, page, (char *)"Hatch manager");
+ j = 1;
- fprintf(fp, "\n\n");
- fread(&hatchhdr, sizeof(hatchhdr), 1, no);
+ fprintf(fp, "\n\n");
+ fread(&hatchhdr, sizeof(hatchhdr), 1, no);
- while ((fread(&hatch, hatchhdr.recsize, 1, no)) == 1) {
+ ip = open_webdoc((char *)"hatch.html", (char *)"File Areas", NULL);
+ fprintf(ip, "Main\n");
+ fprintf(ip, "\n");
+
+ while ((fread(&hatch, hatchhdr.recsize, 1, no)) == 1) {
- if (j == 5) {
- page = newpage(fp, page);
- fprintf(fp, "\n");
- j = 0;
- }
-
- fprintf(fp, " File spec %s\n", hatch.Spec);
- fprintf(fp, " File echo %s\n", hatch.Name);
- fprintf(fp, " Replace file %s\n", hatch.Replace);
- fprintf(fp, " Magic filename %s\n", hatch.Magic);
- fprintf(fp, " Description %s\n", hatch.Desc);
- fprintf(fp, " Dupe check %s\n", getboolean(hatch.DupeCheck));
- fprintf(fp, " Active %s\n", getboolean(hatch.Active));
- tmp = NULL;
- for (i = 0; i < 7; i++)
- if (hatch.Days[i]) {
- if (tmp == NULL) {
- tmp = xstrcpy(Days[i]);
- } else {
- tmp = xstrcat(tmp, (char *)", ");
- tmp = xstrcat(tmp, Days[i]);
- }
- }
- if (tmp == NULL)
- tmp = xstrcpy((char *)"None");
- fprintf(fp, " Hatch on days %s\n", tmp);
- if (tmp != NULL) {
- free(tmp);
- tmp = NULL;
- }
- All = TRUE;
- for (i = 0; i < 32; i++)
- if (!hatch.Month[i])
- All = FALSE;
- if (!All) {
- for (i = 0; i < 32; i++)
- if (hatch.Month[i]) {
- if (tmp == NULL) {
- tmp = xstrcpy(Month[i]);
- } else {
- tmp = xstrcat(tmp, (char *)", ");
- tmp = xstrcat(tmp, Month[i]);
- }
- }
- } else
- tmp = xstrcpy((char *)"All dates");
- if (tmp == NULL)
- tmp = xstrcpy((char *)"None");
- fprintf(fp, " Hatch on dates %s\n", tmp);
- if (tmp != NULL) {
- free(tmp);
- tmp = NULL;
- }
- fprintf(fp, "\n\n");
- j++;
+ nr++;
+ if (j == 5) {
+ page = newpage(fp, page);
+ fprintf(fp, "\n");
+ j = 0;
}
- fclose(no);
- return page;
+ sprintf(temp, "hatch_%d.html", nr);
+ fprintf(ip, " - Hatch %3d %s
\n", temp, nr, hatch.Spec);
+ if ((wp = open_webdoc(temp, (char *)"Hatch Manager", hatch.Spec))) {
+ fprintf(wp, "Main Back\n");
+ fprintf(wp, "\n");
+ fprintf(wp, "
\n");
+ fprintf(wp, "\n");
+ fprintf(wp, "\n");
+ add_webtable(wp, (char *)"File specification", hatch.Spec);
+ add_webtable(wp, (char *)"TIC File area", hatch.Name);
+ add_webtable(wp, (char *)"Replace file", hatch.Replace);
+ add_webtable(wp, (char *)"Magic filename", hatch.Magic);
+ add_webtable(wp, (char *)"File description", hatch.Desc);
+ add_webtable(wp, (char *)"Dupe check", getboolean(hatch.DupeCheck));
+ add_webtable(wp, (char *)"Active", getboolean(hatch.Active));
+ }
+
+ fprintf(fp, " File spec %s\n", hatch.Spec);
+ fprintf(fp, " File echo %s\n", hatch.Name);
+ fprintf(fp, " Replace file %s\n", hatch.Replace);
+ fprintf(fp, " Magic filename %s\n", hatch.Magic);
+ fprintf(fp, " Description %s\n", hatch.Desc);
+ fprintf(fp, " Dupe check %s\n", getboolean(hatch.DupeCheck));
+ fprintf(fp, " Active %s\n", getboolean(hatch.Active));
+ tmp = NULL;
+ for (i = 0; i < 7; i++)
+ if (hatch.Days[i]) {
+ if (tmp == NULL) {
+ tmp = xstrcpy(Days[i]);
+ } else {
+ tmp = xstrcat(tmp, (char *)", ");
+ tmp = xstrcat(tmp, Days[i]);
+ }
+ }
+ if (tmp == NULL)
+ tmp = xstrcpy((char *)"None");
+ if (wp != NULL)
+ add_webtable(wp, (char *)"Hatch on days", tmp);
+ fprintf(fp, " Hatch on days %s\n", tmp);
+ if (tmp != NULL) {
+ free(tmp);
+ tmp = NULL;
+ }
+ All = TRUE;
+ for (i = 0; i < 32; i++)
+ if (!hatch.Month[i])
+ All = FALSE;
+ if (!All) {
+ for (i = 0; i < 32; i++) {
+ if (hatch.Month[i]) {
+ if (tmp == NULL) {
+ tmp = xstrcpy(Month[i]);
+ } else {
+ tmp = xstrcat(tmp, (char *)", ");
+ tmp = xstrcat(tmp, Month[i]);
+ }
+ }
+ }
+ } else {
+ tmp = xstrcpy((char *)"All dates");
+ }
+ if (tmp == NULL)
+ tmp = xstrcpy((char *)"None");
+ if (wp != NULL) {
+ add_webtable(wp, (char *)"Hatch on dates", tmp);
+ fprintf(wp, "\n");
+ fprintf(wp, "
\n");
+ fprintf(wp, "
\n");
+ fprintf(wp, "Hatch Statistics
\n");
+ add_statcnt(wp, (char *)"hatched files", hatch.Hatched);
+ close_webdoc(wp);
+ }
+ fprintf(fp, " Hatch on dates %s\n", tmp);
+ if (tmp != NULL) {
+ free(tmp);
+ tmp = NULL;
+ }
+ fprintf(fp, "\n\n");
+ j++;
+ }
+
+ fprintf(ip, "
\n");
+ close_webdoc(ip);
+
+ fclose(no);
+ return page;
}
diff --git a/mbsetup/m_lang.c b/mbsetup/m_lang.c
index 3b480a31..fe3c0e07 100644
--- a/mbsetup/m_lang.c
+++ b/mbsetup/m_lang.c
@@ -525,42 +525,102 @@ int PickLanguage(char *nr)
int bbs_lang_doc(FILE *fp, FILE *toc, int page)
{
- char temp[PATH_MAX];
- FILE *no;
- int j;
+ char temp[PATH_MAX];
+ FILE *wp, *ip, *no;
+ int j;
+ DIR *dp;
+ struct dirent *de;
- sprintf(temp, "%s/etc/language.data", getenv("MBSE_ROOT"));
- if ((no = fopen(temp, "r")) == NULL)
- return page;
+ sprintf(temp, "%s/etc/language.data", getenv("MBSE_ROOT"));
+ if ((no = fopen(temp, "r")) == NULL)
+ return page;
- page = newpage(fp, page);
- addtoc(fp, toc, 8, 2, page, (char *)"BBS Language setup");
- j = 0;
- fprintf(fp, "\n\n");
- fread(&langhdr, sizeof(langhdr), 1, no);
+ page = newpage(fp, page);
+ addtoc(fp, toc, 8, 2, page, (char *)"BBS Language setup");
+ j = 0;
+ fprintf(fp, "\n\n");
+ fread(&langhdr, sizeof(langhdr), 1, no);
- while ((fread(&lang, langhdr.recsize, 1, no)) == 1) {
+ ip = open_webdoc((char *)"language.html", (char *)"BBS Language Setup", NULL);
+ fprintf(ip, "Main\n");
+ fprintf(ip, "\n");
+
+ while ((fread(&lang, langhdr.recsize, 1, no)) == 1) {
- if (j == 5) {
- page = newpage(fp, page);
- fprintf(fp, "\n");
- j = 0;
+ if (j == 5) {
+ page = newpage(fp, page);
+ fprintf(fp, "\n");
+ j = 0;
+ }
+
+ sprintf(temp, "language_%s.html", lang.LangKey);
+ fprintf(ip, " - %s %s
\n", temp, lang.LangKey, lang.Name);
+ if ((wp = open_webdoc(temp, (char *)"Language", lang.Name))) {
+ fprintf(wp, "Main Back\n");
+ fprintf(wp, "\n");
+ fprintf(wp, "
\n");
+ fprintf(wp, "\n");
+ fprintf(wp, "\n");
+ add_webtable(wp, (char *)"Language key", lang.LangKey);
+ add_webtable(wp, (char *)"Language name", lang.Name);
+ add_webtable(wp, (char *)"Available", getboolean(lang.Available));
+ add_webtable(wp, (char *)"Menu path", lang.MenuPath);
+ add_webtable(wp, (char *)"Textfiles path", lang.TextPath);
+ add_webtable(wp, (char *)"Macrofiles path", lang.MacroPath);
+ add_webtable(wp, (char *)"Language file", lang.Filename);
+ web_secflags(wp, (char *)"Security level", lang.Security);
+ fprintf(wp, "\n");
+ fprintf(wp, "
\n");
+ fprintf(wp, "
\n");
+ fprintf(wp, "Menu files
\n");
+ if ((dp = opendir(lang.MenuPath))) {
+ while ((de = readdir(dp))) {
+ if (de->d_name[0] != '.') {
+ fprintf(wp, "%s
\n", de->d_name);
+ }
}
-
- fprintf(fp, " Language key %s\n", lang.LangKey);
- fprintf(fp, " Language name %s\n", lang.Name);
- fprintf(fp, " Available %s\n", getboolean(lang.Available));
- fprintf(fp, " Menu path %s\n", lang.MenuPath);
- fprintf(fp, " Textfiles path %s\n", lang.TextPath);
- fprintf(fp, " Macrofiles path %s\n", lang.MacroPath);
- fprintf(fp, " Language file %s\n", lang.Filename);
- fprintf(fp, " Security level %s\n", get_secstr(lang.Security));
- fprintf(fp, "\n\n");
- j++;
+ closedir(dp);
+ }
+ fprintf(wp, "
\n");
+ fprintf(wp, "Text files
\n");
+ if ((dp = opendir(lang.TextPath))) {
+ while ((de = readdir(dp))) {
+ if (de->d_name[0] != '.') {
+ fprintf(wp, "%s
\n", de->d_name);
+ }
+ }
+ closedir(dp);
+ }
+ fprintf(wp, "
\n");
+ fprintf(wp, "Macro template files
\n");
+ if ((dp = opendir(lang.MacroPath))) {
+ while ((de = readdir(dp))) {
+ if (de->d_name[0] != '.') {
+ fprintf(wp, "%s
\n", de->d_name);
+ }
+ }
+ closedir(dp);
+ }
+ close_webdoc(wp);
}
- fclose(no);
- return page;
+ fprintf(fp, " Language key %s\n", lang.LangKey);
+ fprintf(fp, " Language name %s\n", lang.Name);
+ fprintf(fp, " Available %s\n", getboolean(lang.Available));
+ fprintf(fp, " Menu path %s\n", lang.MenuPath);
+ fprintf(fp, " Textfiles path %s\n", lang.TextPath);
+ fprintf(fp, " Macrofiles path %s\n", lang.MacroPath);
+ fprintf(fp, " Language file %s\n", lang.Filename);
+ fprintf(fp, " Security level %s\n", get_secstr(lang.Security));
+ fprintf(fp, "\n\n");
+ j++;
+ }
+
+ fprintf(ip, "
\n");
+ close_webdoc(ip);
+
+ fclose(no);
+ return page;
}
diff --git a/mbsetup/m_limits.c b/mbsetup/m_limits.c
index bbbf4704..7c459d73 100644
--- a/mbsetup/m_limits.c
+++ b/mbsetup/m_limits.c
@@ -537,28 +537,67 @@ char *get_limit_name(int level)
int bbs_limits_doc(FILE *fp, FILE *toc, int page)
{
- char temp[PATH_MAX];
- FILE *no;
+ char temp[PATH_MAX];
+ FILE *up, *ip, *no;
- sprintf(temp, "%s/etc/limits.data", getenv("MBSE_ROOT"));
- if ((no = fopen(temp, "r")) == NULL)
- return page;
-
- addtoc(fp, toc, 8, 1, page, (char *)"BBS user limits");
-
- fread(&LIMIThdr, sizeof(LIMIThdr), 1, no);
-
- fprintf(fp, "\n");
- fprintf(fp, " Access Max. Down Down\n");
- fprintf(fp, " Level time Kb. files Active Description\n");
- fprintf(fp, " ------ ------ ------ ------ ------ ------------------------------\n");
-
- while ((fread(&LIMIT, LIMIThdr.recsize, 1, no)) == 1) {
- fprintf(fp, " %6ld %6ld %6ld %6d %s %s\n", LIMIT.Security, LIMIT.Time, LIMIT.DownK,
- LIMIT.DownF, getboolean(LIMIT.Available), LIMIT.Description);
- }
-
- fclose(no);
+ sprintf(temp, "%s/etc/limits.data", getenv("MBSE_ROOT"));
+ if ((no = fopen(temp, "r")) == NULL)
return page;
+
+ addtoc(fp, toc, 8, 1, page, (char *)"BBS user limits");
+
+ ip = open_webdoc((char *)"limits.html", (char *)"BBS User Security Limits", NULL);
+ fprintf(ip, "Main\n");
+ fprintf(ip, "\n");
+ fprintf(ip, "
\n");
+ fprintf(ip, "\n");
+ fprintf(ip, "Access Level | Max. time | ");
+ fprintf(ip, "Down Kb. | Down files | ");
+ fprintf(ip, "Active | Description |
---|
\n");
+ fread(&LIMIThdr, sizeof(LIMIThdr), 1, no);
+
+ fprintf(fp, "\n");
+ fprintf(fp, " Access Max. Down Down\n");
+ fprintf(fp, " Level time Kb. files Active Description\n");
+ fprintf(fp, " ------ ------ ------ ------ ------ ------------------------------\n");
+
+ while ((fread(&LIMIT, LIMIThdr.recsize, 1, no)) == 1) {
+ fprintf(fp, " %6ld %6ld %6ld %6d %s %s\n",
+ LIMIT.Security, LIMIT.Time, LIMIT.DownK, LIMIT.DownF, getboolean(LIMIT.Available), LIMIT.Description);
+ fprintf(ip, "
%ld | %ld | %ld | %d | %s | %s |
\n",
+ LIMIT.Security, LIMIT.Time, LIMIT.DownK, LIMIT.DownF, getboolean(LIMIT.Available), LIMIT.Description);
+ }
+
+ fprintf(ip, "\n");
+ fprintf(ip, "
\n");
+ fprintf(ip, "
\n");
+ fprintf(ip, "Users in security levels
\n");
+ fprintf(ip, "\n");
+ fprintf(ip, "\n");
+ fprintf(ip, "\n");
+ fprintf(ip, "Access Level | User | Location |
\n");
+ fseek(no, LIMIThdr.hdrsize, SEEK_SET);
+
+ sprintf(temp, "%s/etc/users.data", getenv("MBSE_ROOT"));
+ if ((up = fopen(temp, "r"))) {
+ fread(&usrconfighdr, sizeof(usrconfighdr), 1, up);
+
+ while ((fread(&LIMIT, LIMIThdr.recsize, 1, no)) == 1) {
+ fseek(up, usrconfighdr.hdrsize, SEEK_SET);
+ while (fread(&usrconfig, usrconfighdr.recsize, 1, up) == 1) {
+ if (strlen(usrconfig.sUserName) && (usrconfig.Security.level == LIMIT.Security)) {
+ fprintf(ip, "%ld | %s | %s |
\n",
+ LIMIT.Security, usrconfig.sUserName, usrconfig.sLocation);
+ }
+ }
+ }
+ fclose(up);
+ }
+
+ fprintf(ip, "\n");
+ fprintf(ip, "
\n");
+ close_webdoc(ip);
+ fclose(no);
+ return page;
}
diff --git a/mbsetup/m_magic.c b/mbsetup/m_magic.c
index 267c1d8a..91e970b9 100644
--- a/mbsetup/m_magic.c
+++ b/mbsetup/m_magic.c
@@ -487,59 +487,83 @@ void InitMagics(void)
int tic_magic_doc(FILE *fp, FILE *toc, int page)
{
- char temp[PATH_MAX];
- FILE *no;
- int j;
+ char temp[PATH_MAX];
+ FILE *wp, *ip, *no;
+ int nr = 0i, j;
- sprintf(temp, "%s/etc/magic.data", getenv("MBSE_ROOT"));
- if ((no = fopen(temp, "r")) == NULL)
- return page;
+ sprintf(temp, "%s/etc/magic.data", getenv("MBSE_ROOT"));
+ if ((no = fopen(temp, "r")) == NULL)
+ return page;
- page = newpage(fp, page);
- addtoc(fp, toc, 10, 4, page, (char *)"File Magic processing");
- j = 0;
- fprintf(fp, "\n\n");
+ page = newpage(fp, page);
+ addtoc(fp, toc, 10, 4, page, (char *)"File Magic processing");
+ j = 0;
+ fprintf(fp, "\n\n");
+ fread(&magichdr, sizeof(magichdr), 1, no);
- fread(&magichdr, sizeof(magichdr), 1, no);
- while (fread(&magic, magichdr.recsize, 1, no) == 1) {
- if (j == 6) {
- page = newpage(fp, page);
- fprintf(fp, "\n");
- j = 0;
- }
-
- fprintf(fp, " Filemask %s\n", magic.Mask);
- fprintf(fp, " Type %s\n", getmagictype(magic.Attrib));
- fprintf(fp, " Active %s\n", getboolean(magic.Active));
- fprintf(fp, " Area %s\n", magic.From);
-
- switch (magic.Attrib) {
- case MG_ADOPT:
- case MG_MOVE:
- fprintf(fp, " To area %s\n", magic.ToArea);
- break;
-
- case MG_EXEC:
- fprintf(fp, " Command %s\n", magic.Cmd);
- fprintf(fp, " Compile NL %s\n", getboolean(magic.Compile));
- break;
-
- case MG_UNPACK:
- case MG_COPY:
- fprintf(fp, " Compile NL %s\n", getboolean(magic.Compile));
- fprintf(fp, " Path %s\n", magic.Path);
- break;
-
- case MG_KEEPNUM:fprintf(fp, " Keep # file %d\n", magic.KeepNum);
- break;
- }
-
- fprintf(fp, "\n\n");
- j++;
+ ip = open_webdoc((char *)"magic.html", (char *)"File Magic Processing", NULL);
+ fprintf(ip, "Main\n");
+ fprintf(ip, "\n");
+
+ while (fread(&magic, magichdr.recsize, 1, no) == 1) {
+ if (j == 6) {
+ page = newpage(fp, page);
+ fprintf(fp, "\n");
+ j = 0;
}
- fclose(no);
- return page;
+ nr++;
+ sprintf(temp, "magic_%d.html", nr);
+ fprintf(ip, " - Magic %3d %s
\n", temp, nr, magic.Mask);
+ if ((wp = open_webdoc(temp, (char *)"File Magic", magic.Mask))) {
+ fprintf(wp, "Main Back\n");
+ fprintf(wp, "\n");
+ fprintf(wp, "
\n");
+ fprintf(wp, "\n");
+ fprintf(wp, "\n");
+ add_webtable(wp, (char *)"Filemask", magic.Mask);
+ add_webtable(wp, (char *)"Magic type", getmagictype(magic.Attrib));
+ add_webtable(wp, (char *)"Active", getboolean(magic.Active));
+ add_webtable(wp, (char *)"TIC Area", magic.From);
+ fprintf(fp, " Filemask %s\n", magic.Mask);
+ fprintf(fp, " Type %s\n", getmagictype(magic.Attrib));
+ fprintf(fp, " Active %s\n", getboolean(magic.Active));
+ fprintf(fp, " Area %s\n", magic.From);
+
+ switch (magic.Attrib) {
+ case MG_ADOPT:
+ case MG_MOVE: add_webtable(wp, (char *)"To area", magic.ToArea);
+ fprintf(fp, " To area %s\n", magic.ToArea);
+ break;
+ case MG_EXEC: add_webtable(wp, (char *)"Command", magic.Cmd);
+ add_webtable(wp, (char *)"Compile nodelist", getboolean(magic.Compile));
+ fprintf(fp, " Command %s\n", magic.Cmd);
+ fprintf(fp, " Compile NL %s\n", getboolean(magic.Compile));
+ break;
+ case MG_UNPACK:
+ case MG_COPY: add_webtable(wp, (char *)"Compile nodelist", getboolean(magic.Compile));
+ add_webtable(wp, (char *)"Destination path", magic.Path);
+ fprintf(fp, " Compile NL %s\n", getboolean(magic.Compile));
+ fprintf(fp, " Path %s\n", magic.Path);
+ break;
+ case MG_KEEPNUM: add_webdigit(wp, (char *)"Keep # files", magic.KeepNum);
+ fprintf(fp, " Keep # file %d\n", magic.KeepNum);
+ break;
+ }
+ fprintf(wp, "\n");
+ fprintf(wp, "
\n");
+ close_webdoc(wp);
+ }
+
+ fprintf(fp, "\n\n");
+ j++;
+ }
+
+ fprintf(ip, "
\n");
+ close_webdoc(ip);
+
+ fclose(no);
+ return page;
}
diff --git a/mbsetup/m_marea.c b/mbsetup/m_marea.c
index 4ef6600e..427ba346 100644
--- a/mbsetup/m_marea.c
+++ b/mbsetup/m_marea.c
@@ -1762,8 +1762,8 @@ void gold_areas(FILE *fp)
int mail_area_doc(FILE *fp, FILE *toc, int page)
{
char temp[PATH_MAX], status[5];
- FILE *no;
- int i = 0, j, systems, First = TRUE, LMiy;
+ FILE *ti, *wp, *ip, *no;
+ int i = 0, j, k, systems, refs, First = TRUE, LMiy;
sysconnect System;
struct tm *t;
time_t Now;
@@ -1787,6 +1787,10 @@ int mail_area_doc(FILE *fp, FILE *toc, int page)
fread(&msgshdr, msgshdr.hdrsize, 1, no);
systems = msgshdr.syssize / sizeof(sysconnect);
+ ip = open_webdoc((char *)"msgareas.html", (char *)"Message Areas", NULL);
+ fprintf(ip, "Main\n");
+ fprintf(ip, "\n");
+
while (fread(&msgs, msgshdr.recsize, 1, no) == 1) {
i++;
@@ -1800,6 +1804,52 @@ int mail_area_doc(FILE *fp, FILE *toc, int page)
} else
fprintf(fp, "\n\n");
+ sprintf(temp, "msgarea_%d.html", i);
+ fprintf(ip, " - Area %d %s
\n", temp, i, msgs.Name);
+ if ((wp = open_webdoc(temp, (char *)"File area", msgs.Name))) {
+ fprintf(wp, "Main Back\n");
+ fprintf(wp, "\n");
+ fprintf(wp, "
\n");
+ fprintf(wp, "\n");
+ fprintf(wp, "\n");
+ add_webdigit(wp, (char *)"Area number", i);
+ add_webtable(wp, (char *)"Area name", msgs.Name);
+ add_webtable(wp, (char *)"Area tag", msgs.Tag);
+ add_webtable(wp, (char *)"Newsgroup name", msgs.Newsgroup);
+ add_webtable(wp, (char *)"Distribution", msgs.Distribution);
+ add_webtable(wp, (char *)"JAM message base", msgs.Base);
+ add_webtable(wp, (char *)"Offline name", msgs.QWKname);
+ add_webtable(wp, (char *)"Area type", getmsgtype(msgs.Type));
+ add_webtable(wp, (char *)"Messages type", getmsgkinds(msgs.MsgKinds));
+ add_webtable(wp, (char *)"Character set", getchrs(msgs.Charset));
+ add_webdigit(wp, (char *)"Days old msgs", msgs.DaysOld);
+ add_webdigit(wp, (char *)"Maximum msgs", msgs.MaxMsgs);
+ add_webdigit(wp, (char *)"Max articles", msgs.MaxArticles);
+ add_webtable(wp, (char *)"Users delete", getboolean(msgs.UsrDelete));
+ web_secflags(wp, (char *)"Read security", msgs.RDSec);
+ web_secflags(wp, (char *)"Write security", msgs.WRSec);
+ web_secflags(wp, (char *)"Sysop security", msgs.SYSec);
+ add_webtable(wp, (char *)"Link security", getflag(msgs.LinkSec.flags, msgs.LinkSec.notflags));
+ add_webdigit(wp, (char *)"Minimum age", msgs.Age);
+ add_webtable(wp, (char *)"Password", msgs.Password);
+ add_webtable(wp, (char *)"Group", msgs.Group);
+ add_webtable(wp, (char *)"Fido address", aka2str(msgs.Aka));
+ add_webdigit(wp, (char *)"Netmail board", msgs.NetReply);
+ add_webtable(wp, (char *)"Origin line", msgs.Origin);
+ add_webtable(wp, (char *)"Allow aliases", getboolean(msgs.Aliases));
+ add_webtable(wp, (char *)"OLR mandatory", getboolean(msgs.OLR_Forced));
+ add_webtable(wp, (char *)"OLR default on", getboolean(msgs.OLR_Default));
+ add_webtable(wp, (char *)"Append quotes", getboolean(msgs.Quotes));
+ add_webtable(wp, (char *)"Nodes mandatory", getboolean(msgs.Mandatory));
+ add_webtable(wp, (char *)"UnSecure toss", getboolean(msgs.UnSecure));
+ add_webtable(wp, (char *)"Last msg rcvd", ctime(&msgs.LastRcvd));
+ add_webtable(wp, (char *)"Last msg posted", ctime(&msgs.LastPosted));
+ fprintf(wp, "\n");
+ fprintf(wp, "
\n");
+ fprintf(wp, "
\n");
+ fprintf(wp, "Nodes Reference
\n");
+ }
+
fprintf(fp, " Area number %d\n", i);
fprintf(fp, " Area name %s\n", msgs.Name);
fprintf(fp, " Area tag %s\n", msgs.Tag);
@@ -1833,9 +1883,16 @@ int mail_area_doc(FILE *fp, FILE *toc, int page)
fprintf(fp, " Last msg rcvd. %s", ctime(&msgs.LastRcvd));
fprintf(fp, " Last msg posted %s", ctime(&msgs.LastPosted));
+ refs = 0;
for (j = 0; j < systems; j++) {
fread(&System, sizeof(sysconnect), 1, no);
if (System.aka.zone) {
+ if ((refs == 0) && (wp != NULL)) {
+ fprintf(wp, "\n");
+ fprintf(wp, "\n");
+ fprintf(wp, "\n");
+ }
+ refs++;
memset(&status, 0, 5);
memset(&status, '-', 4);
if (System.sendto)
@@ -1848,8 +1905,44 @@ int mail_area_doc(FILE *fp, FILE *toc, int page)
status[3] = 'C';
fprintf(fp, " Link %2d %s %s\n", j+1, status, aka2str(System.aka));
+ if (wp != NULL) {
+ sprintf(temp, "%s/etc/nodes.data", getenv("MBSE_ROOT"));
+ if ((ti = fopen(temp, "r"))) {
+ fread(&nodeshdr, sizeof(nodeshdr), 1, ti);
+ fseek(ti, 0, SEEK_SET);
+ fread(&nodeshdr, nodeshdr.hdrsize, 1, ti);
+ while ((fread(&nodes, nodeshdr.recsize, 1, ti)) == 1) {
+ fseek(ti, nodeshdr.filegrp + nodeshdr.mailgrp, SEEK_CUR);
+ for (k = 0; k < 20; k++) {
+ if ((nodes.Aka[k].zone == System.aka.zone) &&
+ (nodes.Aka[k].net == System.aka.net ) &&
+ (nodes.Aka[k].node == System.aka.node) &&
+ (nodes.Aka[k].point == System.aka.point) &&
+ (strcmp(nodes.Aka[k].domain, System.aka.domain) == 0)) {
+ fprintf(wp, "%s | %s | %s |
\n",
+ nodes.Aka[0].zone, nodes.Aka[0].net, nodes.Aka[0].node, nodes.Aka[0].point,
+ nodes.Aka[0].domain, aka2str(nodes.Aka[0]), status, nodes.Sysop);
+ }
+ }
+ }
+ fclose(ti);
+ }
+ }
}
}
+ if (wp != NULL) {
+ if (refs == 0)
+ fprintf(wp, "No Nodes References\n");
+ else {
+ fprintf(wp, "\n");
+ fprintf(wp, "
\n");
+ }
+ fprintf(wp, "
\n");
+ fprintf(wp, "Area Statistics
\n");
+ add_statcnt(wp, (char *)"received msgs", msgs.Received);
+ add_statcnt(wp, (char *)"posted msgs", msgs.Posted);
+ close_webdoc(wp);
+ }
fprintf(fp, "\n");
fprintf(fp, " Total This Month Last Month\n");
fprintf(fp, " ---------- ---------- ----------\n");
@@ -1860,6 +1953,9 @@ int mail_area_doc(FILE *fp, FILE *toc, int page)
fseek(no, msgshdr.syssize, SEEK_CUR);
}
+ fprintf(ip, "
\n");
+ close_webdoc(ip);
+
fclose(no);
return page;
}
diff --git a/mbsetup/m_menu.c b/mbsetup/m_menu.c
index 6b2ca48e..71240dde 100644
--- a/mbsetup/m_menu.c
+++ b/mbsetup/m_menu.c
@@ -34,6 +34,7 @@
#include "screen.h"
#include "ledit.h"
#include "m_lang.h"
+#include "m_global.h"
#include "m_menu.h"
@@ -580,7 +581,7 @@ void EditMenus(void)
int bbs_menu_doc(FILE *fp, FILE *toc, int page)
{
char *temp;
- FILE *no, *mn;
+ FILE *wp, *ip, *no, *mn;
DIR *dp;
struct dirent *de;
int j;
@@ -598,45 +599,83 @@ int bbs_menu_doc(FILE *fp, FILE *toc, int page)
fread(&langhdr, sizeof(langhdr), 1, no);
j =0;
+ ip = open_webdoc((char *)"menus.html", (char *)"BBS Menus", NULL);
+ fprintf(ip, "Main\n");
+
while ((fread(&lang, langhdr.recsize, 1, no)) == 1) {
+ fprintf(ip, "BBS Menus for %s
\n", lang.Name);
+ fprintf(ip, "\n");
+
if ((dp = opendir(lang.MenuPath)) != NULL) {
while ((de = readdir(dp))) {
if (de->d_name[0] != '.') {
j = 0;
+ fprintf(ip, "- %s
\n", lang.LangKey, de->d_name, de->d_name);
sprintf(temp, "%s/%s", lang.MenuPath, de->d_name);
fprintf(fp, "\n MENU %s (%s)\n\n", de->d_name, lang.Name);
if ((mn = fopen(temp, "r")) != NULL) {
- while (fread(&menus, sizeof(menus), 1, mn) == 1) {
- if (menus.MenuKey[0])
- fprintf(fp, " Menu select %s\n", menus.MenuKey);
- if (menus.AutoExec)
- fprintf(fp, " Menu select Autoexec\n");
- fprintf(fp, " Type %d %s\n", le_int(menus.MenuType), menus.TypeDesc);
- fprintf(fp, " Opt. data %s\n", menus.OptionalData);
- fprintf(fp, " Display %s\n", menus.Display);
- fprintf(fp, " Security %s\n", get_secstr(menus.MenuSecurity));
- fprintf(fp, " Minimum age %d\n", menus.Age);
- fprintf(fp, " Lo-colors %s on %s\n",
+ sprintf(temp, "menu_%s_%s.html", lang.LangKey, de->d_name);
+ if ((wp = open_webdoc(temp, lang.Name, de->d_name))) {
+ fprintf(wp, "Main Back\n");
+ while (fread(&menus, sizeof(menus), 1, mn) == 1) {
+ fprintf(wp, "\n");
+ fprintf(wp, "
\n");
+ fprintf(wp, "\n");
+ fprintf(wp, "\n");
+ if (menus.MenuKey[0]) {
+ fprintf(fp, " Menu select %s\n", menus.MenuKey);
+ add_webtable(wp, (char *)"Menu select", menus.MenuKey);
+ }
+ if (menus.AutoExec) {
+ fprintf(fp, " Menu select Autoexec\n");
+ add_webtable(wp, (char *)"Menu select", (char *)"Autoexec");
+ }
+ sprintf(temp, "%d %s", le_int(menus.MenuType), menus.TypeDesc);
+ add_webtable(wp, (char *)"Menu type", temp);
+ add_webtable(wp, (char *)"Optional data", menus.OptionalData);
+ add_webtable(wp, (char *)"Display", menus.Display);
+ web_secflags(wp, (char *)"Security level", menus.MenuSecurity);
+ add_webdigit(wp, (char *)"Minimum age", menus.Age);
+ add_colors(wp, (char *)"Normal colors", le_int(menus.ForeGnd), le_int(menus.BackGnd));
+ add_colors(wp, (char *)"Bright colors", le_int(menus.HiForeGnd), le_int(menus.HiBackGnd));
+ fprintf(fp, " Type %d %s\n", le_int(menus.MenuType), menus.TypeDesc);
+ fprintf(fp, " Opt. data %s\n", menus.OptionalData);
+ fprintf(fp, " Display %s\n", menus.Display);
+ fprintf(fp, " Security %s\n", get_secstr(menus.MenuSecurity));
+ fprintf(fp, " Minimum age %d\n", menus.Age);
+ fprintf(fp, " Lo-colors %s on %s\n",
get_color(le_int(menus.ForeGnd)), get_color(le_int(menus.BackGnd)));
- fprintf(fp, " Hi-colors %s on %s\n",
+ fprintf(fp, " Hi-colors %s on %s\n",
get_color(le_int(menus.HiForeGnd)), get_color(le_int(menus.HiBackGnd)));
- if (le_int(menus.MenuType) == 7) {
- fprintf(fp, " Door Name %s\n", menus.DoorName);
- fprintf(fp, " No door.sys %s", getboolean(menus.NoDoorsys));
- fprintf(fp, " Y2K door.sys %s", getboolean(menus.Y2Kdoorsys));
- fprintf(fp, " Use COM port %s\n", getboolean(menus.Comport));
- fprintf(fp, " Run nosuid %s", getboolean(menus.NoSuid));
- fprintf(fp, " No Prompt %s", getboolean(menus.NoPrompt));
- fprintf(fp, " Single user %s\n", getboolean(menus.SingleUser));
- fprintf(fp, " Hidden door %s\n", getboolean(menus.HideDoor));
- }
- fprintf(fp, "\n\n");
- j++;
- if (j == 4) {
- j = 0;
- page = newpage(fp, page);
- fprintf(fp, "\n");
+ if (le_int(menus.MenuType) == 7) {
+ add_webtable(wp, (char *)"Door Name", menus.DoorName);
+ add_webtable(wp, (char *)"No door.sys file", getboolean(menus.NoDoorsys));
+ add_webtable(wp, (char *)"Y2K format in door.sys", getboolean(menus.Y2Kdoorsys));
+ add_webtable(wp, (char *)"Use COM port", getboolean(menus.Comport));
+ add_webtable(wp, (char *)"Run nosuid", getboolean(menus.NoSuid));
+ add_webtable(wp, (char *)"No Prompt after door", getboolean(menus.NoPrompt));
+ add_webtable(wp, (char *)"Single user door", getboolean(menus.SingleUser));
+ add_webtable(wp, (char *)"Hidden door", getboolean(menus.HideDoor));
+ fprintf(fp, " Door Name %s\n", menus.DoorName);
+ fprintf(fp, " No door.sys %s", getboolean(menus.NoDoorsys));
+ fprintf(fp, " Y2K door.sys %s", getboolean(menus.Y2Kdoorsys));
+ fprintf(fp, " Use COM port %s\n", getboolean(menus.Comport));
+ fprintf(fp, " Run nosuid %s", getboolean(menus.NoSuid));
+ fprintf(fp, " No Prompt %s", getboolean(menus.NoPrompt));
+ fprintf(fp, " Single user %s\n", getboolean(menus.SingleUser));
+ fprintf(fp, " Hidden door %s\n", getboolean(menus.HideDoor));
+ }
+ fprintf(fp, "\n\n");
+ j++;
+ if (j == 4) {
+ j = 0;
+ page = newpage(fp, page);
+ fprintf(fp, "\n");
+ }
+ fprintf(wp, "\n");
+ fprintf(wp, "
\n");
}
+ close_webdoc(wp);
}
fclose(mn);
}
@@ -646,8 +685,12 @@ int bbs_menu_doc(FILE *fp, FILE *toc, int page)
}
closedir(dp);
}
+ fprintf(ip, "
\n");
+ fprintf(ip, "
\n");
}
+ close_webdoc(ip);
+
free(temp);
fclose(no);
return page;
diff --git a/mbsetup/mbsetup.c b/mbsetup/mbsetup.c
index 47a4c9b0..1b490852 100644
--- a/mbsetup/mbsetup.c
+++ b/mbsetup/mbsetup.c
@@ -184,6 +184,16 @@ void soft_info(void)
}
+int horiz;
+
+void dotter(void);
+void dotter(void)
+{
+ mvprintw(8, horiz++, (char *)".");
+ fflush(stdout);
+}
+
+
void site_docs(void);
void site_docs(void)
@@ -213,7 +223,7 @@ void site_docs(void)
set_color(WHITE, BLACK);
mvprintw( 5, 6, "21. CREATING SITEDOCS");
set_color(CYAN, BLACK);
- mvprintw( 7,11, (char *)"Erasing directory %s/doc/html", getenv("MBSE_ROOT"));
+ mvprintw( 7,11, (char *)"Erasing directory %s/doc/html", getenv("MBSE_ROOT"));
fflush(stdout);
sprintf(temp, "-r -f %s/doc/html", getenv("MBSE_ROOT"));
@@ -228,27 +238,18 @@ void site_docs(void)
fprintf(hp, " Modem Types\n");
fprintf(hp, " TTY Lines Info\n");
fprintf(hp, " Fidonet Nodes\n");
- fprintf(hp, " BBS Setup\n");
- fprintf(hp, " \n");
- fprintf(hp, " Mail Setup\n");
- fprintf(hp, " \n");
- fprintf(hp, " - Echomail Groups
\n");
- fprintf(hp, " - Echomail Areas
\n");
- fprintf(hp, "
\n");
- fprintf(hp, " File Echo's Setup\n");
- fprintf(hp, " \n");
- fprintf(hp, " - FileEcho Groups
\n");
- fprintf(hp, " - Fileecho Areas
\n");
- fprintf(hp, " - Hatch Manager
\n");
- fprintf(hp, " - Magic Files
\n");
- fprintf(hp, "
\n");
+ fprintf(hp, " BBS: Security Limits\n");
+ fprintf(hp, " BBS: Language Setup\n");
+ fprintf(hp, " BBS: BBS Menus\n");
+ fprintf(hp, " BBS: File Areas\n");
+ fprintf(hp, " BBS: Transfer Protocols\n");
+ fprintf(hp, " BBS: Oneliners\n");
+ fprintf(hp, " Mail: Echomail Groups\n");
+ fprintf(hp, " Mail: Echomail Areas\n");
+ fprintf(hp, " TIC: FileEcho Groups\n");
+ fprintf(hp, " TIC: Fileecho Areas\n");
+ fprintf(hp, " TIC: Hatch Manager\n");
+ fprintf(hp, " TIC: Magic Files\n");
fprintf(hp, " Newfiles Groups\n");
fprintf(hp, " Newfiles Reports\n");
fprintf(hp, " Filefind Setup\n");
@@ -263,24 +264,45 @@ void site_docs(void)
Syslog('+', "Can't create html documentation");
}
- mvprintw( 8,11, (char *)"Create document in file %s/doc/site.doc", getenv("MBSE_ROOT"));
+ mvprintw(8,11, (char *)"Creating site documents");
+ fflush(stdout);
+ horiz = 35;
page = global_doc(fp, toc, page);
+ dotter();
page = fido_doc(fp, toc, page);
+ dotter();
page = archive_doc(fp, toc, page);
+ dotter();
page = virus_doc(fp, toc, page);
+ dotter();
page = modem_doc(fp, toc, page);
+ dotter();
page = tty_doc(fp, toc, page);
+ dotter();
page = node_doc(fp, toc, page);
+ dotter();
page = bbs_doc(fp, toc, page);
+ dotter();
page = mail_doc(fp, toc, page);
+ dotter();
page = tic_doc(fp, toc, page);
+ dotter();
page = newf_group_doc(fp, toc, page);
+ dotter();
page = new_doc(fp, toc, page);
+ dotter();
page = ff_doc(fp, toc, page);
+ dotter();
page = service_doc(fp, toc, page);
+ dotter();
page = domain_doc(fp, toc, page);
+ dotter();
page = task_doc(fp, toc, page);
+ dotter();
page = route_doc(fp, toc, page);
+ clrtoeol();
+ mvprintw( 8,11, (char *)"Created site documents in %s/doc", getenv("MBSE_ROOT"));
+ fflush(stdout);
/*
* Append table of contents
diff --git a/mbsetup/mutil.c b/mbsetup/mutil.c
index e1130069..d6088551 100644
--- a/mbsetup/mutil.c
+++ b/mbsetup/mutil.c
@@ -237,3 +237,27 @@ void add_colors(FILE *fp, char *hstr, int fg, int bg)
}
+
+void add_statcnt(FILE *fp, char * hstr, statcnt st)
+{
+ fprintf(fp, "\n");
+ fprintf(fp, "\n");
+ fprintf(fp, "Weekdays overview of %s |
\n", hstr);
+ fprintf(fp, " | Sun | Mon | Tue | Wed | Thu | Fri | Sat | Total |
\n");
+ fprintf(fp, "This week | %ld | %ld | %ld | %ld | %ld | %ld | %ld | %ld |
\n", st.tdow[0], st.tdow[1], st.tdow[2], st.tdow[3], st.tdow[4], st.tdow[5], st.tdow[6], st.tweek);
+ fprintf(fp, "Last week | %ld | %ld | %ld | %ld | %ld | %ld | %ld | %ld |
\n", st.ldow[0], st.ldow[1], st.ldow[2], st.ldow[3], st.ldow[4], st.ldow[5], st.ldow[6], st.lweek);
+ fprintf(fp, "\n");
+ fprintf(fp, "
\n");
+ fprintf(fp, "\n");
+ fprintf(fp, "
\n");
+ fprintf(fp, "\n");
+ fprintf(fp, "Monthly overview of %s | Total ever |
\n", hstr);
+ fprintf(fp, "Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec |
\n");
+ fprintf(fp, "%ld | %ld | %ld | %ld | %ld | %ld | %ld | %ld | %ld | %ld | %ld | %ld | %ld |
\n",
+ st.month[0], st.month[1], st.month[2], st.month[3], st.month[4], st.month[5], st.month[6], st.month[7], st.month[8], st.month[0], st.month[10], st.month[11], st.total);
+ fprintf(fp, "\n");
+ fprintf(fp, "
\n");
+ fprintf(fp, "\n");
+}
+
+
diff --git a/mbsetup/mutil.h b/mbsetup/mutil.h
index 3e89e5b0..56aebb82 100644
--- a/mbsetup/mutil.h
+++ b/mbsetup/mutil.h
@@ -13,5 +13,6 @@ void close_webdoc(FILE *);
void add_webtable(FILE *, char *, char *);
void add_webdigit(FILE *, char *, int);
void add_colors(FILE *, char *, int, int);
+void add_statcnt(FILE *, char *, statcnt);
#endif