+#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);
+}