Annotation of OpenXM/src/kxx/ox100start.c, Revision 1.7
1.7 ! takayama 1: /* $OpenXM: OpenXM/src/kxx/ox100start.c,v 1.6 2004/02/28 12:27:15 takayama Exp $ */
1.1 takayama 2: /* Moved from misc-2003/07/cygwin/test.c */
3: #include <stdio.h>
4: #include <sys/types.h>
5: #include <sys/stat.h>
6: #include <fcntl.h>
7: #include <stdlib.h>
8: #include <unistd.h>
9: #include <sys/wait.h>
10: #include <signal.h>
11: #include <ctype.h>
1.2 takayama 12: #include "ox_pathfinder.h"
1.1 takayama 13:
1.2 takayama 14: static void usage(void);
1.1 takayama 15: static int forkExec(char **argv);
1.3 takayama 16: void *sGC_malloc(int size) {
17: return ((void *)malloc(size));
18: }
1.1 takayama 19:
1.6 takayama 20: int Quiet = 0;
1.7 ! takayama 21: static int EngineLogToStdout = 0;
1.2 takayama 22: extern char **environ;
1.1 takayama 23:
24: main(int argc,char *argv[]) {
25: char *s;
26: char s2[1024];
27: char buf[1024];
28: FILE *fp;
29: char **aaa;
30: char **eee;
31: int i;
32: char *serverName;
33:
1.4 takayama 34:
1.2 takayama 35: /*
1.1 takayama 36: printf("ostype=%s\n",getOStypes());
37: printf("OpenXM_HOME=%s\n",getOpenXM_HOME());
38: printf("sm lib =%s\n",get_sm1_lib_path());
39: printf("k0 lib =%s\n",get_k0_lib_path());
40: printf("ox_asir =%s\n",get_ox_asir_path());
1.2 takayama 41: */
1.4 takayama 42: ox_pathfinderVerbose(1);
43:
1.1 takayama 44:
45: /* Initialize parameters */
46: serverName = NULL;
47: aaa = NULL;
48:
49: for (i=1 ; i<argc; i++) {
50: if (strcmp(argv[i],"-e")==0) {
51: if (aaa == NULL) {
52: fprintf(stderr,"Server is not found or not specified by -oxserver options.\n");
53: exit(1);
54: }
55: aaa = catArgv(aaa,&(argv[i+1]));
56: break;
57: }else if (strcmp(argv[i],"-oxserver")==0) {
58: i++;
59: serverName = argv[i];
60: aaa = getServerEnv(serverName);
61: }else if (strcmp(argv[i],"-nox")==0) {
1.2 takayama 62: ox_pathfinderNoX(1);
1.7 ! takayama 63: }else if (strcmp(argv[i],"-engineLogToStdout")==0) {
! 64: ox_pathfinderEngineLogToStdout(1);
! 65: EngineLogToStdout = 1;
1.6 takayama 66: }else if (strcmp(argv[i],"-quiet")==0) {
67: Quiet = 1; ox_pathfinder_quiet();
1.1 takayama 68: }else{
69: fprintf(stderr,"Unknown option.\n");
70: usage();
71: exit(10);
72: }
73: }
74:
75: forkExec(aaa);
1.2 takayama 76: }
1.1 takayama 77:
1.2 takayama 78: #define MYFORKCP_SIZE 100
79: static int Myforkchildren[MYFORKCP_SIZE];
80: static int Myforkcp=0;
81: static void myforkwait() {
82: int status;
83: int pid;
84: int i,j;
85: signal(SIGCHLD,SIG_IGN);
86: pid = wait(&status);
87: fprintf(stderr,"Child process %d is exiting.\n",pid);
88: for (i=0; i<Myforkcp; i++) {
89: if (Myforkchildren[i] == pid) {
90: for (j=i; j<Myforkcp-1; j++) {
91: Myforkchildren[j] = Myforkchildren[j+1];
92: }
93: if (Myforkcp > 0) Myforkcp--;
94: }
95: }
96: signal(SIGCHLD,myforkwait);
1.1 takayama 97: }
98:
99: static void usage() {
1.7 ! takayama 100: fprintf(stderr,"ox100start -oxserver xxx [-e args]\n");
1.1 takayama 101: fprintf(stderr,"Examples: \n");
1.7 ! takayama 102: fprintf(stderr," ox100start -oxserver bin/ox_sm1 -e -reverse -data 3010 --control 3012 -pass 1121343432434 \n");
! 103: fprintf(stderr," ox100start -nox -engineLogToStdout -oxserver bin/ox_sm1 -e -data 3010 \n");
! 104:
1.1 takayama 105: }
106:
107: static int forkExec(char **argv) {
108: int pid;
109: char **eee;
110: int m;
111: m = 0;
112: if (argv == NULL) {
113: fprintf(stderr,"Cannot fork and exec.\n"); return -1;
114: }
115: if ((pid = fork()) > 0) {
116: if (m&2) {
117: /* Do not call singal to turn around a trouble on cygwin. BUG. */
118: }else{
119: signal(SIGCHLD,myforkwait); /* to kill Zombie */
120: }
121: Myforkchildren[Myforkcp++] = pid;
122: if (Myforkcp >= MYFORKCP_SIZE-1) {
123: fprintf(stderr,"Child process table is full.\n");
124: Myforkcp = 0;
125: }
126: }else{
127: /* close the specified files */
128: if (m&1) {
129: sigset_t sss;
130: sigemptyset(&sss);
131: sigaddset(&sss,SIGINT);
132: sigprocmask(SIG_BLOCK,&sss,NULL);
133: }
1.7 ! takayama 134: if (ox_pathfinderNoX(-1) && (!EngineLogToStdout)) {
1.1 takayama 135: FILE *null;
136: null = fopen("/dev/null","wb");
137: dup2(fileno(null),1);
138: dup2(fileno(null),2);
139: }
1.5 takayama 140:
141: /*
142: {
143: int i;
144: i = 0;
145: fprintf(stderr,"argv-----------\n");
146: while (argv[i] != NULL) {
147: fprintf(stderr,"%s ",argv[i++]);
148: }
149: fprintf(stderr,"\n");
150: i = 0;
151: fprintf(stderr,"environ-----------\n");
152: while (environ[i] != NULL) {
153: fprintf(stderr,"%s ",environ[i++]);
154: }
155: fprintf(stderr,"\n");
156: }
157: */
158:
1.1 takayama 159: execve(argv[0],argv,environ);
160: /* This place will never be reached unless execv fails. */
161: fprintf(stderr,"forkExec fails: ");
162: }
163: }
164:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>