4.4BSD/usr/src/old/games.vax/compat/modshell/compat.c

Compare this file to the similar file:
Show the results in this format:

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