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 )