static void mx_get_vms_version_string( char *vms_version_buffer, size_t max_vms_version_buffer_length ) { static const char fname[] = "mx_get_vms_version_string()"; long item_code; unsigned long vms_status; struct dsc$descriptor_s version_desc; version_desc.dsc$b_dtype = DSC$K_DTYPE_T; version_desc.dsc$b_class = DSC$K_CLASS_S; version_desc.dsc$a_pointer = vms_version_buffer; version_desc.dsc$w_length = max_vms_version_buffer_length - 1; item_code = SYI$_VERSION; vms_status = lib$getsyi( &item_code, 0, &version_desc, &version_desc.dsc$w_length, 0, 0 ); return; }
int getpagesize (void) { long pagsiz = 0L; unsigned short itmcod = SYI$_PAGE_SIZE; (void) lib$getsyi (&itmcod, (void *) &pagsiz); if (pagsiz == 0L) pagsiz = 512L; /* VAX default */ return (int) pagsiz; }
int check_vms_mm() { int retlenaddr; int mem=0; struct item_list_3 lst[14], syilst[2]; 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); return mem; }
/* ** Writes the hostname of the current system in string "hostname". ** ** NOTE: This function used to be called "GetHostName" but that resulted in a ** linking conflict on VMS with the standard gethostname function, because ** VMS links case-insensitively. */ const char *GetNameOfHost(void) { static char hostname[MAXNODENAMELEN+1]; static int hostnameFound = False; if (!hostnameFound) { #ifdef VMS /* This should be simple, but uname is not supported in the DEC C RTL and gethostname on VMS depends either on Multinet or UCX. So use uname on Unix, and use LIB$GETSYI on VMS. Note the VMS hostname will be in DECNET format with trailing double colons, e.g. "FNALV1::". */ int syi_status; struct dsc$descriptor_s *hostnameDesc; unsigned long int syiItemCode = SYI$_NODENAME; /* get Nodename */ unsigned long int unused = 0; unsigned short int hostnameLen = MAXNODENAMELEN+1; hostnameDesc = NulStrWrtDesc(hostname, MAXNODENAMELEN+1); syi_status = lib$getsyi(&syiItemCode, &unused, hostnameDesc, &hostnameLen, 0, 0); if (syi_status != SS$_NORMAL) { fprintf(stderr, "nedit: Error return from lib$getsyi: %d", syi_status); strcpy(hostname, "VMS"); } else hostname[hostnameLen] = '\0'; FreeStrDesc(hostnameDesc); #else struct utsname nameStruct; int rc = uname(&nameStruct); if (rc<0) { /* Shouldn't ever happen, so we better exit() here */ perror("nedit: uname() failed "); exit(EXIT_FAILURE); } strcpy(hostname, nameStruct.nodename); #endif /* VMS */ hostnameFound = True; } return hostname; }
std::string EnvironmentImpl::osNameImpl() { return getsyi(SYI$_NODE_SWTYPE); }
std::string EnvironmentImpl::nodeNameImpl() { return getsyi(SYI$_NODENAME); }
std::string EnvironmentImpl::osArchitectureImpl() { return getsyi(SYI$_ARCH_NAME); }
std::string EnvironmentImpl::osVersionImpl() { return getsyi(SYI$_VERSION); }
rlSharedMemory::rlSharedMemory(const char *shmname, unsigned long Size, int rwmode) { #ifdef RLUNIX struct shmid_ds buf; status = OK; name = new char[strlen(shmname)+1]; strcpy(name,shmname); _size = Size + sizeof(*mutex); // create file fdlock = open(name, O_RDWR | O_CREAT, rwmode ); if(fdlock < 0) { int ret; char buf[1024]; sprintf(buf,"could not write shm=%s\n",shmname); ret = ::write(1,buf,strlen(buf)); if(ret < 0) exit(-1); sprintf(buf,"you have to run this program as root !!!\n"); ret = ::write(1,buf,strlen(buf)); if(ret < 0) exit(-1); status=ERROR_FILE; exit(-1); } // old stuff, without suggestions from Stefan Lievens //shmkey = ftok(name,0); // //id = shmget(shmkey, _size, IPC_CREAT); //shmkey = ftok(name, 'R'); shmkey = ftok(name, 'b'); //id = shmget(shmkey, _size, 0600 | IPC_CREAT); id = shmget(shmkey, _size, rwmode | IPC_CREAT); if(id < 0) { status=ERROR_SHMGET; return; } base_adr = (char *) shmat(id,NULL,0); if(base_adr == NULL) { status=ERROR_SHMAT; return; } if(shmctl(id, IPC_STAT, &buf) != 0) { status=ERROR_SHMCTL; return; }; mutex = (pthread_mutex_t *) base_adr; user_adr = base_adr + sizeof(*mutex); flock(fdlock,LOCK_UN); #endif #ifdef __VMS int file_existed = 0; long ret,fd,page_size,pagelets,pagelet_size,file_block_size,flags,item,ident[2]; FILE *fp; ADD add_in,add_ret; struct dsc$descriptor_s section_name; struct FAB fab; status = OK; name = new char[strlen(shmname)+1]; strcpy(name,shmname); _size = Size + sizeof(*mutex); // The file block size is fixed file_block_size = 512; // Bytes // Get the page size item = SYI$_PAGE_SIZE; ret = lib$getsyi( &item , &page_size , 0 , 0 , 0 , 0 ); if(ret != SS$_NORMAL) { status=ERROR_FILE; return; } // Fill descriptor for section name section_name.dsc$w_length = strlen(name); section_name.dsc$a_pointer = name; section_name.dsc$b_dtype = DSC$K_DTYPE_T; section_name.dsc$b_class = DSC$K_CLASS_S; // The pagelet size is fixed pagelet_size = 512; // Bytes // Get memory if(_size % page_size == 0) pagelets = _size / pagelet_size; else pagelets = (_size / page_size + 1) * (page_size / pagelet_size); ret = sys$expreg(pagelets,&add_ret,0,0); if(ret != SS$_NORMAL) { status=ERROR_FILE; return; } // Set the addresses base_adr = (char *) add_ret.start; user_adr = base_adr + sizeof(*mutex); mutex = (pthread_mutex_t *) base_adr; if(base_adr == NULL) { status=ERROR_SHMAT; return; } // Fill the fab fab = cc$rms_fab; // Initialize fab fab.fab$b_fac = fab.fab$b_fac | FAB$M_PUT | FAB$M_DEL | FAB$M_GET | FAB$M_UPD; fab.fab$l_fna = name; fab.fab$b_fns = strlen(name); fab.fab$l_fop = fab.fab$l_fop | FAB$M_CIF // create file if not existent | FAB$M_CTG // contiguous | FAB$M_UFO; // user open fab.fab$b_shr = fab.fab$b_shr // shareble access | FAB$M_SHRPUT | FAB$M_UPI; fab.fab$l_alq = pagelets * pagelet_size / file_block_size; // Open the section file ret = sys$create (&fab); if(ret != RMS$_NORMAL && ret != RMS$_CREATED) { sys$close (&fab); status=ERROR_FILE; return; } // Set the channel fd = fab.fab$l_stv; // Fill the input address add_in.start = add_ret.start; add_in.end = add_ret.end; // Clear ident ident[0] = 0; ident[1] = 0; // Set flags flags = 0; flags = SEC$M_GBL | SEC$M_WRT | SEC$M_PERM; // Create and map the section ret = sys$crmpsc(&add_in ,&add_ret, (long)0 , // acmode flags , // flags §ion_name , // gsdnam &ident , // ident (long)0 , // relpag (short)fd , // chan pagelets , // pagcnt (long)0 , // vbn (long)0 , // prot (long)0 // pfc ); if(ret != SS$_NORMAL && ret != SS$_CREATED) { sys$close(&fab); status=ERROR_FILE; return; } // Test the section addresses if(add_in.start != add_ret.start || add_in.end != add_ret.end) { sys$close(&fab); status=ERROR_FILE; return; } // Close the section file ret = sys$close(&fab); // rlwthread_mutex_init(mutex,NULL); if(file_existed == 0) myinit(mutex); #endif #ifdef RLWIN32 HANDLE hShmem; //int file_existed; status = OK; name = new char[strlen(shmname)+1]; strcpy(name,shmname); _size = Size + sizeof(HANDLE); // sizeof(*mutex); //file_existed = 1; hSharedFile = CreateFile(name, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if(hSharedFile == INVALID_HANDLE_VALUE) { //file_existed = 0; hSharedFile = CreateFile(name, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL ); } if(hSharedFile == INVALID_HANDLE_VALUE) { status=ERROR_FILE; return; } //char *global_name = new char[strlen(name)+40]; //strcpy(global_name,"Global\\"); strcat(global_name, name); //for(int i=7; i<strlen(global_name); i++) //{ // if (global_name[i] == ':') global_name[i] = '_'; // else if(global_name[i] == '\\') global_name[i] = '_'; // else if(global_name[i] == '.') global_name[i] = '_'; // else if(global_name[i] == ' ') global_name[i] = '_'; //} hShmem = CreateFileMapping( hSharedFile, NULL, // no security attributes PAGE_READWRITE, // read/write access 0, // size: high 32-bits _size, // size: low 32-bits 0); // name of map object // changed by FMakkinga 25-03-2013 global_name); // global_name); // name of map object //delete [] global_name; if(hShmem == NULL) { status=ERROR_FILE; return; } base_adr = (char *) MapViewOfFile( hShmem, // object to map view of FILE_MAP_WRITE, // read/write access 0, // high offset: map from 0, // low offset: beginning 0); // default: map entire file if(base_adr == NULL) { status=ERROR_FILE; return; } id = (int) hShmem; shmkey = (int) hSharedFile; mutex = (pthread_mutex_t *) base_adr; user_adr = base_adr + sizeof(*mutex); memset(&overlapped, 0, sizeof(overlapped)); // Changed by FMakkinga 22-03-2013 UnlockFileEx(hSharedFile,0,_size,0,&overlapped); #endif if(rwmode == 0) return; // no warning of unused parameter }
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; } }
Boolean Process::getCreationDate (CIMDateTime & d) const { long status; long dst_desc[2]; char cimtime[80] = ""; char log_string[] = "SYS$TIMEZONE_DAYLIGHT_SAVING"; char libdst; unsigned __int64 bintime = 0; unsigned short int timbuf[7]; unsigned long libop; unsigned long libdayweek; unsigned long libdayear; unsigned int retlen; struct tm timetm; struct tm *ptimetm = &timetm; // Added to get system uptime for SWAPPER process - PTR 73-51-29 long item = SYI$_BOOTTIME; char t_string[24] = ""; unsigned __int64 val = 0; struct dsc$descriptor_s sysinfo; sysinfo.dsc$b_dtype = DSC$K_DTYPE_T; sysinfo.dsc$b_class = DSC$K_CLASS_S; sysinfo.dsc$w_length = sizeof (t_string); sysinfo.dsc$a_pointer = t_string; static $DESCRIPTOR (lnm_tbl, "LNM$SYSTEM"); struct { unsigned short wLength; unsigned short wCode; void *pBuffer; unsigned int *pRetLen; int term; } dst_item_list; bintime = pInfo.p_stime; libop = LIB$K_DAY_OF_WEEK; status = lib$cvt_from_internal_time (&libop, &libdayweek, &bintime); if (!$VMS_STATUS_SUCCESS (status)) { return false; } libop = LIB$K_DAY_OF_YEAR; status = lib$cvt_from_internal_time (&libop, &libdayear, &bintime); if (!$VMS_STATUS_SUCCESS (status)) { return false; } dst_desc[0] = strlen (log_string); dst_desc[1] = (long) log_string; dst_item_list.wLength = 1; dst_item_list.wCode = LNM$_STRING; dst_item_list.pBuffer = &libdst; dst_item_list.pRetLen = &retlen; dst_item_list.term = 0; status = sys$trnlnm (0, &lnm_tbl, &dst_desc, 0, &dst_item_list); if (!$VMS_STATUS_SUCCESS (status)) { return false; } // Added to get sysuptime for SWAPPER process --- PTR 73-51-29 if (bintime == 0) { status = lib$getsyi(&item, 0, &sysinfo, &val, 0, 0); status = sys$bintim(&sysinfo, &bintime); } status = sys$numtim (timbuf, &bintime); if (!$VMS_STATUS_SUCCESS (status)) { return false; } timetm.tm_sec = timbuf[5]; timetm.tm_min = timbuf[4]; timetm.tm_hour = timbuf[3]; timetm.tm_mday = timbuf[2]; timetm.tm_mon = timbuf[1] - 1; timetm.tm_year = timbuf[0] - 1900; timetm.tm_wday = libdayweek - 1; timetm.tm_yday = libdayear - 1; timetm.tm_isdst = 0; if (libdst != 48) { timetm.tm_isdst = 1; } timetm.tm_gmtoff = -18000; timetm.tm_zone = "EST"; if (convertToCIMDateString (ptimetm, cimtime) != -1) { d = CIMDateTime (cimtime); return true; } return false; }
show_system(){ int i; struct item_list_3 lst[14], syilst[4]; char scsnode[16]; char procname[15]; char proclen; char version[16]; int versionlen; unsigned long long boottime; int boottimelen; unsigned long upid,epid; unsigned long upidlen,epidlen; unsigned long state,statelen; unsigned long pri,prilen; unsigned long pagep, pageplen; unsigned long pageg, pageglen; unsigned long pagef, pageflen; unsigned int dirio, diriolen, bufio, bufiolen; int jpistatus; int sts; int retscsnodelen; unsigned long long now; char timestr[23]; $DESCRIPTOR(atimenow, timestr); char timestr2[23]; $DESCRIPTOR(atimenow2, timestr2); sys$gettim(&now); sys$asctim(0,&atimenow,&now,0); syilst[0].buflen=16; syilst[0].item_code=SYI$_VERSION; syilst[0].bufaddr=version; syilst[0].retlenaddr=&versionlen; syilst[1].buflen=16; syilst[1].item_code=SYI$_BOOTTIME; syilst[1].bufaddr=&boottime; syilst[1].retlenaddr=&boottimelen; syilst[2].buflen=16; syilst[2].item_code=SYI$_SCSNODE; syilst[2].bufaddr=scsnode; syilst[2].retlenaddr=&retscsnodelen; syilst[3].buflen=0; syilst[3].item_code=0; sts=sys$getsyi(0,0,0,syilst,0,0,0); long long delta = boottime - now; int deltalen; sys$asctim(0,&atimenow2,&delta,0); lst[0].buflen=15; lst[0].item_code=JPI$_PRCNAM; lst[0].bufaddr=procname; lst[0].retlenaddr=&proclen; lst[1].buflen=4; lst[1].item_code=JPI$_PID; lst[1].bufaddr=&epid; lst[1].retlenaddr=&epidlen; lst[2].buflen=4; lst[2].item_code=JPI$_MASTER_PID; lst[2].bufaddr=&upid; lst[2].retlenaddr=&upidlen; lst[3].buflen=4; lst[3].item_code=JPI$_STATE; lst[3].bufaddr=&state; lst[3].retlenaddr=&statelen; lst[4].buflen=4; lst[4].item_code=JPI$_PAGEFLTS; lst[4].bufaddr=&pagef; lst[4].retlenaddr=&pageflen; lst[5].buflen=4; lst[5].item_code=JPI$_PRI; lst[5].bufaddr=&pri; lst[5].retlenaddr=&prilen; lst[6].buflen=4; lst[6].item_code=JPI$_PPGCNT; lst[6].bufaddr=&pagep; lst[6].retlenaddr=&pageplen; lst[7].buflen=4; lst[7].item_code=JPI$_GPGCNT; lst[7].bufaddr=&pageg; lst[7].retlenaddr=&pageglen; lst[8].buflen=4; lst[8].item_code=JPI$_DIRIO; lst[8].bufaddr=&dirio; lst[8].retlenaddr=&diriolen; lst[9].buflen=4; lst[9].item_code=JPI$_BUFIO; lst[9].bufaddr=&bufio; lst[9].retlenaddr=&diriolen; lst[10].buflen=4; lst[10].item_code=JPI$_CPUTIM; lst[10].bufaddr=δ lst[10].retlenaddr=&deltalen; lst[11].buflen=0; lst[11].item_code=0; // printf(" FreeVMS V0.0 on node %6s NN-OOO-2003 PP:QQ:RR.SS Uptime TT XX:YY:ZZ\n",scsnode); #ifdef __x86_64__ int bits = 64; #endif #ifdef __i386__ int bits = 32; #endif #ifndef FREEVMS_BUILD #define FREEVMS_BUILD 1 #endif printf(" FreeVMS %d V%s build %d on node %6s %s Uptime %s\n", bits,version, FREEVMS_BUILD, scsnode, timestr, timestr2); printf(" Pid Process Name State Pri I/O CPU Page flts Pages\n"); do { jpistatus=sys$getjpi(0,0,0,lst,0,0,0); if (jpistatus == SS$_NORMAL) delta = -delta * 100000; // check multiplication sys$asctim(0,&atimenow2,&delta,0); printf("%8x %-15s %-6s %3x %9x %17s %6x %6x\n",epid,procname,states[state],31-pri,dirio+bufio,atimenow2.dsc$a_pointer,pagef,pagep+pageg); } while (jpistatus == SS$_NORMAL); //} while (jpistatus != SS$_NOMOREPROC); }