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

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>