ast@cs.vu.nl (Andy Tanenbaum) (12/13/87)
There was a lot of discussion about how to get rid of my calls to _cleanup earlier. Here is the solution that I finally adopted. The following commands should do the job. cc -c -LIB exit.c putc.c ar r /usr/lib/libc.a exit.c putc.c ar x /usr/lib/libc.a cleanup.s ar d /usr/lib/libc.a cleanup.s ar bfork.s /usr/lib/libc.a cleanup.s This requires the new archiver posted a while back (for the b option). It also assumes that putting cleanup before fork.s will include cleanup.s after exit.s and putc.s (check this). Andy Tanenbaum (ast@cs.vu.nl) : This is a shar archive. Extract with sh, not csh. : This archive ends with exit, so do not worry about trailing junk. : --------------------------- cut here -------------------------- PATH=/bin:/usr/bin echo Extracting \e\x\i\t\.\c sed 's/^X//' > \e\x\i\t\.\c << '+ END-OF-FILE '\e\x\i\t\.\c X#include "../include/lib.h" X XPUBLIC int (*__cleanup)(); X XPUBLIC int exit(status) Xint status; X{ X if (__cleanup) (*__cleanup)(); X return callm1(MM, EXIT, status, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); X} + END-OF-FILE exit.c chmod 'u=rw,g=r,o=r' \e\x\i\t\.\c set `sum \e\x\i\t\.\c` sum=$1 case $sum in 11315) :;; *) echo 'Bad sum in '\e\x\i\t\.\c >&2 esac echo Extracting \p\u\t\c\.\c sed 's/^X//' > \p\u\t\c\.\c << '+ END-OF-FILE '\p\u\t\c\.\c X#include "../include/stdio.h" X Xextern int (*__cleanup)(); Xextern int _cleanup(); X Xputc(ch, iop) Xchar ch; XFILE *iop; X{ X int n, X didwrite = 0; X X if (testflag(iop, (_ERR | _EOF))) X return (EOF); X X if ( !testflag(iop,WRITEMODE)) X return(EOF); X X if ( testflag(iop,UNBUFF)){ X n = write(iop->_fd,&ch,1); X iop->_count = 1; X didwrite++; X } X else{ X __cleanup = _cleanup; X *iop->_ptr++ = ch; X if ((++iop->_count) >= BUFSIZ && !testflag(iop,STRINGS) ){ X n = write(iop->_fd,iop->_buf,iop->_count); X iop->_ptr = iop->_buf; X didwrite++; X } X } X X if (didwrite){ X if (n<=0 || iop->_count != n){ X if (n < 0) X iop->_flags |= _ERR; X else X iop->_flags |= _EOF; X return (EOF); X } X iop->_count=0; X } X return(ch & CMASK); X} X + END-OF-FILE putc.c chmod 'u=rw,g=r,o=r' \p\u\t\c\.\c set `sum \p\u\t\c\.\c` sum=$1 case $sum in 49878) :;; *) echo 'Bad sum in '\p\u\t\c\.\c >&2 esac exit 0