PageRenderTime 45ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/pwn/include/freebsd/sys/socket.h

https://github.com/bossjones/pwntools
C Header | 685 lines | 467 code | 67 blank | 151 comment | 1 complexity | 0fb1da993e4b373f35b2d36fd3e77829 MD5 | raw file
  1. /*-
  2. * Copyright (c) 1982, 1985, 1986, 1988, 1993, 1994
  3. * The Regents of the University of California. All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions
  7. * are met:
  8. * 1. Redistributions of source code must retain the above copyright
  9. * notice, this list of conditions and the following disclaimer.
  10. * 2. Redistributions in binary form must reproduce the above copyright
  11. * notice, this list of conditions and the following disclaimer in the
  12. * documentation and/or other materials provided with the distribution.
  13. * 4. Neither the name of the University nor the names of its contributors
  14. * may be used to endorse or promote products derived from this software
  15. * without specific prior written permission.
  16. *
  17. * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  18. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  20. * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  21. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  22. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  23. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  24. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  25. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  26. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  27. * SUCH DAMAGE.
  28. *
  29. * @(#)socket.h 8.4 (Berkeley) 2/21/94
  30. * $FreeBSD$
  31. */
  32. #ifndef _SYS_SOCKET_H_
  33. #define _SYS_SOCKET_H_
  34. #include <sys/cdefs.h>
  35. #include <sys/_types.h>
  36. #include <sys/_iovec.h>
  37. #include <machine/_align.h>
  38. /*
  39. * Definitions related to sockets: types, address families, options.
  40. */
  41. /*
  42. * Data types.
  43. */
  44. #if __BSD_VISIBLE
  45. #ifndef _GID_T_DECLARED
  46. typedef __gid_t gid_t;
  47. #define _GID_T_DECLARED
  48. #endif
  49. #ifndef _OFF_T_DECLARED
  50. typedef __off_t off_t;
  51. #define _OFF_T_DECLARED
  52. #endif
  53. #ifndef _PID_T_DECLARED
  54. typedef __pid_t pid_t;
  55. #define _PID_T_DECLARED
  56. #endif
  57. #endif
  58. #ifndef _SA_FAMILY_T_DECLARED
  59. typedef __sa_family_t sa_family_t;
  60. #define _SA_FAMILY_T_DECLARED
  61. #endif
  62. #ifndef _SOCKLEN_T_DECLARED
  63. typedef __socklen_t socklen_t;
  64. #define _SOCKLEN_T_DECLARED
  65. #endif
  66. #ifndef _SSIZE_T_DECLARED
  67. typedef __ssize_t ssize_t;
  68. #define _SSIZE_T_DECLARED
  69. #endif
  70. #if __BSD_VISIBLE
  71. #ifndef _UID_T_DECLARED
  72. typedef __uid_t uid_t;
  73. #define _UID_T_DECLARED
  74. #endif
  75. #endif
  76. /*
  77. * Types
  78. */
  79. #define SOCK_STREAM 1 /* stream socket */
  80. #define SOCK_DGRAM 2 /* datagram socket */
  81. #define SOCK_RAW 3 /* raw-protocol interface */
  82. #if __BSD_VISIBLE
  83. #define SOCK_RDM 4 /* reliably-delivered message */
  84. #endif
  85. #define SOCK_SEQPACKET 5 /* sequenced packet stream */
  86. /*
  87. * Option flags per-socket.
  88. */
  89. #define SO_DEBUG 0x0001 /* turn on debugging info recording */
  90. #define SO_ACCEPTCONN 0x0002 /* socket has had listen() */
  91. #define SO_REUSEADDR 0x0004 /* allow local address reuse */
  92. #define SO_KEEPALIVE 0x0008 /* keep connections alive */
  93. #define SO_DONTROUTE 0x0010 /* just use interface addresses */
  94. #define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */
  95. #if __BSD_VISIBLE
  96. #define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */
  97. #endif
  98. #define SO_LINGER 0x0080 /* linger on close if data present */
  99. #define SO_OOBINLINE 0x0100 /* leave received OOB data in line */
  100. #if __BSD_VISIBLE
  101. #define SO_REUSEPORT 0x0200 /* allow local address & port reuse */
  102. #define SO_TIMESTAMP 0x0400 /* timestamp received dgram traffic */
  103. #define SO_NOSIGPIPE 0x0800 /* no SIGPIPE from EPIPE */
  104. #define SO_ACCEPTFILTER 0x1000 /* there is an accept filter */
  105. #define SO_BINTIME 0x2000 /* timestamp received dgram traffic */
  106. #endif
  107. #define SO_NO_OFFLOAD 0x4000 /* socket cannot be offloaded */
  108. #define SO_NO_DDP 0x8000 /* disable direct data placement */
  109. /*
  110. * Additional options, not kept in so_options.
  111. */
  112. #define SO_SNDBUF 0x1001 /* send buffer size */
  113. #define SO_RCVBUF 0x1002 /* receive buffer size */
  114. #define SO_SNDLOWAT 0x1003 /* send low-water mark */
  115. #define SO_RCVLOWAT 0x1004 /* receive low-water mark */
  116. #define SO_SNDTIMEO 0x1005 /* send timeout */
  117. #define SO_RCVTIMEO 0x1006 /* receive timeout */
  118. #define SO_ERROR 0x1007 /* get error status and clear */
  119. #define SO_TYPE 0x1008 /* get socket type */
  120. #if __BSD_VISIBLE
  121. #define SO_LABEL 0x1009 /* socket's MAC label */
  122. #define SO_PEERLABEL 0x1010 /* socket's peer's MAC label */
  123. #define SO_LISTENQLIMIT 0x1011 /* socket's backlog limit */
  124. #define SO_LISTENQLEN 0x1012 /* socket's complete queue length */
  125. #define SO_LISTENINCQLEN 0x1013 /* socket's incomplete queue length */
  126. #define SO_SETFIB 0x1014 /* use this FIB to route */
  127. #define SO_USER_COOKIE 0x1015 /* user cookie (dummynet etc.) */
  128. #define SO_PROTOCOL 0x1016 /* get socket protocol (Linux name) */
  129. #define SO_PROTOTYPE SO_PROTOCOL /* alias for SO_PROTOCOL (SunOS name) */
  130. #endif
  131. /*
  132. * Space reserved for new socket options added by third-party vendors.
  133. * This range applies to all socket option levels. New socket options
  134. * in FreeBSD should always use an option value less than SO_VENDOR.
  135. */
  136. #if __BSD_VISIBLE
  137. #define SO_VENDOR 0x80000000
  138. #endif
  139. /*
  140. * Structure used for manipulating linger option.
  141. */
  142. struct linger {
  143. int l_onoff; /* option on/off */
  144. int l_linger; /* linger time */
  145. };
  146. #if __BSD_VISIBLE
  147. struct accept_filter_arg {
  148. char af_name[16];
  149. char af_arg[256-16];
  150. };
  151. #endif
  152. /*
  153. * Level number for (get/set)sockopt() to apply to socket itself.
  154. */
  155. #define SOL_SOCKET 0xffff /* options for socket level */
  156. /*
  157. * Address families.
  158. */
  159. #define AF_UNSPEC 0 /* unspecified */
  160. #if __BSD_VISIBLE
  161. #define AF_LOCAL AF_UNIX /* local to host (pipes, portals) */
  162. #endif
  163. #define AF_UNIX 1 /* standardized name for AF_LOCAL */
  164. #define AF_INET 2 /* internetwork: UDP, TCP, etc. */
  165. #if __BSD_VISIBLE
  166. #define AF_IMPLINK 3 /* arpanet imp addresses */
  167. #define AF_PUP 4 /* pup protocols: e.g. BSP */
  168. #define AF_CHAOS 5 /* mit CHAOS protocols */
  169. #define AF_NETBIOS 6 /* SMB protocols */
  170. #define AF_ISO 7 /* ISO protocols */
  171. #define AF_OSI AF_ISO
  172. #define AF_ECMA 8 /* European computer manufacturers */
  173. #define AF_DATAKIT 9 /* datakit protocols */
  174. #define AF_CCITT 10 /* CCITT protocols, X.25 etc */
  175. #define AF_SNA 11 /* IBM SNA */
  176. #define AF_DECnet 12 /* DECnet */
  177. #define AF_DLI 13 /* DEC Direct data link interface */
  178. #define AF_LAT 14 /* LAT */
  179. #define AF_HYLINK 15 /* NSC Hyperchannel */
  180. #define AF_APPLETALK 16 /* Apple Talk */
  181. #define AF_ROUTE 17 /* Internal Routing Protocol */
  182. #define AF_LINK 18 /* Link layer interface */
  183. #define pseudo_AF_XTP 19 /* eXpress Transfer Protocol (no AF) */
  184. #define AF_COIP 20 /* connection-oriented IP, aka ST II */
  185. #define AF_CNT 21 /* Computer Network Technology */
  186. #define pseudo_AF_RTIP 22 /* Help Identify RTIP packets */
  187. #define AF_IPX 23 /* Novell Internet Protocol */
  188. #define AF_SIP 24 /* Simple Internet Protocol */
  189. #define pseudo_AF_PIP 25 /* Help Identify PIP packets */
  190. #define AF_ISDN 26 /* Integrated Services Digital Network*/
  191. #define AF_E164 AF_ISDN /* CCITT E.164 recommendation */
  192. #define pseudo_AF_KEY 27 /* Internal key-management function */
  193. #endif
  194. #define AF_INET6 28 /* IPv6 */
  195. #if __BSD_VISIBLE
  196. #define AF_NATM 29 /* native ATM access */
  197. #define AF_ATM 30 /* ATM */
  198. #define pseudo_AF_HDRCMPLT 31 /* Used by BPF to not rewrite headers
  199. * in interface output routine
  200. */
  201. #define AF_NETGRAPH 32 /* Netgraph sockets */
  202. #define AF_SLOW 33 /* 802.3ad slow protocol */
  203. #define AF_SCLUSTER 34 /* Sitara cluster protocol */
  204. #define AF_ARP 35
  205. #define AF_BLUETOOTH 36 /* Bluetooth sockets */
  206. #define AF_IEEE80211 37 /* IEEE 802.11 protocol */
  207. #define AF_MAX 38
  208. /*
  209. * When allocating a new AF_ constant, please only allocate
  210. * even numbered constants for FreeBSD until 134 as odd numbered AF_
  211. * constants 39-133 are now reserved for vendors.
  212. */
  213. #define AF_VENDOR00 39
  214. #define AF_VENDOR01 41
  215. #define AF_VENDOR02 43
  216. #define AF_VENDOR03 45
  217. #define AF_VENDOR04 47
  218. #define AF_VENDOR05 49
  219. #define AF_VENDOR06 51
  220. #define AF_VENDOR07 53
  221. #define AF_VENDOR08 55
  222. #define AF_VENDOR09 57
  223. #define AF_VENDOR10 59
  224. #define AF_VENDOR11 61
  225. #define AF_VENDOR12 63
  226. #define AF_VENDOR13 65
  227. #define AF_VENDOR14 67
  228. #define AF_VENDOR15 69
  229. #define AF_VENDOR16 71
  230. #define AF_VENDOR17 73
  231. #define AF_VENDOR18 75
  232. #define AF_VENDOR19 77
  233. #define AF_VENDOR20 79
  234. #define AF_VENDOR21 81
  235. #define AF_VENDOR22 83
  236. #define AF_VENDOR23 85
  237. #define AF_VENDOR24 87
  238. #define AF_VENDOR25 89
  239. #define AF_VENDOR26 91
  240. #define AF_VENDOR27 93
  241. #define AF_VENDOR28 95
  242. #define AF_VENDOR29 97
  243. #define AF_VENDOR30 99
  244. #define AF_VENDOR31 101
  245. #define AF_VENDOR32 103
  246. #define AF_VENDOR33 105
  247. #define AF_VENDOR34 107
  248. #define AF_VENDOR35 109
  249. #define AF_VENDOR36 111
  250. #define AF_VENDOR37 113
  251. #define AF_VENDOR38 115
  252. #define AF_VENDOR39 117
  253. #define AF_VENDOR40 119
  254. #define AF_VENDOR41 121
  255. #define AF_VENDOR42 123
  256. #define AF_VENDOR43 125
  257. #define AF_VENDOR44 127
  258. #define AF_VENDOR45 129
  259. #define AF_VENDOR46 131
  260. #define AF_VENDOR47 133
  261. #endif
  262. /*
  263. * Structure used by kernel to store most
  264. * addresses.
  265. */
  266. struct sockaddr {
  267. unsigned char sa_len; /* total length */
  268. sa_family_t sa_family; /* address family */
  269. char sa_data[14]; /* actually longer; address value */
  270. };
  271. #if __BSD_VISIBLE
  272. #define SOCK_MAXADDRLEN 255 /* longest possible addresses */
  273. /*
  274. * Structure used by kernel to pass protocol
  275. * information in raw sockets.
  276. */
  277. struct sockproto {
  278. unsigned short sp_family; /* address family */
  279. unsigned short sp_protocol; /* protocol */
  280. };
  281. #endif
  282. #include <sys/_sockaddr_storage.h>
  283. #if __BSD_VISIBLE
  284. /*
  285. * Protocol families, same as address families for now.
  286. */
  287. #define PF_UNSPEC AF_UNSPEC
  288. #define PF_LOCAL AF_LOCAL
  289. #define PF_UNIX PF_LOCAL /* backward compatibility */
  290. #define PF_INET AF_INET
  291. #define PF_IMPLINK AF_IMPLINK
  292. #define PF_PUP AF_PUP
  293. #define PF_CHAOS AF_CHAOS
  294. #define PF_NETBIOS AF_NETBIOS
  295. #define PF_ISO AF_ISO
  296. #define PF_OSI AF_ISO
  297. #define PF_ECMA AF_ECMA
  298. #define PF_DATAKIT AF_DATAKIT
  299. #define PF_CCITT AF_CCITT
  300. #define PF_SNA AF_SNA
  301. #define PF_DECnet AF_DECnet
  302. #define PF_DLI AF_DLI
  303. #define PF_LAT AF_LAT
  304. #define PF_HYLINK AF_HYLINK
  305. #define PF_APPLETALK AF_APPLETALK
  306. #define PF_ROUTE AF_ROUTE
  307. #define PF_LINK AF_LINK
  308. #define PF_XTP pseudo_AF_XTP /* really just proto family, no AF */
  309. #define PF_COIP AF_COIP
  310. #define PF_CNT AF_CNT
  311. #define PF_SIP AF_SIP
  312. #define PF_IPX AF_IPX
  313. #define PF_RTIP pseudo_AF_RTIP /* same format as AF_INET */
  314. #define PF_PIP pseudo_AF_PIP
  315. #define PF_ISDN AF_ISDN
  316. #define PF_KEY pseudo_AF_KEY
  317. #define PF_INET6 AF_INET6
  318. #define PF_NATM AF_NATM
  319. #define PF_ATM AF_ATM
  320. #define PF_NETGRAPH AF_NETGRAPH
  321. #define PF_SLOW AF_SLOW
  322. #define PF_SCLUSTER AF_SCLUSTER
  323. #define PF_ARP AF_ARP
  324. #define PF_BLUETOOTH AF_BLUETOOTH
  325. #define PF_MAX AF_MAX
  326. /*
  327. * Definitions for network related sysctl, CTL_NET.
  328. *
  329. * Second level is protocol family.
  330. * Third level is protocol number.
  331. *
  332. * Further levels are defined by the individual families below.
  333. */
  334. #define NET_MAXID AF_MAX
  335. #define CTL_NET_NAMES { \
  336. { 0, 0 }, \
  337. { "unix", CTLTYPE_NODE }, \
  338. { "inet", CTLTYPE_NODE }, \
  339. { "implink", CTLTYPE_NODE }, \
  340. { "pup", CTLTYPE_NODE }, \
  341. { "chaos", CTLTYPE_NODE }, \
  342. { "xerox_ns", CTLTYPE_NODE }, \
  343. { "iso", CTLTYPE_NODE }, \
  344. { "emca", CTLTYPE_NODE }, \
  345. { "datakit", CTLTYPE_NODE }, \
  346. { "ccitt", CTLTYPE_NODE }, \
  347. { "ibm_sna", CTLTYPE_NODE }, \
  348. { "decnet", CTLTYPE_NODE }, \
  349. { "dec_dli", CTLTYPE_NODE }, \
  350. { "lat", CTLTYPE_NODE }, \
  351. { "hylink", CTLTYPE_NODE }, \
  352. { "appletalk", CTLTYPE_NODE }, \
  353. { "route", CTLTYPE_NODE }, \
  354. { "link_layer", CTLTYPE_NODE }, \
  355. { "xtp", CTLTYPE_NODE }, \
  356. { "coip", CTLTYPE_NODE }, \
  357. { "cnt", CTLTYPE_NODE }, \
  358. { "rtip", CTLTYPE_NODE }, \
  359. { "ipx", CTLTYPE_NODE }, \
  360. { "sip", CTLTYPE_NODE }, \
  361. { "pip", CTLTYPE_NODE }, \
  362. { "isdn", CTLTYPE_NODE }, \
  363. { "key", CTLTYPE_NODE }, \
  364. { "inet6", CTLTYPE_NODE }, \
  365. { "natm", CTLTYPE_NODE }, \
  366. { "atm", CTLTYPE_NODE }, \
  367. { "hdrcomplete", CTLTYPE_NODE }, \
  368. { "netgraph", CTLTYPE_NODE }, \
  369. { "snp", CTLTYPE_NODE }, \
  370. { "scp", CTLTYPE_NODE }, \
  371. }
  372. /*
  373. * PF_ROUTE - Routing table
  374. *
  375. * Three additional levels are defined:
  376. * Fourth: address family, 0 is wildcard
  377. * Fifth: type of info, defined below
  378. * Sixth: flag(s) to mask with for NET_RT_FLAGS
  379. */
  380. #define NET_RT_DUMP 1 /* dump; may limit to a.f. */
  381. #define NET_RT_FLAGS 2 /* by flags, e.g. RESOLVING */
  382. #define NET_RT_IFLIST 3 /* survey interface list */
  383. #define NET_RT_IFMALIST 4 /* return multicast address list */
  384. #define NET_RT_IFLISTL 5 /* Survey interface list, using 'l'en
  385. * versions of msghdr structs. */
  386. #define NET_RT_MAXID 6
  387. #define CTL_NET_RT_NAMES { \
  388. { 0, 0 }, \
  389. { "dump", CTLTYPE_STRUCT }, \
  390. { "flags", CTLTYPE_STRUCT }, \
  391. { "iflist", CTLTYPE_STRUCT }, \
  392. { "ifmalist", CTLTYPE_STRUCT }, \
  393. { "iflistl", CTLTYPE_STRUCT }, \
  394. }
  395. #endif /* __BSD_VISIBLE */
  396. /*
  397. * Maximum queue length specifiable by listen.
  398. */
  399. #define SOMAXCONN 128
  400. /*
  401. * Message header for recvmsg and sendmsg calls.
  402. * Used value-result for recvmsg, value only for sendmsg.
  403. */
  404. struct msghdr {
  405. void *msg_name; /* optional address */
  406. socklen_t msg_namelen; /* size of address */
  407. struct iovec *msg_iov; /* scatter/gather array */
  408. int msg_iovlen; /* # elements in msg_iov */
  409. void *msg_control; /* ancillary data, see below */
  410. socklen_t msg_controllen; /* ancillary data buffer len */
  411. int msg_flags; /* flags on received message */
  412. };
  413. #define MSG_OOB 0x1 /* process out-of-band data */
  414. #define MSG_PEEK 0x2 /* peek at incoming message */
  415. #define MSG_DONTROUTE 0x4 /* send without using routing tables */
  416. #define MSG_EOR 0x8 /* data completes record */
  417. #define MSG_TRUNC 0x10 /* data discarded before delivery */
  418. #define MSG_CTRUNC 0x20 /* control data lost before delivery */
  419. #define MSG_WAITALL 0x40 /* wait for full request or error */
  420. #define MSG_NOTIFICATION 0x2000 /* SCTP notification */
  421. #if __BSD_VISIBLE
  422. #define MSG_DONTWAIT 0x80 /* this message should be nonblocking */
  423. #define MSG_EOF 0x100 /* data completes connection */
  424. #define MSG_NBIO 0x4000 /* FIONBIO mode, used by fifofs */
  425. #define MSG_COMPAT 0x8000 /* used in sendit() */
  426. #endif
  427. #ifdef _KERNEL
  428. #define MSG_SOCALLBCK 0x10000 /* for use by socket callbacks - soreceive (TCP) */
  429. #endif
  430. #if __BSD_VISIBLE
  431. #define MSG_NOSIGNAL 0x20000 /* do not generate SIGPIPE on EOF */
  432. #endif
  433. /*
  434. * Header for ancillary data objects in msg_control buffer.
  435. * Used for additional information with/about a datagram
  436. * not expressible by flags. The format is a sequence
  437. * of message elements headed by cmsghdr structures.
  438. */
  439. struct cmsghdr {
  440. socklen_t cmsg_len; /* data byte count, including hdr */
  441. int cmsg_level; /* originating protocol */
  442. int cmsg_type; /* protocol-specific type */
  443. /* followed by u_char cmsg_data[]; */
  444. };
  445. #if __BSD_VISIBLE
  446. /*
  447. * While we may have more groups than this, the cmsgcred struct must
  448. * be able to fit in an mbuf and we have historically supported a
  449. * maximum of 16 groups.
  450. */
  451. #define CMGROUP_MAX 16
  452. /*
  453. * Credentials structure, used to verify the identity of a peer
  454. * process that has sent us a message. This is allocated by the
  455. * peer process but filled in by the kernel. This prevents the
  456. * peer from lying about its identity. (Note that cmcred_groups[0]
  457. * is the effective GID.)
  458. */
  459. struct cmsgcred {
  460. pid_t cmcred_pid; /* PID of sending process */
  461. uid_t cmcred_uid; /* real UID of sending process */
  462. uid_t cmcred_euid; /* effective UID of sending process */
  463. gid_t cmcred_gid; /* real GID of sending process */
  464. short cmcred_ngroups; /* number or groups */
  465. gid_t cmcred_groups[CMGROUP_MAX]; /* groups */
  466. };
  467. /*
  468. * Socket credentials.
  469. */
  470. struct sockcred {
  471. uid_t sc_uid; /* real user id */
  472. uid_t sc_euid; /* effective user id */
  473. gid_t sc_gid; /* real group id */
  474. gid_t sc_egid; /* effective group id */
  475. int sc_ngroups; /* number of supplemental groups */
  476. gid_t sc_groups[1]; /* variable length */
  477. };
  478. /*
  479. * Compute size of a sockcred structure with groups.
  480. */
  481. #define SOCKCREDSIZE(ngrps) \
  482. (sizeof(struct sockcred) + (sizeof(gid_t) * ((ngrps) - 1)))
  483. #endif /* __BSD_VISIBLE */
  484. /* given pointer to struct cmsghdr, return pointer to data */
  485. #define CMSG_DATA(cmsg) ((unsigned char *)(cmsg) + \
  486. _ALIGN(sizeof(struct cmsghdr)))
  487. /* given pointer to struct cmsghdr, return pointer to next cmsghdr */
  488. #define CMSG_NXTHDR(mhdr, cmsg) \
  489. ((char *)(cmsg) == NULL ? CMSG_FIRSTHDR(mhdr) : \
  490. ((char *)(cmsg) + _ALIGN(((struct cmsghdr *)(cmsg))->cmsg_len) + \
  491. _ALIGN(sizeof(struct cmsghdr)) > \
  492. (char *)(mhdr)->msg_control + (mhdr)->msg_controllen) ? \
  493. (struct cmsghdr *)0 : \
  494. (struct cmsghdr *)(void *)((char *)(cmsg) + \
  495. _ALIGN(((struct cmsghdr *)(cmsg))->cmsg_len)))
  496. /*
  497. * RFC 2292 requires to check msg_controllen, in case that the kernel returns
  498. * an empty list for some reasons.
  499. */
  500. #define CMSG_FIRSTHDR(mhdr) \
  501. ((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \
  502. (struct cmsghdr *)(mhdr)->msg_control : \
  503. (struct cmsghdr *)NULL)
  504. #if __BSD_VISIBLE
  505. /* RFC 2292 additions */
  506. #define CMSG_SPACE(l) (_ALIGN(sizeof(struct cmsghdr)) + _ALIGN(l))
  507. #define CMSG_LEN(l) (_ALIGN(sizeof(struct cmsghdr)) + (l))
  508. #endif
  509. #ifdef _KERNEL
  510. #define CMSG_ALIGN(n) _ALIGN(n)
  511. #endif
  512. /* "Socket"-level control message types: */
  513. #define SCM_RIGHTS 0x01 /* access rights (array of int) */
  514. #if __BSD_VISIBLE
  515. #define SCM_TIMESTAMP 0x02 /* timestamp (struct timeval) */
  516. #define SCM_CREDS 0x03 /* process creds (struct cmsgcred) */
  517. #define SCM_BINTIME 0x04 /* timestamp (struct bintime) */
  518. #endif
  519. #if __BSD_VISIBLE
  520. /*
  521. * 4.3 compat sockaddr, move to compat file later
  522. */
  523. struct osockaddr {
  524. unsigned short sa_family; /* address family */
  525. char sa_data[14]; /* up to 14 bytes of direct address */
  526. };
  527. /*
  528. * 4.3-compat message header (move to compat file later).
  529. */
  530. struct omsghdr {
  531. char *msg_name; /* optional address */
  532. int msg_namelen; /* size of address */
  533. struct iovec *msg_iov; /* scatter/gather array */
  534. int msg_iovlen; /* # elements in msg_iov */
  535. char *msg_accrights; /* access rights sent/received */
  536. int msg_accrightslen;
  537. };
  538. #endif
  539. /*
  540. * howto arguments for shutdown(2), specified by Posix.1g.
  541. */
  542. #define SHUT_RD 0 /* shut down the reading side */
  543. #define SHUT_WR 1 /* shut down the writing side */
  544. #define SHUT_RDWR 2 /* shut down both sides */
  545. /* we cheat and use the SHUT_XX defines for these */
  546. #define PRU_FLUSH_RD SHUT_RD
  547. #define PRU_FLUSH_WR SHUT_WR
  548. #define PRU_FLUSH_RDWR SHUT_RDWR
  549. #if __BSD_VISIBLE
  550. /*
  551. * sendfile(2) header/trailer struct
  552. */
  553. struct sf_hdtr {
  554. struct iovec *headers; /* pointer to an array of header struct iovec's */
  555. int hdr_cnt; /* number of header iovec's */
  556. struct iovec *trailers; /* pointer to an array of trailer struct iovec's */
  557. int trl_cnt; /* number of trailer iovec's */
  558. };
  559. /*
  560. * Sendfile-specific flag(s)
  561. */
  562. #define SF_NODISKIO 0x00000001
  563. #define SF_MNOWAIT 0x00000002
  564. #define SF_SYNC 0x00000004
  565. #endif
  566. #ifndef _KERNEL
  567. #include <sys/cdefs.h>
  568. __BEGIN_DECLS
  569. int accept(int, struct sockaddr * __restrict, socklen_t * __restrict);
  570. int bind(int, const struct sockaddr *, socklen_t);
  571. int connect(int, const struct sockaddr *, socklen_t);
  572. int getpeername(int, struct sockaddr * __restrict, socklen_t * __restrict);
  573. int getsockname(int, struct sockaddr * __restrict, socklen_t * __restrict);
  574. int getsockopt(int, int, int, void * __restrict, socklen_t * __restrict);
  575. int listen(int, int);
  576. ssize_t recv(int, void *, size_t, int);
  577. ssize_t recvfrom(int, void *, size_t, int, struct sockaddr * __restrict, socklen_t * __restrict);
  578. ssize_t recvmsg(int, struct msghdr *, int);
  579. ssize_t send(int, const void *, size_t, int);
  580. ssize_t sendto(int, const void *,
  581. size_t, int, const struct sockaddr *, socklen_t);
  582. ssize_t sendmsg(int, const struct msghdr *, int);
  583. #if __BSD_VISIBLE
  584. int sendfile(int, int, off_t, size_t, struct sf_hdtr *, off_t *, int);
  585. int setfib(int);
  586. #endif
  587. int setsockopt(int, int, int, const void *, socklen_t);
  588. int shutdown(int, int);
  589. int sockatmark(int);
  590. int socket(int, int, int);
  591. int socketpair(int, int, int, int *);
  592. __END_DECLS
  593. #endif /* !_KERNEL */
  594. #ifdef _KERNEL
  595. struct socket;
  596. struct tcpcb *so_sototcpcb(struct socket *so);
  597. struct inpcb *so_sotoinpcb(struct socket *so);
  598. struct sockbuf *so_sockbuf_snd(struct socket *);
  599. struct sockbuf *so_sockbuf_rcv(struct socket *);
  600. int so_state_get(const struct socket *);
  601. void so_state_set(struct socket *, int);
  602. int so_options_get(const struct socket *);
  603. void so_options_set(struct socket *, int);
  604. int so_error_get(const struct socket *);
  605. void so_error_set(struct socket *, int);
  606. int so_linger_get(const struct socket *);
  607. void so_linger_set(struct socket *, int);
  608. struct protosw *so_protosw_get(const struct socket *);
  609. void so_protosw_set(struct socket *, struct protosw *);
  610. void so_sorwakeup_locked(struct socket *so);
  611. void so_sowwakeup_locked(struct socket *so);
  612. void so_sorwakeup(struct socket *so);
  613. void so_sowwakeup(struct socket *so);
  614. void so_lock(struct socket *so);
  615. void so_unlock(struct socket *so);
  616. void so_listeners_apply_all(struct socket *so, void (*func)(struct socket *, void *), void *arg);
  617. #endif
  618. #endif /* !_SYS_SOCKET_H_ */