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