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