BSD 4_1_snap development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Sun, 16 Mar 1980 05:25:43 +0000 (21:25 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Sun, 16 Mar 1980 05:25:43 +0000 (21:25 -0800)
Work on file usr/src/games/compat/modshell/compat.c

Synthesized-from: CSRG/cd1/4.1.snap

usr/src/games/compat/modshell/compat.c [new file with mode: 0644]

diff --git a/usr/src/games/compat/modshell/compat.c b/usr/src/games/compat/modshell/compat.c
new file mode 100644 (file)
index 0000000..4dae3da
--- /dev/null
@@ -0,0 +1,58 @@
+#include "defs.h"
+#define BS 8
+#define        MAXARGS 300
+short buf[BS];
+/*
+ *     Check for possible program to run under alternate runtime system
+ *     If it checks out, start the rts and pass file and args
+ *     Art Wetzel 3/13/80
+ */
+compat(file, argv, envp) char *file, *argv[], *envp[]; {
+       register int fd;
+       register char *rts;
+       register char **nargv;
+       char    *nargs[MAXARGS];
+       /* alternate rts images must be readable */
+       /* if not just go back and let rest of shell worry about it */
+       if((fd = open(file,0))<0)
+               return(0);
+       /* read first BS pdp-11 words */
+       if(read(fd,buf,sizeof buf) != sizeof buf) {
+               close(fd);
+               /* if can't, go back as it may be a short shell file */
+               return(0);
+       }
+       close(fd);
+       /* check type of image and set up run time system name */
+       if(buf[0]==0407 || buf[0]==0410 || buf[0]==0411 || buf[0]==0405) {
+               /* looks like UNIX a.out file */
+               /* RTS or default rts */
+               if((rts = rtsnod.namval) == 0)
+                       rts = defrts;
+               /* if header unused is set to 1 force version 6 */
+               /* this is not a real difference between v6 and v7 a.outs */
+               /* rather, version 6 a.outs were patched to be identifiable */
+               if(buf[6] == 1)
+                       rts = "/usr/bin/v6run";
+       } else if(buf[6] == 0) {
+               /* it looks like almost all RT-11 save images have 0 here */
+               rts = "/usr/bin/rtrun";
+       } else {
+               /* was not a recognizable file type */
+               return(0);
+       }
+       /* must make a new argv list with runtime system prefix */
+       nargv = &nargs[0];
+       *nargv++ = rts;
+       /* have to pass full file name to rts */
+       *nargv++ = file;
+       argv++;
+       while(*argv && nargv < &nargs[MAXARGS-1])
+               *nargv++ = *argv++;
+       /* force in final null */
+       *nargv++ = (char *)0;
+       /* try to start rts */
+       execve(nargs[0], nargs, envp);
+       /* if that failed, report no runtime system */
+       failed(nargs[0], norts);
+}