The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use ExtUtils::H2PM 0.07;
use ExtUtils::CChecker;

module "Socket::Netlink::Generic";

include "sys/socket.h";
include "linux/netlink.h";
include "linux/genetlink.h";

use_export;

constant "NETLINK_GENERIC";

structure "struct genlmsghdr",
   with_tail => 1,
   members => [
      cmd     => member_numeric,
      version => member_numeric,
   ];

constant "CTRL_CMD_$_" for qw( UNSPEC NEWFAMILY DELFAMILY GETFAMILY NEWOPS DELOPS GETOPS );

constant "CTRL_ATTR_$_" for qw( UNSPEC FAMILY_ID FAMILY_NAME );

# Some of these constants are not present in really old kernel header files.
# If we've got CTRL_CMD_NEWMCAST_GRP we should have the rest
my $cc = ExtUtils::CChecker->new;

my $has_newmcast_grp = $cc->try_compile_run(
   source => <<EOF );
#include <sys/socket.h>
#include <linux/netlink.h>
#include <linux/genetlink.h>
int main(int argc, char *argv[]) {
  int ctrl = CTRL_CMD_NEWMCAST_GRP;
  return 0;
}
EOF

if( $has_newmcast_grp ) {
   constant "CTRL_CMD_$_" for qw( NEWMCAST_GRP DELMCAST_GRP GETMCAST_GRP );

   constant "CTRL_ATTR_$_" for qw( VERSION HDRSIZE MAXATTR OPS MCAST_GROUPS );

   constant "CTRL_ATTR_OP_$_" for qw( UNSPEC ID FLAGS );

   constant "CTRL_ATTR_MCAST_GRP_$_" for qw( UNSPEC NAME ID );
}

write_output $ARGV[0];