[BACK]Return to ox100start.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kxx

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>