111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/****************************************************************************
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ****************************************************************************
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   This header was automatically generated from a Linux kernel header
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   of the same name, to make information necessary for userspace to
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   call into the kernel available to libc.  It contains only constants,
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   structures, and macros generated from the original header, and thus,
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   contains no copyrightable information.
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ****************************************************************************
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ****************************************************************************/
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _LINUX_SOCKET_H
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _LINUX_SOCKET_H
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _K_SS_MAXSIZE 128
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _K_SS_ALIGNSIZE (__alignof__ (struct sockaddr *))
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct __kernel_sockaddr_storage {
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned short ss_family;
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char __data[_K_SS_MAXSIZE - sizeof(unsigned short)];
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} __attribute__ ((aligned(_K_SS_ALIGNSIZE)));
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined(__GLIBC__) || __GLIBC__ < 2
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <asm/socket.h>
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/sockios.h>
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/uio.h>
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/types.h>
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/compiler.h>
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef unsigned short sa_family_t;
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct sockaddr {
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert sa_family_t sa_family;
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char sa_data[14];
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct linger {
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int l_onoff;
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int l_linger;
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define sockaddr_storage __kernel_sockaddr_storage
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct msghdr {
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void * msg_name;
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int msg_namelen;
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct iovec * msg_iov;
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __kernel_size_t msg_iovlen;
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void * msg_control;
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __kernel_size_t msg_controllen;
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned msg_flags;
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct cmsghdr {
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __kernel_size_t cmsg_len;
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int cmsg_level;
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int cmsg_type;
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __CMSG_NXTHDR(ctl, len, cmsg) __cmsg_nxthdr((ctl),(len),(cmsg))
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CMSG_NXTHDR(mhdr, cmsg) cmsg_nxthdr((mhdr), (cmsg))
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CMSG_ALIGN(len) ( ((len)+sizeof(long)-1) & ~(sizeof(long)-1) )
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CMSG_DATA(cmsg) ((void *)((char *)(cmsg) + CMSG_ALIGN(sizeof(struct cmsghdr))))
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CMSG_SPACE(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + CMSG_ALIGN(len))
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CMSG_LEN(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + (len))
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __CMSG_FIRSTHDR(ctl,len) ((len) >= sizeof(struct cmsghdr) ?   (struct cmsghdr *)(ctl) :   (struct cmsghdr *)NULL)
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CMSG_FIRSTHDR(msg) __CMSG_FIRSTHDR((msg)->msg_control, (msg)->msg_controllen)
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CMSG_OK(mhdr, cmsg) ((cmsg)->cmsg_len >= sizeof(struct cmsghdr) &&   (cmsg)->cmsg_len <= (unsigned long)   ((mhdr)->msg_controllen -   ((char *)(cmsg) - (char *)(mhdr)->msg_control)))
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef __GNUC__
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __KINLINE static __inline__
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif defined(__cplusplus)
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __KINLINE static inline
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __KINLINE static
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__KINLINE struct cmsghdr * __cmsg_nxthdr(void *__ctl, __kernel_size_t __size,
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct cmsghdr *__cmsg)
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct cmsghdr * __ptr;
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __ptr = (struct cmsghdr*)(((unsigned char *) __cmsg) + CMSG_ALIGN(__cmsg->cmsg_len));
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if ((unsigned long)((char*)(__ptr+1) - (char *) __ctl) > __size)
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return (struct cmsghdr *)0;
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return __ptr;
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__KINLINE struct cmsghdr * cmsg_nxthdr (struct msghdr *__msg, struct cmsghdr *__cmsg)
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return __cmsg_nxthdr(__msg->msg_control, __msg->msg_controllen, __cmsg);
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SCM_RIGHTS 0x01
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SCM_CREDENTIALS 0x02
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SCM_SECURITY 0x03
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct ucred {
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __u32 pid;
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __u32 uid;
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __u32 gid;
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_UNSPEC 0
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_UNIX 1
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_LOCAL 1
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_INET 2
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_AX25 3
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_IPX 4
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_APPLETALK 5
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_NETROM 6
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_BRIDGE 7
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_ATMPVC 8
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_X25 9
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_INET6 10
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_ROSE 11
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_DECnet 12
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_NETBEUI 13
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_SECURITY 14
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_KEY 15
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_NETLINK 16
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_ROUTE AF_NETLINK
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_PACKET 17
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_ASH 18
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_ECONET 19
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_ATMSVC 20
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_SNA 22
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_IRDA 23
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_PPPOX 24
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_WANPIPE 25
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_LLC 26
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_TIPC 30
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_BLUETOOTH 31
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_MAX 32
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_UNSPEC AF_UNSPEC
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_UNIX AF_UNIX
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_LOCAL AF_LOCAL
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_INET AF_INET
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_AX25 AF_AX25
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_IPX AF_IPX
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_APPLETALK AF_APPLETALK
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_NETROM AF_NETROM
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_BRIDGE AF_BRIDGE
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_ATMPVC AF_ATMPVC
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_X25 AF_X25
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_INET6 AF_INET6
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_ROSE AF_ROSE
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_DECnet AF_DECnet
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_NETBEUI AF_NETBEUI
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_SECURITY AF_SECURITY
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_KEY AF_KEY
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_NETLINK AF_NETLINK
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_ROUTE AF_ROUTE
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_PACKET AF_PACKET
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_ASH AF_ASH
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_ECONET AF_ECONET
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_ATMSVC AF_ATMSVC
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_SNA AF_SNA
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_IRDA AF_IRDA
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_PPPOX AF_PPPOX
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_WANPIPE AF_WANPIPE
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_LLC AF_LLC
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_TIPC AF_TIPC
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_BLUETOOTH AF_BLUETOOTH
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_MAX AF_MAX
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOMAXCONN 128
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_OOB 1
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_PEEK 2
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_DONTROUTE 4
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_TRYHARD 4
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_CTRUNC 8
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_PROBE 0x10
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_TRUNC 0x20
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_DONTWAIT 0x40
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_EOR 0x80
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_WAITALL 0x100
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_FIN 0x200
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_SYN 0x400
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_CONFIRM 0x800
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_RST 0x1000
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_ERRQUEUE 0x2000
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_NOSIGNAL 0x4000
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_MORE 0x8000
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_EOF MSG_FIN
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_CMSG_COMPAT 0
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_IP 0
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_TCP 6
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_UDP 17
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_IPV6 41
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_ICMPV6 58
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_SCTP 132
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_RAW 255
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_IPX 256
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_AX25 257
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_ATALK 258
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_NETROM 259
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_ROSE 260
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_DECNET 261
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_X25 262
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_PACKET 263
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_ATM 264
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_AAL 265
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_IRDA 266
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_NETBEUI 267
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_LLC 268
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_DCCP 269
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_NETLINK 270
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_TIPC 271
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define IPX_TYPE 1
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
228