home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
unix
/
volume14
/
nntp1.5
/
patch3
< prev
next >
Wrap
Text File
|
1989-03-03
|
7KB
|
287 lines
Description:
1. Under the history mechanism that does not use DBM, files are not
closed following use. This causes the process to run of file
descriptors & nntpd to abort. The nntp log file will show this with
"No more files" messages.
2. There was no graceful way for any version of nntp to stop a transfer
when there was no space left in the news SPOOLDIR. This can cause
many aborted connections and sometimes lost news
Repeat by:
1. Make nntpd for a system that does not use the DBM form of the
history file. Watch the nntp log during a large transfer of
articles from another feed site. Notice the "No more files"
messages after about 20 articles transfer.
2. Fill up the news SPOOLDIR and then watch the nntp log file as more
articles come in.
Fix:
Apply the following patches after you have change directory to nntp.1.5.
Then rebuild nntpd and reinstall. To use the space detection feature, you
must have MINFREE defined in defs.h of your _news_ sources. News 2.11 is
assumed to be your current release of netnews.
Index: server/misc.c
*** server/misc.c Fri May 6 18:36:16 1988
--- ../../nntp_gazette/server/misc.c Sun Sep 18 20:57:51 1988
***************
*** 218,224 ****
(void) strcpy(path, spooldir);
(void) strcat(path, "/");
(void) strcat(path, tmp);
!
return (path);
}
--- 218,226 ----
(void) strcpy(path, spooldir);
(void) strcat(path, "/");
(void) strcat(path, tmp);
! #ifdef USGHIST
! (void) fclose(hfp);
! #endif
return (path);
}
***************
*** 583,588 ****
--- 585,591 ----
}
#endif USGHIST
#ifdef USG
+ #ifndef GAZETTE
bcopy(s, d, l)
register char *s, *d;
register int l;
***************
*** 613,618 ****
--- 616,622 ----
while (l-- > 0)
*p++ = 0;
}
+ #endif
dup2(x,y)
int x,y;
***************
*** 619,623 ****
--- 623,647 ----
{
close(y);
return(fcntl(x, F_DUPFD,y ));
+ }
+
+ #include <ustat.h>
+ /*
+ * determine if there is enough free space on the device
+ * return 0 if there is and
+ * anything appropriate if there is not
+ * written by Stan Barber (sob@soma.bcm.tmc.edu)
+ */
+ int
+ space()
+ {
+ struct stat file;
+ struct ustat device;
+ if (stat(SPOOLDIR,&file))
+ return(-1); /* can't stat spool */
+ if (ustat(file.st_dev, &device))
+ return(-2); /* can't stat the device */
+ if(device.f_tfree < MINFREE) return(-3);
+ return(0);
}
#endif USG
Index: server/main.c
*** server/main.c Fri May 6 18:36:15 1988
--- ../../nntp_gazette/server/main.c Sun Sep 18 20:58:25 1988
***************
*** 33,38 ****
--- 33,43 ----
/* fd 0-2 should be open and point to / now. */
+ /* Let's close all the other FD's just to be sure */
+ for(sockt = 3; sockt < 40; sockt++)
+ (void) close(sockt);
+
+ #ifndef FAKESYSLOG
#ifdef SYSLOG
#ifdef BSD_42
openlog("nntpd", LOG_PID); /* fd 3 */
***************
*** 40,45 ****
--- 45,51 ----
openlog("nntpd", LOG_PID, SYSLOG); /* fd 3 */
#endif
#endif
+ #endif
#ifdef FASTFORK
num_groups = read_groups(); /* Read active file now (fd 4) */
***************
*** 71,78 ****
continue;
#ifdef USG
(void) signal(SIGCLD, SIG_IGN);
! #endif
bzero((char *)&from,sizeof(from));
client = accept(sockt, &from);
#else
length = sizeof (from);
--- 77,86 ----
continue;
#ifdef USG
(void) signal(SIGCLD, SIG_IGN);
! memset((char *)&from,'\0',sizeof(from));
! #else
bzero((char *)&from,sizeof(from));
+ #endif
client = accept(sockt, &from);
#else
length = sizeof (from);
***************
*** 109,115 ****
--- 117,128 ----
#ifdef EXCELAN
if (fork())
exit(0);
+ #ifdef USG
+ (void * )memcpy(¤t_peer,&from,
+ sizeof(from));
+ #else
bcopy(&from,¤t_peer,sizeof(from));
+ #endif
make_stdio(sockt);
#else
(void) close(sockt);
Index: server/serve.c
*** server/serve.c Fri May 6 18:36:17 1988
--- ../../nntp_gazette/server/serve.c Sun Sep 18 20:59:02 1988
***************
*** 74,79 ****
--- 74,81 ----
double user, sys;
#ifdef USG
time_t start, finish;
+ extern int space();
+ int out_of_space;
#else not USG
struct timeval start, finish;
#endif not USG
***************
*** 103,114 ****
/* If we're ALONE, then we've already opened syslog */
! #ifndef ALONE
! # ifdef SYSLOG
! # ifdef BSD_42
openlog("nntpd", LOG_PID);
! # else
openlog("nntpd", LOG_PID, SYSLOG);
# endif
# endif
#endif
--- 105,118 ----
/* If we're ALONE, then we've already opened syslog */
! #ifndef FAKESYSLOG
! # ifndef ALONE
! # ifdef SYSLOG
! # ifdef BSD_42
openlog("nntpd", LOG_PID);
! # else
openlog("nntpd", LOG_PID, SYSLOG);
+ # endif
# endif
# endif
#endif
***************
*** 140,145 ****
--- 144,162 ----
exit(1);
}
+ #ifdef USG
+ if (space() < 0 && !canpost ) {
+ printf("%d %s NNTP server out of space. Try later.\r\n",
+ ERR_FAULT, host);
+ (void) fflush(stdout);
+ #ifdef LOG
+ syslog(LOG_INFO, "%s no space", hostname);
+ #endif
+ exit(1);
+ }
+ out_of_space = 0;
+ #endif
+
/* If we can talk, proceed with initialization */
ngpermcount = get_nglist(&ngpermlist, gdbuf);
***************
*** 209,214 ****
--- 226,237 ----
*cp = '\0';
}
+ #ifdef USG
+ if (space() < 0 && !canpost ) {
+ out_of_space++;
+ break;
+ }
+ #endif
if ((argnum = parsit(line, &argp)) == 0)
continue; /* Null command */
else {
***************
*** 235,243 ****
#endif TIMEOUT
}
! printf("%d %s closing connection. Goodbye.\r\n", OK_GOODBYE, host);
! (void) fflush(stdout);
#ifdef LOG
if (ferror(stdout))
--- 258,276 ----
#endif TIMEOUT
}
! #ifdef USG
! if(out_of_space) {
! printf("%d %s NNTP server out of space. Quitting.\r\n",
! ERR_GOODBYE, host);
! #ifdef LOG
! syslog(LOG_INFO, "%s no space", hostname);
! #endif
! } else
! #endif
! printf("%d %s closing connection. Goodbye.\r\n",
! OK_GOODBYE, host);
+ (void) fflush(stdout);
#ifdef LOG
if (ferror(stdout))
Index: common/version.c
*** common/version.c Thu Feb 25 22:02:33 1988
--- ../../nntp_gazette/common/version.c Sun Sep 18 21:03:06 1988
***************
*** 2,5 ****
* Provide the version number of this release.
*/
! char nntp_version[] = "1.5 (26 Feb 88)";
--- 2,5 ----
* Provide the version number of this release.
*/
! char nntp_version[] = "1.5.3 (18 Sep 88)";