#983288 db.c: add subroutine "readpartactfile"

Package:
src:nn
Source:
nn
Submitter:
Bjarni Ingi Gislason
Date:
2021-02-21 23:09:04 UTC
Severity:
normal
Tags:
#983288#5
Date:
2021-02-21 23:05:11 UTC
From:
To:
Dear Maintainer,
---
 db.c | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 120 insertions(+)

diff --git a/db.c b/db.c
index 4278dda..99c2695 100644
--- a/db.c
+++ b/db.c
@@ -44,6 +44,7 @@ static void     db_init_group(group_header * gh, int num);
 static void     db_init_active(group_header * gh);
 static void     readtimfile(void);
 static void     readactfile(void);
+static void     readpartactfile(void);
 static void
 db_fixup_cross_postings(data_header * dhp,
 			data_dynamic_data * ddp,
@@ -1112,6 +1113,125 @@ readactfile(void)

 }

+
+static void
+readpartactfile(void)
+{
+    char            *cp;
+    char            actline[512];
+    char            newsrcline[256];
+    int             count = 0;
+    int             i, n;
+    FILE           *actfp;
+    stlist_t       *sthead, *stp = NULL;
+    int             get_group_line(const char *, char *, size_t);
+    extern char    *newsrc_file;
+    static FILE    *f_user = NULL;
+    extern int      nntp_debug;
+
+    if (actlist != NULL)
+	return;
+
+    if (newsrc_file == NULL)
+	newsrc_file = home_relative(".newsrc");
+
+    actfp = fopen(newsrc_file, "r");
+
+    if (actfp == NULL) {
+	nn_exitmsg(1, "could not open .newsrc file %s\n", newsrc_file);
+    }
+
+    /*
+     * Snarf all of active up in first pass.  This gives us a count of the
+     * groups we can use for internal tables.
+     */
+    sthead = NULL;
+    gotoxy(0, 3);
+    tprintf("Reading active file for groups in %s ... ", newsrc_file);
+    fflush(stdout);
+    strcpy(actline, "GROUP ");
+
+    if (nntp_debug) {
+	if (f_user == NULL) {
+/*            f_user = open_file(relative(nn_directory, "partial_active_file"), OPEN_CREATE);*/
+            f_user = open_file(relative(active_directory, "partial_active_file"), OPEN_CREATE);
+	    if (f_user == NULL) {
+		msg("Could not open file in the %s directoy for writing the active file\n", nn_directory);
+	    }
+	}
+    }
+    while (fgets(newsrcline, sizeof newsrcline, actfp))
+
+    {
+/* Get the group name from the .newsrc file and the data with the GROUP
+   nntp command.  Data in actline should be the same as from the "LIST"
+   command group: last first p
+*/
+	if ((cp = strchr(newsrcline, ':')) == NULL)
+	    continue;
+	*cp = NUL;
+	n = get_group_line(newsrcline, actline, sizeof actline);
+
+	if (n != OK_GROUP) {
+		msg("newsrc-group %s is not on server", newsrcline);
+		continue;
+	}
+	if (nntp_debug  && (f_user != NULL))
+	    fprintf(f_user, "%s\n", actline);
+
+/*	    tprintf("%s\n", actline);
+	nn_exitmsg(1, "Testing ask_server\n");
+*/
+	stlist_t       *stnew = (stlist_t *) strkeep(actline, sizeof(stlisthdr_t), POOL_ACT);
+	if (stnew == NULL) {
+	    nn_exitmsg(1, "Out of memory for active file (at line %d)\n", count + 1);
+	}
+	if (sthead != NULL) {
+	    stp->n.next = stnew;
+	    stp = stnew;
+	} else {
+	    sthead = stnew;
+	    stp = sthead;
+	}
+	count++;
+    }
+    stp->n.next = NULL;
+
+    if (!use_nntp)
+	(void) fclose(actfp);
+
+    actlist = (char **) calloc(count + 1, sizeof(char *));
+    grplist = (char **) calloc(count + 1, sizeof(char *));
+    if (grplist == NULL) {
+	nn_exitmsg(1, "can't create active or group list (%d entries)\n",
+		   count + 1);
+    }
+
+    /*
+     * Second pass (in core): Put active lines and group names into string
+     * arrays.
+     */
+
+    for (i = 0, stp = sthead; stp && i < count; stp = stp->n.next, i++) {
+	char           *p = strchr(stp->str, ' ');
+
+	if (p == NULL)
+	    actlist[i] = NULL;
+	else {
+	    *p++ = NUL;
+	    actlist[i] = p;
+	}
+	grplist[i] = strkeep(stp->str, 0, POOL_GRP);
+    }
+    tprintf("done.  %d groups.\n\n", count);
+    actlist[count] = NULL;
+    grplist[count] = NULL;
+
+    /* init the master struct */
+    clearobj(&master, sizeof(master), 1);
+    master.number_of_groups = count;
+}
+
 #endif				/* NOV */