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