packages feed

quic-0.2.16: cbits/sysevent.c

#if defined(OS_MacOS)
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/kern_event.h>

int open_socket () {
   struct kev_request filter = { 0 };

   int s = socket(PF_SYSTEM, SOCK_RAW, SYSPROTO_EVENT);

   filter.vendor_code = KEV_VENDOR_APPLE;
   filter.kev_class = KEV_NETWORK_CLASS;
   filter.kev_subclass = KEV_DL_SUBCLASS;
   ioctl(s, SIOCSKEVFILT, &filter);

   return s;
}

int watch_socket(int s) {
   struct kern_event_msg msg;
   int ret = recv(s, &msg, sizeof(msg), 0);
   if (ret < 0) {
     return -1;
   } else {
     return 0;
   }
}

int close_socket (int s) {
  int ret = close(s);
  return ret;
}
#elif defined(OS_Linux)
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>

int open_socket () {
  struct sockaddr_nl filter = { 0 };

  int s = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);

  filter.nl_family = AF_NETLINK;
  filter.nl_groups = RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE;
  bind(s, (struct sockaddr *)&filter, sizeof(filter));

  return s;
}

int watch_socket(int s) {
  char msg[4096] = {0};
  int ret = recv(s, msg, sizeof(msg), 0);
   if (ret < 0) {
     return -1;
   } else {
     return 0;
   }
}

int close_socket (int s) {
  int ret = close(s);
  return ret;
}
#else
int open_socket () { return 0; }

int watch_socket(int s) { return -2; }

int close_socket (int s) { return 0; }
#endif