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