/* * Copyright (c) 2004-2008 Hyperic, Inc. * Copyright (c) 2010 VMware, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "sigar.h" #include "sigar_fileinfo.h" #include "sigar_format.h" typedef sigar_t * Sigar; typedef sigar_net_address_t Sigar__NetAddress; /* generated list */ typedef sigar_uptime_t * Sigar__Uptime; typedef sigar_mem_t * Sigar__Mem; typedef sigar_proc_cred_t * Sigar__ProcCred; typedef sigar_proc_fd_t * Sigar__ProcFd; typedef sigar_dir_stat_t * Sigar__DirStat; typedef sigar_proc_cred_name_t * Sigar__ProcCredName; typedef sigar_file_attrs_t * Sigar__FileAttrs; typedef sigar_cpu_t * Sigar__Cpu; typedef sigar_cpu_info_t * Sigar__CpuInfo; typedef sigar_cpu_perc_t * Sigar__CpuPerc; typedef sigar_net_interface_config_t * Sigar__NetInterfaceConfig; typedef sigar_swap_t * Sigar__Swap; typedef sigar_proc_state_t * Sigar__ProcState; typedef sigar_net_connection_t * Sigar__NetConnection; typedef sigar_proc_exe_t * Sigar__ProcExe; typedef sigar_proc_time_t * Sigar__ProcTime; typedef sigar_proc_cpu_t * Sigar__ProcCpu; typedef sigar_proc_mem_t * Sigar__ProcMem; typedef sigar_file_system_t * Sigar__FileSystem; typedef sigar_file_system_usage_t * Sigar__FileSystemUsage; typedef sigar_disk_usage_t * Sigar__DiskUsage; typedef sigar_proc_stat_t * Sigar__ProcStat; typedef sigar_net_route_t * Sigar__NetRoute; typedef sigar_net_interface_stat_t * Sigar__NetInterfaceStat; typedef sigar_arp_t * Sigar__Arp; typedef sigar_who_t * Sigar__Who; typedef sigar_thread_cpu_t * Sigar__ThreadCpu; typedef sigar_resource_limit_t * Sigar__ResourceLimit; typedef sigar_net_info_t * Sigar__NetInfo; typedef sigar_dir_usage_t * Sigar__DirUsage; typedef sigar_sys_info_t * Sigar__SysInfo; typedef sigar_net_stat_t * Sigar__NetStat; typedef sigar_tcp_t * Sigar__Tcp; typedef sigar_nfs_client_v2_t * Sigar__NfsClientV2; typedef sigar_nfs_server_v2_t * Sigar__NfsServerV2; typedef sigar_nfs_client_v3_t * Sigar__NfsClientV3; typedef sigar_nfs_server_v3_t * Sigar__NfsServerV3; /* Perl < 5.6 */ #ifndef aTHX_ #define aTHX_ #endif #define SIGAR_CROAK(sigar, msg) \ Perl_croak(aTHX_ msg " %s", sigar_strerror(sigar, status)) static SV *convert_2svav(char *data, unsigned long number, int size, const char *classname) { AV *av = newAV(); unsigned long i; for (i=0; iklen == klen) && (strEQ(get->key, key))) { get->val = newSVpv(val, vlen); return !SIGAR_OK; /* foundit; stop iterating */ } return SIGAR_OK; } #define XS_SIGAR_CONST_IV(name) \ (void)newCONSTSUB(stash, #name, newSViv(SIGAR_##name)) #define XS_SIGAR_CONST_PV(name) \ (void)newCONSTSUB(stash, #name, newSVpv(SIGAR_##name, 0)) static void boot_Sigar_constants(pTHX) { HV *stash = gv_stashpv("Sigar", TRUE); XS_SIGAR_CONST_IV(IFF_UP); XS_SIGAR_CONST_IV(IFF_BROADCAST); XS_SIGAR_CONST_IV(IFF_DEBUG); XS_SIGAR_CONST_IV(IFF_LOOPBACK); XS_SIGAR_CONST_IV(IFF_POINTOPOINT); XS_SIGAR_CONST_IV(IFF_NOTRAILERS); XS_SIGAR_CONST_IV(IFF_RUNNING); XS_SIGAR_CONST_IV(IFF_NOARP); XS_SIGAR_CONST_IV(IFF_PROMISC); XS_SIGAR_CONST_IV(IFF_ALLMULTI); XS_SIGAR_CONST_IV(IFF_MULTICAST); XS_SIGAR_CONST_IV(NETCONN_CLIENT); XS_SIGAR_CONST_IV(NETCONN_SERVER); XS_SIGAR_CONST_IV(NETCONN_TCP); XS_SIGAR_CONST_IV(NETCONN_UDP); XS_SIGAR_CONST_IV(NETCONN_RAW); XS_SIGAR_CONST_IV(NETCONN_UNIX); XS_SIGAR_CONST_IV(TCP_ESTABLISHED); XS_SIGAR_CONST_IV(TCP_SYN_SENT); XS_SIGAR_CONST_IV(TCP_SYN_RECV); XS_SIGAR_CONST_IV(TCP_FIN_WAIT1); XS_SIGAR_CONST_IV(TCP_FIN_WAIT2); XS_SIGAR_CONST_IV(TCP_TIME_WAIT); XS_SIGAR_CONST_IV(TCP_CLOSE); XS_SIGAR_CONST_IV(TCP_CLOSE_WAIT); XS_SIGAR_CONST_IV(TCP_LAST_ACK); XS_SIGAR_CONST_IV(TCP_LISTEN); XS_SIGAR_CONST_IV(TCP_CLOSING); XS_SIGAR_CONST_IV(TCP_IDLE); XS_SIGAR_CONST_IV(TCP_BOUND); XS_SIGAR_CONST_IV(TCP_UNKNOWN); XS_SIGAR_CONST_PV(NULL_HWADDR); } MODULE = Sigar PACKAGE = Sigar PROTOTYPES: disable INCLUDE: Sigar_generated.xs BOOT: boot_Sigar_constants(aTHX); MODULE = Sigar PACKAGE = Sigar PREFIX = sigar_ Sigar new(classname) char *classname PREINIT: int status; CODE: if ((status = sigar_open(&RETVAL)) != SIGAR_OK) { classname = classname; /* -Wall */ SIGAR_CROAK(RETVAL, "open"); } OUTPUT: RETVAL void DESTROY(sigar) Sigar sigar CODE: (void)sigar_close(sigar); char * format_size(size) UV size PREINIT: char buffer[56]; CODE: RETVAL = sigar_format_size(size, buffer); OUTPUT: RETVAL char * net_interface_flags_string(size) UV size PREINIT: char buffer[1024]; CODE: RETVAL = sigar_net_interface_flags_to_string(size, buffer); OUTPUT: RETVAL char * sigar_fqdn(sigar) Sigar sigar PREINIT: char fqdn[SIGAR_FQDN_LEN]; CODE: sigar_fqdn_get(sigar, fqdn, sizeof(fqdn)); RETVAL = fqdn; OUTPUT: RETVAL SV * loadavg(sigar) Sigar sigar PREINIT: sigar_loadavg_t loadavg; int status; unsigned long i; AV *av; CODE: status = sigar_loadavg_get(sigar, &loadavg); if (status != SIGAR_OK) { SIGAR_CROAK(sigar, "loadavg"); } av = newAV(); av_extend(av, 2); for (i=0; i<3; i++) { av_push(av, newSVnv(loadavg.loadavg[i])); } RETVAL = newRV_noinc((SV*)av); OUTPUT: RETVAL SV * file_system_list(sigar) Sigar sigar PREINIT: sigar_file_system_list_t fslist; int status; CODE: status = sigar_file_system_list_get(sigar, &fslist); if (status != SIGAR_OK) { SIGAR_CROAK(sigar, "fslist"); } RETVAL = convert_2svav((char *)&fslist.data[0], fslist.number, sizeof(*fslist.data), "Sigar::FileSystem"); sigar_file_system_list_destroy(sigar, &fslist); OUTPUT: RETVAL SV * cpu_info_list(sigar) Sigar sigar PREINIT: sigar_cpu_info_list_t cpu_infos; int status; CODE: status = sigar_cpu_info_list_get(sigar, &cpu_infos); if (status != SIGAR_OK) { SIGAR_CROAK(sigar, "cpu_infos"); } RETVAL = convert_2svav((char *)&cpu_infos.data[0], cpu_infos.number, sizeof(*cpu_infos.data), "Sigar::CpuInfo"); sigar_cpu_info_list_destroy(sigar, &cpu_infos); OUTPUT: RETVAL SV * cpu_list(sigar) Sigar sigar PREINIT: sigar_cpu_list_t cpus; int status; CODE: status = sigar_cpu_list_get(sigar, &cpus); if (status != SIGAR_OK) { SIGAR_CROAK(sigar, "cpu_list"); } RETVAL = convert_2svav((char *)&cpus.data[0], cpus.number, sizeof(*cpus.data), "Sigar::Cpu"); sigar_cpu_list_destroy(sigar, &cpus); OUTPUT: RETVAL SV * proc_list(sigar) Sigar sigar PREINIT: sigar_proc_list_t proclist; int status; unsigned long i; AV *av; CODE: status = sigar_proc_list_get(sigar, &proclist); if (status != SIGAR_OK) { SIGAR_CROAK(sigar, "proc_list"); } av = newAV(); av_extend(av, proclist.number - 1); for (i=0; i