gww@beatnix.UUCP (Gary Winiger) (03/13/88)
Subject: Previous bug report on learn in error +Fix Index: learn/copy.c 4.3BSD +Fix Description: Previously I reported problems in learn dereferencing NULL pointers and not clearing EOF on files before continuing to read from them. I was over zealous in clearing EOFs. I cleared the EOF on the lesson file. That EOF is used to determine when all the lessons on a topic have been completed. Having cleared the EOF, learn didn't know a topic was completed and it tried to get the next lesson. This resulted in a division by zero and an accompanying floating point exception. Repeat-By: Install my previous fix in copy.c. Complete a topic. Get a floating point error and accompanying core dump. Fix: Only clear EOF on standard in. Attached following the corrective code for learn/copy.c is the original bug report. The attached code solves this problem at Elxsi. Gary.. {ucbvax!sun,lll-lcc!lll-tis,amdahl!altos86,bridge2}!elxsi!gww --------- cut --------- snip --------- :.,$w diff ------------- *** /tmp/,RCSt1001436 Fri Oct 23 11:36:21 1987 --- copy.c Fri Oct 23 11:34:20 1987 *************** *** 1,5 **** --- 1,8 ---- /* * $Log: copy.c,v $ + * Revision 1.3 87/10/23 11:33:42 gww + * Only clear eof if file is standard in. + * * Revision 1.2 86/12/30 14:36:21 gww * Stop dereferencing null pointers. * Stop looping on EOF from user. *************** *** 9,15 **** * */ #ifndef lint ! static char *ERcsId = "$Header: copy.c,v 1.2 86/12/30 14:36:21 gww Exp $ ENIX BSD"; static char sccsid[] = "@(#)copy.c 4.3 (Berkeley) 5/15/86"; #endif not lint --- 12,18 ---- * */ #ifndef lint ! static char *ERcsId = "$Header: copy.c,v 1.3 87/10/23 11:33:42 gww Exp $ ENIX BSD"; static char sccsid[] = "@(#)copy.c 4.3 (Berkeley) 5/15/86"; #endif not lint *************** *** 251,257 **** if (fgets(s, 100,f)) return(1); else { ! clearerr(f); return(0); } } --- 254,261 ---- if (fgets(s, 100,f)) return(1); else { ! if (f == stdin) ! clearerr(f); return(0); } } --------------------------------------------------------------------------- ---------------------- ORIGINAL BUG REPORT -------------------------------- --------------------------------------------------------------------------- >Subject: Learn dereferences null pointers and doesn't always clear EOF. +Fix >Index: usr.bin/learn 4.3BSD +Fix > >Description: > Procedure action can return a null. This is dereferenced before it > is checked for. > Procedure scopy is called many places with a NULL parameter. This > is dereferenced before it is checked. > In both copy.c and selsub.c an EOF condition can be encountered > and is not reset before rereading the same file. >Repeat-By: > Having a machine that will not accept null pointers. > Having users type ^D at unexpected places. >Fix: > The attached code resolves these problems at Elxsi. > >Gary.. >{ucbvax!sun,lll-lcc!lll-tis,amdahl!altos86,bridge2}!elxsi!gww >--------- cut --------- snip --------- :.,$w diff ------------- >*** /tmp/,RCSt1001152 Tue Dec 30 14:37:13 1986 >--- copy.c Tue Dec 30 14:36:53 1986 >*************** >*** 1,11 **** > /* > * $Log: copy.c,v $ > * Revision 1.1 86/12/30 14:15:54 gww > * Initial revision > * > */ > #ifndef lint >! static char *ERcsId = "$Header: copy.c,v 1.1 86/12/30 14:15:54 gww Exp $ ENIX BSD"; > static char sccsid[] = "@(#)copy.c 4.3 (Berkeley) 5/15/86"; > #endif not lint > >--- 1,15 ---- > /* > * $Log: copy.c,v $ >+ * Revision 1.2 86/12/30 14:36:21 gww >+ * Stop dereferencing null pointers. >+ * Stop looping on EOF from user. >+ * > * Revision 1.1 86/12/30 14:15:54 gww > * Initial revision > * > */ > #ifndef lint >! static char *ERcsId = "$Header: copy.c,v 1.2 86/12/30 14:36:21 gww Exp $ ENIX BSD"; > static char sccsid[] = "@(#)copy.c 4.3 (Berkeley) 5/15/86"; > #endif not lint > >*************** >*** 56,62 **** > } > r = wordb(s, t); /* t = first token, r = rest */ > p = action(t); /* p = token class */ >! if (*p == ONCE) { /* some actions done only once per script */ > if (wrong && !review) { /* we are on 2nd time */ > scopy(fin, NULL); > continue; >--- 60,67 ---- > } > r = wordb(s, t); /* t = first token, r = rest */ > p = action(t); /* p = token class */ >! if (p != 0 && *p == ONCE) { >! /* some actions done only once per script */ > if (wrong && !review) { /* we are on 2nd time */ > scopy(fin, NULL); > continue; >*************** >*** 245,252 **** > } > if (fgets(s, 100,f)) > return(1); >! else > return(0); > } > > trim(s) >--- 250,259 ---- > } > if (fgets(s, 100,f)) > return(1); >! else { >! clearerr(f); > return(0); >+ } > } > > trim(s) >*************** >*** 272,278 **** > if (c == '\n') > break; > if (c == EOF) { >! fflush(fo); > return; > } > if (fo != NULL) >--- 279,286 ---- > if (c == '\n') > break; > if (c == EOF) { >! if (fo != NULL) >! fflush(fo); > return; > } > if (fo != NULL) >*************** >*** 288,294 **** > } > if (c == '#') > ungetc(c, fi); >! fflush(fo); > } > > cmp(r) /* compare two files for status; #cmp f1 f2 [ firstnlinesonly ] */ >--- 296,303 ---- > } > if (c == '#') > ungetc(c, fi); >! if (fo != NULL) >! fflush(fo); > } > > cmp(r) /* compare two files for status; #cmp f1 f2 [ firstnlinesonly ] */ >*** /tmp/,RCSt1001135 Tue Dec 30 14:34:56 1986 >--- selsub.c Tue Dec 30 14:34:31 1986 >*************** >*** 1,11 **** > /* > * $Log: selsub.c,v $ > * Revision 1.1 86/12/30 14:16:15 gww > * Initial revision > * > */ > #ifndef lint >! static char *ERcsId = "$Header: selsub.c,v 1.1 86/12/30 14:16:15 gww Exp $ ENIX BSD"; > static char sccsid[] = "@(#)selsub.c 4.3 (Berkeley) 5/15/86"; > #endif not lint > >--- 1,14 ---- > /* > * $Log: selsub.c,v $ >+ * Revision 1.2 86/12/30 14:34:02 gww >+ * Stop loop on EOF from user. >+ * > * Revision 1.1 86/12/30 14:16:15 gww > * Initial revision > * > */ > #ifndef lint >! static char *ERcsId = "$Header: selsub.c,v 1.2 86/12/30 14:34:02 gww Exp $ ENIX BSD"; > static char sccsid[] = "@(#)selsub.c 4.3 (Berkeley) 5/15/86"; > #endif not lint > >*************** >*** 84,89 **** >--- 87,93 ---- > if (sname[0] == '\0') { > list("Xinfo"); > do { >+ clearerr(stdin); > printf("\nWhich subject? "); > fflush(stdout); > gets(sname=subname); > From gww Fri Oct 30 09:53:26 1987 To: /RCS/Bugs Subject: Fortran programs can't send all kill signals +Fix Subject: Fortran programs can't send all kill signals +Fix Index: libU77/kill_.c 4.3BSD +Fix Description: A fortran program calling kill(pid,signal) cannot send signals greater than 15 even though there are 31 defined signals. Repeat-By: By examination. Fix: The attached code solves this problem at Elxsi. Gary.. {ucbvax!sun,lll-lcc!lll-tis,amdahl!altos86,bridge2}!elxsi!gww --------- cut --------- snip --------- :.,$w diff ------------- *** /tmp/,RCSt1020143 Fri Oct 30 09:46:48 1987 --- kill_.c Fri Oct 30 09:46:35 1987 *************** *** 1,6 **** ! /* $Header: kill_.c,v 1.1 87/01/05 17:23:37 gww Exp $ ENIX BSD * * $Log: kill_.c,v $ * Revision 1.1 87/01/05 17:23:37 gww * Initial revision * --- 1,9 ---- ! /* $Header: kill_.c,v 1.2 87/10/30 09:46:09 gww Exp $ ENIX BSD * * $Log: kill_.c,v $ + * Revision 1.2 87/10/30 09:46:09 gww + * Permit fortran programs to send all kill signals. + * * Revision 1.1 87/01/05 17:23:37 gww * Initial revision * *************** *** 24,35 **** * ierror will be 0 if successful; an error code otherwise. */ #include "../libI77/f_errno.h" long kill_(pid, signum) long *pid, *signum; { ! if (*pid < 0 || *pid > 32767L || *signum < 1 || *signum > 16) return((long)(errno=F_ERARG)); if (kill((int)*pid, (int)*signum) != 0) return((long)errno); --- 27,39 ---- * ierror will be 0 if successful; an error code otherwise. */ + #include <signal.h> #include "../libI77/f_errno.h" long kill_(pid, signum) long *pid, *signum; { ! if (*pid < 0 || *pid > 32767L || *signum < 1 || *signum >= NSIG) return((long)(errno=F_ERARG)); if (kill((int)*pid, (int)*signum) != 0) return((long)errno); From gww Tue Dec 15 17:02:12 1987 To: /RCS/Bugs Subject: mt dereferences a null pointer when printing register status +Fix Subject: mt dereferences a null pointer when printing register status +FIX Index: bin/mt.c 4.3BSD +Fix Description: When the status command is used for a tape type with a null field for dsbits or erbits, a null pointer will be dereferenced. Repeat-By: On a system which does not permit dereferencing a null pointer run: mt -f /dev/<device where dsbits or erbits is null> status Take a core dump. Fix: Place a guard before dereferencing the null pointer. The attached code solves this problem at Elxsi. Gary.. {ucbvax!sun,lll-lcc!lll-tis,amdahl!altos86,bridge2}!elxsi!gww --------- cut --------- snip --------- :.,$w diff ------------- *** /tmp/,RCSt1014570 Tue Dec 15 16:53:33 1987 --- /tmp/,RCSt2014570 Tue Dec 15 16:53:34 1987 *************** *** 1,5 **** --- 1,8 ---- /* * $Log: mt.c,v $ + * Revision 1.2 87/12/15 16:53:02 gww + * Prevent dereference of null pointer. + * * Revision 1.1 86/12/17 18:14:20 gww * Initial revision * *************** *** 17,23 **** #endif not lint #ifndef lint ! static char *ERcsId = "$Header: mt.c,v 1.1 86/12/17 18:14:20 gww Exp $ ENIX BSD"; static char sccsid[] = "@(#)mt.c 5.1 (Berkeley) 4/30/85"; #endif not lint --- 20,26 ---- #endif not lint #ifndef lint ! static char *ERcsId = "$Header: mt.c,v 1.2 87/12/15 16:53:02 gww Exp $ ENIX BSD"; static char sccsid[] = "@(#)mt.c 5.1 (Berkeley) 4/30/85"; #endif not lint *************** *** 179,185 **** printf("%s=%o", s, v); else printf("%s=%x", s, v); ! bits++; if (v && bits) { putchar('<'); while (i = *bits++) { --- 182,189 ---- printf("%s=%o", s, v); else printf("%s=%x", s, v); ! if (bits) ! bits++; if (v && bits) { putchar('<'); while (i = *bits++) { From gww Sat Mar 12 10:53:28 1988 To: /RCS/Bugs Subject: Vi core dumps on SIGINT input. +Fix Index: ucb/ex/{ex_vget.c, ex_vmain.c, ex_voper.c} 4.3BSD +Fix Description: As previously reported: When vi receives the a SIGINT, it can queue it as the input character ATTN (value -2). This character is returned by getkey() (peekkey()). In some cases, vi asks if the character received is an xxx with ``isxxx''. The ``isxxx'' macros index the array _ctype_[] to determine the type of the character. If _ctype_ begins on a page boundary and the previous page is not a valid page, a segment fault will occur. Thanks to Keith Bostic (bostic@ucbvax) for pointing out that my previous fix was narrow in scope and could better be done as follows. Repeat-By: vi foo <user types INTERRUPT character> When _ctype_ begins on a page boundary and the previous page is not valid. Fix: Guard against checking indexing _ctype_ when the character may be ATTN. The attached code solves this problem at Elxsi. Gary.. {ucbvax!sun,lll-lcc!lll-tis,amdahl!altos86,bridge2}!elxsi!gww --------- cut --------- snip --------- :.,$w diff ------------- Index: ucb/ex/ex_vget.c *** /tmp/,RCSt1014232 Sat Mar 12 10:57:36 1988 --- ex_vget.c Sat Mar 12 10:56:47 1988 *************** *** 1,5 **** --- 1,13 ---- /* * $Log: ex_vget.c,v $ + * Revision 1.3 88/03/12 10:55:34 gww + * Correct guard against non-ascii index of _ctype_[]. Thanks to + * Keith Bostic (bostic@ucbvax). + * + * Revision 1.2 87/05/08 17:06:28 gww + * Check for ATTN (-2) before using isxxxx macro so as not to negatively + * index _ctype_[] and possibly get a segment fault. + * * Revision 1.1 86/12/23 18:16:10 gww * Initial revision * *************** *** 11,17 **** */ #ifndef lint ! static char *ERcsId = "$Header: ex_vget.c,v 1.1 86/12/23 18:16:10 gww Exp $ ENIX BSD"; static char *sccsid = "@(#)ex_vget.c 6.8 (Berkeley) 6/7/85"; #endif not lint --- 19,25 ---- */ #ifndef lint ! static char *ERcsId = "$Header: ex_vget.c,v 1.3 88/03/12 10:55:34 gww Exp $ ENIX BSD"; static char *sccsid = "@(#)ex_vget.c 6.8 (Berkeley) 6/7/85"; #endif not lint *************** *** 624,630 **** cnt = 0; for (;;) { c = getkey(); ! if (!isdigit(c)) break; cnt *= 10, cnt += c - '0'; } --- 632,638 ---- cnt = 0; for (;;) { c = getkey(); ! if (!isascii(c) || !isdigit(c)) break; cnt *= 10, cnt += c - '0'; } Index: ucb/ex/ex_vmain.c *** /tmp/,RCSt1014237 Sat Mar 12 10:57:51 1988 --- ex_vmain.c Sat Mar 12 10:56:54 1988 *************** *** 1,5 **** --- 1,13 ---- /* * $Log: ex_vmain.c,v $ + * Revision 1.3 88/03/12 10:56:48 gww + * Correct guard against non-ascii index of _ctype_[]. Thanks to + * Keith Bostic (bostic@ucbvax). + * + * Revision 1.2 87/05/08 17:08:01 gww + * Check for ATTN (-2) before using isxxxx macro so as not to negatively + * index _ctype_[] and possibly get a segment fault. + * * Revision 1.1 86/12/23 18:16:13 gww * Initial revision * *************** *** 11,17 **** */ #ifndef lint ! static char *ERcsId = "$Header: ex_vmain.c,v 1.1 86/12/23 18:16:13 gww Exp $ ENIX BSD"; static char *sccsid = "@(#)ex_vmain.c 7.7 (Berkeley) 6/7/85"; #endif not lint --- 19,25 ---- */ #ifndef lint ! static char *ERcsId = "$Header: ex_vmain.c,v 1.3 88/03/12 10:56:48 gww Exp $ ENIX BSD"; static char *sccsid = "@(#)ex_vmain.c 7.7 (Berkeley) 6/7/85"; #endif not lint *************** *** 112,118 **** if (trace) fprintf(trace, "pc=%c",peekkey()); #endif ! if (isdigit(peekkey()) && peekkey() != '0') { hadcnt = 1; cnt = vgetcnt(); forbid (cnt <= 0); --- 120,128 ---- if (trace) fprintf(trace, "pc=%c",peekkey()); #endif ! if (isascii(peekkey()) && ! isdigit(peekkey()) && ! peekkey() != '0') { hadcnt = 1; cnt = vgetcnt(); forbid (cnt <= 0); *************** *** 126,132 **** * an 'empty' named buffer spec in the routine * kshift (see ex_temp.c). */ ! forbid (c == '0' || !isalpha(c) && !isdigit(c)); vreg = c; } reread: --- 136,143 ---- * an 'empty' named buffer spec in the routine * kshift (see ex_temp.c). */ ! forbid (c == '0' || ! isascii(c) && !isalpha(c) && !isdigit(c)); vreg = c; } reread: *************** *** 158,164 **** * to go back to the "for" to interpret it. Likewise * for a buffer name. */ ! if ((isdigit(c) && c!='0') || c == '"') { ungetkey(c); goto looptop; } --- 169,175 ---- * to go back to the "for" to interpret it. Likewise * for a buffer name. */ ! if ((isascii(c) && isdigit(c) && c!='0') || c == '"') { ungetkey(c); goto looptop; } Index: ucb/ex/ex_voper.c *** /tmp/,RCSt1014242 Sat Mar 12 10:58:08 1988 --- ex_voper.c Sat Mar 12 10:57:00 1988 *************** *** 1,5 **** --- 1,13 ---- /* * $Log: ex_voper.c,v $ + * Revision 1.3 88/03/12 10:56:56 gww + * Correct guard against non-ascii index of _ctype_[]. Thanks to + * Keith Bostic (bostic@ucbvax). + * + * Revision 1.2 87/05/08 17:08:08 gww + * Check for ATTN (-2) before using isxxxx macro so as not to negatively + * index _ctype_[] and possibly get a segment fault. + * * Revision 1.1 86/12/23 18:16:15 gww * Initial revision * *************** *** 11,17 **** */ #ifndef lint ! static char *ERcsId = "$Header: ex_voper.c,v 1.1 86/12/23 18:16:15 gww Exp $ ENIX BSD"; static char *sccsid = "@(#)ex_voper.c 7.4 (Berkeley) 6/7/85"; #endif not lint --- 19,25 ---- */ #ifndef lint ! static char *ERcsId = "$Header: ex_voper.c,v 1.3 88/03/12 10:56:56 gww Exp $ ENIX BSD"; static char *sccsid = "@(#)ex_voper.c 7.4 (Berkeley) 6/7/85"; #endif not lint *************** *** 133,139 **** * Had an operator, so accept another count. * Multiply counts together. */ ! if (isdigit(peekkey()) && peekkey() != '0') { cnt *= vgetcnt(); Xcnt = cnt; forbid (cnt <= 0); --- 141,147 ---- * Had an operator, so accept another count. * Multiply counts together. */ ! if (isascii(peekkey()) && isdigit(peekkey()) && peekkey() != '0') { cnt *= vgetcnt(); Xcnt = cnt; forbid (cnt <= 0); From gww Fri Oct 23 12:09:38 1987 To: /RCS/Bugs Subject: Previous bug report on abort(3) in error +Fix Subject: Previous bug report on abort(3) in error +Fix Index: libc/gen/abort.c 4.3BSD Description: I previously reported that when abort was called, there were certain cases that it would continue with the user code before core was dumped. Keith Bostic (bostic@ucbvax) kindly pointed out that there was probably some other error in the kernel handling of signals: ``A signal is sent as soon as the process is next scheduled to run. The bug report assumed that there was a multiprocessor, so presumably the process could be running on one processor while the signal was being sent on another processor. The problem is that the process was sending a signal to itself (that is the `abort' library routine sends the signal to the current process). It is semantically incorrect for a process to be running in user code and kernel code concurrently. Therefore the process must have been stopped while it was doing the `kill' system call. hence when it next ran in user code it would have to get the signal. Clearly the Elxsi implementation subtlely violates the semantics of UNIX!'' Keith is clearly correct. I have since found the problem. The kernel was returning to the user code to allow the user to complete the `kill' system call before taking the action of the then pending signal. My thanks to Keith for pointing this out. Repeat-By: Fix: Don't install the suggested sigpause. Gary.. {ucbvax!sun,uunet,lll-lcc!lll-tis,amdahl!altos86,bridge2}!elxsi!gww --------------------------------------------------------------------------- ---------------------- ORIGINAL BUG REPORT -------------------------------- --------------------------------------------------------------------------- >Subject: abort(3) returns to user. +fix >Index: libc/gen/abort.c 4.3BSD > >Description: > When abort is called, it may return to the user and continue > processing before core is dumped. >Repeat-By: > Run a program that calls abort(3) on a multiprocessor system where > the kernel process is on a different cpu from the user process. > Examine the core dump stack trace with adb and notice that the > program has continued to run after abort was called. >Fix: > It is possible for the user process calling abort() to continue > after the abort before the kernel process gets it stopped. > Add code to abort to wait for the kill signal to occur. > > The attached code modification solves this problem at Elxsi. > >Gary.. >{ucbvax!sun,lll-lcc!lll-tis,amdahl!altos86,bridge2}!elxsi!gww >--------- cut --------- snip --------- :.,$w diff ------------- >*** /tmp/,RCSt1001187 Thu Jun 18 17:56:07 1987 >--- abort.c Thu Jun 18 17:55:11 1987 >*************** >*** 1,5 **** >--- 1,8 ---- > /* > * $Log: abort.c,v $ >+ * Revision 1.2 87/06/18 17:54:12 gww >+ * Guarantee abort doesn't return to user. >+ * > * Revision 1.1 87/01/15 15:35:03 gww > * Initial revision > * >*************** >*** 11,17 **** > */ > > #if defined(LIBC_SCCS) && !defined(lint) >! static char *ERcsId = "$Header: abort.c,v 1.1 87/01/15 15:35:03 gww Exp $ ENIX BSD"; > static char sccsid[] = "@(#)abort.c 5.3 (Berkeley) 3/9/86"; > #endif LIBC_SCCS and not lint > >--- 14,20 ---- > */ > > #if defined(LIBC_SCCS) && !defined(lint) >! static char *ERcsId = "$Header: abort.c,v 1.2 87/06/18 17:54:12 gww Exp $ ENIX BSD"; > static char sccsid[] = "@(#)abort.c 5.3 (Berkeley) 3/9/86"; > #endif LIBC_SCCS and not lint > >*************** >*** 25,28 **** >--- 28,32 ---- > signal(SIGILL, SIG_DFL); > sigsetmask(~sigmask(SIGILL)); > kill(getpid(), SIGILL); >+ sigpause(~sigmask(SIGILL)); > } To: /RCS/Bugs Subject: Ident(1) doesn't report SCCS what strings. +Fix Index: new/rcs/src/ident.c 4.3BSD Description: Berkeley distributes most routines with SCCS what strings. Many of us use RCS to maintain the Berkeley code. It would be nice if we could see the original what string as well as any RCS headers that were in our maintained code. Repeat-By: Run ident as distributed Procedure to repeat the problem. Fix: The attached code adds this feature at Elxsi. Description of how to fix the problem. If you don't know the fix, don't include this section or "Fix:". Use with pleasure.... Gary.. {ucbvax!sun,uunet,lll-lcc!lll-tis,amdahl!altos86,bridge2}!elxsi!gww --------- cut --------- snip --------- :.,$w diff ------------- Index: /usr/src/new/rcs/src/ident.c *** /tmp/,RCSt1001229 Tue Aug 4 16:49:14 1987 --- ident.c Tue Aug 4 16:19:26 1987 *************** *** 1,10 **** /* * $Log: ident.c,v $ * Revision 1.1 86/12/09 17:33:50 gww * Initial revision * */ ! static char *ERcsId = "$Header: ident.c,v 1.1 86/12/09 17:33:50 gww Exp $ ENIX BSD"; /* * RCS identification operation */ --- 1,13 ---- /* * $Log: ident.c,v $ + * Revision 1.2 87/08/04 16:19:10 gww + * Add display of sccs what strings. + * * Revision 1.1 86/12/09 17:33:50 gww * Initial revision * */ ! static char *ERcsId = "$Header: ident.c,v 1.2 87/08/04 16:19:10 gww Exp $ ENIX BSD"; /* * RCS identification operation */ *************** *** 69,74 **** --- 72,79 ---- while( (c=getc(fp)) != EOF) { if ( (char)c==KDELIM) matchcount += match(fp); + else if ( (char)c=='@') + matchcount += what(fp); } if (matchcount == 0) fprintf(stderr, "ident warning: no id keywords in %s\n", *argv); *************** *** 132,135 **** --- 137,161 ---- if (s[j] == VDELIM) return(true); return(false); + } + + + what(fp) + FILE *fp; + + { + char line[keyvallength]; + register int c; + register char * tp; + + if ((getc(fp) == '(') && (getc(fp) == '#') && (getc(fp) == ')') ) { + tp = line; + while(((c = getc(fp)) != '\0') && (c != '\n') && (c != '"') && + (c != EOF) && (tp <= line+keyvallength-1)) + *tp++ = c; + *tp='\0'; + fprintf(stdout," %s\n",line); + return(1); + } else + return(0); } Subject: Tar(1) cannot be positioned. +Fix: Index: bin/tar.c 4.3BSD Index: man1/tar.1 Description: When a tar(1) aborts for some reason, there is no way to restart it from when it left off. Repeat-By: Abort a tar x and try to restart it. Fix: Elxsi has added a new flag to tar(1), -K. K will skip an archive until the named file is found and then extract or list the remainder of the archive. We found this to be quite useful when an extract from a large archive aborted. We didn't have to reextract all the files that had already been extracted. Enjoy. Gary.. {ucbvax!sun,lll-lcc!lll-tis,amdahl!altos86,bridge2}!elxsi!gww # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. -----cut here-----cut here-----cut here-----cut here----- #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # tar.c.diff # tar.1.diff # This archive created: Thu Dec 18 18:01:33 1986 echo shar: extracting tar.c.diff '(1794 characters)' sed 's/^XX//' << \SHAR_EOF > tar.c.diff XX*** /tmp/,RCSt1002165 Thu Dec 18 17:47:28 1986 XX--- tar.c Thu Dec 18 17:17:38 1986 XX*************** XX*** 1,5 **** XX--- 1,8 ---- XX /* XX * $Log: tar.c,v $ XX+ * Revision 1.2 86/12/18 17:16:26 gww XX+ * Add -K flag to start extracting (-x) or listing (-t) at the named file. XX+ * XX * Revision 1.1 86/12/17 18:14:47 gww XX * Initial revision XX * XX*************** XX*** 17,23 **** XX #endif not lint XX XX #ifndef lint XX! static char *ERcsId = "$Header: tar.c,v 1.1 86/12/17 18:14:47 gww Exp $ ENIX BSD"; XX static char sccsid[] = "@(#)tar.c 5.7 (Berkeley) 4/26/86"; XX #endif not lint XX XX--- 20,26 ---- XX #endif not lint XX XX #ifndef lint XX! static char *ERcsId = "$Header: tar.c,v 1.2 86/12/18 17:16:26 gww Exp $ ENIX BSD"; XX static char sccsid[] = "@(#)tar.c 5.7 (Berkeley) 4/26/86"; XX #endif not lint XX XX*************** XX*** 85,90 **** XX--- 88,95 ---- XX int hflag; XX int Bflag; XX int Fflag; XX+ int Kflag; /* Start at the Named file. Ie, skip all files up to, but */ XX+ /* not including the named file. Get all files thereafter.*/ XX XX int mt; XX int term; XX*************** XX*** 244,249 **** XX--- 249,258 ---- XX Fflag++; XX break; XX XX+ case 'K': XX+ Kflag++; XX+ break; XX+ XX default: XX fprintf(stderr, "tar: %c: unknown option\n", *cp); XX usage(); XX*************** XX*** 1052,1059 **** XX if (*argv == 0) XX return (1); XX for (cp = argv; *cp; cp++) XX! if (prefix(*cp, dblock.dbuf.name)) XX return (1); XX passtape(); XX return (0); XX } XX--- 1061,1074 ---- XX if (*argv == 0) XX return (1); XX for (cp = argv; *cp; cp++) XX! if (prefix(*cp, dblock.dbuf.name)) { XX! if (Kflag) XX! /* Kflag means 'start' at the given */ XX! /* file. Now that we've found it */ XX! /* let 'er rip! */ XX! *argv = 0; XX return (1); XX+ } XX passtape(); XX return (0); XX } SHAR_EOF if test 1794 -ne "`wc -c tar.c.diff`" then echo shar: error transmitting tar.c.diff '(should have been 1794 characters)' fi echo shar: extracting tar.1.diff '(990 characters)' sed 's/^XX//' << \SHAR_EOF > tar.1.diff XX*** /tmp/,RCSt1002158 Thu Dec 18 17:46:51 1986 XX--- tar.1 Thu Dec 18 17:46:18 1986 XX*************** XX*** 1,6 **** XX! .\" $Header: tar.1,v 1.1 86/12/18 17:20:18 gww Exp $ ENIX BSD XX .\" XX .\" $Log: tar.1,v $ XX .\" Revision 1.1 86/12/18 17:20:18 gww XX .\" Initial revision XX .\" XX--- 1,9 ---- XX! .\" $Header: tar.1,v 1.2 86/12/18 17:45:53 gww Exp $ ENIX BSD XX .\" XX .\" $Log: tar.1,v $ XX+ .\" Revision 1.2 86/12/18 17:45:53 gww XX+ .\" Add description of -K flag. XX+ .\" XX .\" Revision 1.1 86/12/18 17:20:18 gww XX .\" Initial revision XX .\" XX*************** XX*** 163,168 **** XX--- 166,179 ---- XX and from /etc, one might use XX .ti +0.5i XX tar c -C /usr include -C / etc XX+ .TP 10 XX+ .B K XX+ Forces XX+ .I tar XX+ to skip all files up to the first file named. XX+ This file and all the files that follow on the archive are extracted XX+ (key letter `x') or listed (key letter `t'). XX+ This option is useful for beginning in the middle of an archive. XX .PP XX Previous restrictions dealing with XX .IR tar 's SHAR_EOF if test 990 -ne "`wc -c tar.1.diff`" then echo shar: error transmitting tar.1.diff '(should have been 990 characters)' fi # End of shell archive exit 0