void cce_start(void) { int4 status; uint4 prvadr[2], prvprv[2]; static readonly $DESCRIPTOR(proc,"GT.CX_CONTROL"); static readonly $DESCRIPTOR(image,"GTM$DIST:CCP.EXE"); static readonly uic = 65540; /* uic = [1,4] */ $DESCRIPTOR(ccp,""); unsigned char success[] = "GT.CX Cluster controller started with PID = "; uint4 pid; uint4 baspri; struct FAB ccp_fab; struct NAM ccp_nam; unsigned char ccp_namebuf[63]; /* max image name allowable for creprc */ prvadr[1] = 0; prvadr[0] = PRV$M_DETACH | PRV$M_OPER | PRV$M_SYSNAM | PRV$M_SYSLCK | PRV$M_TMPMBX; status = sys$setprv(TRUE, &prvadr[0], FALSE, &prvprv[0]); if (status == SS$_NORMAL) { baspri = 5; cli_get_num("PRIORITY",&baspri); ccp_fab = cc$rms_fab; ccp_fab.fab$l_fna = image.dsc$a_pointer; ccp_fab.fab$b_fns = image.dsc$w_length; ccp_fab.fab$l_nam = &ccp_nam; ccp_nam = cc$rms_nam; ccp_nam.nam$l_esa = ccp_namebuf; ccp_nam.nam$b_ess = SIZEOF(ccp_namebuf); ccp_nam.nam$b_nop = NAM$M_SYNCHK; status = sys$parse (&ccp_fab); if (!(status & 1)) { lib$signal(status); return; } ccp.dsc$a_pointer = ccp_namebuf; ccp.dsc$w_length = ccp_nam.nam$b_esl; status = sys$creprc(&pid, &ccp, 0, 0, 0, &prvadr, 0, &proc, baspri, uic, 0, PRC$M_DETACH); sys$setprv(FALSE, &prvprv[0], FALSE, 0); if (status != SS$_NORMAL) { lib$signal(status); return; } util_out_open(0); i2hex(pid, &success[ SIZEOF(success) - 8], 8); util_out_write(&success[0], SIZEOF(success)); util_out_close(); } else lib$signal(status); }
asmlinkage int exe$creprc_wrap(struct struct_args *s) { return exe$creprc(s->s1,s->s2,s->s3,s->s4,s->s5,s->s6,s->s7,s->s8,s->s9,s->s10,s->s11,s->s12); }
main(int argc,void ** argv){ $DESCRIPTOR(imgname,"/bin/ls"); $DESCRIPTOR(prcname,"ls"); $DESCRIPTOR(imgname2,"/vms$common/syshlp/examples/hi.exe"); $DESCRIPTOR(imgname3,"[vms$common.syshlp.examples]hi.exe"); $DESCRIPTOR(prcname3,"hi"); $DESCRIPTOR(imgname4,"/vms$common/sysexe/dcl"); $DESCRIPTOR(prcname4,"dcl2"); int pid; struct item_list_3 lst[14], syilst[2]; if (argc>1) goto dcl; int RC = sys$creprc(&pid, &imgname,0,0,0, 0, 0, &prcname, 24, 0, 0, 0, 0, 0, 0); printf("creprc pid %x returned %x\n",pid,RC); int retlenaddr; int mem=0; syilst[0].buflen=4; syilst[0].item_code=SYI$_LASTFLD; syilst[0].bufaddr=&mem; syilst[0].retlenaddr=&retlenaddr; syilst[1].buflen=0; syilst[1].item_code=0; int sts=sys$getsyi(0,0,0,syilst,0,0,0); if (!mem) { printf("No VMS MM\n"); goto out; } int file = fopen(imgname2.dsc$a_pointer,"r"); if (file==0) { printf("%s not found\n",imgname2.dsc$a_pointer); goto out; } RC = sys$creprc(&pid, &imgname3,0,0,0, 0, 0, &prcname3, 24, 0, 0, 0, 0, 0, 0); printf("creprc pid %x returned %x\n",pid,RC); out: sleep(60); return SS$_NORMAL; dcl: { $DESCRIPTOR(opa,"opa0"); int RC = sys$creprc(&pid, &imgname4,&opa,&opa,&opa, 0, 0, &prcname4, 24, 0, 0, 0, 0, 0, 0); sleep(60); return SS$_NORMAL; } }
int rlPcontrol::start() { if(startup_command == NULL) return -1; if(isAlive()) return -1; process_time.getLocalTime(); #ifdef RLUNIX if((m_pid = ::fork()) == 0) { rlexec(startup_command); ::exit(0); } // printf("start pid=%ld\n",m_pid); return 0; #endif #ifdef __VMS int ret; struct dsc$descriptor_s image,prcnam,input,output,error,*inputptr,*outputptr,*errorptr; image.dsc$w_length = rlstrlen(startup_command); image.dsc$b_dtype = DSC$K_DTYPE_T; image.dsc$b_class = DSC$K_CLASS_S; image.dsc$a_pointer = startup_command; prcnam.dsc$w_length = rlstrlen(process_name); prcnam.dsc$b_dtype = DSC$K_DTYPE_T; prcnam.dsc$b_class = DSC$K_CLASS_S; prcnam.dsc$a_pointer = process_name; input.dsc$w_length = rlstrlen(m_input); input.dsc$b_dtype = DSC$K_DTYPE_T; input.dsc$b_class = DSC$K_CLASS_S; input.dsc$a_pointer = m_input; output.dsc$w_length = rlstrlen(m_output); output.dsc$b_dtype = DSC$K_DTYPE_T; output.dsc$b_class = DSC$K_CLASS_S; output.dsc$a_pointer = m_output; error.dsc$w_length = rlstrlen(m_error); error.dsc$b_dtype = DSC$K_DTYPE_T; error.dsc$b_class = DSC$K_CLASS_S; error.dsc$a_pointer = m_error; inputptr = outputptr = errorptr = 0; if( input.dsc$w_length > 0) inputptr = &input; if(output.dsc$w_length > 0) outputptr = &output; if( error.dsc$w_length > 0) errorptr = &error; if( inputptr != 0 && inputptr->dsc$a_pointer == NULL) inputptr = 0; if(outputptr != 0 && outputptr->dsc$a_pointer == NULL) outputptr = 0; if( errorptr != 0 && errorptr->dsc$a_pointer == NULL) errorptr = 0; /* printf("sys$creprc(\n"); printf(" image=%s\n",image.dsc$a_pointer); printf(" inputptr=%s\n" ,inputptr->dsc$a_pointer); printf(" outputptr=%s\n",outputptr->dsc$a_pointer); printf(" errorptr=%s\n" ,errorptr->dsc$a_pointer); printf(" prcnam=%s\n",prcnam.dsc$a_pointer); printf(" priority=%d\n",prio); printf(")\n"); */ ret = sys$creprc(&m_pid,&image,inputptr,outputptr,errorptr,0,0,&prcnam,prio,0,0,0,0,0); if(ret != SS$_NORMAL) return -1; return 0; #endif #ifdef RLWIN32 STARTUPINFO si; // = { sizeof(si)}; si.cb = sizeof(si); PROCESS_INFORMATION pi; DWORD dwCreationFlags; if(m_pid != -1) CloseHandle((HANDLE) m_pid); dwCreationFlags = CREATE_NO_WINDOW; if (prio == 0) dwCreationFlags |= IDLE_PRIORITY_CLASS; else if(prio == 1) dwCreationFlags |= NORMAL_PRIORITY_CLASS; else if(prio == 2) dwCreationFlags |= HIGH_PRIORITY_CLASS; else if(prio == 3) dwCreationFlags |= REALTIME_PRIORITY_CLASS; int ret = (int) CreateProcess( NULL, startup_command , NULL, NULL , FALSE, dwCreationFlags , NULL, NULL , &si, &pi); m_pid = (int) pi.hProcess; m_dwProcessId = pi.dwProcessId; CloseHandle(pi.hThread); return ret; #endif }