v19i020: rkive - Usenet sources archiver, Patch01b/3
Kent Landfield
kent at sparky.imd.sterling.com
Fri May 10 03:56:44 AEST 1991
Submitted-by: Kent Landfield <kent at sparky.imd.sterling.com>
Posting-number: Volume 19, Issue 20
Archive-name: rkive/patch01b
Patch-To: rkive: Volume 17, Issue 17-22
#!/bin/sh
# do not concatenate these parts, unpack them in order with /bin/sh
# file patch2.1 continued
#
if test ! -r _shar_seq_.tmp; then
echo 'Please unpack part 1 first!'
exit 1
fi
(read Scheck
if test "$Scheck" != 2; then
echo Please unpack part "$Scheck" next!
exit 1
else
exit 0
fi
) < _shar_seq_.tmp || exit 1
if test ! -f _shar_wnt_.tmp; then
echo 'x - still skipping patch2.1'
else
echo 'x - continuing file patch2.1'
sed 's/^X//' << 'SHAR_EOF' >> 'patch2.1' &&
X
! 9. Use the posted date for chronological archiving instead of the
! archived date.
X
! 10. Mail on error only.
X
! 11. Add a selection control-character which gives the local system article
X number to put in 'log' and 'index'. Would help if one runs into trouble.
+
+ 12. Have a post capability in which the output from rkive would be posted
+ to a local newsgroup instead of mailing it to a list of users or maybe
+ as well as.
X
X Well that's the direction I am heading... If you have *any* additional
X ideas that are constructive, positive or negative (flames to /nev/dull)
Only in .: INSTALL
diff -cr ../usenet/MANIFEST ./MANIFEST
*** ../usenet/MANIFEST Wed May 8 21:31:59 1991
--- ./MANIFEST Thu May 9 01:23:25 1991
***************
*** 1,9 ****
! File Name Archive # Description
! -----------------------------------------------------------
X Changes 1 General description of changes in each version.
X IDEAS 1 Contains future improvement ideas.
X MANIFEST 1 This shipping list
! Makefile 2 rkive make file for generating the software.
X README 1 Information posting that should be read first.
X article.1 2 Manual page for article command.
X article.c 2 Source containing article main routines.
--- 1,10 ----
! # File Name Archive # Description
! #-----------------------------------------------------------
X Changes 1 General description of changes in each version.
X IDEAS 1 Contains future improvement ideas.
+ INSTALL 1 Instructions on installing rkive.
X MANIFEST 1 This shipping list
! Makefile.dst 2 rkive distribution Makefile.
X README 1 Information posting that should be read first.
X article.1 2 Manual page for article command.
X article.c 2 Source containing article main routines.
***************
*** 16,21 ****
--- 17,23 ----
X efopen.c 1 Fopen a file with error checking.
X format.c 2 Formatting output for indexes, logs, articles.
X header.c 3 News article header reading routines.
+ localize.smpl 3 Local configuration script example.
X makedir.c 1 Make directory routines.
X match.y 1 Matching routines for globbing support.
X news_arc.c 4 News archiving gut functions.
***************
*** 30,40 ****
X rkive.5 2 Manual page for the rkive configuration file.
X rkive.c 4 Source containing rkive main routines.
X rkive.cf 3 Template configuration file.
! rkive.h 2 Include file for rkive software.
X setup.c 3 Routines to read the rkive configuration file.
X str.c 1 String manipulation routines.
X suffix.c 1 Compression suffix addition/removal routines.
X suffix.h 1 Include for suffix structure and table.
X t.cf 1 Test archive config file. Not the template.
X update_netdocs 1 Script to archive Usenet periodic articles.
X version.c 1 Print the current version and patchlevel.
--- 32,43 ----
X rkive.5 2 Manual page for the rkive configuration file.
X rkive.c 4 Source containing rkive main routines.
X rkive.cf 3 Template configuration file.
! rkive.h.dst 2 Distribution include file for rkive software.
X setup.c 3 Routines to read the rkive configuration file.
X str.c 1 String manipulation routines.
X suffix.c 1 Compression suffix addition/removal routines.
X suffix.h 1 Include for suffix structure and table.
+ sys.cf 1 Test archive config file. Could be a template.
X t.cf 1 Test archive config file. Not the template.
X update_netdocs 1 Script to archive Usenet periodic articles.
X version.c 1 Print the current version and patchlevel.
Only in ../usenet: Makefile
Only in .: Makefile.dst
diff -cr ../usenet/README ./README
*** ../usenet/README Wed May 8 21:31:50 1991
--- ./README Thu May 9 01:33:33 1991
***************
*** 1,7 ****
X
X USENET Sources Archiver
X
! @(#)README 2.2 2/23/91
X
X Copyright (c) 1989, 1990, 1991 by Kent Landfield.
X
--- 1,7 ----
X
X USENET Sources Archiver
X
! @(#)README 2.3 5/9/91
X
X Copyright (c) 1989, 1990, 1991 by Kent Landfield.
X
***************
*** 68,108 ****
X to a specified list of users or aliases. The indexes and log file formats
X are specifiable by the person configuring the rkive configuration file.
X
! -------------------------------------------------------------------
! The following defines are possible. Please note that the Directory
! Creation defines are specified in Makefile while the rest are specified
! in rkive.h.
!
! ***************************
! rkive.h - General Defines
! ***************************
!
! -D REDUCE_HEADERS : Archived article header reduction code.
! Disk space is saved by removing header lines that have no
! further use after the article is stored in the archive.
! As currently defined, all headers *except* for From:, Newsgroups:,
! Subject:, Message-ID:, Approved:, and Date: are removed if this
! is defined.
! The list of headers to be saved can be added to or reduced by
! modifying the table "hdrs" in news_arc.c.
!
! -D SUBJECT_LINE : Specify that the local mailer has -s option
! such as /usr/bin/mailx or /usr/ucb/Mail.
!
! *************************************
! Makefile - Directory Creation Defines
! *************************************
!
! -D HAVE_MKDIR : use the mkdir() function in the system library.
! (AT&T 5.2 or earlier systems are probably out of luck..)
!
! -D USE_SYSMKDIR : have rkive system off /bin/mkdir.
! (not recommended for *real* use...)
!
! If you do not define either, the function makedir() will create the
! directory itself. I suggest that if you do not have mkdir() in your
! system libraries, use the builtin if you can. *Please* verify you can
! use it *first*.
X
X ---------------------------
X Archive Member Compression:
--- 68,76 ----
X to a specified list of users or aliases. The indexes and log file formats
X are specifiable by the person configuring the rkive configuration file.
X
! Please read the file INSTALL for specifics on installation of rkive and
! is associated applications. What follows is a little background information
! that might be helpful to read prior to reading INSTALL.
X
X ---------------------------
X Archive Member Compression:
diff -cr ../usenet/article.1 ./article.1
*** ../usenet/article.1 Wed May 8 21:31:56 1991
--- ./article.1 Thu May 9 01:36:32 1991
***************
*** 1,4 ****
! 'br "@(#)article.1 2.2 2/23/91"
X .op 1i
X .TH ARTICLE 1
X .SH NAME
--- 1,4 ----
! 'br "@(#)article.1 2.3 5/9/91"
X .op 1i
X .TH ARTICLE 1
X .SH NAME
***************
*** 81,89 ****
X D - Print the Date line.
X E - Print the Reposted-by line.
X F - Print the From line.
! H - Print the Original-posting-by line.
! I - Print the Original-subject line.
! J - Print the Archive-directory.
X K - Print the Keywords line.
X L - Print the Lines line.
X M - Print the Message-ID line.
--- 81,89 ----
X D - Print the Date line.
X E - Print the Reposted-by line.
X F - Print the From line.
! H - Print the Comp.archives Original-posting-by line.
! I - Print the Comp.archives Original-subject line.
! J - Print the Comp.archives Archive-directory line.
X K - Print the Keywords line.
X L - Print the Lines line.
X M - Print the Message-ID line.
***************
*** 92,99 ****
X Q - Print the Expires line.
X R - Print the References line.
X S - Print the Subject line.
- T - Print the Subject Topic.
- V - Print the Volume-Issue article filename.
X W - Print the Architecture line.
X X - Print the Version-number.
X a - Print the Archive-name line.
--- 92,97 ----
***************
*** 102,108 ****
X d - Print the Distribution line.
X e - Print the Environment line.
X f - Print the Followup-to line.
! h - Print the X-Checksum-Snefru line.
X o - Print the Organization line.
X p - Print the Posting-number line.
X r - Print the Reply-to line.
--- 100,107 ----
X d - Print the Distribution line.
X e - Print the Environment line.
X f - Print the Followup-to line.
! h - Print the X-Md4-Signature line or
! Print the X-Checksum-Snefru line.
X o - Print the Organization line.
X p - Print the Posting-number line.
X r - Print the Reply-to line.
***************
*** 118,123 ****
--- 117,124 ----
X B - Print the base file name.
X G - Print the newsGroup name.
X O - Print the Full path of the specified file.
+ Z - Print the Relative path of the file within the
+ newsgroup archive directory.
X i - Print the issue (if archive) line.
X l - Print the Author's logon address line.
X n - Print the Author's name.
***************
*** 126,133 ****
X Additional Specification Characters
X
X T - Print the Subject line's topic information.
X % - Print a %, no argument is converted.
! ..nr
X .PP
X In addition to the conversion characters, the following
X characters have meaning during the formatting of the output.
--- 127,135 ----
X Additional Specification Characters
X
X T - Print the Subject line's topic information.
+ V - Print the Volume-Issue article filename.
X % - Print a %, no argument is converted.
! .nf
X .PP
X In addition to the conversion characters, the following
X characters have meaning during the formatting of the output.
diff -cr ../usenet/article.h ./article.h
*** ../usenet/article.h Wed May 8 21:31:57 1991
--- ./article.h Thu May 9 01:36:32 1991
***************
*** 1,5 ****
X /*
! ** @(#)article.h 2.2 2/23/91
X **
X */
X
--- 1,5 ----
X /*
! ** @(#)article.h 2.3 5/9/91
X **
X */
X
***************
*** 57,63 ****
X #define ARCH_NAME 23
X #define ARTICLEID 24
X #define PATCH_TO 25
! #define X_CHECKSUM_SNEFRU 26
X #define ORIGINAL_POSTING_BY 27
X #define ORIGINAL_SUBJECT 28
X #define ARCHIVE_SITE 29
--- 57,63 ----
X #define ARCH_NAME 23
X #define ARTICLEID 24
X #define PATCH_TO 25
! #define X_CHECKSUM 26
X #define ORIGINAL_POSTING_BY 27
X #define ORIGINAL_SUBJECT 28
X #define ARCHIVE_SITE 29
***************
*** 103,109 ****
X char posting_num[BUFLEN]; /* Posting-number: */
X char archive_name[BUFLEN]; /* Archive-name: */
X char patch_to[BUFLEN]; /* Patch-To: */
! char x_checksum_snefru[BUFLEN]; /* X-Checksum-Snefru: */
X char orig_poster[BUFLEN]; /* Original-posting-by: */
X char orig_subject[BUFLEN]; /* Original-subject: */
X char archive_site[BUFLEN]; /* Archive-site: */
--- 103,110 ----
X char posting_num[BUFLEN]; /* Posting-number: */
X char archive_name[BUFLEN]; /* Archive-name: */
X char patch_to[BUFLEN]; /* Patch-To: */
! char x_checksum[BUFLEN]; /* X-Checksum-Snefru: or */
! /* X-Md4-Signature: */
X char orig_poster[BUFLEN]; /* Original-posting-by: */
X char orig_subject[BUFLEN]; /* Original-subject: */
X char archive_site[BUFLEN]; /* Archive-site: */
diff -cr ../usenet/ckconfig.c ./ckconfig.c
*** ../usenet/ckconfig.c Wed May 8 21:31:57 1991
--- ./ckconfig.c Thu May 9 01:39:07 1991
***************
*** 24,30 ****
X ** all ideas to me. This software is going to be maintained and
X ** enhanced as deemed necessary by the community.
X */
! char sccsid[] = "@(#)ckconfig.c 2.2 2/23/91";
X
X #include <sys/types.h>
X #include <stdio.h>
--- 24,30 ----
X ** all ideas to me. This software is going to be maintained and
X ** enhanced as deemed necessary by the community.
X */
! char sccsid[] = "@(#)ckconfig.c 2.3 5/9/91";
X
X #include <sys/types.h>
X #include <stdio.h>
***************
*** 125,135 ****
X default_type == ONLY_ARCHIVE_NAME ? "Only-Archive-Name":
X default_type == EXTERNAL_COMMAND ? "External-Command":
X "Article-Number");
! if (default_type == EXTERNAL_COMMAND) {
! /* Must have an ARCHIVE_CMD line... */
! (void) fprintf(logfp,"Archive Command: %s\n",
! *arch_command ? arch_command : "ERROR - NOT SPECIFIED");
! }
X
X (void) fprintf(logfp,"Patches Type: %s\n",
X default_patch_type == PACKAGE ? "Package" : "Historical");
--- 125,132 ----
X default_type == ONLY_ARCHIVE_NAME ? "Only-Archive-Name":
X default_type == EXTERNAL_COMMAND ? "External-Command":
X "Article-Number");
! (void) fprintf(logfp,"Archive Command: %s\n",
! *arch_command ? arch_command : "NOT SPECIFIED");
X
X (void) fprintf(logfp,"Patches Type: %s\n",
X default_patch_type == PACKAGE ? "Package" : "Historical");
diff -cr ../usenet/disp_grp.c ./disp_grp.c
*** ../usenet/disp_grp.c Wed May 8 21:32:00 1991
--- ./disp_grp.c Thu May 9 01:41:16 1991
***************
*** 8,14 ****
X **
X */
X #ifndef lint
! static char SID[] = "@(#)disp_grp.c 2.2 2/23/91";
X #endif
X
X #include <sys/types.h>
--- 8,14 ----
X **
X */
X #ifndef lint
! static char SID[] = "@(#)disp_grp.c 2.3 5/9/91";
X #endif
X
X #include <sys/types.h>
***************
*** 26,31 ****
--- 26,32 ----
X extern char mail[];
X extern char compress[];
X extern char checkhash[];
+ extern char arch_command[];
X
X struct passwd *pw;
X struct passwd *getpwuid();
***************
*** 88,95 ****
X "Article-Number");
X if (ng->type == EXTERNAL_COMMAND) {
X /* Must have an ARCHIVE_CMD line... */
! (void) fprintf(logfp,"\tArchive Command: %s\n",
! *(ng->arch_command) ? ng->arch_command : "ERROR - NOT SPECIFIED");
X }
X
X (void) fprintf(logfp,"\tPatches Type: %s\n",
--- 89,98 ----
X "Article-Number");
X if (ng->type == EXTERNAL_COMMAND) {
X /* Must have an ARCHIVE_CMD line... */
! (void)fprintf(logfp,"\tArchive Command: %-15s\n",
! *ng->arch_command != '\0' ? ng->arch_command :
! !*arch_command ? "ERROR - (*NO* DEFAULT)" :
! fill_in_defaults ? arch_command : "NOT SPECIFIED (DEFAULT)");
X }
X
X (void) fprintf(logfp,"\tPatches Type: %s\n",
diff -cr ../usenet/format.c ./format.c
*** ../usenet/format.c Wed May 8 21:31:53 1991
--- ./format.c Thu May 9 01:44:09 1991
***************
*** 8,14 ****
X **
X */
X #if !defined(lint) && !defined(SABER)
! static char SID[] = "@(#)format.c 2.2 2/23/91";
X #endif
X
X #include <stdio.h>
--- 8,14 ----
X **
X */
X #if !defined(lint) && !defined(SABER)
! static char SID[] = "@(#)format.c 2.3 5/9/91";
X #endif
X
X #include <stdio.h>
***************
*** 40,45 ****
--- 40,46 ----
X extern int default_modes;
X # ifdef NNTP
X extern char nntp[];
+ extern char nntp_tmp_path[];
X # endif /*NNTP*/
X #endif /* RKIVE */
X
***************
*** 243,248 ****
--- 244,254 ----
X case 'X': /* Version-number */
X cp = add_string(cp, header.version_number);
X continue;
+ #ifdef RKIVE
+ case 'Z': /* Relative pathname of archived file */
+ cp = add_string(cp,substr(filename,newsgrp->location)?filename+strlen(newsgrp->location)+1:filename);
+ continue;
+ #endif
X case 'a': /* Archive-name */
X cp = add_string(cp, header.archive_name);
X continue;
***************
*** 261,268 ****
X case 'f': /* Followup-to */
X cp = add_string(cp, header.followup_to);
X continue;
! case 'h': /* X-Checksum-Snefru */
! cp = add_string(cp, header.x_checksum_snefru);
X continue;
X case 'i': /* issue (if archive) */
X cp = add_string(cp,itoa(article.issue));
--- 267,274 ----
X case 'f': /* Followup-to */
X cp = add_string(cp, header.followup_to);
X continue;
! case 'h': /* X-Checksum-Snefru or X-Md4-Signature */
! cp = add_string(cp, header.x_checksum);
X continue;
X case 'i': /* issue (if archive) */
X cp = add_string(cp,itoa(article.issue));
***************
*** 419,424 ****
--- 425,433 ----
X cp = add_string(cp,newsgrp->mail_list);
X continue;
X #ifdef NNTP
+ case 'F': /* NNTP Temporary transfer file */
+ cp = add_string(cp,nntp_tmp_path);
+ continue;
X case 'N': /* NNTP */
X /* print out according to precedence. */
X if (*newsgrp->nntp)
diff -cr ../usenet/header.c ./header.c
*** ../usenet/header.c Wed May 8 21:31:51 1991
--- ./header.c Thu May 9 01:45:11 1991
***************
*** 9,15 ****
X */
X
X #if !defined(lint) && !defined(SABER)
! static char SID[] = "@(#)header.c 2.2 2/23/91";
X #endif
X
X #include <stdio.h>
--- 9,15 ----
X */
X
X #if !defined(lint) && !defined(SABER)
! static char SID[] = "@(#)header.c 2.3 5/9/91";
X #endif
X
X #include <stdio.h>
***************
*** 78,93 ****
X if (its("Patch-to: "))
X return PATCH_TO;
X
! /* The X-Checksum-Snefru archive is being used by */
! /* comp.sources.unix and comp.sources.misc to */
! /* verify articles. */
X
X if (its("X-Checksum-Snefru: "))
! return X_CHECKSUM_SNEFRU;
X
X /* The following lines are used by comp.sources.games */
X /* currently to indicate the environmental keywords */
X /* indicating what is required by the software to run. */
X
X if (its("Environment: "))
X return ENVIRONMENT;
--- 78,99 ----
X if (its("Patch-to: "))
X return PATCH_TO;
X
! /* The X-Checksum-Snefru archive was being used by */
! /* comp.sources.unix and comp.sources.misc to verify */
! /* articles. Once snefru was broken, the moderators */
! /* of c.s.u and c.s.m switched to use X-Md4-Signature: */
! /* which is based on MD4 (RFC1186). */
X
X if (its("X-Checksum-Snefru: "))
! return X_CHECKSUM;
! if (its("X-Md4-Signature: "))
! return X_CHECKSUM;
X
X /* The following lines are used by comp.sources.games */
X /* currently to indicate the environmental keywords */
X /* indicating what is required by the software to run. */
+ /* Supersedes: is also used by comp.sources.misc to */
+ /* indicate when a posting totally replaces another. */
X
X if (its("Environment: "))
X return ENVIRONMENT;
***************
*** 288,294 ****
X header.posting_num[0] = '\0'; /* Posting-number: */
X header.archive_name[0] = '\0'; /* Archive-name: */
X header.patch_to[0] = '\0'; /* Patch-To: */
! header.x_checksum_snefru[0] = '\0'; /* X-Checksum-Snefru: */
X header.orig_poster[0] = '\0'; /* Original-posting-by: */
X header.orig_subject[0] = '\0'; /* Original-subject: */
X header.archive_site[0] = '\0'; /* Archive-site: */
--- 294,301 ----
X header.posting_num[0] = '\0'; /* Posting-number: */
X header.archive_name[0] = '\0'; /* Archive-name: */
X header.patch_to[0] = '\0'; /* Patch-To: */
! header.x_checksum[0] = '\0'; /* X-Checksum-Snefru: or */
! /* X-Md4-Signature */
X header.orig_poster[0] = '\0'; /* Original-posting-by: */
X header.orig_subject[0] = '\0'; /* Original-subject: */
X header.archive_site[0] = '\0'; /* Archive-site: */
***************
*** 736,743 ****
X *sp = '\0';
X break;
X
! case X_CHECKSUM_SNEFRU:
! data(header.x_checksum_snefru,sizeof(header.x_checksum_snefru),"X_CHECKSUM_SNEFRU:", X_CHECKSUM_SNEFRU);
X break;
X
X case ORIGINAL_POSTING_BY:
--- 743,750 ----
X *sp = '\0';
X break;
X
! case X_CHECKSUM:
! data(header.x_checksum,sizeof(header.x_checksum),"X_CHECKSUM:", X_CHECKSUM);
X break;
X
X case ORIGINAL_POSTING_BY:
Only in .: localize.smpl
diff -cr ../usenet/makedir.c ./makedir.c
*** ../usenet/makedir.c Wed May 8 21:32:01 1991
--- ./makedir.c Thu May 9 01:48:11 1991
***************
*** 9,15 ****
X */
X
X #if !defined(lint) && !defined(SABER)
! static char SID[] = "@(#)makedir.c 2.1 2/21/91";
X #endif
X
X #include <sys/types.h>
--- 9,15 ----
X */
X
X #if !defined(lint) && !defined(SABER)
! static char SID[] = "@(#)makedir.c 2.2 5/9/91";
X #endif
X
X #include <sys/types.h>
***************
*** 34,40 ****
X int strlen();
X int chown();
X
! #ifndef HAVE_MKDIR
X # ifndef USE_SYSMKDIR
X
X char *strcat();
--- 34,40 ----
X int strlen();
X int chown();
X
! #ifndef MKDIR
X # ifndef USE_SYSMKDIR
X
X char *strcat();
***************
*** 58,69 ****
X
X char crnt_dir[MAXNAMLEN];
X
! #else /* HAVE_MKDIR */
X
X int mkdir();
X int svmask; /* Old umask value */
X
! #endif /* HAVE_MKDIR */
X
X if ((strlen(dirpath) == 0) || (dirpath[0] == '\0')) {
X (void) fprintf(errfp,"%s: cannot make %s\n", progname,dirpath);
--- 58,69 ----
X
X char crnt_dir[MAXNAMLEN];
X
! #else /* MKDIR */
X
X int mkdir();
X int svmask; /* Old umask value */
X
! #endif /* MKDIR */
X
X if ((strlen(dirpath) == 0) || (dirpath[0] == '\0')) {
X (void) fprintf(errfp,"%s: cannot make %s\n", progname,dirpath);
***************
*** 76,82 ****
X return(0);
X }
X
! #ifdef HAVE_MKDIR
X
X /*
X ** mkdir function supplied in system library.
--- 76,82 ----
X return(0);
X }
X
! #ifdef MKDIR
X
X /*
X ** mkdir function supplied in system library.
***************
*** 176,181 ****
X return(-1);
X }
X #endif /* USE_SYSMKDIR */
! #endif /* HAVE_MKDIR */
X return(0);
X }
--- 176,181 ----
X return(-1);
X }
X #endif /* USE_SYSMKDIR */
! #endif /* MKDIR */
X return(0);
X }
diff -cr ../usenet/news_arc.c ./news_arc.c
*** ../usenet/news_arc.c Wed May 8 21:31:46 1991
--- ./news_arc.c Thu May 9 01:49:47 1991
***************
*** 9,15 ****
X */
X
X #if !defined(lint) && !defined(SABER)
! static char SID[] = "@(#)news_arc.c 2.2 2/23/91";
X #endif
X
X #include <sys/types.h>
--- 9,15 ----
X */
X
X #if !defined(lint) && !defined(SABER)
! static char SID[] = "@(#)news_arc.c 2.3 5/9/91";
X #endif
X
X #include <sys/types.h>
***************
*** 58,63 ****
--- 58,64 ----
X void store_line();
X void dump_article();
X void record_problem();
+ void write_patch_log();
X
X void get_header(filename)
X char *filename;
***************
*** 120,125 ****
--- 121,127 ----
X { "Date:", (sizeof "Date:") },
X { "Approved:", (sizeof "Approved:") },
X { "X-Checksum-Snefru:", (sizeof "X-Checksum-Snefru:") },
+ { "X-Md4-Signature:", (sizeof "X-Md4-Signature:") },
X { NULL, 0 },
X };
X
***************
*** 252,258 ****
X char *path;
X {
X void write_archived();
- void write_patch_log();
X
X if (copy(filename,path) != 0) {
X (void) fprintf(errfp,"copy failed for %s to %s\n",filename,path);
--- 254,259 ----
***************
*** 308,316 ****
X */
X
X /*
! ** If the Snefru header exists, check the article checksum for validity.
X */
! if (header.x_checksum_snefru[0]) {
X if (*(ng->checkhash)) {
X if (do_checkhash(ng->checkhash, filename) != 0)
X return(do_problem(CHECKHASH_PROB,ng,filename,path));
--- 309,318 ----
X */
X
X /*
! ** If the MD4 or Snefru headers exists, check the article's
! ** checksum for validity.
X */
! if (header.x_checksum[0]) {
X if (*(ng->checkhash)) {
X if (do_checkhash(ng->checkhash, filename) != 0)
X return(do_problem(CHECKHASH_PROB,ng,filename,path));
***************
*** 421,431 ****
X ** issue number to be used is available.
X ** There should be no duplicates here ever... :-)
X ** [ just don't blow away your .archived file... :-( ]
X */
X do {
! ++inum;
! chronpath(ng->location, path, inum);
! } while (stat(path ,&sb) == 0);
X break;
X case ONLY_ARCHIVE_NAME:
X /*
--- 423,442 ----
X ** issue number to be used is available.
X ** There should be no duplicates here ever... :-)
X ** [ just don't blow away your .archived file... :-( ]
+ ** Need to assure that the compression suffix in not attached
+ ** as well since the prior run that day may use compression.
X */
X do {
! do {
! ++inum;
! chronpath(ng->location, path, inum);
! } while (stat(path ,&sb) == 0);
! /*
! ** expand the path to the file to include the
! ** compression suffix if necessary.
! */
! final_path = expand_name(path, ng);
! } while (stat(final_path ,&sb) == 0);
X break;
X case ONLY_ARCHIVE_NAME:
X /*
***************
*** 517,523 ****
X if (*ng->arch_command)
X (void) strcpy(command, ng->arch_command);
X else if (*arch_command)
! (void) strcpy(command, ng->arch_command);
X else
X return(do_problem(EXTERNAL_PROB,ng,filename,path));
X
--- 528,534 ----
X if (*ng->arch_command)
X (void) strcpy(command, ng->arch_command);
X else if (*arch_command)
! (void) strcpy(command, arch_command);
X else
X return(do_problem(EXTERNAL_PROB,ng,filename,path));
X
***************
*** 643,648 ****
--- 654,660 ----
X #endif /*MV_ORIGINAL */
X
X char pmess[BUFSIZ];
+ char *final_path;
X int nm;
X struct stat sb;
X
***************
*** 670,679 ****
X (void) strcat(pmess,"has an invalid archive TYPE specified.\n");
X break;
X case CHECKHASH_PROB:
! (void) strcat(pmess,"failed Snefru checkhash test.\n");
X break;
X case MSNG_HASH_PROB:
! (void) strcat(pmess,"is missing expected Snefru header.\n");
X break;
X case DUP_PROB:
X if (article.repost != TRUE)
--- 682,691 ----
X (void) strcat(pmess,"has an invalid archive TYPE specified.\n");
X break;
X case CHECKHASH_PROB:
! (void) strcat(pmess,"failed article checksum verification test.\n");
X break;
X case MSNG_HASH_PROB:
! (void) strcat(pmess,"is missing expected article checksum verifications header.\n");
X break;
X case DUP_PROB:
X if (article.repost != TRUE)
***************
*** 780,789 ****
X
X nm = 1;
X
! while (stat(path, &sb) == 0) {
! (void) sprintf(path,"%s/%s/%s.%d",problems_dir,ng->ng_path,file,nm);
! ++nm;
! }
X
X /* Display and record the actions */
X (void) sprintf(pmess,"\tStoring Article %s at %s\n", file, path);
--- 792,812 ----
X
X nm = 1;
X
! do {
! final_path = expand_name(path, ng);
! /*
! ** Let's assure that neither the uncompressed or
! ** the compressed version of the article number
! ** exists where we want to put this problem.
! ** Don't need to create a different problem...
! */
! if ((stat(path, &sb) == 0) || (stat(final_path, &sb) == 0)) {
! (void) sprintf(path,"%s/%s/%s.%d",problems_dir,ng->ng_path,file,nm);
! ++nm;
! }
! else
! nm = 0;
! } while (nm != 0);
X
X /* Display and record the actions */
X (void) sprintf(pmess,"\tStoring Article %s at %s\n", file, path);
***************
*** 849,854 ****
--- 872,878 ----
X VOLUME, now.tm_year, month[now.tm_mon],
X now.tm_year,now.tm_mon+1,now.tm_mday,seqnum);
X #endif /* NO_MONTH_DIR */
+ article.volume = now.tm_year;
X }
X
X void write_patch_log(ng, path)
***************
*** 954,957 ****
X else
X return(0);
X }
-
--- 978,980 ----
diff -cr ../usenet/nntpart.c ./nntpart.c
*** ../usenet/nntpart.c Wed May 8 21:31:54 1991
--- ./nntpart.c Thu May 9 01:52:17 1991
***************
*** 9,15 ****
X */
X
X #if !defined(lint) && !defined(SABER)
! static char *SID = "@(#)nntpart.c 2.1 2/21/91";
X #endif
X
X /*LINTLIBRARY*/
--- 9,15 ----
X */
X
X #if !defined(lint) && !defined(SABER)
! static char *SID = "@(#)nntpart.c 2.2 5/9/91";
X #endif
X
X /*LINTLIBRARY*/
***************
*** 155,161 ****
--- 155,169 ----
X return;
X }
X
+ /*
+ ** nntp_tmp_path[]
+ **
+ ** Holds the full pathname of the nntp transfer file.
+ ** For use with external command archiving...
+ */
X
+ char nntp_tmp_path[MAXNAMLEN];
+
X int nntp_retrieve_article(filename,which_time)
X char *filename;
X int which_time;
***************
*** 249,254 ****
--- 257,263 ----
X ** the Article-Number form of archiving.
X */
X (void) sprintf(filename,"%d",f);
+ (void) sprintf(nntp_tmp_path,"%s/%d",TMPDIR,f);
X
X /*
X ** Build the nntp command string
diff -cr ../usenet/patchlevel.h ./patchlevel.h
*** ../usenet/patchlevel.h Wed May 8 21:32:02 1991
--- ./patchlevel.h Thu May 9 01:53:31 1991
***************
*** 1,5 ****
X /*
! ** @(#)patchlevel.h 2.2 2/23/91
X */
X #define RELEASE 2
! #define PATCHLEVEL 0
--- 1,5 ----
X /*
! ** @(#)patchlevel.h 2.3 5/9/91
X */
X #define RELEASE 2
! #define PATCHLEVEL 1
Common subdirectories: ../usenet/port and ./port
diff -cr ../usenet/record_arc.c ./record_arc.c
*** ../usenet/record_arc.c Wed May 8 21:32:03 1991
--- ./record_arc.c Thu May 9 01:55:39 1991
***************
*** 9,15 ****
X */
X
X #if !defined(lint) && !defined(SABER)
! static char SID[] = "@(#)record_arc.c 2.1 2/21/91";
X #endif
X
X #include <sys/types.h>
--- 9,15 ----
X */
X
X #if !defined(lint) && !defined(SABER)
! static char SID[] = "@(#)record_arc.c 2.2 5/9/91";
X #endif
X
X #include <sys/types.h>
***************
*** 130,137 ****
X if (test)
X return;
X
! if ((stat(path ,&sb) != 0))
! if (mkparents(path) == -1)
X return; /* unable to build parent directories */
X
X /*
--- 130,137 ----
X if (test)
X return;
X
! if ((stat(newsgrp->arc_done ,&sb) != 0))
! if (mkparents(newsgrp->arc_done) == -1)
X return; /* unable to build parent directories */
X
X /*
diff -cr ../usenet/retrieve.c ./retrieve.c
*** ../usenet/retrieve.c Wed May 8 21:31:58 1991
--- ./retrieve.c Thu May 9 01:57:18 1991
***************
*** 9,15 ****
X */
X
X #if !defined(lint) && !defined(SABER)
! static char SID[] = "@(#)retrieve.c 2.1 2/21/91";
X #endif
X
X #include <sys/types.h>
--- 9,15 ----
X */
X
X #if !defined(lint) && !defined(SABER)
! static char SID[] = "@(#)retrieve.c 2.2 5/9/91";
X #endif
X
X #include <sys/types.h>
***************
*** 17,22 ****
--- 17,24 ----
X #include <stdio.h>
X #include "rkive.h"
X
+ #define TMPDIR "/tmp"
+
X char newsgroup_directory[MAXNAMLEN];
X
X extern FILE *inputfp;
***************
*** 70,77 ****
X ** to retrieve an article:
X ** 1. Retrieve an article from a remote site via NNTP,
X ** 2. Search the newsgroup directory for newsarticles,
! ** 3. Receive a newsarticle filename on standard input,
! ** 4. Receive newsarticle filenames from a batch file.
X */
X
X int retrieve_article(filename,which_time)
--- 72,80 ----
X ** to retrieve an article:
X ** 1. Retrieve an article from a remote site via NNTP,
X ** 2. Search the newsgroup directory for newsarticles,
! ** 3. Read an article from standard input,
! ** 4. Receive a newsarticle filename on standard input,
! ** 5. Receive newsarticle filenames from a batch file.
X */
X
X int retrieve_article(filename,which_time)
***************
*** 83,88 ****
--- 86,92 ----
X int strlen();
X int unlink();
X int fclose();
+ int creat();
X char *strcpy();
X
X FILE *efopen();
***************
*** 95,105 ****
X static DIR *dfd;
X static char *dir = ".";
X char ibuf[BUFSIZ];
X
- #ifdef NNTP
- if (retrieve == FROM_NNTP)
- return(nntp_retrieve_article(filename,which_time));
- #endif /*NNTP*/
X
X if (which_time == 1) {
X (void) strcpy(newsgrp->ng_path, newsgrp->ng_name);
--- 99,107 ----
X static DIR *dfd;
X static char *dir = ".";
X char ibuf[BUFSIZ];
+ int len;
+ int tmpfp;
X
X
X if (which_time == 1) {
X (void) strcpy(newsgrp->ng_path, newsgrp->ng_name);
***************
*** 115,121 ****
X *rp = '/'; /* to create */
X rp++; /* the disk */
X } /* location */
!
X (void) sprintf(newsgroup_directory,"%s/%s", spooldir,newsgrp->ng_path);
X
X if (chdir(newsgroup_directory) != 0) {
--- 117,130 ----
X *rp = '/'; /* to create */
X rp++; /* the disk */
X } /* location */
! }
!
! #ifdef NNTP
! if (retrieve == FROM_NNTP)
! return(nntp_retrieve_article(filename,which_time));
! #endif /*NNTP*/
!
! if (which_time == 1) {
X (void) sprintf(newsgroup_directory,"%s/%s", spooldir,newsgrp->ng_path);
X
X if (chdir(newsgroup_directory) != 0) {
***************
*** 164,174 ****
X }
X
X /*
X ** The following code is for retrieval types FROM_NAME and FROM_BATCHFILE
X ** only. Any other type is an unknown software error ...
X */
X if (retrieve != FROM_NAME && retrieve != FROM_BATCHFILE) {
! (void) fprintf(errfp, "Invalid retrieval type encountered - %d\n",retrieve);
X return(ERROR_ENCOUNTERED);
X }
X
--- 173,242 ----
X }
X
X /*
+ ** FROM_STDIN archiving.
+ **
+ ** First create a temp file name and write the information into
+ ** the temp file. Write the data passed on stdin into the temp file.
+ ** Then pass the temp file name back to rkive to use from then on.
+ */
+
+ if (retrieve == FROM_STDIN) {
+ if ((rp = tempnam(TMPDIR, "rkiveXXXXXX")) == NULL) {
+ (void) fprintf(errfp, "Can't create tmpfile name\n");
+ return(ERROR_ENCOUNTERED);
+ }
+
+ if ((tmpfp = creat(rp, 0644)) == NULL) {
+ (void) fprintf(errfp, "Can't create tmpfile\n");
+ return(ERROR_ENCOUNTERED);
+ }
+
+ len = -1;
+
+ while (fgets(ibuf, BUFSIZ, inputfp) != NULL) {
+ len = strlen(ibuf);
+ if (write(tmpfp, ibuf, len) != len)
+ perror("write");
+ }
+ (void) close(tmpfp);
+
+ /*
+ ** If len was never assigned then stdin was closed.
+ ** and no reason at all to go any further, we are
+ ** done. Return so...
+ */
+ if (len == -1) {
+ /*
+ ** no more filenames on inputfp...
+ */
+
+ (void) unlink(rp);
+ return(DONE);
+ }
+
+ /*
+ ** Check to assure the file is available and contains
+ ** some data...
+ */
+ if (!valid_disk_article(rp,rp)) {
+ return(ERROR_ENCOUNTERED);
+ }
+
+ /*
+ ** We have real data here...
+ */
+ (void) strcpy(filename,rp);
+ free(rp);
+ return(RETRIEVED);
+ }
+
+ /*
X ** The following code is for retrieval types FROM_NAME and FROM_BATCHFILE
X ** only. Any other type is an unknown software error ...
X */
X if (retrieve != FROM_NAME && retrieve != FROM_BATCHFILE) {
! (void) fprintf(errfp, "Invalid retrieval type encountered - %d\n",
! retrieve);
X return(ERROR_ENCOUNTERED);
X }
X
diff -cr ../usenet/rkive.5 ./rkive.5
*** ../usenet/rkive.5 Wed May 8 21:31:54 1991
--- ./rkive.5 Thu May 9 01:58:47 1991
***************
*** 1,4 ****
! 'br "@(#)rkive.5 2.3 2/24/91"
X .TH RKIVE 5
X .SH NAME
X rkive.cf \- USENET Source Archiver Configuration File.
--- 1,4 ----
! 'br "@(#)rkive.5 2.4 5/9/91"
X .TH RKIVE 5
X .SH NAME
X rkive.cf \- USENET Source Archiver Configuration File.
***************
*** 117,125 ****
X .IP "CHECKHASH ="
X The location of the checkhash utility if the files are to be tested for
X transit damage. Currently, only comp.sources.unix and comp.sources.misc
! supports this test with the X-Checksum-Snerfu: header. If this variable
! is specified, it must contain the full path to the command used to perform
! the test.
X .IP "NNTP ="
X The location of the NNTP server where the articles are to be archived from.
X This can be specified globally if all or most newsgroups are archived
--- 117,126 ----
X .IP "CHECKHASH ="
X The location of the checkhash utility if the files are to be tested for
X transit damage. Currently, only comp.sources.unix and comp.sources.misc
! supports this type of testing. The X-Checksum-Snerfu: header has been used
! in the past. This header is being phased out in favor of the X-Md4-Signature:
! header. If this variable is specified, it must contain the full path to the
! command used to perform the verification testing on the articles.
X .IP "NNTP ="
X The location of the NNTP server where the articles are to be archived from.
X This can be specified globally if all or most newsgroups are archived
***************
*** 263,271 ****
X used to perform the compression.
X .IP "CHECKHASH :"
X The location of the checkhash utility if the files are to be tested for
! transit damage. Currently, only comp.sources.unix supports this test with
! the X-Checksum-Snerfu: header. If this variable is specified, it must contain
! the full path to the command used to perform the test.
X .IP "NNTP :"
X The location of the NNTP server where the articles are to be archived from.
X This can be specified globally if all or most newsgroups are archived
--- 264,272 ----
X used to perform the compression.
X .IP "CHECKHASH :"
X The location of the checkhash utility if the files are to be tested for
! transit damage. Currently, only comp.sources.unix supports this type of
! testing. If this variable is specified, it must contain the full path to
! the command used to perform the test.
X .IP "NNTP :"
X The location of the NNTP server where the articles are to be archived from.
X This can be specified globally if all or most newsgroups are archived
***************
*** 331,337 ****
X .br
X g - GROUP - Group id specified.
X .br
! h - CHECKHASH - Path to the checkhash utility.
X .br
X i - INDEX - Location of the newsgroup index.
X .br
--- 332,338 ----
X .br
X g - GROUP - Group id specified.
X .br
! h - CHECKHASH - Path to checkhash or checkmd4 utility.
X .br
X i - INDEX - Location of the newsgroup index.
X .br
***************
*** 358,363 ****
--- 359,366 ----
X b - Newsgroup's spool directory path.
X .br
X n - Newsgroup name.
+ .br
+ N - Disk path to the NNTP temporary transfer file.
X .br
X P - Actual disk path to the file to be archived.
X .br
diff -cr ../usenet/rkive.c ./rkive.c
*** ../usenet/rkive.c Wed May 8 21:31:49 1991
--- ./rkive.c Thu May 9 02:00:19 1991
***************
*** 37,45 ****
X #include "cfg.h"
X
X #ifdef NNTP
! char sccsid[] = "@(#)rkive.c 2.2 2/23/91 - NNTP Version";
X #else
! char sccsid[] = "@(#)rkive.c 2.2 2/23/91";
X #endif /*!NNTP*/
X
X /*
--- 37,45 ----
X #include "cfg.h"
X
X #ifdef NNTP
! char sccsid[] = "@(#)rkive.c 2.3 5/9/91 - NNTP Version";
X #else
! char sccsid[] = "@(#)rkive.c 2.3 5/9/91";
X #endif /*!NNTP*/
X
X /*
***************
*** 46,63 ****
X ** This is necessary since the builtin makedir call uses
X ** mknod which is a superuser only call for directories.
X */
! #if (!HAVE_MKDIR && !USE_SYSMKDIR)
! #define ROOT_ONLY
X #endif
X
- /*
- ** The following define is use for compilation
- ** so that format_output can use the extended
- ** fomating characters that are not available
- ** in article.
- */
- #define RKIVE
-
X char tmp_mailfile[] = "/tmp/rkive.mail";
X char global_mailfile[] = "/tmp/gbl.mail";
X
--- 46,57 ----
X ** This is necessary since the builtin makedir call uses
X ** mknod which is a superuser only call for directories.
X */
! #ifndef MKDIR
! # ifndef USE_SYSMKDIR
! # define ROOT_ONLY
! # endif
X #endif
X
X char tmp_mailfile[] = "/tmp/rkive.mail";
X char global_mailfile[] = "/tmp/gbl.mail";
X
***************
*** 131,136 ****
--- 125,132 ----
X (void)fprintf(stderr," Specify alternate configuration file to be used.\n");
X (void)fprintf(stderr," -n newsgroup\n");
X (void)fprintf(stderr," Specify newsgroup to archive or display status for.\n");
+ (void)fprintf(stderr," -A newsgroup\n");
+ (void)fprintf(stderr," Take an article to archive from stdin.\n");
X (void)fprintf(stderr," -B batchfile\n");
X (void)fprintf(stderr," Read names of articles to archive from batchfile.\n");
X (void)fprintf(stderr," Note: Use of the -B option requires a newsgroup\n");
***************
*** 171,178 ****
X config_file = LOCATION;
X
X if (argc > 1) {
! while ((c = getopt(argc, argv, "?dgstuvVn:f:B:S:y")) != EOF) {
X switch (c) {
X case 'B': /* take filenames from batch file */
X retrieve = FROM_BATCHFILE;
X batch_file = optarg;
--- 167,178 ----
X config_file = LOCATION;
X
X if (argc > 1) {
! while ((c = getopt(argc, argv, "?dgstuvVn:f:A:B:S:y")) != EOF) {
X switch (c) {
+ case 'A': /* stdin article archiving */
+ retrieve = FROM_STDIN;
+ nwsg = optarg;
+ break;
X case 'B': /* take filenames from batch file */
X retrieve = FROM_BATCHFILE;
X batch_file = optarg;
***************
*** 237,242 ****
--- 237,262 ----
X return(1);
X }
X }
+ /*
+ ** If the user has specified that the article is to be read from stdin,
+ ** the user must specify a a newsgroup as well. A request for status
+ ** on an article from stdin makes little sense to me... If I am wrong
+ ** let me know...
+ */
+ else if (retrieve == FROM_STDIN) {
+ if (nwsg == NULL) {
+ (void) fprintf(errfp, "%s: Must specify a newsgroup\n",progname);
+ (void) fprintf(errfp,"Sample command line...\n");
+ (void) fprintf(errfp,"\t%s -A newsgroup-here\n",progname);
+ return(1);
+ }
+ if (status_only != 0) {
+ (void) fprintf(errfp,"%s: can't get status for an article on stdin\n", progname);
+ (void) fprintf(errfp,"Sample command line...\n");
+ (void) fprintf(errfp,"\t%s -A newsgroup-here\n",progname);
+ return(1);
+ }
+ }
X
X setup_defaults();
X
***************
*** 387,392 ****
--- 407,413 ----
X /*
X ** If the user has specified that a quick status
X ** listing should be produced then hop to it....
+ ** FROM_STDIN is not allowed to have status requests.
X */
X
X if (status_only) {
***************
*** 485,490 ****
--- 506,516 ----
X if (retrieve == FROM_NNTP)
X (void) unlink(article_name);
X #endif /*NNTP*/
+ /*
+ ** Remove the tmpfile if the article came from stdin.
+ */
+ if (retrieve == FROM_STDIN)
+ (void) unlink(article_name);
X continue;
X }
X
***************
*** 502,507 ****
--- 528,538 ----
X if (retrieve == FROM_NNTP)
X (void) unlink(article_name);
X #endif /*NNTP*/
+ /*
+ ** Remove the tmpfile if the article came from stdin.
+ */
+ if (retrieve == FROM_STDIN)
+ (void) unlink(article_name);
X continue;
X }
X
***************
*** 519,524 ****
--- 550,560 ----
X if (retrieve == FROM_NNTP)
X (void) unlink(article_name);
X #endif /*NNTP*/
+ /*
+ ** Remove the tmpfile if the article came from stdin.
+ */
+ if (retrieve == FROM_STDIN)
+ (void) unlink(article_name);
X continue;
X }
X }
***************
*** 548,554 ****
X
X if (!problem_article) {
X log_activities(archived_file,newsgrp);
! build_index(new_member,newsgrp);
X notify_users(archived_file,newsgrp,cct++);
X }
X }
--- 584,590 ----
X
X if (!problem_article) {
X log_activities(archived_file,newsgrp);
! build_index(archived_file,newsgrp);
X notify_users(archived_file,newsgrp,cct++);
X }
X }
***************
*** 566,571 ****
--- 602,612 ----
X if (retrieve == FROM_NNTP)
X (void) unlink(article_name);
X #endif /*NNTP*/
+ /*
+ ** Remove the tmpfile if the article came from stdin.
+ */
+ if (retrieve == FROM_STDIN)
+ (void) unlink(article_name);
X }
X
X if (!status_only) {
***************
*** 833,839 ****
X char *filename;
X {
X char *comp_cmd;
- char *kp;
X char cmd[BUFSIZ];
X
X (void) sprintf(cmd,"%s %s", packit, filename);
--- 874,879 ----
***************
*** 849,865 ****
X if (!test)
X (void) system(cmd);
X
! /*
! ** Need to remove any compression command
! ** options if they exist. (compress -f)
! */
!
! (void) sprintf(cmd,"%s", comp_cmd);
!
! if ((kp = strchr(cmd,' ')) != NULL) {
! *kp = '\0';
! }
! return(suffix(cmd));
X }
X
X
--- 889,895 ----
X if (!test)
X (void) system(cmd);
X
! return(suffix(comp_cmd));
X }
X
X
***************
*** 877,883 ****
X /*
X ** This function is used in the event that a problem
X ** has occurred during archiving. It mails a message
! ** to the newsgroup speecified list and it mails a
X ** message to the globally specified users.
X **
X ** It then logs the fact into both the newsgroup
--- 907,913 ----
X /*
X ** This function is used in the event that a problem
X ** has occurred during archiving. It mails a message
! ** to the newsgroup specified list and it mails a
X ** message to the globally specified users.
X **
X ** It then logs the fact into both the newsgroup
***************
*** 890,895 ****
--- 920,932 ----
X if ( *mail )
X logit(global_mailfile, msg_fmt,filename);
X
+ /*
+ ** Assure that the file you are logging information to
+ ** has a directory to exist in.. If it fails, oh well..
+ */
+
+ (void)mkparents(ng->logfile);
X logit(ng->logfile, msg_fmt, filename);
+ (void)mkparents(log);
X logit(log, msg_fmt, filename);
X }
diff -cr ../usenet/rkive.cf ./rkive.cf
*** ../usenet/rkive.cf Wed May 8 21:31:48 1991
--- ./rkive.cf Thu May 9 02:50:40 1991
***************
*** 1,5 ****
X #
! # @(#)rkive.cf 2.2 2/23/91
X #
X # An rkive.cf template.
X # Copy and edit this to reflect the local archive conditions.
--- 1,5 ----
X #
! # @(#)rkive.cf 2.3 5/9/91
X #
X # An rkive.cf template.
X # Copy and edit this to reflect the local archive conditions.
***************
*** 82,94 ****
X # the available selection format capabilities.
X # COMPRESS - The location of the compression utility if the
X # files are to be reduced.
! # CHECKHASH - The location of the checkhash utility if the
SHAR_EOF
true || echo 'restore of patch2.1 failed'
fi
echo 'End of part 2'
echo 'File patch2.1 is continued in part 3'
echo 3 > _shar_seq_.tmp
exit 0
exit 0 # Just in case...
--
Kent Landfield INTERNET: kent at sparky.IMD.Sterling.COM
Sterling Software, IMD UUCP: uunet!sparky!kent
Phone: (402) 291-8300 FAX: (402) 291-4362
Please send comp.sources.misc-related mail to kent at uunet.uu.net.
More information about the Comp.sources.misc
mailing list