Rn bug patch #5 (REPOSTED)
Jonathan Biggar
jonab at sdcrdcf.UUCP
Sat Nov 17 09:51:29 AEST 1984
System: rn version 4.1
Bug #: 5
Priority: HIGH
Subject: Xref patch for 2.10.1 inews is wrong.
Index: inews.c.1.pat
Description:
An older version of the inews patch for news 2.10.1 was inadvertently
sent out with the kit. This causes inews to produce Xref lines that
are useless to rn.
Repeat-By:
Examine an article produced by a version 2.10.1 inews that has the
inews.c.1.pat applied. If the article has an Xref line due to
posting to multiple newsgroups, it will be of the form:
Xref: sysname art# art# art# ...
This is an old form of Xref line, where the article numbers correspond
to the newsgroups on the Newsgroups: line. This is now incorrect,
and rn (version 4.1, anyway) will ignore such a line, and show the
given article more than once. The problem with the old format
was that it did not allow for possible newsgroup aliasing.
Fix: The correct format of an Xref line is now:
Xref: sysname newsgroup:art# newsgroup:art# ...
There are 2 possible solutions:
1) Upgrade to news 2.10.2 and install inews.c.2.pat from the kit.
2) INSTEAD of applying the inews.c.1.pat that came with the rn kit,
apply the following.
From rn, say "| patch -d DIR", where DIR is your news source
directory. Outside of rn, say "cd DIR; patch <thisarticle". If
you don't have the patch program, apply the following by hand, or
get patch.
*** inews.c.std Tue Oct 2 16:09:59 1984
--- inews.c. Fri Sep 21 14:50:49 1984
***************
*** 483,488
/*
* Link ARTICLE into dir for ngname and update active file.
*/
localize(ngname)
char *ngname;
{
--- 483,491 -----
/*
* Link ARTICLE into dir for ngname and update active file.
*/
+ #ifdef DOXREFS
+ long
+ #endif
localize(ngname)
char *ngname;
{
***************
*** 515,520
}
for (;;) {
sprintf(bfr, "%s/%ld", dirname(ngname), ngsize+1);
if (link(ARTICLE, bfr) == 0) break;
e = errno; /* keep log from clobbering it */
fprintf(stderr, "Cannot install article as %s\n", bfr);
--- 518,528 -----
}
for (;;) {
sprintf(bfr, "%s/%ld", dirname(ngname), ngsize+1);
+ #ifdef LINKART
+ if (mylink(ARTICLE, bfr) == 0) break;
+ /* on first file inits ARTICLE, on subsequent */
+ /* files "links" to first article */
+ #else
if (link(ARTICLE, bfr) == 0) break;
#endif
e = errno; /* keep log from clobbering it */
***************
*** 516,521
for (;;) {
sprintf(bfr, "%s/%ld", dirname(ngname), ngsize+1);
if (link(ARTICLE, bfr) == 0) break;
e = errno; /* keep log from clobbering it */
fprintf(stderr, "Cannot install article as %s\n", bfr);
log("Cannot install article as %s", bfr);
--- 524,530 -----
/* files "links" to first article */
#else
if (link(ARTICLE, bfr) == 0) break;
+ #endif
e = errno; /* keep log from clobbering it */
fprintf(stderr, "Cannot install article as %s\n", bfr);
log("Cannot install article as %s", bfr);
***************
*** 542,547
strcpy(firstbufname, bfr);
sprintf(bfr, "%s/%ld ", ngname, ngsize+1);
addhist(bfr);
return TRUE;
}
--- 551,557 -----
strcpy(firstbufname, bfr);
sprintf(bfr, "%s/%ld ", ngname, ngsize+1);
addhist(bfr);
+ #ifndef DOXREFS
return TRUE;
#else DOXREFS
return ngsize+1;
***************
*** 543,548
sprintf(bfr, "%s/%ld ", ngname, ngsize+1);
addhist(bfr);
return TRUE;
}
/*
--- 553,561 -----
addhist(bfr);
#ifndef DOXREFS
return TRUE;
+ #else DOXREFS
+ return ngsize+1;
+ #endif DOXREFS
}
/*
***************
*** 553,558
register char *ptr;
register FILE *tfp;
int badgroup = 0, goodgroup = 0;
/* Fill up the rest of header. */
if (mode != PROC) {
--- 566,574 -----
register char *ptr;
register FILE *tfp;
int badgroup = 0, goodgroup = 0;
+ #ifdef DOXREFS
+ register char *nextxref = header.xref;
+ #endif DOXREFS
/* Fill up the rest of header. */
if (mode != PROC) {
***************
*** 565,570
if (mode==PROC)
log("from %s relay %s", header.from, header.relayversion);
/* Write article to temp file. */
tfp = xfopen(mktemp(ARTICLE), "w");
lhwrite(&header, tfp);
--- 581,593 -----
if (mode==PROC)
log("from %s relay %s", header.from, header.relayversion);
+ #ifdef LINKART
+ *ARTICLE = '\0'; /* tell mylink() to snarf the name */
+ #else !LINKART
+ #ifdef DOXREFS
+ /* Open temp file for article, but link before writing */
+ tfp = xfopen(mktemp(ARTICLE), "w");
+ #else DOXREFS
/* Write article to temp file. */
tfp = xfopen(mktemp(ARTICLE), "w");
lhwrite(&header, tfp);
***************
*** 577,582
}
fclose(tfp);
fclose(infp);
if (is_ctl) {
control(&header);
--- 600,607 -----
}
fclose(tfp);
fclose(infp);
+ #endif DOXREFS
+ #endif LINKART
if (is_ctl) {
control(&header);
***************
*** 593,598
}
}
} else {
for (ptr = nbuf; *ptr;) {
if (*ptr == '-') {
while (*ptr++)
--- 618,627 -----
}
}
} else {
+ #ifdef DOXREFS
+ sprintf(nextxref,"%s ",SYSNAME);
+ nextxref += strlen(nextxref);
+ #endif
for (ptr = nbuf; *ptr;) {
if (*ptr == '-') {
while (*ptr++)
***************
*** 610,615
}
else
goodgroup++;
if (*nbuf)
localize(ptr);
while (*ptr++)
--- 639,645 -----
}
else
goodgroup++;
+ #ifndef DOXREFS
if (*nbuf)
localize(ptr);
#else DOXREFS
***************
*** 612,617
goodgroup++;
if (*nbuf)
localize(ptr);
while (*ptr++)
;
}
--- 642,653 -----
#ifndef DOXREFS
if (*nbuf)
localize(ptr);
+ #else DOXREFS
+ if (*nbuf)
+ sprintf(nextxref,"%s:%ld ",ptr,localize(ptr));
+ while (*nextxref)
+ nextxref++;
+ #endif DOXREFS
while (*ptr++)
;
}
***************
*** 616,621
;
}
}
#ifdef NOFORWARD
if (*nbuf)
--- 652,663 -----
;
}
}
+ #ifdef DOXREFS
+ if (goodgroup < 2 || badgroup)
+ header.xref[0] = '\0';
+ else
+ *(nextxref-1) = '\0';
+ #endif
#ifdef LINKART
tfp = xfopen(ARTICLE,"w"); /* open 1st article localized */
***************
*** 617,622
}
}
#ifdef NOFORWARD
if (*nbuf)
#endif
--- 659,683 -----
*(nextxref-1) = '\0';
#endif
+ #ifdef LINKART
+ tfp = xfopen(ARTICLE,"w"); /* open 1st article localized */
+ #endif
+
+ #if defined(LINKART) || defined(DOXREFS)
+ /* Now that xref is constructed, write article to temp file. */
+ /* (We ought to detect no room at this point and clean up.) */
+ lhwrite(&header, tfp);
+ while (fgets(bfr, BUFLEN, infp) != NULL) {
+ /*
+ if (!strncmp(bfr, "From ", 5))
+ putc('>', tfp);
+ */
+ fputs(bfr, tfp);
+ }
+ fclose(tfp);
+ fclose(infp);
+ #endif LINKART || DOXREFS
+
#ifdef NOFORWARD
if (*nbuf)
#endif
***************
*** 861,863
mclose(fd);
}
}
--- 922,946 -----
mclose(fd);
}
}
+
+ #ifdef LINKART
+ mylink(tmpart,linkfrom)
+ char *tmpart, *linkfrom;
+ {
+ struct stat statbuf;
+
+ if (stat(linkfrom,&statbuf)==0)
+ return -1;
+ if (!*tmpart)
+ strcpy(tmpart,linkfrom);
+ else {
+ FILE *linkfp = fopen(linkfrom,"w");
+
+ if (!linkfp)
+ return -1;
+ fprintf(linkfp,"%s\n",tmpart);
+ fclose(linkfp);
+ }
+ return 0;
+ }
+ #endif LINKART
More information about the Comp.sources.bugs
mailing list