sms@wlv.imsd.contel.com (Steven M. Schultz) (05/05/91)
File: /usr/src/bin/dd.c Description: When dd(1) is writing an archive to tape, and encounters a write error or even an end of tape mark, it returns exit status 0, which spoils error checking in scripts and especially if it is the last command in a list. Repeat-By: try it; or inspect code to see that term() always exits with zero. Fix: Apply the following patch and recompile 'dd'. *** dd.c.old Sun Feb 8 14:24:49 1987 --- dd.c Sun Mar 31 00:23:49 1991 *************** *** 313,319 **** perror("read"); if((cflag&NERR) == 0) { flsh(); ! term(); } ibc = 0; for(c=0; c<ibs; c++) --- 313,319 ---- perror("read"); if((cflag&NERR) == 0) { flsh(); ! term(1); } ibc = 0; for(c=0; c<ibs; c++) *************** *** 323,329 **** } if(ibc == 0 && --files<=0) { flsh(); ! term(); } if(ibc != ibs) { nipr++; --- 323,329 ---- } if(ibc == 0 && --files<=0) { flsh(); ! term(0); } if(ibc != ibs) { nipr++; *************** *** 365,371 **** c = write(obf, obuf, obc); if(c != obc) { perror("write"); ! term(); } obc = 0; } --- 365,371 ---- c = write(obf, obuf, obc); if(c != obc) { perror("write"); ! term(1); } obc = 0; } *************** *** 592,602 **** null(c); } ! term() { stats(); ! exit(0); } stats() --- 592,603 ---- null(c); } ! term(status) ! int status; { stats(); ! exit(status); } stats()