Source: nn
Version: 6.7.3-14
Severity: normal
Tags: patch

Dear Maintainer,

>From ad4779b0cafc962850b776c9dc1dfc6196c91e84 Mon Sep 17 00:00:00 2001
>From: Bjarni Ingi Gislason <bjarn...@rhi.hi.is>
>Date: Tue, 2 Mar 2021 21:46:59 +0000
>Subject: [PATCH] nntp.c: various additions and changes

  Add variable "nntp_debug_delay".

  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 <bjarn...@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
 */
 
-- 
2.30.1



-- System Information:
Debian Release: bullseye/sid
  APT prefers testing
  APT policy: (500, 'testing'), (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 5.10.9-1 (SMP w/2 CPU threads)
Locale: LANG=is_IS.iso88591, LC_CTYPE=is_IS.iso88591 (charmap=ISO-8859-1), 
LANGUAGE not set
Shell: /bin/sh linked to /bin/dash
Init: sysvinit (via /sbin/init)

-- debconf information excluded

-- 
Bjarni I. Gislason

Reply via email to