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