change sockaddr generation to pass around correct types.
[trinity.git] / net / sockaddr.c
blobb3eae1420b8ccdcbf350afdc0f553c7ac909e527
1 #include <sys/types.h>
2 #include <sys/socket.h>
3 #include <sys/un.h>
4 #include <netinet/in.h>
5 #include <stdlib.h>
6 #include "sanitise.h"
7 #include "compat.h"
8 #include "net.h"
9 #include "maps.h"
10 #include "config.h"
11 #include "random.h"
12 #include "params.h" // do_specific_proto
13 #include "utils.h" // ARRAY_SIZE
15 struct sa_func_entry {
16 unsigned int pf;
17 void (*func)(struct sockaddr **addr, socklen_t *addrlen);
20 static const struct sa_func_entry sa_funcs[] = {
21 //TODO { .pf = PF_UNSPEC, .func = &unspec_gen_sockaddr },
22 { .pf = PF_UNIX, .func = &unix_gen_sockaddr },
23 { .pf = PF_INET, .func = &ipv4_gen_sockaddr },
24 { .pf = PF_AX25, .func = &ax25_gen_sockaddr },
25 { .pf = PF_IPX, .func = &ipx_gen_sockaddr },
26 { .pf = PF_APPLETALK, .func = &atalk_gen_sockaddr },
27 //TODO { .pf = PF_NETROM, .func = &netrom_gen_sockaddr },
28 //TODO { .pf = PF_BRIDGE, .func = &bridge_gen_sockaddr },
29 { .pf = PF_ATMPVC, .func = &atmpvc_gen_sockaddr },
30 { .pf = PF_X25, .func = &x25_gen_sockaddr },
31 { .pf = PF_INET6, .func = &ipv6_gen_sockaddr },
32 { .pf = PF_ROSE, .func = &rose_gen_sockaddr },
33 { .pf = PF_DECnet, .func = &decnet_gen_sockaddr },
34 { .pf = PF_NETBEUI, .func = &llc_gen_sockaddr },
35 //TODO { .pf = PF_SECURITY, .func = &security_gen_sockaddr },
36 //TODO { .pf = PF_KEY, .func = &key_gen_sockaddr },
37 { .pf = PF_NETLINK, .func = &netlink_gen_sockaddr },
38 { .pf = PF_PACKET, .func = &packet_gen_sockaddr },
39 //TODO { .pf = PF_ASH, .func = &ash_gen_sockaddr },
40 { .pf = PF_ECONET, .func = &econet_gen_sockaddr },
41 { .pf = PF_ATMSVC, .func = &atmsvc_gen_sockaddr },
42 { .pf = PF_RDS, .func = &rds_gen_sockaddr },
43 //TODO { .pf = PF_SNA, .func = &sna_gen_sockaddr },
44 { .pf = PF_IRDA, .func = &irda_gen_sockaddr },
45 { .pf = PF_PPPOX, .func = &pppox_gen_sockaddr },
46 //TODO { .pf = PF_WANPIPE, .func = &wanpipe_gen_sockaddr },
47 { .pf = PF_LLC, .func = &llc_gen_sockaddr },
48 { .pf = PF_CAN, .func = &can_gen_sockaddr },
49 { .pf = PF_TIPC, .func = &tipc_gen_sockaddr },
50 //TODO { .pf = PF_BLUETOOTH, .func = &bluetooth_gen_sockaddr },
51 //TODO { .pf = PF_IUCV, .func = &iucv_gen_sockaddr },
52 //TODO { .pf = PF_RXRPC, .func = &rxrpc_gen_sockaddr },
53 //TODO { .pf = PF_ISDN, .func = &isdn_gen_sockaddr },
54 { .pf = PF_PHONET, .func = &phonet_gen_sockaddr },
55 //TODO { .pf = PF_IEEE802154, .func = &ieee802154_gen_sockaddr },
56 #ifdef USE_CAIF
57 { .pf = PF_CAIF, .func = &caif_gen_sockaddr },
58 #endif
59 #ifdef USE_IF_ALG
60 { .pf = PF_ALG, .func = &alg_gen_sockaddr },
61 #endif
62 { .pf = PF_NFC, .func = &nfc_gen_sockaddr },
63 //TODO { .pf = PF_VSOCK, .func = &vsock_gen_sockaddr },
66 void generate_sockaddr(struct sockaddr **addr, socklen_t *addrlen, int pf)
68 unsigned int i;
70 /* If we want sockets of a specific type, we'll want sockaddrs that match. */
71 if (do_specific_proto == TRUE)
72 pf = specific_proto;
74 /* If we got no hint passed down, pick a random proto. */
75 if (pf == -1)
76 pf = rand() % TRINITY_PF_MAX;
78 for (i = 0; i < ARRAY_SIZE(sa_funcs); i++) {
79 if (sa_funcs[i].pf == (unsigned int) pf) {
80 sa_funcs[i].func(addr, addrlen);
81 return;
85 /* Make something up for unknown protocols. */
86 *addr = (struct sockaddr *) page_rand;
87 *addrlen = rand() % 100;