ag@cbmvax.UUCP (Keith Gabryelski) (05/03/89)
I have been receiving a steady reply for these since I posted the message. Here are the diffs/coff unexec code to bring adventure up on a SysV system. Pax, Keith #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # README # DIFFS # unexec.c # This archive created: Wed Apr 26 20:42:57 1989 export PATH; PATH=/bin:$PATH if test -f 'README' then echo shar: will not over-write existing file "'README'" else cat << \SHAR_EOF > 'README' Apply the diffs in the file DIFFS and add `-DAMIX' to CFLAGS in the makefile. Pax, Keith SHAR_EOF fi # end of overwriting check if test -f 'DIFFS' then echo shar: will not over-write existing file "'DIFFS'" else cat << \SHAR_EOF > 'DIFFS' *** /p/tahoe/usr/src/games/adventure/Makefile Thu Jul 14 21:24:46 1988 --- Makefile Thu Apr 6 17:56:55 1989 *************** *** 5,14 # # @(#)Makefile 4.7 (Berkeley) 9/21/87 # ! CFLAGS= -O ! LIBC= /lib/libc.a ! SRCS= done.c init.c io.c main.c save.c subr.c vocab.c wizard.c ! OBJS= done.o init.o io.o main.o save.o subr.o vocab.o wizard.o advent: ${OBJS} ${LIBC} ${CC} -n ${CFLAGS} ${OBJS} --- 5,16 ----- # # @(#)Makefile 4.7 (Berkeley) 9/21/87 # ! CFLAGS= -g ! SHELL=/bin/sh ! GAMESDIR=$(ROOT)/usr/games ! LIBC= $(ROOT)/lib/libc.a ! SRCS= done.c init.c io.c main.c save.c subr.c vocab.c wizard.c unexec.c ! OBJS= done.o init.o io.o main.o save.o subr.o vocab.o wizard.o unexec.o advent: ${OBJS} ${LIBC} ${CC} -n ${CFLAGS} ${OBJS} *************** *** 16,22 echo y | ./a.out save.o: save.c # vax C optimizer bug - infinite loop ! ${CC} -c save.c clean: FRC rm -f ${OBJS} core advent a.out --- 18,24 ----- echo y | ./a.out save.o: save.c # vax C optimizer bug - infinite loop ! ${CC} $(CFLAGS) -Dindex=strchr -c save.c clean: FRC rm -f ${OBJS} core advent a.out *************** *** 24,32 depend: FRC mkdep ${CFLAGS} ${SRCS} ! install: FRC ! install -s -o games -g bin -m 700 advent ${DESTDIR}/usr/games/hide/adventure ! (cd ${DESTDIR}/usr/games; rm -f adventure; ln -s dm adventure; chown games.bin adventure) lint: FRC lint ${CFLAGS} ${SRCS} --- 26,34 ----- depend: FRC mkdep ${CFLAGS} ${SRCS} ! install: advent ! cpset advent $(GAMESDIR) 755 games games ! strip $(GAMESDIR)/advent lint: FRC lint ${CFLAGS} ${SRCS} *************** *** 34,39 tags: FRC ctags ${SRCS} FRC: # DO NOT DELETE THIS LINE -- mkdep uses it. --- 36,44 ----- tags: FRC ctags ${SRCS} + TAGS: FRC + etags ${SRCS} + FRC: # DO NOT DELETE THIS LINE -- mkdep uses it. *************** *** 41,47 done.o: done.c hdr.h init.o: init.c hdr.h ! io.o: io.c hdr.h /usr/include/stdio.h main.o: main.c hdr.h save.o: save.c /usr/include/a.out.h /usr/include/sys/exec.h subr.o: subr.c hdr.h --- 46,52 ----- done.o: done.c hdr.h init.o: init.c hdr.h ! io.o: io.c hdr.h main.o: main.c hdr.h save.o: save.c subr.o: subr.c hdr.h *************** *** 43,49 init.o: init.c hdr.h io.o: io.c hdr.h /usr/include/stdio.h main.o: main.c hdr.h ! save.o: save.c /usr/include/a.out.h /usr/include/sys/exec.h subr.o: subr.c hdr.h vocab.o: vocab.c hdr.h wizard.o: wizard.c hdr.h --- 48,54 ----- init.o: init.c hdr.h io.o: io.c hdr.h main.o: main.c hdr.h ! save.o: save.c subr.o: subr.c hdr.h vocab.o: vocab.c hdr.h wizard.o: wizard.c hdr.h *** /p/tahoe/usr/src/games/adventure/hdr.h Tue Jun 8 22:36:25 1982 --- hdr.h Wed Mar 22 11:38:20 1989 *************** *** 18,24 /* hdr.h: included by c advent files */ extern int setup; /* changed by savec & init */ ! int datfd; /* message file descriptor */ int delhit; int yea; --- 18,24 ----- /* hdr.h: included by c advent files */ extern int setup; /* changed by savec & init */ ! extern int datfd; /* message file descriptor */ int delhit; int yea; *** /p/tahoe/usr/src/games/adventure/init.c Tue Jun 8 22:36:22 1982 --- init.c Thu Apr 6 18:45:13 1989 *************** *** 27,42 } else exit(0); printf("Save succeeded. Adding messages.\n"); ! adfd=open("advent",1); ! lseek(adfd,0L,2); ! close(datfd); ! if (fork()==0) /* child process */ ! { close(1); ! dup(adfd); /* output goes to advent file */ ! execl("/bin/cat","cat",TMPFILE,0); ! printf("unable to find /bin/cat\n"); ! } ! wait(&stat); unlink(TMPFILE); printf("Advent is ready.\n"); exit(0); --- 27,33 ----- } else exit(0); printf("Save succeeded. Adding messages.\n"); ! system("cat tmp.foo.baz >> advent"); unlink(TMPFILE); printf("Advent is ready.\n"); exit(0); *** /p/tahoe/usr/src/games/adventure/main.c Tue Jun 8 22:36:23 1982 --- main.c Mon Mar 27 23:49:14 1989 *************** *** 306,311 case 30: /* suspend=8300 */ spk=201; if (demo) goto l2011; printf("I can suspend your adventure for you so"); printf(" you can resume later, but\n"); printf("you will have to wait at least"); --- 306,312 ----- case 30: /* suspend=8300 */ spk=201; if (demo) goto l2011; + #ifdef BOGUS_LATENCY_CHECK_THAT_TWAS_MADE_FOR_WIMPS_BY_WIMPS printf("I can suspend your adventure for you so"); printf(" you can resume later, but\n"); printf("you will have to wait at least"); *************** *** 311,316 printf("you will have to wait at least"); printf(" %d minutes before continuing.",latncy); if (!yes(200,54,54)) goto l2012; datime(&saved,&savet); setup = -1; ciao(argv[0]); --- 312,318 ----- printf("you will have to wait at least"); printf(" %d minutes before continuing.",latncy); if (!yes(200,54,54)) goto l2012; + #endif datime(&saved,&savet); setup = -1; ciao(argv[0]); *** /p/tahoe/usr/src/games/adventure/save.c Mon Nov 17 20:52:28 1986 --- save.c Mon Mar 27 23:36:22 1989 *************** *** 15,21 save(cmdfile,outfile) /* save core image */ char *cmdfile,*outfile; ! { register char *c; register int i,fd; int fdaout; struct exec header; --- 15,25 ----- save(cmdfile,outfile) /* save core image */ char *cmdfile,*outfile; ! { ! #ifdef AMIX ! unexec(cmdfile, outfile); ! #else /* !AMIX */ ! register char *c; register int i,fd; int fdaout; struct exec header; *************** *** 95,100 write(fd,buff,counter); write(fd,c,header.a_data); /* write all data in 1 glob */ close(fd); } #define NULL 0 --- 99,105 ----- write(fd,buff,counter); write(fd,c,header.a_data); /* write all data in 1 glob */ close(fd); + #endif /* !AMIX */ } #define NULL 0 *************** *** 105,111 char *command; { char *pathstr; - register char *cp; char fname[128]; int fd; --- 110,115 ----- char *command; { char *pathstr; char fname[128]; register char *cp; int fd; *************** *** 107,112 char *pathstr; register char *cp; char fname[128]; int fd; if ((pathstr = getenv("PATH")) == NULL) --- 111,117 ----- { char *pathstr; char fname[128]; + register char *cp; int fd; if ((pathstr = getenv("PATH")) == NULL) *************** *** 110,116 int fd; if ((pathstr = getenv("PATH")) == NULL) ! pathstr = ":/bin:/usr/bin"; cp = index(command, '/')? "": pathstr; do { --- 115,121 ----- int fd; if ((pathstr = getenv("PATH")) == NULL) ! pathstr = ":/bin:/usr/bin:/usr/games"; cp = index(command, '/')? "": pathstr; do { *** /p/tahoe/usr/src/games/adventure/wizard.c Tue Jun 8 22:36:25 1982 --- wizard.c Mon Mar 27 23:46:07 1989 *************** *** 26,32 } start(n) ! { int d,t,delay; datime(&d,&t); delay=(d-saved)*1440+(t-savet); /* good for about a month */ if (delay>=latncy || setup >= 0) --- 26,34 ----- } start(n) ! { ! #ifdef BOGUS_LATENCY_CHECK_THAT_WAS_MADE_FOR_WIMPS_BY_WIMPS ! int d,t,delay; datime(&d,&t); delay=(d-saved)*1440+(t-savet); /* good for about a month */ if (delay>=latncy || setup >= 0) *************** *** 43,48 { mspeak(9); exit(0); } saved = -1; return(FALSE); } --- 45,51 ----- { mspeak(9); exit(0); } + #endif saved = -1; return(FALSE); } SHAR_EOF fi # end of overwriting check if test -f 'unexec.c' then echo shar: will not over-write existing file "'unexec.c'" else cat << \SHAR_EOF > 'unexec.c' #include <a.out.h> #include <fcntl.h> extern filesize; unexec(oldname, newname) char *oldname, *newname; { int ifd, ofd, i; long text_vaddr, data_vaddr; struct filehdr filehdr; struct aouthdr aouthdr; struct scnhdr scnhdr; if((ifd=open(oldname, O_RDONLY)) < 0) { char foo[512]; sprintf(foo, "/usr/games/%s", oldname); if((ifd=open(foo, O_RDONLY)) < 0) { perror("open"); return 1; } } if (read(ifd, &filehdr, sizeof filehdr) < sizeof filehdr) { perror("read"); return 1; } if (filehdr.f_opthdr != sizeof (struct aouthdr)) { perror("weird optional header; lseek help"); return 1; } filehdr.f_symptr = 0; filehdr.f_nsyms = 0; if((ofd=open(newname, O_WRONLY|O_CREAT|O_TRUNC, 0755)) < 0) { perror("open"); return 1; } if (write(ofd, &filehdr, sizeof filehdr) < sizeof filehdr) { perror("write"); return 1; } if (read(ifd, &aouthdr, sizeof aouthdr) < sizeof aouthdr) { perror("read"); return 1; } aouthdr.bsize = 0; aouthdr.dsize = sbrk(0) - aouthdr.data_start; if (write(ofd, &aouthdr, sizeof aouthdr) < sizeof aouthdr) { perror("write"); return 1; } for (i=0; i < filehdr.f_nscns; ++i) { if (read(ifd, &scnhdr, sizeof scnhdr) < sizeof scnhdr) { perror("read"); return 1; } if (!strncmp(scnhdr.s_name, _TEXT, sizeof (scnhdr.s_name))) text_vaddr = scnhdr.s_vaddr; else if (!strncmp(scnhdr.s_name, _DATA, sizeof (scnhdr.s_name))) { data_vaddr = scnhdr.s_vaddr; filesize = scnhdr.s_scnptr+aouthdr.dsize; scnhdr.s_size = aouthdr.dsize; } else if (!strncmp(scnhdr.s_name, _BSS, sizeof (scnhdr.s_name))) scnhdr.s_size = 0; scnhdr.s_relptr = scnhdr.s_lnnoptr = 0; scnhdr.s_nreloc = scnhdr.s_nlnno = 0; if (write(ofd, &scnhdr, sizeof scnhdr) < sizeof scnhdr) { perror("write"); return 1; } } lseek(ofd, aouthdr.text_start, 0); if (write(ofd, text_vaddr, aouthdr.tsize) < aouthdr.tsize) { perror("text write"); return 1; } lseek(ofd, aouthdr.data_start, 0); if (write(ofd, data_vaddr, aouthdr.dsize) < aouthdr.dsize) { perror("data write"); return 1; } close(ofd); close(ifd); return 0; } SHAR_EOF fi # end of overwriting check # End of shell archive exit 0 -- This article is freely ditributable under the terms of the GNU License. Keith Gabryelski ag@cbmvax.commodore.com