VMS-Monitor
view release on metacpan or search on metacpan
starting at the beginning of the buffer we pass, it returns it starting
in by 4 bytes. Go figure.
*/
#ifdef __cplusplus
extern "C" {
#endif
#include <starlet.h>
#include <descrip.h>
#include <prvdef.h>
#include <jpidef.h>
#include <uaidef.h>
#include <ssdef.h>
#include <stsdef.h>
#include <prcdef.h>
#include <pcbdef.h>
#include <pscandef.h>
#include <lib$routines.h>
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#ifdef __cplusplus
}
#endif
#pragma nomember_alignment
struct scs_info {
int scs_nodename[2];
int scs_dgsent;
int scs_dgrcvd;
int scs_dgdiscard;
int scs_msgsent;
int scs_msgrcvd;
int scs_snddats;
int scs_kbytsent;
int scs_reqdats;
int scs_kbytreqd;
int scs_kbytmapd;
int scs_qcr_cnt;
int scs_qbdt_cnt;
} ;
struct disk_info {
char disk_alloclass;
int disk_devname[1];
short int disk_unitnum;
char disk_flags;
int disk_nodename[2];
int disk_volname[3];
int disk_optcnt;
int disk_qcount;
};
struct proc_info {
int proc_ipid;
int proc_uic;
short int proc_state;
char proc_pri;
int proc_lname[4];
int proc_gpgcnt;
int proc_ppgcnt;
int proc_sts;
int proc_diocnt;
int proc_pageflts;
int proc_cputim;
int proc_biocnt;
int proc_epid;
int proc_efwm;
int proc_rbstran;
};
struct mode_info {
char cpu_id;
int interrupt_time;
int mpsync_time;
int kernel_time;
int exec_time;
int super_time;
int user_time;
int compatibility_time;
int idle_time;
};
#pragma member_alignment
typedef union {
struct {short buflen, /* Length of output buffer */
itmcode; /* Item code */
void *buffer; /* Buffer address */
long itemflags; /* Item flags */
} BufferItem; /* Layout of buffer $PROCESS_SCAN item-list elements */
struct {short buflen, /* Length of output buffer */
itmcode; /* Item code */
long itemvalue; /* Value for this item */
long itemflags; /* flags for this item */
} LiteralItem; /* Layout of literal $PROCESS_SCAN item-list */
/* elements */
struct {short buflen, /* Length of output buffer */
itmcode; /* Item code */
void *buffer; /* Buffer address */
void *retlen; /* Return length address */
} TradItem; /* Layout of 'traditional' item-list elements */
} ITMLST;
typedef struct {int sts; /* Returned status */
int unused; /* Unused by us */
} iosb;
/* Prototype for exe$getspi. Takes an event flag pointer, a CSID pointer
(unused), a pointer to a string descriptor with the nodename (unused), a
pointer to an itemlist, a pointer to an IOSB structure, a pointer to an
AST completion routine, and a pointer to an AST routine parameter.
This info snagged from the SYSGETSPI.MAR module off the VMS listing CD.
*/
short exe$getspi(int, void *, void *, void *, void *, void *, long *);
typedef struct {char *ItemName; /* Name of the item we're getting */
unsigned short *ReturnLength; /* Pointer to the return */
/* buffer length */
hv_store(TempHV, "VOLNAME", 7,
newSVpv(&TempName[0], 12), 0);
memcpy(TempName, ReturnDiskInfo[i].disk_devname, 4);
hv_store(TempHV, "DEVNAME", 7,
newSVpv(&TempName[1], TempName[0]), 0);
hv_store(TempHV, "ALLOCLASS", 8,
newSViv(ReturnDiskInfo[i].disk_alloclass), 0);
hv_store(TempHV, "FLAGS", 5,
newSViv(ReturnDiskInfo[i].disk_flags), 0);
hv_store(TempHV, "OPTCNT", 6,
newSViv(ReturnDiskInfo[i].disk_optcnt), 0);
hv_store(TempHV, "QCOUNT", 6,
newSViv(ReturnDiskInfo[i].disk_qcount), 0);
hv_store(TempHV, "UNITNUM", 7,
newSViv(ReturnDiskInfo[i].disk_unitnum), 0);
}
/* Return a reference to our array */
ST(0) = newRV_noinc((SV *)TempAV);
}
/* Give back the buffer */
free(ReturnStringBuffer);
break;
case IS_PROCESS:
{
int i = 0;
AV *TempAV;
HV *TempHV;
char TempName[20];
TempAV = newAV();
sv_2mortal((SV *)TempAV);
/* Swap to a pointer variable of the type we like */
ReturnProcInfo = (void *)ReturnStringBuffer;
/* Add four bytes because GETSPI doesn't return starting at the */
/* beginning of the buffer. Dunno why. */
ReturnProcInfo = (void *)((char *)ReturnProcInfo + 4);
for (i=0; (i<NUM_PROCESS) && ReturnProcInfo[i].proc_ipid; i++) {
/* Get a new hash */
TempHV = newHV();
/* Push a reference to it on our array */
av_push(TempAV, newRV_noinc((SV *)TempHV));
/* Fill it in */
hv_store(TempHV, "IPID", 4,
newSViv(ReturnProcInfo[i].proc_ipid), 0);
hv_store(TempHV, "UIC", 3,
newSViv(ReturnProcInfo[i].proc_uic), 0);
hv_store(TempHV, "STATE", 5,
newSViv(ReturnProcInfo[i].proc_state), 0);
hv_store(TempHV, "PRI", 3,
newSViv(ReturnProcInfo[i].proc_pri), 0);
memcpy(TempName, ReturnProcInfo[i].proc_lname, 16);
hv_store(TempHV, "NAME", 4,
newSVpv(&TempName[1], TempName[0]), 0);
hv_store(TempHV, "GPGCNT", 6,
newSViv(ReturnProcInfo[i].proc_gpgcnt), 0);
hv_store(TempHV, "PPGCNT", 6,
newSViv(ReturnProcInfo[i].proc_ppgcnt), 0);
hv_store(TempHV, "STS", 3,
newSViv(ReturnProcInfo[i].proc_sts), 0);
hv_store(TempHV, "DIOCNT", 6,
newSViv(ReturnProcInfo[i].proc_diocnt), 0);
hv_store(TempHV, "PAGEFLTS", 8,
newSViv(ReturnProcInfo[i].proc_pageflts), 0);
hv_store(TempHV, "CPUTIM", 6,
newSViv(ReturnProcInfo[i].proc_cputim), 0);
hv_store(TempHV, "BIOCNT", 6,
newSViv(ReturnProcInfo[i].proc_biocnt), 0);
hv_store(TempHV, "EPID", 4,
newSViv(ReturnProcInfo[i].proc_epid), 0);
hv_store(TempHV, "EFWM", 4,
newSViv(ReturnProcInfo[i].proc_efwm), 0);
hv_store(TempHV, "RBSTRAN", 9,
newSViv(ReturnProcInfo[i].proc_rbstran), 0);
}
/* Return a reference to our array */
ST(0) = newRV_noinc((SV *)TempAV);
}
/* Give back the buffer */
free(ReturnStringBuffer);
break;
default:
ST(0) = &PL_sv_undef;
break;
}
} else {
SETERRNO(EVMSERR, status);
ST(0) = &PL_sv_undef;
/* free up the buffer if we were looking for a string */
if (MonitorInfoList[i].ReturnType == IS_STRING)
free(ReturnStringBuffer);
}
}
}
( run in 1.033 second using v1.01-cache-2.11-cpan-df04353d9ac )