BSD 4_3 development
[unix-history] / usr / src / games / compat / modshell / compat.c
#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);
}