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);
}
Exemple #2
0
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);
}
Exemple #3
0
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;
  }

}
Exemple #4
0
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
}