#983894 nntp.c: various additions and changes

Package:
src:nn
Source:
nn
Submitter:
Bjarni Ingi Gislason
Date:
2021-03-02 22:42:04 UTC
Severity:
normal
Tags:
#983894#5
Date:
2021-03-02 22:38:56 UTC
From:
To:
Dear Maintainer,

  Add FILE "*f_user".

  Append to "nnmaster.log", not just create it.

  Add debug information.

  Add "server_port()" to get the name of the mail server and the port
number, if provided.

  Change some return values to more different values in the function
"connect_server()".

  Make a new directory "active_directory" for ACTIVE, instead of
"nn_directory".

  Change the "XOVER" command to "OVER" (RFC 3977 (2006)).

  Use the text "not-for-mail" instead of the deprecated
"passwd->pw_name" (login name) after "Path: " in sent articles
(RFC 5536 (2009).

  Use "tolower()" if "HAVE_8BIT_CTYPE" (in conf/s-....h) is defined.

Signed-off-by: Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
---
 nntp.c | 128 +++++++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 98 insertions(+), 30 deletions(-)

diff --git a/nntp.c b/nntp.c
index 29a3ffa..43093b8 100644
--- a/nntp.c
+++ b/nntp.c
@@ -50,7 +50,7 @@
 #include <strings.h>

 #ifndef EXCELAN
-#include <netdb.h>
+#include <netdb.h>	/* h_addr = h_addr_list[0] */
 #endif

 #include <errno.h>
@@ -122,6 +122,7 @@ char           *nntp_user, *nntp_password;	/* so can set on command line */

 int             nntp_local_server = 0;
 int             nntp_debug = 0;
+int	        nntp_debug_delay = 3;

 extern char    *home_directory;
 extern int      silent;
@@ -168,10 +169,11 @@ static void
 debug_msg(char *prefix, char *str)
 {
     static FILE    *f = NULL;
+    static FILE    *f_user = NULL;

     if (who_am_i == I_AM_MASTER) {
 	if (f == NULL) {
-	    f = open_file(relative(tmp_directory, "nnmaster.log"), OPEN_CREATE);
+	    f = open_file(relative(tmp_directory, "nnmaster.log"), OPEN_APPEND);
 	    if (f == NULL) {
 		nntp_debug = 0;
 		return;
@@ -182,7 +184,16 @@ debug_msg(char *prefix, char *str)
 	return;
     }
     msg("NNTP%s %s", prefix, str);
-    user_delay(3);
+    user_delay(nntp_debug_delay);
+    if (f_user == NULL) {
+	f_user = open_file(relative(nn_directory, "nn.log"), OPEN_APPEND);
+	if (f_user == NULL) {
+	    nntp_debug = 0;
+	    return;
+	}
+    }
+    fprintf(f_user, "%s %s\n", prefix, str);
+    fflush(f_user);
 }


@@ -199,6 +210,7 @@ find_server(void)
     char           *cp, *name;
     char            buf[BUFSIZ];
     FILE           *fp;
+    void server_port(char *);

     /*
      * This feature cannot normally be enabled, because the database and the
@@ -214,11 +226,12 @@ find_server(void)
      * worry about keeping his .newsrc straight.
      */
     if ((cp = getenv("NNTPSERVER")) != NULL) {
-	nntp_server = cp;
+	server_port(cp);
 	return;
-    } else if (*nntp_server != '/')
-	return;			/* variable was set on cmd line, or in init
-				 * file */
+    } else if (*nntp_server != '/') {
+	server_port(nntp_server);
+	return;			/* variable was set on cmd line, or in init */
+    }				/* file */
 #endif				/* NOV */

     name = nntp_server;		/* default, or variable was set to a filename */
@@ -230,8 +243,12 @@ find_server(void)
 	    if ((cp = strchr(buf, '\n')) != 0)
 		*cp = '\0';
 	    nntp_server = strdup(buf);
-	    if (!nntp_server)
+	    if (!nntp_server) {
 		sys_error("Failed to allocate space for name of NNTP server!");
+	    } else {
+		server_port(nntp_server);
+	    }
+
 	    fclose(fp);
 	    return;
 	}
@@ -252,10 +269,12 @@ find_server(void)
  *	If error and master, then return -1, else terminate.
  */

+static int retry = 0; /* =2 */
+
 static int
 get_server_line(register char *string, register int size)
 {
-    int             retry = 2;
+//    int             retry = 2;

     while (fgets(string, size, nntp_in) == NULL)
 	retry = (reconnect_server(retry));
@@ -354,19 +373,29 @@ get_socket(void)
 	memmove((char *) &sin.sin_addr, *cp, hp->h_length);
 #endif				/* NO_MEMMOVE */

+	if (nntp_debug) {
+	    sprintf(string, "trying to connect to port %u", ntohs(sin.sin_port));
+	    debug_msg("<<<", string);
+	}
+
 	/* Quick hack to work around interrupting system calls.. */
 	while ((x = connect(s, (struct sockaddr *) & sin, sizeof(sin))) < 0 &&
 	       errno == EINTR)
 	    sleep(1);
 	if (x == 0)
 	    break;
-	if (who_am_i != I_AM_MASTER)
-	    msg("Connecting to %s failed: %s", nntp_server, strerror(errno));
+	if (who_am_i != I_AM_MASTER) {
+	    msg("Connecting to %s on port %d failed: %s\n", nntp_server,
+		ntohl(sin.sin_port), strerror(errno));
+	}
 	(void) close(s);
 	s = -1;
     }
-    if (x < 0)
-	sys_warning("Giving up on NNTP server %s!", nntp_server);
+    if (x < 0) {
+	sys_warning("get_socket: Giving up on NNTP server %s with\
+ connect return = %d and errno = %d (%s)", nntp_server, x, errno,
+		     strerror(errno));
+    }
 #else	/* h_addr */		/* no name server */

 #ifdef EXCELAN
@@ -391,7 +420,9 @@ get_socket(void)
 #ifdef NO_MEMMOVE
     bcopy(hp->h_addr, (char *) &sin.sin_addr, hp->h_length);
 #else
-    memmove((char *) &sin.sin_addr, hp->h_addr, hp->h_length);
+/*    memmove((char *) &sin.sin_addr, hp->h_addr, hp->h_length); */
+/* h_addr = h_addrd_list[0] */
+    memmove((char *) &sin.sin_addr, hp->h_addr_list[0], hp->h_length);
 #endif				/* NO_MEMMOVE */

     if (connect(s, (struct sockaddr *) & sin, sizeof(sin)) < 0)
@@ -435,7 +466,7 @@ static int
 connect_server(void)
 {
     int             sockt_rd, sockt_wr;
-    int             response;
+    int             response = -255;
     int             triedauth = 0;
     char            line[NNTP_STRLEN];

@@ -454,17 +485,21 @@ connect_server(void)

     if ((nntp_in = fdopen(sockt_rd, "r")) == NULL) {
 	close(sockt_rd);
-	return -1;
+	return -2;
     }
     sockt_wr = dup(sockt_rd);
     if ((nntp_out = fdopen(sockt_wr, "w")) == NULL) {
 	close(sockt_wr);
 	fclose(nntp_in);
 	nntp_in = NULL;		/* from above */
-	return -1;
+	return -3;
     }
     /* Now get the server's signon message */
     response = get_server(line, sizeof(line));
+    if (response != OK_CANPOST) {
+	log_entry('N', "%s: %i; response = %i, line = %s\n", __func__,
+	__LINE__, response, line);
+    }

     if (who_am_i == I_AM_MASTER) {
 	if (response != OK_CANPOST && response != OK_NOPOST) {
@@ -472,7 +507,7 @@ connect_server(void)
 	    log_entry('N', "Response: %s", line);
 	    fclose(nntp_out);
 	    fclose(nntp_in);
-	    return -1;
+	    return -4;
 	}
     } else if (reconnecting && need_auth) {
 	nntp_doauth();
@@ -568,13 +603,18 @@ reconnect_server(int retry)
     reconnecting = 1;
     strcpy(buf, last_put);
     nntp_close_server();
-    if (connect_server() < 0) {
+    if ((connect_server_return = connect_server()) < 0) {
 	if (nntp_debug)
 	    debug_msg("failed to connect", "");
-	if (retry > 0)
+	if (retry > 0) {
+	    log_entry('N', "%s: %i; retry = %i, return value of\
+ connect_server = %i\n", __func__, __LINE__, retry, connect_server_return);
 	    return (retry);
-	else
-	    nn_exitmsg(1, "failed to reconnect to server");
+	}
+	else {
+	    nn_exitmsg(1, "failed to reconnect to server, connect_server = %i, retry = %i",
+			connect_server, retry);
+	}
     }
     if (group_hd)
 	if (nntp_set_group(group_hd) < 1)
@@ -652,7 +692,8 @@ ask_server(char *fmt,...)
      */

     if (response == ERR_TIMEOUT) {
-	(void) reconnect_server(1);
+	retry = 1;
+	(void) reconnect_server(retry);
 	response = get_server(ask_reply, sizeof(ask_reply));
     }
     if (response == ERR_NEEDAUTH) {
@@ -930,7 +971,7 @@ nntp_check(void)
     if ((hp = gethostbyname(nntp_server)) != NULL)
 	server_real_name = hp->h_name;
     else
-	nn_exitmsg(1, "NNTPSERVER is invalid");
+	nn_exitmsg(1, "NNTPSERVER \"%s\" is invalid", nntp_server);
 #ifdef USE_SPOOL
     use_nntp = (strcasecmp(host, server_real_name) != 0);
 #else /* USE_SPOOL */
@@ -943,7 +984,8 @@ nntp_check(void)
 #ifndef NOV
 	news_active = mk_file_name(db_directory, "ACTIVE");
 #else				/* NOV */
-	news_active = mk_file_name(nn_directory, "ACTIVE");
+/*	news_active = mk_file_name(nn_directory, "ACTIVE"); */
+	news_active = mk_file_name(active_directory, "ACTIVE");
 #endif				/* NOV */
     }
 }
@@ -1000,7 +1042,7 @@ nntp_get_active(void)
     FILE           *old, *new;
     char            bufo[NNTP_STRLEN], bufn[NNTP_STRLEN];
     char           *new_name;
-    int             same, n;
+    int             fd, same, n;

     if (who_am_i != I_AM_MASTER)
 	return access(news_active, 4);
@@ -1365,14 +1407,14 @@ nntp_get_overview(group_header * gh, article_number first, article_number last)
 	    return NULL;
     }

-    n = ask_server("XOVER %d-%d", first, last);
+    n = ask_server("OVER %d-%d", first, last);
     switch (n) {

 	case OK_NOV:
 	    return novstream(nntp_in);

 	default:
-	    log_entry('N', "XOVER response: %d", n);
+	    log_entry('N', "OVER response is %d for group %s", n, gh->group_name);
 	    return NULL;

     }
@@ -1524,6 +1566,7 @@ static void
 gen_frompath(void)
 {
     struct passwd  *passwd;
+    char message[NNTP_STRLEN];

     passwd = getpwuid(getuid());

@@ -1534,12 +1577,27 @@ gen_frompath(void)
 	    passwd->pw_name,
 	    domain);

+    if (nntp_debug) {
+	snprintf(message, NNTP_STRLEN, "From: %s <%s@%s>",full_name(), passwd->pw_name, domain);
+	debug_msg(">>>", message);
+    }
+
+
 #ifdef HIDDENNET
     /* Only the login name - nntp server will add uucp name */
-    fprintf(nntp_out, "Path: %s\r\n", passwd->pw_name);
+    /* login name is deprecated */
+    fprintf(nntp_out, "Path: not-for-mail\r\n");
+
+    if (nntp_debug) {
+	snprintf(message, NNTP_STRLEN, "Path: not-for-mail");
+    }
 #else				/* HIDDENNET */
-    fprintf(nntp_out, "Path: %s!%s\r\n", host_name, passwd->pw_name);
+    fprintf(nntp_out, "Path: %s!%s\r\n", host_name, "not-for-mail");
+    if (nntp_debug)
+	snprintf(message, NNTP_STRLEN, "Path: %s!%s", host_name, "not-for-mail");
 #endif				/* HIDDENNET */
+    if (nntp_debug)
+	debug_msg(">>>", message);
 }


@@ -1560,8 +1618,12 @@ gen_frompath(void)
 static char
 lower(register char c)
 {
+#ifndef HAVE_8BIT_CTYPE
     if (isascii(c) && isupper(c))
 	c = c - 'A' + 'a';
+    else
+#endif
+        c = tolower(c);
     return (c);
 }

@@ -1696,10 +1758,15 @@ nntp_post(char *temp_file)
 	    break;
 	case ERR_POSTFAIL:
 	    msg("Article not accepted by server; not posted.");
+	    log_entry('W', "Article not accepted by server; not posted.");
 	    user_delay(2);
+	    msg("Answer: %s", ask_reply);
+	    log_entry('W', "Answer: %s", ask_reply);
+	    user_delay(5);
 	    return 1;
 	default:
 	    msg("Remote error: %s", ask_reply);
+	    log_entry('E', "Remote error: %s", ask_reply);
 	    user_delay(2);
 	    return 1;
     }
@@ -1736,6 +1803,7 @@ strdup(char *str)
 #endif				/* NeXT */

 #endif				/* NNTP */
+
 /* Get the group line for a newsgroup
 */