ast@cs.vu.nl (Andy Tanenbaum) (06/28/88)
: 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:/usr/ucb echo Extracting 'LISTING' sed 's/^X//' > 'LISTING' << '+ END-OF-FILE ''LISTING' Xtotal 45 X-rw-r--r-- 1 ast 167 Jun 27 22:51 cache.c.diff X-rw-r--r-- 1 ast 278 Jun 27 22:51 const.h.diff X-rw-r--r-- 1 ast 3244 Jun 27 22:51 device.c.diff X-rw-r--r-- 1 ast 90 Jun 27 22:51 fproc.h.diff X-rw-r--r-- 1 ast 456 Jun 27 22:52 fs.log X-rw-r--r-- 1 ast 113 Jun 27 22:51 link.c.diff X-rw-r--r-- 1 ast 7511 Jun 27 22:51 main.c.diff X-rw-r--r-- 1 ast 4190 Jun 27 22:51 makefile X-rw-r--r-- 1 ast 694 Jun 27 22:51 misc.c.diff X-rw-r--r-- 1 ast 140 Jun 27 22:51 mount.c.diff X-rw-r--r-- 1 ast 452 Jun 27 22:51 open.c.diff X-rw-r--r-- 1 ast 34 Jun 27 22:51 param.h.diff X-rw-r--r-- 1 ast 743 Jun 27 22:51 path.c.diff X-rw-r--r-- 1 ast 1736 Jun 27 22:51 pipe.c.diff X-rw-r--r-- 1 ast 231 Jun 27 22:51 protect.c.diff X-rw-r--r-- 1 ast 67 Jun 27 22:51 putc.c.diff X-rw-r--r-- 1 ast 2579 Jun 27 22:51 read.c.diff X-rw-r--r-- 1 ast 369 Jun 27 22:51 super.c.diff X-rw-r--r-- 1 ast 139 Jun 27 22:51 super.h.diff X-rw-r--r-- 1 ast 824 Jun 27 22:51 table.c.diff X-rw-r--r-- 1 ast 82 Jun 27 22:51 time.c.diff X-rw-r--r-- 1 ast 145 Jun 27 22:52 type.h.diff X-rw-r--r-- 1 ast 274 Jun 27 22:52 utility.c.diff X-rw-r--r-- 1 ast 168 Jun 27 22:52 write.c.diff + END-OF-FILE LISTING chmod 'u=rw,g=r,o=r' 'LISTING' set `wc -c 'LISTING'` count=$1 case $count in 1386) :;; *) echo 'Bad character count in ''LISTING' >&2 echo 'Count should be 1386' >&2 esac echo Extracting 'cache.c.diff' sed 's/^X//' > 'cache.c.diff' << '+ END-OF-FILE ''cache.c.diff' X66c66 X< * However, a block that is aready in use (b_count > 0) may not be taken. X--- X> * However, a block that is already in use (b_count > 0) may not be taken. + END-OF-FILE cache.c.diff chmod 'u=rw,g=r,o=r' 'cache.c.diff' set `wc -c 'cache.c.diff'` count=$1 case $count in 167) :;; *) echo 'Bad character count in ''cache.c.diff' >&2 echo 'Count should be 167' >&2 esac echo Extracting 'const.h.diff' sed 's/^X//' > 'const.h.diff' << '+ END-OF-FILE ''const.h.diff' X3c3 X< #define NR_BUFS 20 /* # blocks in the buffer cache */ X--- X> #define NR_BUFS 30 /* # blocks in the buffer cache */ X11a12,13 X> X> #ifdef i8088 X12a15,19 X> #endif X> X> #ifdef ATARI_ST X> #define FS_STACK_BYTES 2048 /* size of file system stack */ X> #endif + END-OF-FILE const.h.diff chmod 'u=rw,g=r,o=r' 'const.h.diff' set `wc -c 'const.h.diff'` count=$1 case $count in 278) :;; *) echo 'Bad character count in ''const.h.diff' >&2 echo 'Count should be 278' >&2 esac echo Extracting 'device.c.diff' sed 's/^X//' > 'device.c.diff' << '+ END-OF-FILE ''device.c.diff' X11a12,13 X> * tty_open: a tty has been opened X> * tty_exit: a process with pid=pgrp has exited. X40a43 X> dev_mess.DEVICE = dev; X111a115 X> dev_mess.TTY_SPEED = m.TTY_SPEED; X138d141 X< dev_mess.DEVICE = minor; X151a155,156 X> int r; X> message m; X153,160c158,161 X< int proc_nr; X< X< proc_nr = mess_ptr->PROC_NR; X< X< if (sendrec(task_nr, mess_ptr) != OK) panic("rw_dev: can't send", NO_NUM); X< while (mess_ptr->REP_PROC_NR != proc_nr) { X< /* Instead of the reply to this request, we got a message for an X< * earlier request. Handle it and go receive again. X--- X> while ((r = sendrec(task_nr, mess_ptr)) == E_LOCKED) { X> /* sendrec() failed to avoid deadlock. The task 'task_nr' is X> * trying to send a REVIVE message for an earlier request. X> * Handle it and go try again. X162,163c163,164 X< revive(mess_ptr->REP_PROC_NR, mess_ptr->REP_STATUS); X< receive(task_nr, mess_ptr); X--- X> if (receive(task_nr, &m) != OK) panic("rw_dev: can't receive", NO_NUM); X> revive(m.REP_PROC_NR, m.REP_STATUS); X164a166 X> if (r != OK) panic("rw_dev: can't send", NO_NUM); X175c177 X< /* This routine is only called for one device, namely /dev/tty. It's job X--- X> /* This routine is only called for one device, namely /dev/tty. Its job X181a184,188 X> if (fp->fs_tty == 0) { X> mess_ptr->DEVICE = NULL_DEV; X> rw_dev(MEM, mess_ptr); X> return; X> } X199a207,264 X> X> /*===========================================================================* X> * tty_open * X> *===========================================================================*/ X> PUBLIC tty_open(task_nr, mess_ptr) X> int task_nr; X> message *mess_ptr; X> { X> register struct fproc *rfp; X> int major; X> X> mess_ptr->REP_STATUS = OK; X> X> /* Is this a process group leader? */ X> if (fp->fp_pid != fp->fp_pgrp) return; X> X> /* Is there a current control terminal? */ X> if (fp->fs_tty != 0) return; X> /* Is this one already allocated to another process? */ X> for (rfp = &fproc[INIT_PROC_NR + 1]; rfp < &fproc[NR_PROCS]; rfp++) X> if (rfp->fs_tty == mess_ptr->DEVICE) return; X> X> /* All conditions satisfied. Make this a control terminal. */ X> fp->fs_tty = mess_ptr->DEVICE; X> major = (mess_ptr->DEVICE >> MAJOR) & BYTE; X> mess_ptr->DEVICE = (mess_ptr->DEVICE >> MINOR) & BYTE; X> mess_ptr->m_type = TTY_SETPGRP; X> mess_ptr->PROC_NR = who; X> mess_ptr->TTY_PGRP = who; X> (*dmap[major].dmap_rw)(task_nr, mess_ptr); X> } X> X> /*===========================================================================* X> * tty_exit * X> *===========================================================================*/ X> PUBLIC tty_exit() X> { X> /* Process group leader exits. Remove its control terminal X> * from any processes currently running. X> */ X> X> register struct fproc *rfp; X> register dev_nr ttydev; X> X> ttydev = fp->fs_tty; X> for (rfp = &fproc[INIT_PROC_NR + 1]; rfp < &fproc[NR_PROCS]; rfp++) X> if (rfp->fs_tty == ttydev) X> rfp->fs_tty = 0; X> /* Inform the terminal driver. */ X> find_dev(ttydev); X> dev_mess.m_type = TTY_SETPGRP; X> dev_mess.DEVICE = (ttydev >> MINOR) & BYTE; X> dev_mess.PROC_NR = who; X> dev_mess.TTY_PGRP = 0; X> (*dmap[major].dmap_rw)(task, &dev_mess); X> return(OK); X> } X> + END-OF-FILE device.c.diff chmod 'u=rw,g=r,o=r' 'device.c.diff' set `wc -c 'device.c.diff'` count=$1 case $count in 3244) :;; *) echo 'Bad character count in ''device.c.diff' >&2 echo 'Count should be 3244' >&2 esac echo Extracting 'fproc.h.diff' sed 's/^X//' > 'fproc.h.diff' << '+ END-OF-FILE ''fproc.h.diff' X5a6 X> X21a23,24 X> int fp_pid; /* process id */ X> int fp_pgrp; /* process group */ + END-OF-FILE fproc.h.diff chmod 'u=rw,g=r,o=r' 'fproc.h.diff' set `wc -c 'fproc.h.diff'` count=$1 case $count in 90) :;; *) echo 'Bad character count in ''fproc.h.diff' >&2 echo 'Count should be 90' >&2 esac echo Extracting 'link.c.diff' sed 's/^X//' > 'link.c.diff' << '+ END-OF-FILE ''link.c.diff' X28c28 X< /* Perform the link(name, name2) system call. */ X--- X> /* Perform the link(name1, name2) system call. */ + END-OF-FILE link.c.diff chmod 'u=rw,g=r,o=r' 'link.c.diff' set `wc -c 'link.c.diff'` count=$1 case $count in 113) :;; *) echo 'Bad character count in ''link.c.diff' >&2 echo 'Count should be 113' >&2 esac echo Extracting 'main.c.diff' sed 's/^X//' > 'main.c.diff' << '+ END-OF-FILE ''main.c.diff' X9a10,14 X> #ifdef ATARI_ST X> #define ASKDEV /* ask for boot device */ X> #define FASTLOAD /* use multiple block transfers to init ram */ X> #endif X> X24a30,33 X> #ifdef FASTLOAD X> #include "dev.h" X> #endif FASTLOAD X> X27c36,37 X< #define MAX_RAM 512 /* maxium RAM disk size in blocks */ X--- X> #define MAX_RAM 16384 /* maximum RAM disk size in blocks */ X> #define RAM_IMAGE (dev_nr)0x303 /* major-minor dev where root image is kept */ X28a39,43 X> #ifdef i8088 X> #define EM_ORIGIN 0x100000 /* origin of extended memory RAM disk on AT */ X> #define MAX_CRD 255 /* if root fs > MAX_CRD, use extended mem */ X> #endif X> X80c95 X< who = rp - fproc; X--- X> who = (int)(rp - fproc); X85c100 X< rp->fp_suspended = NOT_SUSPENDED; /* no longer hanging*/ X--- X> rp->fp_suspended = NOT_SUSPENDED; /*no longer hanging*/ X109c124 X< * been killed by a signal, so don't check the return code. If the send X--- X> * been killed by a signal), so don't check the return code. If the send X166a182 X> #ifdef i8088 X169a186 X> #endif X224a242 X> dev_nr root_device; X225a244 X> long base; X232a252,253 X> base = (long) init_org + (long) init_text_clicks + (long) init_data_clicks; X> base = base << CLICK_SHIFT; X234,235c255,267 X< /* Get size of RAM disk by reading root file system's super block */ X< bp = get_block(BOOT_DEV, SUPER_BLOCK, NORMAL); /* get RAM super block */ X--- X> /* Get size of RAM disk by reading root file system's super block. X> * First read block 0 from the floppy. If this is a valid file system, use X> * it as the root image, otherwise try the hard disk (RAM_IMAGE). X> */ X> #ifdef ATARI_ST X> printf("Booting MINIX-ST 1.1. Copyright 1988 Prentice-Hall, Inc.\n"); X> #endif ATARI_ST X> #ifdef ASKDEV X> root_device = (dev_nr)askdev(); X> if (root_device == 0) X> #endif ASKDEV X> root_device = BOOT_DEV; /* try floppy disk first */ X> bp = get_block(root_device, SUPER_BLOCK, NORMAL); /* get RAM super block */ X238,239c270,278 X< if (sp->s_magic != SUPER_MAGIC) X< panic("Diskette in drive 0 is not root file system", NO_NUM); X--- X> if (sp->s_magic != SUPER_MAGIC) { X> put_block(bp, FULL_DATA_BLOCK); X> root_device = RAM_IMAGE; X> bp = get_block(root_device, SUPER_BLOCK, NORMAL); /* get RAM super block */ X> copy(super_block, bp->b_data, sizeof(struct super_block)); X> sp = &super_block[0]; X> if (sp->s_magic != SUPER_MAGIC) X> panic("Invalid root file system", NO_NUM); X> } X244a284,296 X> #ifdef i8088 X> /* There are two possibilities now (by convention): X> * count < MAX_CRD ==> RAM disk is in core X> * count >=MAX_CRD ==> RAM disk is in extended memory (AT only) X> * In the latter case, tell MM that RAM disk size is 0 and tell the ram disk X> * driver than the device begins at 1MB. X> */ X> if (count > MAX_CRD) { X> ram_clicks = 0; /* MM does not have to allocate any core */ X> base = EM_ORIGIN; /* tell RAM disk driver RAM disk origin */ X> } X> #endif X> X251a304,306 X> #ifdef ATARI_ST X> m1.m1_p1 = (char *) (int) init_org; /* Bug in Alcyon 4.14 C */ X> #else X252a308 X> #endif X258,259c314 X< m1.POSITION = (long) init_org + (long) init_text_clicks + init_data_clicks; X< m1.POSITION = m1.POSITION << CLICK_SHIFT; X--- X> m1.POSITION = base; X264c319,326 X< printf("Loading RAM disk from root diskette. Loaded: 0K "); X--- X> #ifdef i8088 X> if (ram_clicks == 0) X> printf("RAM disk of %d blocks is in extended memory\n\n", count); X> #endif X> #ifdef FASTLOAD X> fastload(root_device, (char *)base); X> #else X> printf("Loading RAM disk. Loaded: 0K "); X266c328 X< bp = get_block(BOOT_DEV, (block_nr) i, NORMAL); X--- X> bp = get_block(root_device, (block_nr) i, NORMAL); X273c335 X< if (k_loaded % 5 == 0) printf("\b\b\b\b\b%3DK %c", k_loaded, 0); X--- X> if (k_loaded % 5 == 0) printf("\b\b\b\b\b\b%4DK %c", k_loaded, 0); X274a337 X> #endif FASTLOAD X276c339,342 X< printf("\rRAM disk loaded. Please remove root diskette. \n\n"); X--- X> if (root_device == BOOT_DEV) X> printf("\rRAM disk loaded. Please remove root diskette. \n\n"); X> else X> printf("\rRAM disk loaded. \n\n"); X311a378,506 X> X> #ifdef ASKDEV X> /*===========================================================================* X> * askdev * X> *===========================================================================*/ X> PRIVATE askdev() X> { X> char line[80]; X> register char *p; X> register min, maj, c, n; X> X> printf("Insert ROOT diskette and hit RETURN (or specify bootdev) %c", 0); X> m.m_type = TTY_READ; X> m.TTY_LINE = 0; X> m.PROC_NR = FS_PROC_NR; X> m.ADDRESS = line; X> m.COUNT = sizeof(line); X> if (sendrec(TTY, &m) != OK) X> return(0); X> for (;;) { X> if (m.REP_PROC_NR != FS_PROC_NR) X> return(-1); X> if (m.REP_STATUS != SUSPEND) X> break; X> receive(TTY, &m); X> } X> if ((n = m.REP_STATUS) <= 0) X> return(0); X> p = line; X> for (maj = 0;;) { X> if (--n < 0) X> return(0); X> c = *p++; X> if (c == ',') X> break; X> if (c < '0' || c > '9') X> return(0); X> maj = maj * 10 + c - '0'; X> } X> for (min = 0;;) { X> if (--n < 0) X> return(0); X> c = *p++; X> if (c == '\n') X> break; X> if (c < '0' || c > '9') X> return(0); X> min = min * 10 + c - '0'; X> } X> if (n != 0) X> return(0); X> return((maj << 8) | min); X> } X> #endif ASKDEV X> X> #ifdef FASTLOAD X> /*===========================================================================* X> * fastload * X> *===========================================================================*/ X> PRIVATE fastload(boot_dev, address) X> dev_nr boot_dev; X> char *address; X> { X> register i, blocks; X> register long position; X> X> blocks = lastused(boot_dev); X> printf("Loading RAM disk. To load: %4DK Loaded: 0K %c", X> ((long)blocks * BLOCK_SIZE) / 1024, 0); X> position = 0; X> while (blocks) { X> i = blocks; X> if (i > (18*1024)/BLOCK_SIZE) X> i = (18*1024)/BLOCK_SIZE; X> blocks -= i; X> i *= BLOCK_SIZE; X> m1.m_type = DISK_READ; X> m1.DEVICE = (boot_dev >> MINOR) & BYTE; X> m1.POSITION = position; X> m1.PROC_NR = HARDWARE; X> m1.ADDRESS = address; X> m1.COUNT = i; X> (*dmap[(boot_dev >> MAJOR) & BYTE].dmap_rw)( X> dmap[(boot_dev >> MAJOR) & BYTE].dmap_task, X> &m1 X> ); X> if (m1.REP_STATUS < 0) X> panic("Disk error loading BOOT disk", m1.REP_STATUS); X> position += i; X> address += i; X> printf("\b\b\b\b\b\b%4DK %c", position / 1024L, 0); X> } X> } X> X> /*===========================================================================* X> * lastused * X> *===========================================================================*/ X> PRIVATE lastused(boot_dev) X> dev_nr boot_dev; X> { X> register i, w, b, last, this, zbase; X> register struct super_block *sp = &super_block[0]; X> register struct buf *bp; X> register short *wptr, *wlim; X> X> zbase = SUPER_BLOCK + 1 + sp->s_imap_blocks; X> this = sp->s_firstdatazone; X> last = this - 1; X> for (i = 0; i < sp->s_zmap_blocks; i++) { X> bp = get_block(boot_dev, (block_nr) zbase + i, NORMAL); X> wptr = (short *)&bp->b_data[0]; X> wlim = (short *)&bp->b_data[BLOCK_SIZE]; X> while (wptr != wlim) { X> w = *wptr++; X> for (b = 0; b < 8*sizeof(*wptr); b++) { X> if (this == sp->s_nzones) { X> put_block(bp, ZMAP_BLOCK); X> return(last << sp->s_log_zone_size); X> } X> if ((w>>b) & 1) X> last = this; X> this++; X> } X> } X> put_block(bp, ZMAP_BLOCK); X> } X> panic("lastused", NO_NUM); X> } X> #endif FASTLOAD + END-OF-FILE main.c.diff chmod 'u=rw,g=r,o=r' 'main.c.diff' set `wc -c 'main.c.diff'` count=$1 case $count in 7511) :;; *) echo 'Bad character count in ''main.c.diff' >&2 echo 'Count should be 7511' >&2 esac echo Extracting 'makefile' sed 's/^X//' > 'makefile' << '+ END-OF-FILE ''makefile' X# On a PC, cpp and cem are in /lib and will be removed to make space while X# linking the kernel. On an AT, they are in /usr/lib are are not removed. X# This is because they have to be in /lib on a PC; the diskette is too small X# for them to be in /usr/lib. X XCFLAGS= -Di8088 -F Xh=../h Xl=/usr/lib X Xobj = main.s open.s read.s write.s pipe.s device.s \ X path.s mount.s link.s super.s inode.s cache.s filedes.s \ X stadir.s protect.s time.s misc.s utility.s table.s putc.s X Xfs: makefile $l/head.s $(obj) $l/libc.a $l/end.s X @echo "Start linking FS. " X @asld -o fs $l/head.s $(obj) $l/libc.a $l/end.s X @echo "FS done. " X Xclean: X rm -f $(obj) X Xcache.s: const.h type.h $h/const.h $h/type.h Xcache.s: $h/error.h Xcache.s: buf.h Xcache.s: file.h Xcache.s: fproc.h Xcache.s: glo.h Xcache.s: inode.h Xcache.s: super.h X Xdevice.s: const.h type.h $h/const.h $h/type.h Xdevice.s: $h/com.h Xdevice.s: $h/error.h Xdevice.s: dev.h Xdevice.s: file.h Xdevice.s: fproc.h Xdevice.s: glo.h Xdevice.s: inode.h Xdevice.s: param.h X Xfiledes.s: const.h type.h $h/const.h $h/type.h Xfiledes.s: $h/error.h Xfiledes.s: file.h Xfiledes.s: fproc.h Xfiledes.s: glo.h Xfiledes.s: inode.h X Xinode.s: const.h type.h $h/const.h $h/type.h Xinode.s: $h/error.h Xinode.s: buf.h Xinode.s: file.h Xinode.s: fproc.h Xinode.s: glo.h Xinode.s: inode.h Xinode.s: super.h X Xlink.s: const.h type.h $h/const.h $h/type.h Xlink.s: $h/error.h Xlink.s: buf.h Xlink.s: file.h Xlink.s: fproc.h Xlink.s: glo.h Xlink.s: inode.h Xlink.s: param.h X Xmain.s: const.h type.h $h/const.h $h/type.h Xmain.s: $h/callnr.h Xmain.s: $h/com.h Xmain.s: $h/error.h Xmain.s: buf.h Xmain.s: file.h Xmain.s: fproc.h Xmain.s: glo.h Xmain.s: inode.h Xmain.s: param.h Xmain.s: super.h X Xmisc.s: const.h type.h $h/const.h $h/type.h Xmisc.s: $h/callnr.h Xmisc.s: $h/com.h Xmisc.s: $h/error.h Xmisc.s: buf.h Xmisc.s: file.h Xmisc.s: fproc.h Xmisc.s: glo.h Xmisc.s: inode.h Xmisc.s: param.h Xmisc.s: super.h X Xmount.s: const.h type.h $h/const.h $h/type.h Xmount.s: $h/error.h Xmount.s: buf.h Xmount.s: file.h Xmount.s: fproc.h Xmount.s: glo.h Xmount.s: inode.h Xmount.s: param.h Xmount.s: super.h X Xopen.s: const.h type.h $h/const.h $h/type.h Xopen.s: $h/callnr.h Xopen.s: $h/error.h Xopen.s: buf.h Xopen.s: file.h Xopen.s: fproc.h Xopen.s: glo.h Xopen.s: inode.h Xopen.s: param.h X Xpath.s: const.h type.h $h/const.h $h/type.h Xpath.s: $h/error.h Xpath.s: buf.h Xpath.s: file.h Xpath.s: fproc.h Xpath.s: glo.h Xpath.s: inode.h Xpath.s: super.h X Xpipe.s: const.h type.h $h/const.h $h/type.h Xpipe.s: $h/callnr.h Xpipe.s: $h/com.h Xpipe.s: $h/error.h Xpipe.s: $h/signal.h Xpipe.s: file.h Xpipe.s: fproc.h Xpipe.s: glo.h Xpipe.s: inode.h Xpipe.s: param.h X Xprotect.s: const.h type.h $h/const.h $h/type.h Xprotect.s: $h/error.h Xprotect.s: buf.h Xprotect.s: file.h Xprotect.s: fproc.h Xprotect.s: glo.h Xprotect.s: inode.h Xprotect.s: param.h Xprotect.s: super.h X Xputc.s: const.h type.h $h/const.h $h/type.h Xputc.s: $h/com.h X Xread.s: const.h type.h $h/const.h $h/type.h Xread.s: $h/com.h Xread.s: $h/error.h Xread.s: buf.h Xread.s: file.h Xread.s: fproc.h Xread.s: glo.h Xread.s: inode.h Xread.s: param.h Xread.s: super.h X Xstadir.s: const.h type.h $h/const.h $h/type.h Xstadir.s: $h/error.h Xstadir.s: $h/stat.h Xstadir.s: file.h Xstadir.s: fproc.h Xstadir.s: glo.h Xstadir.s: inode.h Xstadir.s: param.h X Xsuper.s: const.h type.h $h/const.h $h/type.h Xsuper.s: $h/error.h Xsuper.s: buf.h Xsuper.s: inode.h Xsuper.s: super.h X Xtable.s: const.h type.h $h/const.h $h/type.h Xtable.s: $h/com.h Xtable.s: $h/callnr.h Xtable.s: $h/error.h Xtable.s: $h/stat.h Xtable.s: buf.h Xtable.s: dev.h Xtable.s: file.h Xtable.s: fproc.h Xtable.s: glo.h Xtable.s: inode.h Xtable.s: super.h X Xtime.s: const.h type.h $h/const.h $h/type.h Xtime.s: $h/callnr.h Xtime.s: $h/com.h Xtime.s: $h/error.h Xtime.s: file.h Xtime.s: fproc.h Xtime.s: glo.h Xtime.s: inode.h Xtime.s: param.h X Xutility.s: const.h type.h $h/const.h $h/type.h Xutility.s: $h/com.h Xutility.s: $h/error.h Xutility.s: buf.h Xutility.s: file.h Xutility.s: fproc.h Xutility.s: glo.h Xutility.s: inode.h Xutility.s: param.h Xutility.s: super.h X Xwrite.s: const.h type.h $h/const.h $h/type.h Xwrite.s: $h/error.h Xwrite.s: buf.h Xwrite.s: file.h Xwrite.s: fproc.h Xwrite.s: glo.h Xwrite.s: inode.h Xwrite.s: super.h + END-OF-FILE makefile chmod 'u=rw,g=r,o=r' 'makefile' set `wc -c 'makefile'` count=$1 case $count in 4190) :;; *) echo 'Bad character count in ''makefile' >&2 echo 'Count should be 4190' >&2 esac echo Extracting 'misc.c.diff' sed 's/^X//' > 'misc.c.diff' << '+ END-OF-FILE ''misc.c.diff' X88,89c88,91 X< sp->s_time = clock_time(); X< if (sp->s_rd_only == FALSE) sp->s_dirt = DIRTY; X--- X> if (sp != NIL_SUPER) { X> sp->s_time = clock_time(); X> if (sp->s_rd_only == FALSE) sp->s_dirt = DIRTY; X> } X124c126 X< * In particular, let the child inherit its parents file descriptors. X--- X> * In particular, let the child inherit its parent's file descriptors. X146a149,154 X> /* Fill in new process id and, if necessary, process group. */ X> cp->fp_pid = pid; X> if (parent == INIT_PROC_NR) { X> cp->fp_pgrp = pid; X> } X> X168a177,179 X> X> /* Can this be a process group leader associated with a terminal? */ X> if (fp->fp_pid == fp->fp_pgrp && fp->fs_tty != 0) tty_exit(); + END-OF-FILE misc.c.diff chmod 'u=rw,g=r,o=r' 'misc.c.diff' set `wc -c 'misc.c.diff'` count=$1 case $count in 694) :;; *) echo 'Bad character count in ''misc.c.diff' >&2 echo 'Count should be 694' >&2 esac echo Extracting 'mount.c.diff' sed 's/^X//' > 'mount.c.diff' << '+ END-OF-FILE ''mount.c.diff' X34c34 X< extern dev_nr name_to_dev(); X--- X> dev_nr name_to_dev(); X132c132 X< extern dev_nr name_to_dev(); X--- X> dev_nr name_to_dev(); + END-OF-FILE mount.c.diff chmod 'u=rw,g=r,o=r' 'mount.c.diff' set `wc -c 'mount.c.diff'` count=$1 case $count in 140) :;; *) echo 'Bad character count in ''mount.c.diff' >&2 echo 'Count should be 140' >&2 esac echo Extracting 'open.c.diff' sed 's/^X//' > 'open.c.diff' << '+ END-OF-FILE ''open.c.diff' X39c39 X< extern struct inode *new_node(); X--- X> struct inode *new_node(); X52c52 X< * and has been created, or it pre-existed. In the later case, truncate X--- X> * and has been created, or it pre-existed. In the latter case, truncate X213,217d212 X< /* Assume that first open of char special file is controlling tty. */ X< if (fp->fs_tty == 0) fp->fs_tty = (dev_nr) rip->i_zone[0]; X< dev_open((dev_nr) rip->i_zone[0], (int) bits); X< break; X< + END-OF-FILE open.c.diff chmod 'u=rw,g=r,o=r' 'open.c.diff' set `wc -c 'open.c.diff'` count=$1 case $count in 452) :;; *) echo 'Bad character count in ''open.c.diff' >&2 echo 'Count should be 452' >&2 esac echo Extracting 'param.h.diff' sed 's/^X//' > 'param.h.diff' << '+ END-OF-FILE ''param.h.diff' X29a30 X> #define pid m.m1_i3 + END-OF-FILE param.h.diff chmod 'u=rw,g=r,o=r' 'param.h.diff' set `wc -c 'param.h.diff'` count=$1 case $count in 34) :;; *) echo 'Bad character count in ''param.h.diff' >&2 echo 'Count should be 34' >&2 esac echo Extracting 'path.c.diff' sed 's/^X//' > 'path.c.diff' << '+ END-OF-FILE ''path.c.diff' X70c70 X< extern char *get_name(); X--- X> char *get_name(); X121c121 X< while ( rnp < &user_path[MAX_PATH] && c != '/' && c != '\0') { X--- X> while ( rnp < &old_name[MAX_PATH] && c != '/' && c != '\0') { X127c127 X< while (c == '/' && rnp < &user_path[MAX_PATH]) c = *++rnp; X--- X> while (c == '/' && rnp < &old_name[MAX_PATH]) c = *++rnp; X132c132 X< if (rnp >= &user_path[MAX_PATH]) { X--- X> if (rnp >= &old_name[MAX_PATH]) { X162a163,165 X> /* Check for NIL_INODE. */ X> if (dirp == NIL_INODE) return(NIL_INODE); X> X175c178 X< for (sp = &super_block[1]; sp < &super_block[NR_SUPERS]; sp++) { X--- X> for (sp = &super_block[1]; sp < &super_block[NR_SUPERS]; sp++){ X189a193,194 X> if (rip == NIL_INODE) return(NIL_INODE); X> + END-OF-FILE path.c.diff chmod 'u=rw,g=r,o=r' 'path.c.diff' set `wc -c 'path.c.diff'` count=$1 case $count in 743) :;; *) echo 'Bad character count in ''path.c.diff' >&2 echo 'Count should be 743' >&2 esac echo Extracting 'pipe.c.diff' sed 's/^X//' > 'pipe.c.diff' << '+ END-OF-FILE ''pipe.c.diff' X84c84 X< PUBLIC int pipe_check(rip, rw_flag, virgin, bytes, position) X--- X> PUBLIC int pipe_check(rip, rw_flag, bytes, position) X87d86 X< int virgin; /* 1 if no data transferred yet, else 0 */ X89c88 X< register file_pos *position; /* pointer to current file position */ X--- X> register file_pos position; /* pointer to current file position */ X101c100 X< if (*position >= rip->i_size) { X--- X> if (position >= rip->i_size) { X104,105c103,104 X< /* Writer exists; suspend rdr if no data already read.*/ X< if (virgin) suspend(XPIPE); /* block reader */ X--- X> /* Writer exists */ X> suspend(XPIPE); /* block reader */ X116,120c115,116 X< /* Tell MM to generate a SIGPIPE signal. */ X< mess.m_type = KSIG; X< mess.PROC1 = fp - fproc; X< mess.SIG_MAP = 1 << (SIGPIPE - 1); X< send(MM_PROC_NR, &mess); X--- X> /* Tell kernel to generate a SIGPIPE signal. */ X> sys_kill((int)(fp - fproc), SIGPIPE); X124c120 X< if (*position + bytes > PIPE_SIZE) { X--- X> if (position + bytes > PIPE_SIZE) { X130c126 X< if (*position == 0) release(rip, READ, 1); X--- X> if (position == 0) release(rip, READ, 1); X176,178c172,176 X< if (rp->fp_suspended == SUSPENDED && (rp->fp_fd & BYTE) == call_nr && X< rp->fp_filp[rp->fp_fd>>8]->filp_ino == ip) { X< revive(rp - fproc, 0); X--- X> if (rp->fp_suspended == SUSPENDED && X> rp->fp_revived == NOT_REVIVING && X> (rp->fp_fd & BYTE) == call_nr && X> rp->fp_filp[rp->fp_fd>>8]->filp_ino == ip) { X> revive((int)(rp - fproc), 0); X251,255c249 X< if (sendrec(task, &mess) != OK) panic("unpause err 3", NO_NUM); X< while (mess.REP_PROC_NR != proc_nr) { X< revive(mess.REP_PROC_NR, mess.REP_STATUS); X< if (receive(task, &m) != OK) panic("unpause err 4", NO_NUM); X< } X--- X> rw_dev(task, &mess); + END-OF-FILE pipe.c.diff chmod 'u=rw,g=r,o=r' 'pipe.c.diff' set `wc -c 'pipe.c.diff'` count=$1 case $count in 1736) :;; *) echo 'Bad character count in ''pipe.c.diff' >&2 echo 'Count should be 1736' >&2 esac echo Extracting 'protect.c.diff' sed 's/^X//' > 'protect.c.diff' << '+ END-OF-FILE ''protect.c.diff' X138c138 X< /* Given a pointer to an inode, 'rip', and the accessed desired, determine X--- X> /* Given a pointer to an inode, 'rip', and the access desired, determine X181c181 X< PRIVATE int read_only(ip) X--- X> PUBLIC int read_only(ip) + END-OF-FILE protect.c.diff chmod 'u=rw,g=r,o=r' 'protect.c.diff' set `wc -c 'protect.c.diff'` count=$1 case $count in 231) :;; *) echo 'Bad character count in ''protect.c.diff' >&2 echo 'Count should be 231' >&2 esac echo Extracting 'putc.c.diff' sed 's/^X//' > 'putc.c.diff' << '+ END-OF-FILE ''putc.c.diff' X49c49 X< sendrec(TTY, &putchmsg); X--- X> rw_dev(TTY, &putchmsg); + END-OF-FILE putc.c.diff chmod 'u=rw,g=r,o=r' 'putc.c.diff' set `wc -c 'putc.c.diff'` count=$1 case $count in 67) :;; *) echo 'Bad character count in ''putc.c.diff' >&2 echo 'Count should be 67' >&2 esac echo Extracting 'read.c.diff' sed 's/^X//' > 'read.c.diff' << '+ END-OF-FILE ''read.c.diff' X9c9 X< * read_map: given an inode and file position, lookup its zone number X--- X> * read_map: given an inode and file position, look up its zone number X56c56 X< int r, chunk, virg, mode_word, usr, seg; X--- X> int r, chunk, mode_word, usr, seg, block_spec, char_spec; X73,74c73,76 X< if (nbytes == 0) return(0); /* so char special files need not check for 0*/ X< if (who != MM_PROC_NR && nbytes < 0) return(EINVAL); /* only MM > 32K */ X--- X> #ifdef i8088 X> if (who != MM_PROC_NR) /* only MM > 32K */ X> #endif X> if (nbytes < 0) return(EINVAL); X77a80 X> if (nbytes == 0) return(0); /* so char special files need not check for 0*/ X84d86 X< virg = TRUE; X86c88,90 X< if (mode_word == I_BLOCK_SPECIAL && f_size == 0) f_size = MAX_P_LONG; X--- X> char_spec = (mode_word == I_CHAR_SPECIAL ? 1 : 0); X> block_spec = (mode_word == I_BLOCK_SPECIAL ? 1 : 0); X> if (block_spec && f_size == 0) f_size = MAX_P_LONG; X90c94 X< if (mode_word == I_CHAR_SPECIAL) { X--- X> if (char_spec) { X98c102 X< if (rw_flag == WRITING && mode_word != I_BLOCK_SPECIAL) { X--- X> if (rw_flag == WRITING && block_spec == 0) { X111,113c115,117 X< if (rip->i_pipe && (r = pipe_check(rip, rw_flag, virg, X< nbytes, &position)) <= 0) return(r); X< X--- X> if (rip->i_pipe && X> (r = pipe_check(rip, rw_flag, nbytes, position)) <= 0) X> return r; X120c124 X< if (rw_flag == READING) { X--- X> if (rw_flag == READING || (block_spec && rw_flag == WRITING)) { X137d140 X< virg = FALSE; /* tells pipe_check() that data has been copied */ X143,144c146 X< if (mode_word != I_CHAR_SPECIAL && mode_word != I_BLOCK_SPECIAL && X< position > f_size) X--- X> if (char_spec == 0 && block_spec == 0 && position > f_size) X220c222,223 X< if(rw_flag == WRITING && off == 0 && position >= rip->i_size) n=NO_READ; X--- X> if(rw_flag == WRITING && !block_spec && X> off == 0 && position >= rip->i_size) n=NO_READ; X263c266 X< if ( (z = rip->i_zone[zone]) == NO_ZONE) return(NO_BLOCK); X--- X> if ( (z = rip->i_zone[(int) zone]) == NO_ZONE) return(NO_BLOCK); X280c283 X< z = bp->b_ind[excess/NR_INDIRECTS]; /* z is zone # for single ind */ X--- X> z = bp->b_ind[(int)(excess/NR_INDIRECTS)];/*z is zone # for single ind*/ X285c288 X< /* 'z' is zone number for single indirect block; 'excess' is index into it. */ X--- X> /* 'z' is zone num for single indirect block; 'excess' is index into it. */ X289,290c292,293 X< z = bp->b_ind[excess]; X< put_block(bp, INDIRECT_BLOCK); /* release single indirect blk */ X--- X> z = bp->b_ind[(int) excess]; X> put_block(bp, INDIRECT_BLOCK); /* release single indir blk */ + END-OF-FILE read.c.diff chmod 'u=rw,g=r,o=r' 'read.c.diff' set `wc -c 'read.c.diff'` count=$1 case $count in 2579) :;; *) echo 'Bad character count in ''read.c.diff' >&2 echo 'Count should be 2579' >&2 esac echo Extracting 'super.c.diff' sed 's/^X//' > 'super.c.diff' << '+ END-OF-FILE ''super.c.diff' X125c125 X< a = i + (wptr - &bp->b_int[0])*INT_BITS X--- X> a = i + (int)(wptr - &bp->b_int[0])*INT_BITS X153c153 X< /* Return a zone or inode by turning on its bitmap bit. */ X--- X> /* Return a zone or inode by turning off its bitmap bit. */ X166c166 X< bp->b_int[w] &= ~(1 << bit); /* turn the bit on */ X--- X> bp->b_int[w] &= ~(1 << bit); /* turn the bit off */ + END-OF-FILE super.c.diff chmod 'u=rw,g=r,o=r' 'super.c.diff' set `wc -c 'super.c.diff'` count=$1 case $count in 369) :;; *) echo 'Bad character count in ''super.c.diff' >&2 echo 'Count should be 369' >&2 esac echo Extracting 'super.h.diff' sed 's/^X//' > 'super.h.diff' << '+ END-OF-FILE ''super.h.diff' X30c30 X< int s_magic; /* magic number to recognize super-blocks */ X--- X> short s_magic; /* magic number to recognize super-blocks */ + END-OF-FILE super.h.diff chmod 'u=rw,g=r,o=r' 'super.h.diff' set `wc -c 'super.h.diff'` count=$1 case $count in 139) :;; *) echo 'Bad character count in ''super.h.diff' >&2 echo 'Count should be 139' >&2 esac echo Extracting 'table.c.diff' sed 's/^X//' > 'table.c.diff' << '+ END-OF-FILE ''table.c.diff' X105c105,108 X< no_sys /* 68 = TASK_REPLY */ X--- X> no_sys, /* 68 = TASK_REPLY */ X> #ifdef i8088 X> no_sys, /* 69 = unused */ X> #endif X109c112 X< extern rw_dev(), rw_dev2(); X--- X> extern rw_dev(), rw_dev2(), tty_open(); X110a114 X> X115c119,121 X< * must be changed to correspond to the new values. X--- X> * must be changed to correspond to the new values. Note that the major X> * device numbers used in /dev are NOT the same as the task numbers used X> * inside the kernel (as defined in h/com.h). X124c130 X< no_call, rw_dev, no_call, TTY, /* 4 = /dev/tty0 */ X--- X> tty_open, rw_dev, no_call, TTY, /* 4 = /dev/tty0 */ X126c132 X< no_call, rw_dev, no_call, PRINTER /* 6 = /dev/lp */ X--- X> no_call, rw_dev, no_call, PRINTER, /* 6 = /dev/lp */ + END-OF-FILE table.c.diff chmod 'u=rw,g=r,o=r' 'table.c.diff' set `wc -c 'table.c.diff'` count=$1 case $count in 824) :;; *) echo 'Bad character count in ''table.c.diff' >&2 echo 'Count should be 824' >&2 esac echo Extracting 'time.c.diff' sed 's/^X//' > 'time.c.diff' << '+ END-OF-FILE ''time.c.diff' X42a43 X> if (read_only(rip) != OK) r = EROFS; /* not even su can touch if R/O */ + END-OF-FILE time.c.diff chmod 'u=rw,g=r,o=r' 'time.c.diff' set `wc -c 'time.c.diff'` count=$1 case $count in 82) :;; *) echo 'Bad character count in ''time.c.diff' >&2 echo 'Count should be 82' >&2 esac echo Extracting 'type.h.diff' sed 's/^X//' > 'type.h.diff' << '+ END-OF-FILE ''type.h.diff' X9c9 X< typedef struct { /* disk inode. Memory inode is in "inotab.h" */ X--- X> typedef struct { /* disk inode. Memory inode is in "inode.h" */ + END-OF-FILE type.h.diff chmod 'u=rw,g=r,o=r' 'type.h.diff' set `wc -c 'type.h.diff'` count=$1 case $count in 145) :;; *) echo 'Bad character count in ''type.h.diff' >&2 echo 'Count should be 145' >&2 esac echo Extracting 'utility.c.diff' sed 's/^X//' > 'utility.c.diff' << '+ END-OF-FILE ''utility.c.diff' X45,46c45,48 X< sp->s_time = clock_mess.NEW_TIME; /* update super block time */ X< if (sp->s_rd_only == FALSE) sp->s_dirt = DIRTY; X--- X> if (sp) { X> sp->s_time = clock_mess.NEW_TIME; /* update super block time */ X> if (sp->s_rd_only == FALSE) sp->s_dirt = DIRTY; X> } + END-OF-FILE utility.c.diff chmod 'u=rw,g=r,o=r' 'utility.c.diff' set `wc -c 'utility.c.diff'` count=$1 case $count in 274) :;; *) echo 'Bad character count in ''utility.c.diff' >&2 echo 'Count should be 274' >&2 esac echo Extracting 'write.c.diff' sed 's/^X//' > 'write.c.diff' << '+ END-OF-FILE ''write.c.diff' X61c61 X< rip->i_zone[zone] = new_zone; X--- X> rip->i_zone[(int) zone] = new_zone; X112c112 X< bp->b_ind[excess] = new_zone; X--- X> bp->b_ind[(int) excess] = new_zone; + END-OF-FILE write.c.diff chmod 'u=rw,g=r,o=r' 'write.c.diff' set `wc -c 'write.c.diff'` count=$1 case $count in 168) :;; *) echo 'Bad character count in ''write.c.diff' >&2 echo 'Count should be 168' >&2 esac exit 0