#include #include #include #include #include #include #include #include #include #include #include "../../pmsg.h" #include "../../task.h" #include "../../pvmalloc.h" extern int hostertid; /* from pvmd.c */ extern int pvmmytid; /* from pvmd.c */ static int hosterforkexec(tid,name, tpp) int tid; /* tid given by hosterexectask */ char *name; /* filename */ struct task **tpp; /* return task context */ { int pid=-1; /* task pid */ char *argv[2]; struct task *tp; /* new task context */ char *expected_pid; char buf[32]; char *myenv[100]; char **p, **q; struct stat sb; extern int *ptr_nfp; /* XXX fix this */ if (stat(name, &sb) == -1) return PvmNoFile; tp = task_new(tid); p = myenv; q = environ; while (*q) { *p++ = *q++; } /* copy all the environment for socket stuff and more */ expected_pid=malloc(20 * sizeof(char)); sprintf(expected_pid, "PVMEPID=%d", *ptr_nfp); *p++ = expected_pid; *p=0; pvmputenv(expected_pid); argv[0]=name; argv[1]=0; pid = spawnve(P_NOWAIT,name,argv,myenv); if (pid == -1) { pvmlogperror("forkexec_hoster() _spawnve"); /* task_free(&tp); */ pvmbailout(0); return PvmOutOfRes; } task_setpid(tp,*ptr_nfp); *ptr_nfp=*ptr_nfp + 1; tp->t_flag |= TF_FORKD; tp->t_a_out = STRALLOC(name); *tpp = tp; return 0; } static int hostexectasker(file, tid) char *file; int tid; { int tids = 0; /* tid from hosterforkexec */ struct pmsg *rmp; struct task *tp = 0; int err = 0; /* error code from forkexec */ rmp = mesg_new(0); rmp->m_dst = pvmmytid; rmp->m_src = pvmmytid; rmp->m_tag = DM_EXECACK; if (err = hosterforkexec(tid,file, &tp)) { tids = err; } else { tp->t_ptid = 0; tp->t_outtid = 0; tp->t_trctid = 0; tp->t_sched = 0; tids = tp->t_tid; } pkint(rmp, 1); pkint(rmp, tids); sendmessage(rmp); return err; } /* start_hoster() * forkexec the hoster process which * will start other pvmd's. * acts like pvmd' ***/ int start_hoster(int reserved_tid) { char hosterpath[128]; strcpy(hosterpath,(char*)pvmgetroot()); strcat(hosterpath,"/bin/OS2/hoster.exe"); if (hostexectasker(hosterpath,reserved_tid)) { return -1; } return 0; }