All Downloads are FREE. Search and download functionalities are using the official Maven repository.

bindings.perl.Sigar.xs Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2004-2008 Hyperic, 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_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




© 2015 - 2024 Weber Informatics LLC | Privacy Policy