|
|
1.1 root 1: #include "global.h"
2: #include <a.out.h>
3: #define round(x,s) ((((x)-1) & ~((s)-1)) + (s))
4:
5: char *stabf = 0;
6: int fvirgin = 1;
7:
8: lispval
9: Lffasl(){
10: register struct argent *mlbot = lbot;
11: register lispval work;
12: int fildes, totsize, readsize;
13: lispval csegment();
14: char *sbrk(), *currend, *tfile, cbuf[512], *mytemp(), *gstab();
15: struct exec header;
16: snpand(2);
17:
18: if(np - mlbot != 3 || TYPE(mlbot[1].val)!=ATOM)
19: mlbot[1].val = error("Incorrect .o file specification",TRUE);
20: if(np - mlbot != 3 || TYPE(mlbot[2].val)!=ATOM)
21: mlbot[2].val = error("Incorrect entry specification for fasl"
22: ,TRUE);
23: if(np - mlbot != 3 || TYPE(mlbot[3].val)!=ATOM || mlbot[3].val==nil)
24: mlbot[3].val = error( "Bad associated atom name for fasl",TRUE);
25:
26: /*
27: * Invoke loader.
28: */
29: currend = sbrk(0);
30: tfile = mytemp();
31: sprintf(cbuf,
32: "nld -A %s -T %x -N %s -e %s -o %s",
33: gstab(),
34: currend,
35: mlbot[1].val->pname,
36: mlbot[2].val->pname,
37: tfile);
38: printf(cbuf); fflush(stdout);
39: if(system(cbuf)!=0) {
40: unlink(tfile);
41: return(nil);
42: }
43: if(fvirgin)
44: fvirgin = 0;
45: else
46: unlink(stabf);
47: stabf = tfile;
48: if((fildes = open(tfile,0))<0)
49: return(nil);
50: /*
51: * Read a.out header to find out how much room to
52: * allocate and attempt to do so.
53: */
54: if(read(fildes,(char *)&header,sizeof(header)) <= 0) {
55: close(fildes);
56: return(nil);
57: }
58: readsize = header.a_text + header.a_data;
59: totsize = readsize + header.a_bss;
60: totsize = round(totsize,512);
61: /*
62: * Fix up system indicators, typing info, etc.
63: */
64: currend = (char *)csegment(int_name,totsize/4);
65:
66: if(readsize!=read(fildes,currend,readsize))
67: return(nil);
68: work = newfunct();
69: work->entry = (lispval (*)())header.a_entry;
70: work->discipline = lambda;
71: return(mlbot[3].val->fnbnd = work);
72: }
73: #include "types.h"
74: #include <sys/stat.h>
75: static char myname[100];
76: char *
77: gstab()
78: {
79: register char *cp, *cp2; char *getenv();
80: struct stat stbuf;
81: extern char **Xargv;
82:
83: if(stabf==0) {
84: cp = getenv("PATH");
85: if(cp==0)
86: cp=":/usr/ucb:/bin:/usr/bin";
87: if(*cp==':') {
88: cp++;
89: if(stat(Xargv[0],&stbuf)==0) {
90: strcpy(myname,Xargv[0]);
91: return(stabf = myname);
92: }
93: }
94: for(;*cp;) {
95:
96: /* copy over current directory
97: and then append argv[0] */
98:
99: for(cp2=myname;(*cp)!=0 && (*cp)!=':';)
100: *cp2++ = *cp++;
101: *cp2++ = '/';
102: strcpy(cp2,Xargv[0]);
103: if(*cp) cp++;
104: if(0!=stat(myname,&stbuf)) continue;
105: return(stabf = myname);
106: }
107: error("Could not find which file is being executed.",FALSE);
108: } else return (stabf);
109: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.