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
*/