uevent monitor
[cinitramfs.git] / ulinux / socket / msg.h
blob6945e510e403688e0fc5e2849c4256b7a18824f6
1 #ifndef ULINUX_SOCKET_MSG_H
2 #define ULINUX_SOCKET_MSG_H
3 //******************************************************************************
4 //*this code is protected by the GNU affero GPLv3
5 //*author:Sylvain BERTRAND <sylvain.bertrand AT gmail dot com>
6 //* <digital.ragnarok AT gmail dot com>
7 //******************************************************************************
8 #define K_SOL_SOCKET 1
10 struct k_io_vec{//will probably go somewhere else
11 void *base;//BSD uses caddr_t (1003.1g requires void *)
12 k_sz len; //Must be size_t (1003.1g)
15 struct k_msg_hdr{
16 void *name;//socket name
17 k_i name_len;//length of name
18 struct k_io_vec *iov;//data blocks
19 k_sz iov_len;//number of blocks
20 void *control;//per protocol magic (eg BSD file descriptor passing)
21 k_sz control_len;//length of cmsg list
22 k_u flgs;
23 };
25 //the c prefix stands for access *c*ontrol message (other name ancillary data)
26 struct k_cmsg_hdr{
27 k_sz len;//data byte count, including hdr
28 k_i lvl;//originating protocol
29 k_i type;//protocol-specific type
32 #define __K_CMSG_NXTHDR(ctl,len,cmsg) __k_cmsg_nxthdr((ctl),(len),(cmsg))
33 #define K_CMSG_NXTHDR(mhdr,cmsg) __k_cmsg_nxthdr((mhdr),(cmsg))
35 #define K_CMSG_ALIGN(len) (((len)+sizeof(k_l)-1)&~(sizeof(k_l)-1))
37 #define K_CMSG_DATA(cmsg) ((void*)((k_u8*)(cmsg)+K_CMSG_ALIGN(\
38 sizeof(struct k_cmsg_hdr))))
39 #define K_CMSG_SPACE(len) (K_CMSG_ALIGN(sizeof(struct k_cmsg_hdr))\
40 +K_CMSG_ALIGN(len))
41 #define K_CMSG_LEN(len) (K_CMSG_ALIGN(sizeof(struct k_cmsg_hdr))+(len))
43 #define __K_CMSG_FIRSTHDR(ctl,len) ((len)>=sizeof(struct k_cmsg_hdr) ? \
44 (struct k_cmsg_hdr *)(ctl) : \
45 (struct k_cmsg_hdr *)NULL)
46 #define K_CMSG_FIRSTHDR(msg) __K_CMSG_FIRSTHDR((msg)->msg_control,\
47 (msg)->msg_controllen)
48 #define K_CMSG_OK(mhdr, cmsg) ((cmsg)->cmsg_len>=sizeof(struct cmsg_hdr)&&\
49 (cmsg)->cmsg_len<=(k_ul)\
50 ((mhdr)->msg_controllen-\
51 ((k_u8*)(cmsg)-(k_u8*)(mhdr)->msg_control)))
53 static inline struct k_cmsg_hdr * __k_cmsg_nxthdr(void *ctl,k_sz size,
54 struct k_cmsg_hdr *cmsg)
56 struct k_cmsg_hdr *ptr;
58 ptr=(struct k_cmsg_hdr*)(((k_u8*)cmsg)+K_CMSG_ALIGN(cmsg->len));
59 if((k_ul)((k_u8*)(ptr+1)-(k_u8*)ctl)>size) return (struct k_cmsg_hdr *)0;
60 return ptr;
63 static inline struct k_cmsg_hdr *k_cmsg_nxthdr(struct k_msg_hdr *msg,
64 struct k_cmsg_hdr *cmsg)
66 return __k_cmsg_nxthdr(msg->control,msg->control_len,cmsg);
69 #define K_MSG_OOB 1
70 #define K_MSG_PEEK 2
71 #define K_MSG_DONTROUTE 4
72 #define K_MSG_TRYHARD 4//synonym for msg_dontroute for decnet
73 #define K_MSG_CTRUNC 8
74 #define K_MSG_PROBE 0x10//do not send. only probe path f.e. for mtu
75 #define K_MSG_TRUNC 0x20
76 #define K_MSG_DONTWAIT 0x40//nonblocking io
77 #define K_MSG_EOR 0x80//end of record
78 #define K_MSG_WAITALL 0x100//wait for a full request
79 #define K_MSG_FIN 0x200
80 #define K_MSG_SYN 0x400
81 #define K_MSG_CONFIRM 0x800//confirm path validity
82 #define K_MSG_RST 0x1000
83 #define K_MSG_ERRQUEUE 0x2000//fetch message from error queue
84 #define K_MSG_NOSIGNAL 0x4000//do not generate sigpipe
85 #define K_MSG_MORE 0x8000//sender will send more
86 #define K_MSG_WAITFORONE 0x10000//recvmmsg(): block until 1+ packets avail
87 #define K_MSG_EOF K_MSG_FIN
88 #define K_MSG_CMSG_CLOEXEC 0x40000000//set close_on_exit for file descriptor
89 //received through scm_rights
91 //"socket"-level control message types:
92 #define K_SCM_RIGHTS 0x01//rw: access rights (array of int)
93 #define K_SCM_CREDENTIALS 0x02//rw: struct ucred
94 #define K_SCM_SECURITY 0x03//rw: security label
95 struct ucred{
96 k_u32 pid;
97 k_u32 uid;
98 k_u32 gid;
100 #endif