Linux-WireGuard

 view release on metacpan or  search on metacpan

WireGuard.xs  view on Meta::CPAN


    hv_stores(hv, "endpoint", endpoint_len ? newSVpvn((char*) &peer->endpoint, endpoint_len) : &PL_sv_undef);

    hv_stores(hv, "rx_bytes", newSVuv(peer->rx_bytes));
    hv_stores(hv, "tx_bytes", newSVuv(peer->tx_bytes));
    hv_stores(hv, "persistent_keepalive_interval", (peer->flags & WGPEER_HAS_PERSISTENT_KEEPALIVE_INTERVAL) ? newSVuv(peer->persistent_keepalive_interval) : &PL_sv_undef);

    hv_stores(hv, "last_handshake_time_sec", newSViv(peer->last_handshake_time.tv_sec));
    hv_stores(hv, "last_handshake_time_nsec", newSViv(peer->last_handshake_time.tv_nsec));

    AV* allowed_ips = newAV();
    hv_stores(hv, "allowed_ips", newRV_noinc((SV*) allowed_ips));

    wg_for_each_allowedip(peer, allowedip) {
        HV* ip_hv = _wgallowedip_to_hv(aTHX_ allowedip);
        av_push(allowed_ips, newRV_noinc((SV*)ip_hv));
    }

    return hv;
}

static HV* _wgdev_to_hv (pTHX_ wg_device *dev) {
    wg_peer *peer;

    HV* dev_hv = newHV();

    hv_stores(dev_hv, "name", newSVpv(dev->name, 0));
    hv_stores(dev_hv, "ifindex", newSVuv(dev->ifindex));

    // hv_stores(dev_hv, "flags", newSViv(dev->flags));

    hv_stores(dev_hv, "public_key", dev->flags & WGDEVICE_HAS_PUBLIC_KEY ? newSVpvn((char*) dev->public_key, sizeof(dev->public_key)) : &PL_sv_undef);
    hv_stores(dev_hv, "private_key", dev->flags & WGDEVICE_HAS_PRIVATE_KEY ? newSVpvn((char*) dev->private_key, sizeof(dev->private_key)) : &PL_sv_undef);

    hv_stores(dev_hv, "fwmark", dev->flags & WGDEVICE_HAS_FWMARK ? newSVuv(dev->fwmark) : &PL_sv_undef);
    hv_stores(dev_hv, "listen_port", dev->flags & WGDEVICE_HAS_LISTEN_PORT ? newSVuv(dev->listen_port) : &PL_sv_undef);

    AV* peers = newAV();
    hv_stores(dev_hv, "peers", newRV_noinc((SV*) peers));

    wg_for_each_peer(dev, peer) {
        HV* peer_hv = _wgpeer_to_hv(aTHX_ peer);
        av_push(peers, newRV_noinc((SV*) peer_hv));
    }

    return dev_hv;
}

// Doesn’t seem to be useful:
#define _LWG_CREATE_CONST_UV(ns, theconst) \
    newCONSTSUB(gv_stashpv(ns, 0), #theconst, newSVuv(theconst));

// ----------------------------------------------------------------------

MODULE = Linux::WireGuard       PACKAGE = Linux::WireGuard

PROTOTYPES: DISABLE

void
list_device_names()
    PPCODE:
        char *device_names, *device_name;
        size_t len;

        device_names = wg_list_device_names();
        if (!device_names) {
            croak("Failed to retrieve device names: %s", strerror(errno));
        }

        unsigned count=0;

        wg_for_each_device_name(device_names, device_name, len) {
            count++;
            mXPUSHp(device_name, len);
        }

        free(device_names);

        XSRETURN(count);

SV*
get_device (SV* name_sv)
    CODE:
        wg_device *dev;

        const char* devname = exs_SvPVbyte_nolen(name_sv);

        if (wg_get_device(&dev, devname) < 0) {
            croak("Failed to retrieve device `%s`: %s", devname, strerror(errno));
        }

        HV* dev_hv = _wgdev_to_hv(aTHX_ dev);

        wg_free_device(dev);

        RETVAL = newRV_noinc((SV*) dev_hv);

    OUTPUT:
        RETVAL

void
add_device (SV* name_sv)
    ALIAS:
        del_device = 1
    CODE:
        const char* devname = exs_SvPVbyte_nolen(name_sv);

        int result = ix ? wg_del_device(devname) : wg_add_device(devname);
        if (result) {
            croak("Failed to %s device `%s`: %s", ix ? "delete" : "add", devname, strerror(errno));
        }

SV*
generate_private_key()
    ALIAS:
        generate_preshared_key = 1
    CODE:
        wg_key key;

        if (ix) {
            wg_generate_preshared_key(key);



( run in 0.399 second using v1.01-cache-2.11-cpan-5511b514fd6 )