diff -u old-trn-3.6/Configure new-trn-3.6/Configure --- old-trn-3.6/Configure 1994-11-08 02:35:17.000000000 +0100 +++ new-trn-3.6/Configure 2006-08-08 20:16:14.000000000 +0200 @@ -65,11 +65,11 @@ done export PATH -: Some sanity checks -if test ! -t 0; then - echo "Say 'sh Configure', not 'sh %s\n", buf) FLUSH; #endif +/* fprintf(stderr,"command_buf: %s last_comm: %s\n",buf, last_command); */ #if defined(NNTP_HANDLE_TIMEOUT) || defined(NNTP_HANDLE_AUTH_ERR) strcpy(last_command, buf); + if ( strncmp(buf,"GROUP",5) == 0 ) { + strcpy(last_group_command, buf); + } #endif - fprintf(ser_wr_fp, "%s\r\n", buf); - fflush(ser_wr_fp); + while(1) { + res=fprintf(ser_wr_fp, "%s\r\n", buf); +/* fprintf(stderr,"res: %d\n",res); */ + res=fflush(ser_wr_fp); + if ( res == -1 ) { + /* nntp_error("\nUnexpected close of server socket, reconnecting in nc "); */ + nntp_error("\nReconnecting in nntp_command "); + res=server_init(1); + if ( res == -1 ) { + nntp_error("failed\n"); + finalize(1); + } + else { + res=fprintf(ser_wr_fp, "%s\r\n", last_group_command); + res=fflush(ser_wr_fp); +fprintf(stderr,"wrote last group: %s\n",last_group_command); + nntp_check(FALSE); + res=fprintf(ser_wr_fp, "%s\r\n", last_command); + res=fflush(ser_wr_fp); +fprintf(stderr,"wrote last comm: %s\n",last_command); + nntp_error("sucessful\n"); + break; + } + } + else { + break; + } + } } #ifdef NNTP_HANDLE_TIMEOUT @@ -114,6 +146,7 @@ bool_int strict; { int n; + int res; #ifdef HAS_SIGHOLD sighold(SIGINT); @@ -124,12 +157,15 @@ #endif if (n < 0) { nntp_close(FALSE); - nntp_error("\nUnexpected close of server socket.\n"); -#ifdef NNTP_ERROR_IS_FATAL - finalize(1); -#else - return NNTP_CLASS_FATAL; -#endif + nntp_error("\nUnexpected close of server socket, reconnecting in nntp_check "); + res=server_init(1); + if ( res == -1 ) { + nntp_error("failed\n"); + finalize(1); + } + else { + nntp_error("sucessful\n"); + } } n = strlen(ser_line); if (n >= 2 && ser_line[n-1] == '\n' && ser_line[n-2] == '\r') @@ -176,7 +212,7 @@ #endif if (n < 0) { nntp_close(FALSE); - nntp_error("\nUnexpected close of server socket.\n"); + nntp_error("\nUnexpected close of server socket 2.\n"); #ifdef NNTP_ERROR_IS_FATAL finalize(1); #else diff -u old-trn-3.6/nntpclient.h new-trn-3.6/nntpclient.h --- old-trn-3.6/nntpclient.h 1994-11-19 07:01:23.000000000 +0100 +++ new-trn-3.6/nntpclient.h 2006-08-13 16:38:03.000000000 +0200 @@ -7,7 +7,7 @@ #ifdef USE_NNTP -int server_init _((char*)); +int server_init _((int)); int nntp_connect _((bool_int)); void nntp_command _((char*)); @@ -51,6 +51,7 @@ #if defined(NNTP_HANDLE_TIMEOUT) || defined(USE_GENAUTH) EXT char last_command[NNTP_STRLEN]; +EXT char last_group_command[NNTP_STRLEN]; #endif EXT bool CompliantServer INIT(FALSE); diff -u old-trn-3.6/nntpinit.c new-trn-3.6/nntpinit.c --- old-trn-3.6/nntpinit.c 1994-11-19 07:01:24.000000000 +0100 +++ new-trn-3.6/nntpinit.c 2007-12-31 14:47:08.000000000 +0100 @@ -23,6 +23,7 @@ #ifdef USE_NNTP +#include #include #include #ifdef NONETDB @@ -48,10 +49,39 @@ int get_tcp_socket _((char *machine)); int -server_init(server) -char *server; +server_init(reconn) +int reconn; { int sockt_rd, sockt_wr; + char *server, filebuf[128]; + + if ((server = getenv("NNTPSERVER")) == Nullch) + server = SERVER_NAME; + if (server[0] == '/') { + register FILE *fp; + if ((fp = fopen(server, "r")) != Nullfp) { + server = Nullch; + while (fgets(filebuf, sizeof filebuf, fp) != Nullch) { + if (*filebuf == '\n' || *filebuf == '#') + continue; + if ((server = index(filebuf, '\n')) != Nullch) + *server = '\0'; + server = filebuf; + break; + } + fclose(fp); + } else + server = Nullch; + if (server == Nullch) { + sprintf(ser_line, "\ +Couldn't get name of news server from %s\n\ +Either fix this file, or put NNTPSERVER in your environment.\n", SERVER_NAME); + nntp_init_error(ser_line); + return 0; + } + } + + { #ifdef DECNET char *cp; @@ -65,6 +95,21 @@ #else /* !DECNET */ sockt_rd = get_tcp_socket(server); #endif + } + + /* printf("after get_tcp_socket: sockt_rd: %d\n",sockt_rd); */ + + { + struct sigaction act_ignore; + int res; + + act_ignore.sa_handler = SIG_IGN; + res=sigaction(SIGPIPE, &act_ignore, NULL); + if ( res == -1 ) { + perror("sigact"); + return -1; + } + } if (sockt_rd < 0) return -1; @@ -87,6 +132,10 @@ /* Now get the server's signon message */ nntp_check(FALSE); + if ( reconn == 1 ) { + return atoi(ser_line); + } + if (*ser_line == NNTP_CLASS_OK) { char line2[NNTP_STRLEN]; /* Send an XMODE READER command to see if this is a compliant @@ -110,6 +159,107 @@ return atoi(ser_line); } +/* new style, v6 ready, from getaddrinfo(3) */ +int +get_tcp_socket(server) +char *server; +{ +#define CONNECT_TIMEOUT 4 + struct addrinfo hints, *res, *res0; + int error; + int s; + const char *cause = NULL; + int i; + int flags; + int cnt = 0; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + error=getaddrinfo(server, "nntp", &hints, &res0); + if (error) { + errx(1, "huhu %s", gai_strerror(error)); + /*NOTREACHED*/ + } + + s = -1; + for (res = res0; res; res = res->ai_next) { + s = socket(res->ai_family, res->ai_socktype, res->ai_protocol); + if (s < 0) { + cause = "socket"; + continue; + } + i = fcntl(s, F_SETFL, O_NONBLOCK); + if ( i == -1 ) { + cause = "fcntl"; + close(s); + s = -1; + continue; + } + + /* if connection cant be established in the first few seconds, abort */ + cnt = 0; + while ( cnt < CONNECT_TIMEOUT ) { + i = connect(s, res->ai_addr, res->ai_addrlen); + if ( i == -1 ) { + if ( errno == EINPROGRESS ) { + /* printf("1st: %d\n",cnt); */ + sleep(1); + cnt++; + continue; + } + else if ( errno == EALREADY ) { + /* printf("cnt: %d\n",cnt); */ + sleep(1); + cnt++; + continue; + } + else if ( errno != EISCONN ) { + cause = "connect"; + close(s); + s = -1; + break; + } + else { + break; + } + } + /* printf("connected: %d\n",errno); */ + } + break; /* okay we got one */ + } + /* printf("after loop: cnt: %d s: %d\n",cnt,s); */ + if ( cnt == CONNECT_TIMEOUT ) { + printf("connect: short-timeout\n"); + close(s); + finalize(1); + } + if (s < 0) { + printf("%s: %s\n", cause, strerror(errno)); + finalize(1); + } + /* O_NONBLOCK rueckgaengig machen */ + flags = fcntl(s, F_GETFL, 0); + if ( flags == -1 ) { + printf("fcntl-get: %s\n", strerror(errno)); + close(s); + finalize(1); + } + /* printf("flags: %d\n",flags); */ + i = fcntl(s, F_SETFL, flags ^ O_NONBLOCK ); + if ( i == -1 ) { + printf("fcntl-reset: %s\n", strerror(errno)); + close(s); + finalize(1); + } + freeaddrinfo(res0); + + return(s); + +} + +/* old style */ +#if 0 int get_tcp_socket(server) char *server; @@ -158,7 +308,7 @@ hp = &def; } if (hp == NULL) { - fprintf(stderr, "%s: Unknown host.\n", server); + fprintf(stderr, "%s: Unknown host 1.\n", server); return -1; } @@ -211,13 +361,13 @@ /* set up addr for the connect */ if ((sin.sin_addr.s_addr = rhost(&server)) == -1) { - fprintf(stderr, "%s: Unknown host.\n", server); + fprintf(stderr, "%s: Unknown host 2.\n", server); return -1; } /* And then connect */ if (connect(s, (struct sockaddr *)&sin) < 0) { - perror("connect"); + perror("connect failed"); (void) close(s); return -1; } @@ -255,6 +405,8 @@ #endif return s; } +#endif +/* old style */ #ifdef DECNET int @@ -280,7 +432,7 @@ break; default: if ((np = getnodebyname(server)) == NULL) { - fprintf(stderr, "%s: Unknown host.\n", server); + fprintf(stderr, "%s: Unknown host 3.\n", server); return -1; } else { bcopy(np->n_addr, (char *) sdn.sdn_add.a_addr, np->n_length); diff -u old-trn-3.6/rt-util.c new-trn-3.6/rt-util.c --- old-trn-3.6/rt-util.c 1994-11-02 03:44:01.000000000 +0100 +++ new-trn-3.6/rt-util.c 2002-12-30 15:04:18.000000000 +0100 @@ -511,6 +511,7 @@ 0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF }; +/* int strcasecmp(s1, s2) register char *s1, *s2; @@ -535,6 +536,7 @@ } return 0; } +*/ #endif /* Modified version of a spinner originally found in Clifford Adams' strn. */ diff -u old-trn-3.6/rt-util.h new-trn-3.6/rt-util.h --- old-trn-3.6/rt-util.h 1994-10-04 23:38:36.000000000 +0100 +++ new-trn-3.6/rt-util.h 2002-12-30 14:35:45.000000000 +0100 @@ -11,8 +11,8 @@ char *compress_subj _((ARTICLE*,int)); char *get_subject_start _((char*)); #ifndef HAS_STRCASECMP -int strcasecmp _((char*,char*)); -int strncasecmp _((char*,char*,int)); +/*int strcasecmp _((char*,char*)); */ +/*#int strncasecmp _((char*,char*,int));*/ #endif EXT char spin_char INIT(' '); /* char to put back when we're done spinning */ diff -u old-trn-3.6/term.c new-trn-3.6/term.c --- old-trn-3.6/term.c 1994-11-21 04:29:20.000000000 +0100 +++ new-trn-3.6/term.c 2007-12-31 11:19:06.000000000 +0100 @@ -75,6 +75,17 @@ void term_init() { + +#ifdef I_TERMIO + /* printf("having I_TERMIO\n"); */ +#else +# ifdef I_TERMIOS + /* printf("having I_TERMIOS\n"); */ +# else + /* printf("the-else-case\n"); */ +# endif +#endif + savetty(); /* remember current tty state */ #ifdef I_TERMIO