#include <asm/unistd.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>

#define DOMAINS_STOP -1
#ifndef IPPROTO_SCTP
#define IPPROTO_SCTP 132
#endif
#ifndef PX_PROTO_OL2TP
#define PX_PROTO_OL2TP 1
#endif
#ifndef PF_IUCV
#define PF_IUCV 32
#endif

const int domains[][3] = { 
	{ PF_APPLETALK, SOCK_DGRAM, 0 },
	{PF_IPX, SOCK_DGRAM, 0 },
	{ PF_IRDA, SOCK_DGRAM, 0 },
	{PF_X25, SOCK_DGRAM, 0 },
	{ PF_AX25, SOCK_DGRAM, 0 },
	{PF_BLUETOOTH, SOCK_DGRAM, 0 },
	{ PF_IUCV, SOCK_STREAM, 0 },
	{PF_INET6, SOCK_SEQPACKET, IPPROTO_SCTP },
	{PF_PPPOX, SOCK_DGRAM, 0 },
	{PF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP },
	{DOMAINS_STOP, 0, 0 }
	};

const char *domainnames[] = {
	"{ PF_APPLETALK, SOCK_DGRAM, 0 }",
	"{ PF_IPX, SOCK_DGRAM, 0 }",
	"{ PF_IRDA, SOCK_DGRAM, 0 }",
	"{ PF_X25, SOCK_DGRAM, 0 }",
	"{ PF_AX25, SOCK_DGRAM, 0 }",
	"{ PF_BLUETOOTH, SOCK_DGRAM, 0 }",
	"{ PF_IUCV, SOCK_STREAM, 0 }",
	"{ PF_INET6, SOCK_SEQPACKET, IPPROTO_SCTP }",
	"{ PF_PPPOX, SOCK_DGRAM, 0 }",
	"{ PF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP }",
	};

int main(void)
{
	int out, d, found = 0;
	// Find a vulnerable domain
	for (d = 0; domains[d][0] != DOMAINS_STOP; d++) {
		if ((out = socket(domains[d][0], domains[d][1], domains[d][2])) >= 0) {
			fprintf(stdout, "found vulnerable domain %s.\n", domainnames[d]);
			found = 1;
		}
	}
    
	if (!found) {
		fprintf(stdout, "unable to find a vulnerable domain.\n");
	}
}
