Last active
June 16, 2016 18:29
-
-
Save o11c/25d404dcfa0b48a8d9fe40e00eeb9ba3 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| socket_structs | |
| *.o |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| z-output-$(shell uname | tr A-Z a-z).txt: socket_structs | |
| ./socket_structs > $@ | |
| socket_structs: socket_structs.o | |
| socket_structs.o: socket_structs.c |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Output information about all known socket types. | |
| // TODO expand to more information, such as AF/PF macros and field names. | |
| // TODO expand to build on non-Linux via `#ifdef` | |
| // TODO figure out libc/kernel version requirements | |
| // Note that some types are available in both libc and kernel headers. | |
| // In this case, libc headers are preferred. | |
| #include <sys/socket.h> | |
| #include <linux/socket.h> | |
| #include <linux/if_alg.h> | |
| #include <netash/ash.h> | |
| #include <netatalk/at.h> | |
| #include <linux/atm.h> | |
| #include <netax25/ax25.h> | |
| #include <linux/caif/caif_socket.h> | |
| #include <linux/can.h> | |
| #include <linux/dn.h> | |
| #include <neteconet/ec.h> | |
| #include <netinet/in.h> | |
| #include <netipx/ipx.h> | |
| #include <linux/irda.h> | |
| #include <netiucv/iucv.h> | |
| #include <linux/l2tp.h> | |
| #include <netpacket/packet.h> | |
| #include <net/if.h> | |
| #include <linux/llc.h> // not self-contained | |
| #include <linux/nfc.h> | |
| #include <linux/netlink.h> | |
| #include <net/if_packet.h> | |
| #include <linux/phonet.h> | |
| #include <linux/if_pppox.h> | |
| #include <netrose/rose.h> | |
| #include <linux/tipc.h> | |
| #include <sys/un.h> | |
| #include <linux/vm_sockets.h> | |
| #include <linux/x25.h> | |
| #include <stddef.h> | |
| #include <stdio.h> | |
| #define PRINT(name, pfx, dom, sol) \ | |
| printf("%sstruct %s: size %zu align %zu, prefix %s, domain [AP]F_%s (%d, %d), level %s (%d)\n", \ | |
| indent, #name, \ | |
| sizeof(struct name) + 0 * offsetof(struct name, pfx##family), __alignof__(struct name), \ | |
| #pfx, #dom, AF_##dom, PF_##dom, #sol, sol) | |
| int main() | |
| { | |
| const char *indent = ""; | |
| printf("WARNING: all numbers may be *local* to the system!"); | |
| PRINT(sockaddr, sa_, UNSPEC, SOL_SOCKET); | |
| // Differs by using `unsigned char` for the data (i.e. padding). | |
| // (and semantically in that it is intended as a wire format). | |
| PRINT(osockaddr, sa_, UNSPEC, SOL_SOCKET); | |
| PRINT(sockaddr_storage, ss_, UNSPEC, SOL_SOCKET); | |
| PRINT(__kernel_sockaddr_storage, ss_, UNSPEC, SOL_SOCKET); | |
| indent = " "; | |
| PRINT(sockaddr_alg, salg_, ALG, SOL_SOCKET); | |
| PRINT(sockaddr_ash, sash_, ASH, SOL_SOCKET); | |
| PRINT(sockaddr_at, sat_, APPLETALK, SOL_ATALK); | |
| PRINT(sockaddr_atmpvc, sap_, ATMPVC, SOL_ATM); | |
| PRINT(sockaddr_atmsvc, sas_, ATMSVC, SOL_AAL); | |
| PRINT(sockaddr_ax25, sax25_, AX25, SOL_AX25); | |
| indent = " "; | |
| PRINT(full_sockaddr_ax25, fsa_ax25.sax25_, AX25, SOL_AX25); | |
| indent = " "; | |
| // No prefix. | |
| PRINT(sockaddr_caif, , CAIF, SOL_SOCKET); | |
| PRINT(sockaddr_can, can_, CAN, SOL_CAN_BASE); | |
| #if 0 | |
| // No known definition, only opaque declarations. | |
| PRINT(sockaddr_dl, sa_, UNSPEC, SOL_SOCKET); | |
| #endif | |
| PRINT(sockaddr_dn, sdn_, DECnet, SOL_DECNET); | |
| PRINT(sockaddr_ec, sec_, ECONET, SOL_SOCKET); | |
| #if 0 | |
| // No known definition, only opaque declarations. | |
| PRINT(sockaddr_eon, sa_, UNSPEC, SOL_SOCKET); | |
| #endif | |
| PRINT(sockaddr_in, sin_, INET, SOL_SOCKET); | |
| indent = " "; | |
| PRINT(sockaddr_l2tpip, l2tp_, UNSPEC, SOL_SOCKET); | |
| indent = " "; | |
| PRINT(sockaddr_in6, sin6_, INET6, SOL_SOCKET); | |
| indent = " "; | |
| PRINT(sockaddr_l2tpip6, l2tp_, UNSPEC, SOL_SOCKET); | |
| indent = " "; | |
| #if 0 | |
| // No known definition, only opaque declarations. | |
| PRINT(sockaddr_inarp, sa_, UNSPEC, SOL_SOCKET); | |
| #endif | |
| PRINT(sockaddr_ipx, sipx_, IPX, SOL_IPX); | |
| PRINT(sockaddr_irda, sir_, IRDA, SOL_IRDA); | |
| #if 0 | |
| // No known definition, only opaque declarations. | |
| PRINT(sockaddr_iso, sa_, UNSPEC, SOL_SOCKET); | |
| #endif | |
| PRINT(sockaddr_iucv, siucv_, IUCV, SOL_SOCKET); | |
| PRINT(sockaddr_ll, sll_, PACKET, SOL_PACKET); | |
| PRINT(sockaddr_llc, sllc_, LLC, SOL_SOCKET); | |
| PRINT(sockaddr_nfc, sa_, NFC, SOL_SOCKET); | |
| indent = " "; | |
| PRINT(sockaddr_nfc_llcp, sa_, NFC, SOL_SOCKET); | |
| indent = " "; | |
| // Alias [AP]F_ROUTE. | |
| PRINT(sockaddr_nl, nl_, NETLINK, SOL_SOCKET); | |
| #if 0 | |
| // No known definition, only opaque declarations. | |
| PRINT(sockaddr_ns, sa_, UNSPEC, SOL_SOCKET); | |
| #endif | |
| // Deprecated, used for SOCK_PACKET rather than AF_PACKET | |
| PRINT(sockaddr_pkt, spkt_, UNSPEC, SOL_PACKET); | |
| PRINT(sockaddr_pn, spn_, PHONET, SOL_SOCKET); | |
| PRINT(sockaddr_pppox, sa_, PPPOX, SOL_SOCKET); | |
| PRINT(sockaddr_pppol2tp, sa_, PPPOX, SOL_SOCKET); | |
| PRINT(sockaddr_pppol2tpin6, sa_, PPPOX, SOL_SOCKET); | |
| PRINT(sockaddr_pppol2tpv3, sa_, PPPOX, SOL_SOCKET); | |
| PRINT(sockaddr_pppol2tpv3in6, sa_, PPPOX, SOL_SOCKET); | |
| PRINT(sockaddr_rose, srose_, ROSE, SOL_ROSE); | |
| indent = " "; | |
| PRINT(full_sockaddr_rose, srose_, ROSE, SOL_ROSE); | |
| indent = " "; | |
| // No prefix. | |
| PRINT(sockaddr_tipc, , TIPC, SOL_TIPC); | |
| // Alias [AP]F_LOCAL. | |
| // Alias [AP]F_FILE. | |
| PRINT(sockaddr_un, sun_, UNIX, SOL_SOCKET); | |
| PRINT(sockaddr_vm, svm_, VSOCK, SOL_SOCKET); | |
| PRINT(sockaddr_x25, sx25_, X25, SOL_X25); | |
| #if 0 | |
| // documented by valgrind as Linux 3.9+ specific | |
| PRINT(sockaddr_rc, sa_, UNSPEC, SOL_SOCKET); | |
| #endif | |
| // Additionally, no structs are known for the following families: | |
| // [AP]F_NETROM SOL_NETROM | |
| // [AP]F_BRIDGE | |
| // [AP]F_NETBEUI | |
| // [AP]F_SECURITY | |
| // [AP]F_KEY | |
| // [AP]F_RDS SOL_RDS | |
| // [AP]F_SNA | |
| // [AP]F_WANPIPE | |
| // [AP]F_IB | |
| // [AP]F_MPLS | |
| // [AP]F_BLUETOOTH | |
| // [AP]F_RXRPC | |
| // [AP]F_ISDN | |
| // [AP]F_IEEE802154 | |
| // [AP]F_CAIF | |
| // | |
| // SOL_ | |
| return 0; | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| WARNING: all numbers may be *local* to the system!struct sockaddr: size 16 align 2, prefix sa_, domain [AP]F_UNSPEC (0, 0), level SOL_SOCKET (1) | |
| struct osockaddr: size 16 align 2, prefix sa_, domain [AP]F_UNSPEC (0, 0), level SOL_SOCKET (1) | |
| struct sockaddr_storage: size 128 align 8, prefix ss_, domain [AP]F_UNSPEC (0, 0), level SOL_SOCKET (1) | |
| struct __kernel_sockaddr_storage: size 128 align 8, prefix ss_, domain [AP]F_UNSPEC (0, 0), level SOL_SOCKET (1) | |
| struct sockaddr_alg: size 88 align 4, prefix salg_, domain [AP]F_ALG (38, 38), level SOL_SOCKET (1) | |
| struct sockaddr_ash: size 32 align 4, prefix sash_, domain [AP]F_ASH (18, 18), level SOL_SOCKET (1) | |
| struct sockaddr_at: size 16 align 2, prefix sat_, domain [AP]F_APPLETALK (5, 5), level SOL_ATALK (258) | |
| struct sockaddr_atmpvc: size 12 align 4, prefix sap_, domain [AP]F_ATMPVC (8, 8), level SOL_ATM (264) | |
| struct sockaddr_atmsvc: size 44 align 4, prefix sas_, domain [AP]F_ATMSVC (20, 20), level SOL_AAL (265) | |
| struct sockaddr_ax25: size 16 align 4, prefix sax25_, domain [AP]F_AX25 (3, 3), level SOL_AX25 (257) | |
| struct full_sockaddr_ax25: size 72 align 4, prefix fsa_ax25.sax25_, domain [AP]F_AX25 (3, 3), level SOL_AX25 (257) | |
| struct sockaddr_caif: size 24 align 4, prefix , domain [AP]F_CAIF (37, 37), level SOL_SOCKET (1) | |
| struct sockaddr_can: size 16 align 4, prefix can_, domain [AP]F_CAN (29, 29), level SOL_CAN_BASE (100) | |
| struct sockaddr_dn: size 26 align 2, prefix sdn_, domain [AP]F_DECnet (12, 12), level SOL_DECNET (261) | |
| struct sockaddr_ec: size 16 align 8, prefix sec_, domain [AP]F_ECONET (19, 19), level SOL_SOCKET (1) | |
| struct sockaddr_in: size 16 align 4, prefix sin_, domain [AP]F_INET (2, 2), level SOL_SOCKET (1) | |
| struct sockaddr_l2tpip: size 16 align 4, prefix l2tp_, domain [AP]F_UNSPEC (0, 0), level SOL_SOCKET (1) | |
| struct sockaddr_in6: size 28 align 4, prefix sin6_, domain [AP]F_INET6 (10, 10), level SOL_SOCKET (1) | |
| struct sockaddr_l2tpip6: size 32 align 4, prefix l2tp_, domain [AP]F_UNSPEC (0, 0), level SOL_SOCKET (1) | |
| struct sockaddr_ipx: size 16 align 4, prefix sipx_, domain [AP]F_IPX (4, 4), level SOL_IPX (256) | |
| struct sockaddr_irda: size 36 align 4, prefix sir_, domain [AP]F_IRDA (23, 23), level SOL_IRDA (266) | |
| struct sockaddr_iucv: size 32 align 4, prefix siucv_, domain [AP]F_IUCV (32, 32), level SOL_SOCKET (1) | |
| struct sockaddr_ll: size 20 align 4, prefix sll_, domain [AP]F_PACKET (17, 17), level SOL_PACKET (263) | |
| struct sockaddr_llc: size 16 align 2, prefix sllc_, domain [AP]F_LLC (26, 26), level SOL_SOCKET (1) | |
| struct sockaddr_nfc: size 16 align 4, prefix sa_, domain [AP]F_NFC (39, 39), level SOL_SOCKET (1) | |
| struct sockaddr_nfc_llcp: size 96 align 8, prefix sa_, domain [AP]F_NFC (39, 39), level SOL_SOCKET (1) | |
| struct sockaddr_nl: size 12 align 4, prefix nl_, domain [AP]F_NETLINK (16, 16), level SOL_SOCKET (1) | |
| struct sockaddr_pkt: size 18 align 2, prefix spkt_, domain [AP]F_UNSPEC (0, 0), level SOL_PACKET (263) | |
| struct sockaddr_pn: size 16 align 1, prefix spn_, domain [AP]F_PHONET (35, 35), level SOL_SOCKET (1) | |
| struct sockaddr_pppox: size 30 align 1, prefix sa_, domain [AP]F_PPPOX (24, 24), level SOL_SOCKET (1) | |
| struct sockaddr_pppol2tp: size 38 align 1, prefix sa_, domain [AP]F_PPPOX (24, 24), level SOL_SOCKET (1) | |
| struct sockaddr_pppol2tpin6: size 50 align 1, prefix sa_, domain [AP]F_PPPOX (24, 24), level SOL_SOCKET (1) | |
| struct sockaddr_pppol2tpv3: size 46 align 1, prefix sa_, domain [AP]F_PPPOX (24, 24), level SOL_SOCKET (1) | |
| struct sockaddr_pppol2tpv3in6: size 58 align 1, prefix sa_, domain [AP]F_PPPOX (24, 24), level SOL_SOCKET (1) | |
| struct sockaddr_rose: size 28 align 4, prefix srose_, domain [AP]F_ROSE (11, 11), level SOL_ROSE (260) | |
| struct full_sockaddr_rose: size 64 align 4, prefix srose_, domain [AP]F_ROSE (11, 11), level SOL_ROSE (260) | |
| struct sockaddr_tipc: size 16 align 4, prefix , domain [AP]F_TIPC (30, 30), level SOL_TIPC (271) | |
| struct sockaddr_un: size 110 align 2, prefix sun_, domain [AP]F_UNIX (1, 1), level SOL_SOCKET (1) | |
| struct sockaddr_vm: size 16 align 4, prefix svm_, domain [AP]F_VSOCK (40, 40), level SOL_SOCKET (1) | |
| struct sockaddr_x25: size 18 align 2, prefix sx25_, domain [AP]F_X25 (9, 9), level SOL_X25 (262) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment