Annotation of OpenXM_contrib2/asir2000/io/ox_launch.c, Revision 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>