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