summaryrefslogtreecommitdiffstats
path: root/include/linux/socket.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/socket.h')
-rw-r--r--include/linux/socket.h113
1 files changed, 70 insertions, 43 deletions
diff --git a/include/linux/socket.h b/include/linux/socket.h
index 21d7169bb..756d4cca6 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -4,6 +4,7 @@
#include <asm/socket.h> /* arch-dependent defines */
#include <linux/sockios.h> /* the SIOCxxx I/O controls */
#include <linux/uio.h> /* iovec support */
+#include <linux/types.h> /* pid_t */
typedef unsigned short sa_family_t;
@@ -33,10 +34,10 @@ struct msghdr
void * msg_name; /* Socket name */
int msg_namelen; /* Length of name */
struct iovec * msg_iov; /* Data blocks */
- size_t msg_iovlen; /* Number of blocks */
+ __kernel_size_t msg_iovlen; /* Number of blocks */
void * msg_control; /* Per protocol magic (eg BSD file descriptor passing) */
- size_t msg_controllen; /* Length of rights list */
- int msg_flags; /* 4.4 BSD item we dont use */
+ __kernel_size_t msg_controllen; /* Length of cmsg list */
+ unsigned msg_flags;
};
/*
@@ -46,7 +47,7 @@ struct msghdr
*/
struct cmsghdr {
- size_t cmsg_len; /* data byte count, including hdr */
+ __kernel_size_t cmsg_len; /* data byte count, including hdr */
int cmsg_level; /* originating protocol */
int cmsg_type; /* protocol-specific type */
unsigned char cmsg_data[0];
@@ -57,11 +58,38 @@ struct cmsghdr {
* Table 5-14 of POSIX 1003.1g
*/
-#define CMSG_DATA(cmsg) cmsg->cmsg_data
+#define CMSG_DATA(cmsg) (cmsg)->cmsg_data
#define CMSG_NXTHDR(mhdr, cmsg) cmsg_nxthdr(mhdr, cmsg)
-#define CMSG_FIRST(mhdr) ((struct cmsghdr *) (mhdr)->msg_control)
-extern __inline__ struct cmsghdr * cmsg_nxthdr(struct msghdr *mhdr,
+#define CMSG_ALIGN(len) ( ((len)+sizeof(long)-1) & ~(sizeof(long)-1) )
+
+/* Stevens's Adv. API specifies CMSG_SPACE & CMSG_LENGTH,
+ * I cannot understand, what the differenece? --ANK
+ */
+
+#define CMSG_SPACE(len) CMSG_ALIGN((len)+sizeof(struct cmsghdr))
+#define CMSG_LENGTH(len) CMSG_ALIGN((len)+sizeof(struct cmsghdr))
+
+#define CMSG_FIRSTHDR(msg) ((msg)->msg_controllen >= sizeof(struct cmsghdr) ? \
+ (struct cmsghdr *)(msg)->msg_control : \
+ (struct cmsghdr *)NULL)
+
+/*
+ * This mess will go away with glibc
+ */
+
+#ifdef __KERNEL__
+#define KINLINE extern __inline__
+#else
+#define KINLINE static
+#endif
+
+
+/*
+ * Get the next cmsg header
+ */
+
+KINLINE struct cmsghdr * cmsg_nxthdr(struct msghdr *mhdr,
struct cmsghdr *cmsg)
{
unsigned char * ptr;
@@ -70,16 +98,25 @@ extern __inline__ struct cmsghdr * cmsg_nxthdr(struct msghdr *mhdr,
{
return NULL;
}
- ptr = ((unsigned char *) cmsg) + cmsg->cmsg_len;
+ ptr = ((unsigned char *) cmsg) + CMSG_ALIGN(cmsg->cmsg_len);
if (ptr >= (unsigned char *) mhdr->msg_control + mhdr->msg_controllen)
return NULL;
return (struct cmsghdr *) ptr;
}
-/* Control Messages */
+/* "Socket"-level control message types: */
-#define SCM_RIGHTS 1
+#define SCM_RIGHTS 0x01 /* rw: access rights (array of int) */
+#define SCM_CREDENTIALS 0x02 /* rw: struct ucred */
+#define SCM_CONNECT 0x03 /* rw: struct scm_connect */
+
+struct ucred
+{
+ __kernel_pid_t pid;
+ __kernel_uid_t uid;
+ __kernel_gid_t gid;
+};
/* Supported address families. */
@@ -98,6 +135,7 @@ extern __inline__ struct cmsghdr * cmsg_nxthdr(struct msghdr *mhdr,
#define AF_ROSE 11 /* Amateur Radio X.25 PLP */
#define AF_DECNET 12 /* Reserved for DECnet project */
#define AF_NETBEUI 13 /* Reserved for 802.2LLC project*/
+#define AF_SECURITY 14 /* Security callback pseudo AF */
#define AF_MAX 32 /* For now.. */
/* Protocol families, same as address families. */
@@ -113,9 +151,10 @@ extern __inline__ struct cmsghdr * cmsg_nxthdr(struct msghdr *mhdr,
#define PF_AAL5 AF_AAL5
#define PF_X25 AF_X25
#define PF_INET6 AF_INET6
-#define PR_ROSE AF_ROSE
+#define PF_ROSE AF_ROSE
#define PF_DECNET AF_DECNET
#define PF_NETBEUI AF_NETBEUI
+#define PF_SECURITY AF_SECURITY
#define PF_MAX AF_MAX
@@ -126,17 +165,25 @@ extern __inline__ struct cmsghdr * cmsg_nxthdr(struct msghdr *mhdr,
Added those for 1003.1g not all are supported yet
*/
-enum
-{
- MSG_OOB = 0x01, /* Process out-of-band data. */
- MSG_PEEK = 0x02, /* Peek at incoming messages. */
- MSG_DONTROUTE = 0x04, /* Don't use local routing. */
- MSG_CTRUNC = 0x08, /* We need to support this for BSD oddments */
- MSG_PROXY = 0x10, /* Supply or ask second address. */
- MSG_EOR = 0x20, /* End of record */
- MSG_TRUNC = 0x40, /* Data was discarded before delivery */
- MSG_WAITALL = 0x80, /* Wait for a full request */
-};
+#define MSG_OOB 1
+#define MSG_PEEK 2
+#define MSG_DONTROUTE 4
+#define MSG_CTRUNC 8
+#define MSG_PROXY 0x10 /* Supply or ask second address. */
+#define MSG_TRUNC 0x20
+#define MSG_DONTWAIT 0x40 /* Nonblocking io */
+#define MSG_EOR 0x80 /* End of record */
+#define MSG_WAITALL 0x100 /* Wait for a full request */
+#define MSG_FIN 0x200
+#define MSG_SYN 0x400
+#define MSG_URG 0x800
+#define MSG_RST 0x1000
+
+#define MSG_CTLIGNORE 0x80000000
+
+#define MSG_EOF MSG_FIN
+#define MSG_CTLFLAGS (MSG_OOB|MSG_URG|MSG_FIN|MSG_SYN|MSG_RST)
+
/* Setsockoptions(2) level. Thanks to BSD these must match IPPROTO_xxx */
#define SOL_IP 0
@@ -153,27 +200,6 @@ enum
#define SOL_TCP 6
#define SOL_UDP 17
-/* IP options */
-#define IP_TOS 1
-#define IPTOS_LOWDELAY 0x10
-#define IPTOS_THROUGHPUT 0x08
-#define IPTOS_RELIABILITY 0x04
-#define IPTOS_MINCOST 0x02
-#define IP_TTL 2
-#define IP_HDRINCL 3
-#define IP_OPTIONS 4
-
-#define IP_MULTICAST_IF 32
-#define IP_MULTICAST_TTL 33
-#define IP_MULTICAST_LOOP 34
-#define IP_ADD_MEMBERSHIP 35
-#define IP_DROP_MEMBERSHIP 36
-
-/* These need to appear somewhere around here */
-#define IP_DEFAULT_MULTICAST_TTL 1
-#define IP_DEFAULT_MULTICAST_LOOP 1
-#define IP_MAX_MEMBERSHIPS 20
-
/* IPX options */
#define IPX_TYPE 1
@@ -199,5 +225,6 @@ extern int verify_iovec(struct msghdr *m, struct iovec *iov, char *address, int
extern int memcpy_toiovec(struct iovec *v, unsigned char *kdata, int len);
extern int move_addr_to_user(void *kaddr, int klen, void *uaddr, int *ulen);
extern int move_addr_to_kernel(void *uaddr, int ulen, void *kaddr);
+extern void put_cmsg(struct msghdr*, int level, int type, int len, void *data);
#endif
#endif /* _LINUX_SOCKET_H */