Annotation of OpenXM_contrib2/asir2000/io/ox_launch.c, Revision 1.1.1.1
1.1 noro 1: /* $OpenXM: OpenXM/src/asir99/io/ox_launch.c,v 1.1.1.1 1999/11/10 08:12:30 noro Exp $ */
2: #include "ca.h"
3: #include "com.h"
4: #include "ox.h"
5: #include <signal.h>
6: #include <setjmp.h>
7: #include <fcntl.h>
8: #if defined(VISUAL)
9: #include <windows.h>
10: #include <io.h>
11: #include <fcntl.h>
12: #include <process.h>
13: #else
14: #include <sys/file.h>
15: #include <sys/types.h>
16: #include <sys/stat.h>
17: #include <pwd.h>
18: #endif
19:
20: #if defined(SYSV)
21: #include <unistd.h>
22: #endif
23:
24: #if defined(VISUAL)
25: HANDLE hIntr,hReset,hKill;
26: #endif
27:
28: static void put_log(char *);
29: static int which_command(char *,char *);
30: static int search_command(char *);
31: static int ox_spawn(char *,int,char *);
32: static void launch_error(char *);
33: static int ox_io_init(int);
34: static void push_one(Obj);
35: static Obj pop_one();
36: static void do_cmd(int);
37:
38: static Obj *asir_OperandStack;
39: static int asir_OperandStackPtr;
40:
41: static char hostname[BUFSIZ];
42: static int sindex;
43: static struct sockaddr_in peer;
44: static int cpid;
45:
46: static void put_log(str)
47: char *str;
48: {
49: static FILE *logfile;
50:
51: if ( !logfile )
52: logfile = fopen("/tmp/ox_log","w");
53: fprintf(logfile,"%s\n",str);
54: fflush(logfile);
55: }
56:
57: #if !defined(VISUAL)
58: static int which_command(com,file)
59: char *com,*file;
60: {
61: char *c,*s;
62: int len;
63: char dir[BUFSIZ],path[BUFSIZ];
64:
65: for ( s = (char *)getenv("PATH"); s; ) {
66: c = (char *)index(s,':');
67: if ( c ) {
68: len = c-s;
69: strncpy(dir,s,len); s = c+1; dir[len] = 0;
70: } else {
71: strcpy(dir,s); s = 0;
72: }
73: sprintf(path,"%s/%s",dir,com);
74: if ( search_command(path) ) {
75: strcpy(file,path); return 1;
76: }
77: }
78: file[0] = 0; return 0;
79: }
80:
81: static int search_command(file)
82: char *file;
83: {
84: struct stat buf;
85:
86: if ( stat(file,&buf) || (buf.st_mode & S_IFDIR) )
87: return 0;
88: if ( access(file,X_OK) )
89: return 0;
90: else
91: return 1;
92: }
93: #endif
94:
95: /*
96: argv[1] : host to connect
97: argv[2] : if 1, call try_bind_listen and try_accept
98: if 0, call try_connect
99: argv[3] : control_port
100: argv[4] : server_port
101: argv[5] : server
102: argv[6] : display or "0"
103: */
104:
105: void launch_main(argc,argv)
106: int argc;
107: char **argv;
108: {
109: int id;
110: Obj p,obj;
111: char *name;
112: char buf[BUFSIZ];
113: int cs,ss;
114: unsigned int cmd;
115: int use_unix,accept_client;
116: char *control_port_str,*server_port_str;
117: char *rhost,*server,*dname;
118:
119: GC_init(); nglob_init();
120: gethostname(hostname,BUFSIZ);
121: rhost = argv[1];
122: use_unix = !strcmp(rhost,".") ? 1 : 0;
123: accept_client = atoi(argv[2]) ? 1 : 0;
124: control_port_str = argv[3];
125: server_port_str = argv[4];
126: server = argv[5];
127: dname = argv[6];
128:
129: #if defined(VISUAL)
130: init_socket();
131: #endif
132:
133: signal(SIGINT,SIG_IGN);
134: #if defined(SIGUSR1)
135: signal(SIGUSR1,SIG_IGN);
136: #endif
137:
138: if ( accept_client ) {
139: cs = try_bind_listen(use_unix,control_port_str);
140: ss = try_bind_listen(use_unix,server_port_str);
141: cs = try_accept(use_unix,cs);
142: ss = try_accept(use_unix,ss);
143: } else {
144: cs = try_connect(use_unix,rhost,control_port_str);
145: ss = try_connect(use_unix,rhost,server_port_str);
146: }
147: ox_io_init(cs);
148: if ( cs < 0 || ss < 0 )
149: launch_error("cannot connect to the client");
150: cpid = ox_spawn(server,ss,dname);
151:
152: while ( 1 ) {
153: ox_recv(sindex,&id,&obj);
154: switch ( id ) {
155: case OX_COMMAND:
156: cmd = ((USINT)obj)->body;
157: do_cmd(cmd);
158: break;
159: case OX_DATA:
160: push_one(obj);
161: break;
162: case OX_SYNC_BALL:
163: break;
164: default:
165: break;
166: }
167: }
168: }
169:
170: #if defined(VISUAL)
171: static void do_cmd(cmd)
172: int cmd;
173: {
174: USINT t;
175: int id,cindex;
176: int bport,sport;
177: int bs,bs0;
178: STRING prog,dname;
179:
180: switch ( cmd ) {
181: case SM_shutdown:
182: SetEvent(hKill);
183: exit(0); break;
184: case SM_control_intr:
185: SetEvent(hIntr);
186: break;
187: case SM_control_kill:
188: SetEvent(hKill);
189: break;
190: case SM_control_reset_connection:
191: MKUSINT(t,0);
192: ox_send_data(sindex,t);
193: SetEvent(hReset);
194: break;
195: default:
196: break;
197: }
198: }
199: #else
200: static void do_cmd(cmd)
201: int cmd;
202: {
203: USINT t;
204: int id,cindex;
205: int bport,sport;
206: int bs,bs0;
207: int status;
208: STRING prog,dname;
209:
210: switch ( cmd ) {
211: case SM_shutdown:
212: kill(cpid,SIGKILL);
213: exit(0); break;
214: case SM_control_intr:
215: kill(cpid,SIGINT);
216: break;
217: case SM_control_kill:
218: kill(cpid,SIGKILL);
219: break;
220: case SM_control_reset_connection:
221: MKUSINT(t,0);
222: ox_send_data(sindex,t);
223: kill(cpid,SIGUSR1);
224: break;
225: default:
226: break;
227: }
228: }
229: #endif
230:
231: static int ox_spawn(prog,bs,dname)
232: char *prog;
233: int bs;
234: char *dname;
235: {
236: #if defined(VISUAL)
237: char *av[BUFSIZ];
238: char sock_id[BUFSIZ],ox_intr[BUFSIZ],ox_reset[BUFSIZ],ox_kill[BUFSIZ];
239: char AsirExe[BUFSIZ];
240: HANDLE hProc;
241: STRING rootdir;
242: int mypid;
243:
244: mypid = GetCurrentProcessId();
245: sprintf(ox_intr,"ox_intr_%d",mypid);
246: sprintf(ox_reset,"ox_reset_%d",mypid);
247: sprintf(ox_kill,"ox_kill_%d",mypid);
248: hIntr = CreateEvent(NULL,TRUE,FALSE,ox_intr);
249: hReset = CreateEvent(NULL,TRUE,FALSE,ox_reset);
250: hKill = CreateEvent(NULL,TRUE,FALSE,ox_kill);
251: sprintf(sock_id,"%d",bs);
252: av[0] = prog;
253: av[1] = sock_id;
254: av[2] = ox_intr;
255: av[3] = ox_reset;
256: av[4] = ox_kill;
257: av[5] = NULL;
258: Pget_rootdir(&rootdir);
259: sprintf(AsirExe,"%s\\bin\\engine.exe",BDY(rootdir));
260: hProc = _spawnv(_P_NOWAIT,AsirExe,av);
261: return (int)hProc;
262: #else /* VISUAL */
263: int b,s,i;
264: struct hostent *hp;
265: int pid;
266: char wname[BUFSIZ];
267: char buf[BUFSIZ];
268:
269: pid = fork();
270: if ( pid )
271: return pid;
272: else {
273: setpgid(0,getpid());
274: if ( dup2(bs,3) != 3 )
275: exit(1);
276: if ( dup2(bs,4) != 4 )
277: exit(1);
278: {
279: #if defined(linux) || defined(__NeXT__) || defined(ultrix)
280: #include <sys/param.h>
281: close(0);
282: for ( i = 5; i < NOFILE; i++ )
283: close(i);
284: #else
285: #include <sys/resource.h>
286: struct rlimit rl;
287:
288: getrlimit(RLIMIT_NOFILE,&rl);
289: close(0);
290: for ( i = 5; i < rl.rlim_cur; i++ )
291: close(i);
292: #endif
293: }
294: if ( strcmp(dname,"0") )
295: execl(prog,prog,"-display",dname,0);
296: else {
297: FILE *null;
298:
299: null = fopen("/dev/null","wb");
300: dup2(fileno(null),1);
301: dup2(fileno(null),2);
302: putenv("DISPLAY=");
303: execl(prog,prog,0);
304: }
305: }
306: #endif
307: }
308:
309: static void launch_error(s)
310: char *s;
311: {
312: exit(0);
313: }
314:
315: static int ox_io_init(sock)
316: int sock;
317: {
318: endian_init();
319: /* server mode */
320: sindex = get_iofp(sock,0,1);
321: asir_OperandStack = (Obj *)CALLOC(BUFSIZ,sizeof(Obj));
322: asir_OperandStackPtr = -1;
323: }
324:
325: static void push_one(obj)
326: Obj obj;
327: {
328: if ( !obj || OID(obj) != O_VOID )
329: asir_OperandStack[++asir_OperandStackPtr] = obj;
330: }
331:
332: static Obj pop_one() {
333: if ( asir_OperandStackPtr >= 0 ) {
334: return asir_OperandStack[asir_OperandStackPtr--];
335: }
336: }
337:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>