0dbd6262a9
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1298 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
1059 lines
31 KiB
C
1059 lines
31 KiB
C
/*********************************************************************
|
|
Project : GUSI - Grand Unified Socket Interface
|
|
File : GUSI.h - Socket calls
|
|
Author : Matthias Neeracher
|
|
Language : MPW C/C++
|
|
*********************************************************************/
|
|
|
|
#ifndef _GUSI_
|
|
#define _GUSI_
|
|
|
|
#ifdef __MWERKS__
|
|
#ifndef macintosh
|
|
#define macintosh 1
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef macintosh
|
|
#include <errno.h>
|
|
#else
|
|
#ifndef KERNEL
|
|
extern int errno; /* global error number */
|
|
#endif
|
|
#endif
|
|
|
|
#define __P(protos) protos /* full-blown ANSI C */
|
|
|
|
#define EPERM 1 /* Operation not permitted */
|
|
/* MSL defines ENOMEM, EACCES, ENOENT, ENOSYS. We give in. */
|
|
#ifndef ENOENT
|
|
#define ENOENT 2 /* No such file or directory */
|
|
#endif
|
|
#define ESRCH 3 /* No such process */
|
|
#define EINTR 4 /* Interrupted system call */
|
|
#define EIO 5 /* Input/output error */
|
|
#define ENXIO 6 /* Device not configured */
|
|
#define E2BIG 7 /* Argument list too long */
|
|
#define ENOEXEC 8 /* Exec format error */
|
|
#define EBADF 9 /* Bad file descriptor */
|
|
#define ECHILD 10 /* No child processes */
|
|
#define EDEADLK 11 /* Resource deadlock avoided */
|
|
/* 11 was EAGAIN */
|
|
#ifndef ENOMEM
|
|
#define ENOMEM 12 /* Cannot allocate memory */
|
|
#define EACCES 13 /* Permission denied */
|
|
#endif
|
|
#define EFAULT 14 /* Bad address */
|
|
#ifndef _POSIX_SOURCE
|
|
#define ENOTBLK 15 /* Block device required */
|
|
#define EBUSY 16 /* Device busy */
|
|
#endif
|
|
#define EEXIST 17 /* File exists */
|
|
#define EXDEV 18 /* Cross-device link */
|
|
#define ENODEV 19 /* Operation not supported by device */
|
|
#define ENOTDIR 20 /* Not a directory */
|
|
#define EISDIR 21 /* Is a directory */
|
|
#define EINVAL 22 /* Invalid argument */
|
|
#define ENFILE 23 /* Too many open files in system */
|
|
#define EMFILE 24 /* Too many open files */
|
|
#define ENOTTY 25 /* Inappropriate ioctl for device */
|
|
#ifndef _POSIX_SOURCE
|
|
#define ETXTBSY 26 /* Text file busy */
|
|
#endif
|
|
#define EFBIG 27 /* File too large */
|
|
#define ENOSPC 28 /* No space left on device */
|
|
#define ESPIPE 29 /* Illegal seek */
|
|
#define EROFS 30 /* Read-only file system */
|
|
#define EMLINK 31 /* Too many links */
|
|
#define EPIPE 32 /* Broken pipe */
|
|
|
|
#ifndef __MWERKS__
|
|
/* math software */
|
|
#define EDOM 33 /* Numerical argument out of domain */
|
|
#define ERANGE 34 /* Result too large */
|
|
#endif
|
|
|
|
/* non-blocking and interrupt i/o */
|
|
#if defined(macintosh)
|
|
#ifndef EAGAIN
|
|
#define EAGAIN 11
|
|
#endif
|
|
#else
|
|
#define EAGAIN 35 /* Resource temporarily unavailable */
|
|
#endif
|
|
#define EWOULDBLOCK EAGAIN /* Operation would block */
|
|
#ifndef _POSIX_SOURCE
|
|
/* Did I tell that MSL also occupies errnos 33-40? We give in. */
|
|
#if ENOMEM==37
|
|
#define EINPROGRESS 136 /* Operation now in progress */
|
|
#define EALREADY 137 /* Operation already in progress */
|
|
|
|
/* ipc/network software -- argument errors */
|
|
#define ENOTSOCK 138 /* Socket operation on non-socket */
|
|
#define EDESTADDRREQ 139 /* Destination address required */
|
|
#define EMSGSIZE 140 /* Message too long */
|
|
#else
|
|
#define EINPROGRESS 36 /* Operation now in progress */
|
|
#define EALREADY 37 /* Operation already in progress */
|
|
|
|
/* ipc/network software -- argument errors */
|
|
#define ENOTSOCK 38 /* Socket operation on non-socket */
|
|
#define EDESTADDRREQ 39 /* Destination address required */
|
|
#define EMSGSIZE 40 /* Message too long */
|
|
#endif
|
|
#define EPROTOTYPE 41 /* Protocol wrong type for socket */
|
|
#define ENOPROTOOPT 42 /* Protocol not available */
|
|
#define EPROTONOSUPPORT 43 /* Protocol not supported */
|
|
#define ESOCKTNOSUPPORT 44 /* Socket type not supported */
|
|
#define EOPNOTSUPP 45 /* Operation not supported on socket */
|
|
#define EPFNOSUPPORT 46 /* Protocol family not supported */
|
|
#define EAFNOSUPPORT 47 /* Address family not supported by protocol family */
|
|
#define EADDRINUSE 48 /* Address already in use */
|
|
#define EADDRNOTAVAIL 49 /* Can't assign requested address */
|
|
|
|
/* ipc/network software -- operational errors */
|
|
#define ENETDOWN 50 /* Network is down */
|
|
#define ENETUNREACH 51 /* Network is unreachable */
|
|
#define ENETRESET 52 /* Network dropped connection on reset */
|
|
#define ECONNABORTED 53 /* Software caused connection abort */
|
|
#define ECONNRESET 54 /* Connection reset by peer */
|
|
#define ENOBUFS 55 /* No buffer space available */
|
|
#define EISCONN 56 /* Socket is already connected */
|
|
#define ENOTCONN 57 /* Socket is not connected */
|
|
#define ESHUTDOWN 58 /* Can't send after socket shutdown */
|
|
#define ETOOMANYREFS 59 /* Too many references: can't splice */
|
|
#define ETIMEDOUT 60 /* Connection timed out */
|
|
#define ECONNREFUSED 61 /* Connection refused */
|
|
|
|
#define ELOOP 62 /* Too many levels of symbolic links */
|
|
#endif /* _POSIX_SOURCE */
|
|
#define ENAMETOOLONG 63 /* File name too long */
|
|
|
|
/* should be rearranged */
|
|
#ifndef _POSIX_SOURCE
|
|
#define EHOSTDOWN 64 /* Host is down */
|
|
#define EHOSTUNREACH 65 /* No route to host */
|
|
#endif /* _POSIX_SOURCE */
|
|
#define ENOTEMPTY 66 /* Directory not empty */
|
|
|
|
/* quotas & mush */
|
|
#ifndef _POSIX_SOURCE
|
|
#define EPROCLIM 67 /* Too many processes */
|
|
#define EUSERS 68 /* Too many users */
|
|
#define EDQUOT 69 /* Disc quota exceeded */
|
|
|
|
/* Network File System */
|
|
#define ESTALE 70 /* Stale NFS file handle */
|
|
#define EREMOTE 71 /* Too many levels of remote in path */
|
|
#define EBADRPC 72 /* RPC struct is bad */
|
|
#define ERPCMISMATCH 73 /* RPC version wrong */
|
|
#define EPROGUNAVAIL 74 /* RPC prog. not avail */
|
|
#define EPROGMISMATCH 75 /* Program version wrong */
|
|
#define EPROCUNAVAIL 76 /* Bad procedure for program */
|
|
#endif /* _POSIX_SOURCE */
|
|
|
|
#define ENOLCK 77 /* No locks available */
|
|
|
|
#ifndef ENOSYS
|
|
#define ENOSYS 78 /* Function not implemented */
|
|
#endif
|
|
|
|
#define EFTYPE 79 /* Inappropriate file type or format */
|
|
|
|
#ifdef KERNEL
|
|
/* pseudo-errors returned inside kernel to modify return to process */
|
|
#define ERESTART -1 /* restart syscall */
|
|
#define EJUSTRETURN -2 /* don't modify regs, just return */
|
|
#endif
|
|
|
|
#define NBBY 8 /* number of bits in a byte */
|
|
|
|
/*
|
|
* Select uses bit masks of file descriptors in longs. These macros
|
|
* manipulate such bit fields (the filesystem macros use chars).
|
|
* FD_SETSIZE may be defined by the user, but the default here should
|
|
* be enough for most uses.
|
|
*/
|
|
#ifndef FD_SETSIZE
|
|
#ifdef macintosh
|
|
#define FD_SETSIZE 64
|
|
#else
|
|
#define FD_SETSIZE 256
|
|
#endif
|
|
#endif
|
|
|
|
typedef long fd_mask;
|
|
#define NFDBITS (sizeof(fd_mask) * NBBY) /* bits per mask */
|
|
|
|
#ifndef howmany
|
|
#define howmany(x, y) (((x)+((y)-1))/(y))
|
|
#endif
|
|
|
|
typedef struct fd_set {
|
|
fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)];
|
|
} fd_set;
|
|
|
|
#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
|
|
#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
|
|
#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
|
|
#define FD_ZERO(p) bzero((char *)(p), sizeof(*(p)))
|
|
|
|
// #include <sys/types.h>
|
|
typedef unsigned char u_char;
|
|
typedef unsigned short u_short;
|
|
typedef unsigned int u_int;
|
|
typedef unsigned long u_long;
|
|
typedef unsigned short ushort; /* Sys V compatibility */
|
|
|
|
typedef char * caddr_t; /* core address */
|
|
typedef long daddr_t; /* disk address */
|
|
typedef short dev_t; /* device number */
|
|
typedef u_long ino_t; /* inode number */
|
|
typedef long off_t; /* file offset (should be a quad) */
|
|
typedef u_short nlink_t; /* link count */
|
|
typedef long swblk_t; /* swap offset */
|
|
typedef long segsz_t; /* segment size */
|
|
typedef u_short uid_t; /* user id */
|
|
typedef u_short gid_t; /* group id */
|
|
typedef short pid_t; /* process id */
|
|
typedef u_short mode_t; /* permissions */
|
|
typedef u_long fixpt_t; /* fixed point number */
|
|
|
|
|
|
// Feel free to increase FD_SETSIZE as needed
|
|
#define GUSI_MAX_FD FD_SETSIZE
|
|
|
|
//#include <sys/cdefs.h>
|
|
|
|
#ifndef macintosh
|
|
#ifdef __MWERKS__
|
|
#define macintosh 1
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(__cplusplus)
|
|
#define __BEGIN_DECLS extern "C" {
|
|
#define __END_DECLS }
|
|
#else
|
|
#define __BEGIN_DECLS
|
|
#define __END_DECLS
|
|
#endif
|
|
|
|
//#include <compat.h>
|
|
//#include <sys/ioctl.h>
|
|
#define IOCPARM_MASK 0x1fff /* parameter length, at most 13 bits */
|
|
#define IOCPARM_LEN(x) (((x) >> 16) & IOCPARM_MASK)
|
|
#define IOCBASECMD(x) ((x) & ~IOCPARM_MASK)
|
|
#define IOCGROUP(x) (((x) >> 8) & 0xff)
|
|
|
|
#define IOCPARM_MAX NBPG /* max size of ioctl, mult. of NBPG */
|
|
#define IOC_VOID 0x20000000 /* no parameters */
|
|
#define IOC_OUT 0x40000000 /* copy out parameters */
|
|
#define IOC_IN 0x80000000 /* copy in parameters */
|
|
#define IOC_INOUT (IOC_IN|IOC_OUT)
|
|
#define IOC_DIRMASK 0xe0000000 /* mask for IN/OUT/VOID */
|
|
|
|
#define _IOC(inout,group,num,len) \
|
|
(inout | ((len & IOCPARM_MASK) << 16) | ((group) << 8) | (num))
|
|
#define _IO(g,n) _IOC(IOC_VOID, (g), (n), 0)
|
|
#define _IOR(g,n,t) _IOC(IOC_OUT, (g), (n), sizeof(t))
|
|
#define _IOW(g,n,t) _IOC(IOC_IN, (g), (n), sizeof(t))
|
|
/* this should be _IORW, but stdio got there first */
|
|
#define _IOWR(g,n,t) _IOC(IOC_INOUT, (g), (n), sizeof(t))
|
|
|
|
#define FIOCLEX _IO('f', 1) /* set close on exec on fd */
|
|
#define FIONCLEX _IO('f', 2) /* remove close on exec */
|
|
#define FIONREAD _IOR('f', 127, int) /* get # bytes to read */
|
|
#define FIONBIO _IOW('f', 126, int) /* set/clear non-blocking i/o */
|
|
#define FIOASYNC _IOW('f', 125, int) /* set/clear async i/o */
|
|
#define FIOSETOWN _IOW('f', 124, int) /* set owner */
|
|
#define FIOGETOWN _IOR('f', 123, int) /* get owner */
|
|
|
|
__BEGIN_DECLS
|
|
#ifdef macintosh
|
|
int ioctl(int fildes, unsigned int cmd, unsigned long *arg);
|
|
#else
|
|
int ioctl __P((int, unsigned long, ...));
|
|
#endif
|
|
__END_DECLS
|
|
|
|
//#include <sys/fcntl.h>
|
|
//#include <sys/stat.h>
|
|
//#include <dirent.h>
|
|
//#include <Types.h>
|
|
//#include <Events.h>
|
|
//#include <Files.h>
|
|
//#include <AppleTalk.h>
|
|
//#include <CTBUtilities.h>
|
|
//#include <Packages.h>
|
|
//#include <PPCToolBox.h>
|
|
//#include <StandardFile.h>
|
|
//#include <stdio.h>
|
|
//#include <sys/time.h>
|
|
|
|
|
|
/*
|
|
* Definitions for byte order, according to byte significance from low
|
|
* address to high.
|
|
*/
|
|
#define LITTLE_ENDIAN 1234 /* LSB first: i386, vax */
|
|
#define BIG_ENDIAN 4321 /* MSB first: 68000, ibm, net */
|
|
#define PDP_ENDIAN 3412 /* LSB first in word, MSW first in long */
|
|
|
|
#define BYTE_ORDER BIG_ENDIAN
|
|
|
|
__BEGIN_DECLS
|
|
unsigned long htonl (unsigned long);
|
|
unsigned short htons (unsigned short);
|
|
unsigned long ntohl (unsigned long);
|
|
unsigned short ntohs (unsigned short);
|
|
__END_DECLS
|
|
|
|
/*
|
|
* Macros for network/external number representation conversion.
|
|
*/
|
|
#if BYTE_ORDER == BIG_ENDIAN && !defined(lint)
|
|
#define ntohl(x) (x)
|
|
#define ntohs(x) (x)
|
|
#define htonl(x) (x)
|
|
#define htons(x) (x)
|
|
|
|
#define NTOHL(x) (x)
|
|
#define NTOHS(x) (x)
|
|
#define HTONL(x) (x)
|
|
#define HTONS(x) (x)
|
|
|
|
#else
|
|
|
|
#define NTOHL(x) (x) = ntohl((u_long)x)
|
|
#define NTOHS(x) (x) = ntohs((u_short)x)
|
|
#define HTONL(x) (x) = htonl((u_long)x)
|
|
#define HTONS(x) (x) = htons((u_short)x)
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
* Constants and structures defined by the internet system,
|
|
* Per RFC 790, September 1981.
|
|
*/
|
|
|
|
/*
|
|
* Protocols
|
|
*/
|
|
#define IPPROTO_IP 0 /* dummy for IP */
|
|
#define IPPROTO_ICMP 1 /* control message protocol */
|
|
#define IPPROTO_GGP 3 /* gateway^2 (deprecated) */
|
|
#define IPPROTO_TCP 6 /* tcp */
|
|
#define IPPROTO_EGP 8 /* exterior gateway protocol */
|
|
#define IPPROTO_PUP 12 /* pup */
|
|
#define IPPROTO_UDP 17 /* user datagram protocol */
|
|
#define IPPROTO_IDP 22 /* xns idp */
|
|
#define IPPROTO_TP 29 /* tp-4 w/ class negotiation */
|
|
#define IPPROTO_EON 80 /* ISO cnlp */
|
|
|
|
#define IPPROTO_RAW 255 /* raw IP packet */
|
|
#define IPPROTO_MAX 256
|
|
|
|
|
|
/*
|
|
* Local port number conventions:
|
|
* Ports < IPPORT_RESERVED are reserved for
|
|
* privileged processes (e.g. root).
|
|
* Ports > IPPORT_USERRESERVED are reserved
|
|
* for servers, not necessarily privileged.
|
|
*/
|
|
#define IPPORT_RESERVED 1024
|
|
#define IPPORT_USERRESERVED 5000
|
|
|
|
/*
|
|
* Internet address (a structure for historical reasons)
|
|
*/
|
|
struct in_addr {
|
|
u_long s_addr;
|
|
};
|
|
|
|
/*
|
|
* Definitions of bits in internet address integers.
|
|
* On subnets, the decomposition of addresses to host and net parts
|
|
* is done according to subnet mask, not the masks here.
|
|
*/
|
|
#define IN_CLASSA(i) (((long)(i) & 0x80000000) == 0)
|
|
#define IN_CLASSA_NET 0xff000000
|
|
#define IN_CLASSA_NSHIFT 24
|
|
#define IN_CLASSA_HOST 0x00ffffff
|
|
#define IN_CLASSA_MAX 128
|
|
|
|
#define IN_CLASSB(i) (((long)(i) & 0xc0000000) == 0x80000000)
|
|
#define IN_CLASSB_NET 0xffff0000
|
|
#define IN_CLASSB_NSHIFT 16
|
|
#define IN_CLASSB_HOST 0x0000ffff
|
|
#define IN_CLASSB_MAX 65536
|
|
|
|
#define IN_CLASSC(i) (((long)(i) & 0xe0000000) == 0xc0000000)
|
|
#define IN_CLASSC_NET 0xffffff00
|
|
#define IN_CLASSC_NSHIFT 8
|
|
#define IN_CLASSC_HOST 0x000000ff
|
|
|
|
#define IN_CLASSD(i) (((long)(i) & 0xf0000000) == 0xe0000000)
|
|
#define IN_MULTICAST(i) IN_CLASSD(i)
|
|
|
|
#define IN_EXPERIMENTAL(i) (((long)(i) & 0xe0000000) == 0xe0000000)
|
|
#define IN_BADCLASS(i) (((long)(i) & 0xf0000000) == 0xf0000000)
|
|
|
|
#define INADDR_ANY (u_long)0x00000000
|
|
#define INADDR_BROADCAST (u_long)0xffffffff /* must be masked */
|
|
#ifndef KERNEL
|
|
#define INADDR_NONE 0xffffffff /* -1 return */
|
|
#endif
|
|
|
|
#define IN_LOOPBACKNET 127 /* official! */
|
|
|
|
/*
|
|
* Socket address, internet style.
|
|
*/
|
|
struct sockaddr_in {
|
|
u_char sin_len;
|
|
u_char sin_family;
|
|
u_short sin_port;
|
|
struct in_addr sin_addr;
|
|
char sin_zero[8];
|
|
};
|
|
|
|
/*
|
|
* Structure used to describe IP options.
|
|
* Used to store options internally, to pass them to a process,
|
|
* or to restore options retrieved earlier.
|
|
* The ip_dst is used for the first-hop gateway when using a source route
|
|
* (this gets put into the header proper).
|
|
*/
|
|
#ifdef __MWERKS__
|
|
#pragma cplusplus off
|
|
#endif
|
|
struct ip_opts {
|
|
struct in_addr ip_dst; /* first hop, 0 w/o src rt */
|
|
char ip_opts[40]; /* actually variable in size */
|
|
};
|
|
#ifdef __MWERKS__
|
|
#pragma cplusplus reset
|
|
#endif
|
|
|
|
/*
|
|
* Options for use with [gs]etsockopt at the IP level.
|
|
* First word of comment is data type; bool is stored in int.
|
|
*/
|
|
#define IP_OPTIONS 1 /* buf/ip_opts; set/get IP per-packet options */
|
|
#define IP_HDRINCL 2 /* int; header is included with data (raw) */
|
|
#define IP_TOS 3 /* int; IP type of service and precedence */
|
|
#define IP_TTL 4 /* int; IP time to live */
|
|
#define IP_RECVOPTS 5 /* bool; receive all IP options w/datagram */
|
|
#define IP_RECVRETOPTS 6 /* bool; receive IP options for response */
|
|
#define IP_RECVDSTADDR 7 /* bool; receive IP dst addr w/datagram */
|
|
#define IP_RETOPTS 8 /* ip_opts; set/get IP per-packet options */
|
|
|
|
/*
|
|
* Structure returned by gettimeofday(2) system call,
|
|
* and used in other calls.
|
|
*/
|
|
struct timeval {
|
|
long tv_sec; /* seconds */
|
|
long tv_usec; /* and microseconds */
|
|
};
|
|
|
|
struct timezone {
|
|
int tz_minuteswest; /* minutes west of Greenwich */
|
|
int tz_dsttime; /* type of dst correction */
|
|
};
|
|
#define DST_NONE 0 /* not on dst */
|
|
#define DST_USA 1 /* USA style dst */
|
|
#define DST_AUST 2 /* Australian style dst */
|
|
#define DST_WET 3 /* Western European dst */
|
|
#define DST_MET 4 /* Middle European dst */
|
|
#define DST_EET 5 /* Eastern European dst */
|
|
#define DST_CAN 6 /* Canada */
|
|
//#include <sys/socket.h>
|
|
|
|
/*
|
|
* Definitions related to sockets: types, address families, options.
|
|
*/
|
|
|
|
/*
|
|
* Types
|
|
*/
|
|
#define SOCK_STREAM 1 /* stream socket */
|
|
#define SOCK_DGRAM 2 /* datagram socket */
|
|
#define SOCK_RAW 3 /* raw-protocol interface */
|
|
#define SOCK_RDM 4 /* reliably-delivered message */
|
|
#define SOCK_SEQPACKET 5 /* sequenced packet stream */
|
|
|
|
/*
|
|
* Option flags per-socket.
|
|
*/
|
|
#define SO_DEBUG 0x0001 /* turn on debugging info recording */
|
|
#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */
|
|
#define SO_REUSEADDR 0x0004 /* allow local address reuse */
|
|
#define SO_KEEPALIVE 0x0008 /* keep connections alive */
|
|
#define SO_DONTROUTE 0x0010 /* just use interface addresses */
|
|
#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */
|
|
#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */
|
|
#define SO_LINGER 0x0080 /* linger on close if data present */
|
|
#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */
|
|
|
|
/*
|
|
* Additional options, not kept in so_options.
|
|
*/
|
|
#define SO_SNDBUF 0x1001 /* send buffer size */
|
|
#define SO_RCVBUF 0x1002 /* receive buffer size */
|
|
#define SO_SNDLOWAT 0x1003 /* send low-water mark */
|
|
#define SO_RCVLOWAT 0x1004 /* receive low-water mark */
|
|
#define SO_SNDTIMEO 0x1005 /* send timeout */
|
|
#define SO_RCVTIMEO 0x1006 /* receive timeout */
|
|
#define SO_ERROR 0x1007 /* get error status and clear */
|
|
#define SO_TYPE 0x1008 /* get socket type */
|
|
|
|
/*
|
|
* Structure used for manipulating linger option.
|
|
*/
|
|
struct linger {
|
|
int l_onoff; /* option on/off */
|
|
int l_linger; /* linger time */
|
|
};
|
|
|
|
/*
|
|
* Level number for (get/set)sockopt() to apply to socket itself.
|
|
*/
|
|
#define SOL_SOCKET 0xffff /* options for socket level */
|
|
|
|
/*
|
|
* Address families.
|
|
*/
|
|
#ifdef macintosh
|
|
#define AF_UNSPEC 0 /* unspecified */
|
|
#define AF_UNIX 1 /* local to host (pipes, portals) */
|
|
#define AF_INET 2 /* internetwork: UDP, TCP, etc. */
|
|
#define AF_CTB 3 /* Apple Comm Toolbox (not yet supported) */
|
|
#define AF_FILE 4 /* Normal File I/O (used internally) */
|
|
#define AF_PPC 5 /* PPC Toolbox */
|
|
#define AF_PAP 6 /* Printer Access Protocol (client only) */
|
|
#define AF_APPLETALK 16 /* Apple Talk */
|
|
|
|
#define AF_MAX 20
|
|
#else
|
|
#define ATALK_SYMADDR 272 /* Symbolic Address for AppleTalk */
|
|
#define AF_UNSPEC 0 /* unspecified */
|
|
#define AF_UNIX 1 /* local to host (pipes, portals) */
|
|
#define AF_INET 2 /* internetwork: UDP, TCP, etc. */
|
|
#define AF_IMPLINK 3 /* arpanet imp addresses */
|
|
#define AF_PUP 4 /* pup protocols: e.g. BSP */
|
|
#define AF_CHAOS 5 /* mit CHAOS protocols */
|
|
#define AF_NS 6 /* XEROX NS protocols */
|
|
#define AF_ISO 7 /* ISO protocols */
|
|
#define AF_OSI AF_ISO
|
|
#define AF_ECMA 8 /* european computer manufacturers */
|
|
#define AF_DATAKIT 9 /* datakit protocols */
|
|
#define AF_CCITT 10 /* CCITT protocols, X.25 etc */
|
|
#define AF_SNA 11 /* IBM SNA */
|
|
#define AF_DECnet 12 /* DECnet */
|
|
#define AF_DLI 13 /* DEC Direct data link interface */
|
|
#define AF_LAT 14 /* LAT */
|
|
#define AF_HYLINK 15 /* NSC Hyperchannel */
|
|
#define AF_APPLETALK16 /* Apple Talk */
|
|
#define AF_ROUTE 17 /* Internal Routing Protocol */
|
|
#define AF_LINK 18 /* Link layer interface */
|
|
#define pseudo_AF_XTP 19 /* eXpress Transfer Protocol (no AF) */
|
|
|
|
#define AF_MAX 20
|
|
#endif
|
|
|
|
/*
|
|
* Structure used by kernel to store most
|
|
* addresses.
|
|
*/
|
|
#if defined(powerc) || defined (__powerc)
|
|
#pragma options align=mac68k
|
|
#endif
|
|
struct sockaddr {
|
|
u_char sa_len; /* total length */
|
|
u_char sa_family; /* address family */
|
|
char sa_data[14]; /* actually longer; address value */
|
|
};
|
|
#if defined(powerc) || defined (__powerc)
|
|
#pragma options align=reset
|
|
#endif
|
|
|
|
/*
|
|
* Structure used by kernel to pass protocol
|
|
* information in raw sockets.
|
|
*/
|
|
struct sockproto {
|
|
u_short sp_family; /* address family */
|
|
u_short sp_protocol; /* protocol */
|
|
};
|
|
|
|
/*
|
|
* Protocol families, same as address families for now.
|
|
*/
|
|
#ifdef macintosh
|
|
#define PF_UNSPEC AF_UNSPEC /* unspecified */
|
|
#define PF_UNIX AF_UNIX /* local to host (pipes, portals) */
|
|
#define PF_INET AF_INET /* internetwork: UDP, TCP, etc. */
|
|
#define PF_CTB AF_CTB /* Apple Comm Toolbox (not yet supported) */
|
|
#define PF_FILE AF_FILE /* Normal File I/O (used internally) */
|
|
#define PF_PPC AF_PPC /* PPC Toolbox */
|
|
#define PF_PAP AF_PAP /* Printer Access Protocol (client only) */
|
|
#define PF_APPLETALK AF_APPLETALK /* Apple Talk */
|
|
#else
|
|
#define PF_UNSPEC AF_UNSPEC
|
|
#define PF_UNIX AF_UNIX
|
|
#define PF_INET AF_INET
|
|
#define PF_IMPLINK AF_IMPLINK
|
|
#define PF_PUP AF_PUP
|
|
#define PF_CHAOS AF_CHAOS
|
|
#define PF_NS AF_NS
|
|
#define PF_ISO AF_ISO
|
|
#define PF_OSI AF_ISO
|
|
#define PF_ECMA AF_ECMA
|
|
#define PF_DATAKIT AF_DATAKIT
|
|
#define PF_CCITT AF_CCITT
|
|
#define PF_SNA AF_SNA
|
|
#define PF_DECnet AF_DECnet
|
|
#define PF_DLI AF_DLI
|
|
#define PF_LAT AF_LAT
|
|
#define PF_HYLINK AF_HYLINK
|
|
#define PF_APPLETALK AF_APPLETALK
|
|
#define PF_ROUTE AF_ROUTE
|
|
#define PF_LINK AF_LINK
|
|
#define PF_XTP pseudo_AF_XTP /* really just proto family, no AF */
|
|
#endif
|
|
|
|
#define PF_MAX AF_MAX
|
|
|
|
/*
|
|
* Maximum queue length specifiable by listen.
|
|
*/
|
|
#define SOMAXCONN 5
|
|
|
|
/*
|
|
* Message header for recvmsg and sendmsg calls.
|
|
* Used value-result for recvmsg, value only for sendmsg.
|
|
*/
|
|
struct msghdr {
|
|
caddr_t msg_name; /* optional address */
|
|
u_int msg_namelen; /* size of address */
|
|
struct iovec *msg_iov; /* scatter/gather array */
|
|
u_int msg_iovlen; /* # elements in msg_iov */
|
|
caddr_t msg_control; /* ancillary data, see below */
|
|
u_int msg_controllen; /* ancillary data buffer len */
|
|
int msg_flags; /* flags on received message */
|
|
};
|
|
|
|
#define MSG_OOB 0x1 /* process out-of-band data */
|
|
#define MSG_PEEK 0x2 /* peek at incoming message */
|
|
#define MSG_DONTROUTE 0x4 /* send without using routing tables */
|
|
#define MSG_EOR 0x8 /* data completes record */
|
|
#define MSG_TRUNC 0x10 /* data discarded before delivery */
|
|
#define MSG_CTRUNC 0x20 /* control data lost before delivery */
|
|
#define MSG_WAITALL 0x40 /* wait for full request or error */
|
|
|
|
/*
|
|
* Header for ancillary data objects in msg_control buffer.
|
|
* Used for additional information with/about a datagram
|
|
* not expressible by flags. The format is a sequence
|
|
* of message elements headed by cmsghdr structures.
|
|
*/
|
|
struct cmsghdr {
|
|
u_int cmsg_len; /* data byte count, including hdr */
|
|
int cmsg_level; /* originating protocol */
|
|
int cmsg_type; /* protocol-specific type */
|
|
/* followed by u_char cmsg_data[]; */
|
|
};
|
|
|
|
/* given pointer to struct adatahdr, return pointer to data */
|
|
#define CMSG_DATA(cmsg) ((u_char *)((cmsg) + 1))
|
|
|
|
/* given pointer to struct adatahdr, return pointer to next adatahdr */
|
|
#define CMSG_NXTHDR(mhdr, cmsg) \
|
|
(((caddr_t)(cmsg) + (cmsg)->cmsg_len + sizeof(struct cmsghdr) > \
|
|
(mhdr)->msg_control + (mhdr)->msg_controllen) ? \
|
|
(struct cmsghdr *)NULL : \
|
|
(struct cmsghdr *)((caddr_t)(cmsg) + ALIGN((cmsg)->cmsg_len)))
|
|
|
|
#define CMSG_FIRSTHDR(mhdr) ((struct cmsghdr *)(mhdr)->msg_control)
|
|
|
|
/* "Socket"-level control message types: */
|
|
#define SCM_RIGHTS 0x01 /* access rights (array of int) */
|
|
|
|
/*
|
|
* 4.3 compat sockaddr, move to compat file later
|
|
*/
|
|
struct osockaddr {
|
|
u_short sa_family; /* address family */
|
|
char sa_data[14]; /* up to 14 bytes of direct address */
|
|
};
|
|
|
|
/*
|
|
* 4.3-compat message header (move to compat file later).
|
|
*/
|
|
struct omsghdr {
|
|
caddr_t msg_name; /* optional address */
|
|
int msg_namelen; /* size of address */
|
|
struct iovec *msg_iov; /* scatter/gather array */
|
|
int msg_iovlen; /* # elements in msg_iov */
|
|
caddr_t msg_accrights; /* access rights sent/received */
|
|
int msg_accrightslen;
|
|
};
|
|
|
|
//#include <string.h>
|
|
//#include <netinet/in.h>
|
|
//#include <netdb.h>
|
|
//#include <sys/un.h>
|
|
//#include <unistd.h>
|
|
//#include <machine/endian.h>
|
|
//
|
|
|
|
typedef enum spin_msg {
|
|
SP_MISC, /* some weird thing, usually just return immediately if you get this */
|
|
SP_SELECT, /* in a select call */
|
|
SP_NAME, /* getting a host by name */
|
|
SP_ADDR, /* getting a host by address */
|
|
SP_STREAM_READ, /* Stream read call */
|
|
SP_STREAM_WRITE, /* Stream write call */
|
|
SP_DGRAM_READ, /* Datagram read call */
|
|
SP_DGRAM_WRITE, /* Datagram write call */
|
|
SP_SLEEP, /* sleeping, passes ticks left to sleep */
|
|
SP_AUTO_SPIN /* Autospin, passes argument to SpinCursor */
|
|
} spin_msg;
|
|
|
|
typedef int (*GUSISpinFn)(spin_msg msg, long param);
|
|
typedef void (*GUSIEvtHandler)(EventRecord * ev);
|
|
typedef GUSIEvtHandler GUSIEvtTable[24];
|
|
|
|
/*
|
|
* Address families, defined in sys/socket.h
|
|
*
|
|
|
|
#define AF_UNSPEC 0 // unspecified
|
|
#define AF_UNIX 1 // local to host (pipes, portals)
|
|
#define AF_INET 2 // internetwork: UDP, TCP, etc.
|
|
#define AF_CTB 3 // Apple Comm Toolbox (not yet supported)
|
|
#define AF_FILE 4 // Normal File I/O (used internally)
|
|
#define AF_PPC 5 // PPC Toolbox
|
|
#define AF_PAP 6 // Printer Access Protocol (client only)
|
|
#define AF_APPLETALK 16 // Apple Talk
|
|
|
|
*/
|
|
|
|
#define ATALK_SYMADDR 272 /* Symbolic Address for AppleTalk */
|
|
|
|
/*
|
|
* Some Implementations of GUSI require you to call GUSISetup for the
|
|
* socket families you'd like to have defined. It's a good idea to call
|
|
* this for *all* implementations.
|
|
*
|
|
* GUSIDefaultSetup() will include all socket families.
|
|
*
|
|
* Never call any of the GUSIwithXXX routines directly.
|
|
*/
|
|
|
|
__BEGIN_DECLS
|
|
void GUSIwithAppleTalkSockets();
|
|
void GUSIwithInternetSockets();
|
|
void GUSIwithPAPSockets();
|
|
void GUSIwithPPCSockets();
|
|
void GUSIwithUnixSockets();
|
|
void GUSIwithSIOUXSockets();
|
|
void GUSIwithMPWSockets();
|
|
|
|
void GUSISetup(void (*socketfamily)());
|
|
void GUSIDefaultSetup();
|
|
__END_DECLS
|
|
/*
|
|
* Types, defined in sys/socket.h
|
|
*
|
|
|
|
#define SOCK_STREAM 1 // stream socket
|
|
#define SOCK_DGRAM 2 // datagram socket
|
|
|
|
*/
|
|
|
|
/*
|
|
* Defined in sys/un.h
|
|
*
|
|
|
|
struct sockaddr_un {
|
|
short sun_family;
|
|
char sun_path[108];
|
|
};
|
|
|
|
*/
|
|
|
|
#ifndef PRAGMA_ALIGN_SUPPORTED
|
|
#error Apple had some fun with the conditional macros again
|
|
#endif
|
|
|
|
#if PRAGMA_ALIGN_SUPPORTED
|
|
#pragma options align=mac68k
|
|
#endif
|
|
|
|
/*
|
|
struct sockaddr_atlk {
|
|
short family;
|
|
AddrBlock addr;
|
|
};
|
|
|
|
struct sockaddr_atlk_sym {
|
|
short family;
|
|
EntityName name;
|
|
};
|
|
|
|
struct sockaddr_ppc {
|
|
short family;
|
|
LocationNameRec location;
|
|
PPCPortRec port;
|
|
};
|
|
|
|
// Definitions for choose()
|
|
|
|
#define CHOOSE_DEFAULT 1
|
|
#define CHOOSE_NEW 2
|
|
#define CHOOSE_DIR 4
|
|
|
|
typedef struct {
|
|
short numTypes;
|
|
SFTypeList types;
|
|
} sa_constr_file;
|
|
|
|
typedef struct {
|
|
short numTypes;
|
|
NLType types;
|
|
} sa_constr_atlk;
|
|
|
|
|
|
// Definitions for sa_constr_ppc
|
|
|
|
#define PPC_CON_NEWSTYLE 0x8000
|
|
#define PPC_CON_MATCH_NAME 0x0001
|
|
#define PPC_CON_MATCH_TYPE 0x0002
|
|
#define PPC_CON_MATCH_NBP 0x0004
|
|
|
|
typedef struct {
|
|
short flags;
|
|
Str32 nbpType;
|
|
PPCPortRec match;
|
|
} sa_constr_ppc;
|
|
|
|
*/
|
|
|
|
#if PRAGMA_ALIGN_SUPPORTED
|
|
#pragma options align=reset
|
|
#endif
|
|
|
|
__BEGIN_DECLS
|
|
/*
|
|
* IO/Socket stuff, defined elsewhere (unistd.h, sys/socket.h
|
|
*
|
|
*/
|
|
int socket(int domain, int type, short protocol);
|
|
int bind(int s, void *name, int namelen);
|
|
int connect(int s, void *addr, int addrlen);
|
|
int listen(int s, int qlen);
|
|
int accept(int s, void *addr, int *addrlen);
|
|
int close(int s);
|
|
int read(int s, char *buffer, unsigned buflen);
|
|
int readv(int s, struct iovec *iov, int count);
|
|
int recv(int s, void *buffer, int buflen, int flags);
|
|
int recvfrom(int s, void *buffer, int buflen, int flags, void *from, int *fromlen);
|
|
int recvmsg(int s,struct msghdr *msg,int flags);
|
|
int write(int s, const char *buffer, unsigned buflen);
|
|
int writev(int s, struct iovec *iov, int count);
|
|
int send(int s, void *buffer, int buflen, int flags);
|
|
int sendto (int s, void *buffer, int buflen, int flags, void *to, int tolen);
|
|
int sendmsg(int s,struct msghdr *msg,int flags);
|
|
int select(int width, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
|
|
int getdtablesize(void);
|
|
int getsockname(int s, void *name, int *namelen);
|
|
int getpeername(int s, struct sockaddr *name, int *namelen);
|
|
int shutdown(int s, int how);
|
|
int fcntl(int s, unsigned int cmd, int arg);
|
|
int dup(int s);
|
|
int dup2(int s, int s1);
|
|
//int ioctl(int d, unsigned int request, long *argp);
|
|
int getsockopt(int s, int level, int optname, char *optval, int * optlen);
|
|
int setsockopt(int s, int level, int optname, char *optval, int optlen);
|
|
int isatty(int);
|
|
int remove(const char *filename);
|
|
int rename(const char *oldname, const char *newname);
|
|
int creat(const char*);
|
|
int faccess(char*, unsigned int, long*);
|
|
long lseek(int, long, int);
|
|
int open(const char*, int);
|
|
int unlink(char*);
|
|
int symlink(char* linkto, char* linkname);
|
|
int readlink(char* path, char* buf, int bufsiz);
|
|
int truncate(char *path, long length);
|
|
int ftruncate(int fd, long length);
|
|
int chdir(char * path);
|
|
int mkdir(char * path);
|
|
int rmdir(char * path);
|
|
char * getcwd(char * buf, int size);
|
|
|
|
|
|
/*
|
|
* Defined in stdio.h
|
|
*/
|
|
|
|
#ifdef __MWERKS__
|
|
void fsetfileinfo (char *filename, unsigned long newcreator, unsigned long newtype);
|
|
#endif
|
|
|
|
void fgetfileinfo (char *filename, unsigned long * creator, unsigned long * type);
|
|
|
|
#ifdef __MWERKS__
|
|
FILE *fdopen(int fd, const char *mode);
|
|
int fwalk(int (*func)(FILE * stream));
|
|
#endif
|
|
|
|
int choose(
|
|
int domain,
|
|
int type,
|
|
char * prompt,
|
|
void * constraint,
|
|
int flags,
|
|
void * name,
|
|
int * namelen);
|
|
|
|
/*
|
|
* Hostname routines, defined in netdb.h
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* Structures returned by network data base library. All addresses are
|
|
* supplied in host order, and returned in network order (suitable for
|
|
* use in system calls).
|
|
*/
|
|
struct hostent {
|
|
char *h_name; /* official name of host */
|
|
char **h_aliases; /* alias list */
|
|
int h_addrtype; /* host address type */
|
|
int h_length; /* length of address */
|
|
char **h_addr_list; /* list of addresses from name server */
|
|
#define h_addr h_addr_list[0] /* address, for backward compatiblity */
|
|
};
|
|
|
|
/*
|
|
* Assumption here is that a network number
|
|
* fits in 32 bits -- probably a poor one.
|
|
*/
|
|
struct netent {
|
|
char *n_name; /* official name of net */
|
|
char **n_aliases; /* alias list */
|
|
int n_addrtype; /* net address type */
|
|
unsigned long n_net; /* network # */
|
|
};
|
|
|
|
struct servent {
|
|
char *s_name; /* official service name */
|
|
char **s_aliases; /* alias list */
|
|
int s_port; /* port # */
|
|
char *s_proto; /* protocol to use */
|
|
};
|
|
|
|
struct protoent {
|
|
char *p_name; /* official protocol name */
|
|
char **p_aliases; /* alias list */
|
|
int p_proto; /* protocol # */
|
|
};
|
|
|
|
/*
|
|
* Error return codes from gethostbyname() and gethostbyaddr()
|
|
* (left in extern int h_errno).
|
|
*/
|
|
|
|
#define HOST_NOT_FOUND 1 /* Authoritative Answer Host not found */
|
|
#define TRY_AGAIN 2 /* Non-Authoritive Host not found, or SERVERFAIL */
|
|
#define NO_RECOVERY 3 /* Non recoverable errors, FORMERR, REFUSED, NOTIMP */
|
|
#define NO_DATA 4 /* Valid name, no data record of requested type */
|
|
#define NO_ADDRESS NO_DATA /* no address, look for MX record */
|
|
|
|
int gethostname(char *machname, long buflen);
|
|
|
|
void endhostent __P((void));
|
|
void endnetent __P((void));
|
|
void endprotoent __P((void));
|
|
void endservent __P((void));
|
|
struct hostent *gethostbyaddr __P((const char *, int, int));
|
|
struct hostent *gethostbyname __P((const char *));
|
|
struct hostent *gethostent __P((void));
|
|
struct netent *getnetbyaddr __P((long, int)); /* u_long? */
|
|
struct netent *getnetbyname __P((const char *));
|
|
struct netent *getnetent __P((void));
|
|
struct protoent *getprotobyname __P((const char *));
|
|
struct protoent *getprotobynumber __P((int));
|
|
struct protoent *getprotoent __P((void));
|
|
struct servent *getservbyname __P((const char *, const char *));
|
|
struct servent *getservbyport __P((int, const char *));
|
|
struct servent *getservent __P((void));
|
|
void herror __P((const char *));
|
|
void sethostent __P((int));
|
|
/* void sethostfile __P((const char *)); */
|
|
void setnetent __P((int));
|
|
void setprotoent __P((int));
|
|
void setservent __P((int));
|
|
|
|
|
|
char * inet_ntoa(struct in_addr inaddr);
|
|
struct in_addr inet_addr(const char *address);
|
|
|
|
/*
|
|
* GUSI supports a number of hooks. Every one of them has a different prototype, but needs
|
|
* to be passed as a GUSIHook
|
|
*/
|
|
|
|
typedef enum {
|
|
GUSI_SpinHook, /* A GUSISpinFn, to be called when a call blocks */
|
|
GUSI_ExecHook, /* Boolean (*hook)(const GUSIFileRef & ref), decides if file is executable */
|
|
GUSI_FTypeHook,/* Boolean (*hook)(const FSSpec & spec) sets a default file type */
|
|
GUSI_SpeedHook /* A long integer, to be added to the cursor spin variable */
|
|
} GUSIHookCode;
|
|
|
|
typedef void (*GUSIHook)(void);
|
|
void GUSISetHook(GUSIHookCode code, GUSIHook hook);
|
|
GUSIHook GUSIGetHook(GUSIHookCode code);
|
|
|
|
/*
|
|
* What to do when a routine blocks
|
|
*/
|
|
|
|
/* Defined for compatibility */
|
|
#define GUSISetSpin(routine) GUSISetHook(GUSI_SpinHook, (GUSIHook)routine)
|
|
#define GUSIGetSpin() (GUSISpinFn) GUSIGetHook(GUSI_SpinHook)
|
|
|
|
int GUSISetEvents(GUSIEvtTable table);
|
|
GUSIEvtHandler * GUSIGetEvents(void);
|
|
|
|
extern GUSIEvtHandler GUSISIOWEvents[];
|
|
|
|
#define SIGPIPE 13
|
|
#define SIGALRM 14
|
|
|
|
/*
|
|
* BSD memory routines, defined in compat.h
|
|
*
|
|
*/
|
|
#define index(a, b) strchr(a, b)
|
|
#define rindex(a, b) strrchr(a, b)
|
|
#define bzero(from, len) memset(from, 0, len)
|
|
#define bcopy(from, to, len) memcpy(to, from, len)
|
|
#define bcmp(s1, s2, len) memcmp(s1, s2, len)
|
|
#define bfill(from, len, x) memset(from, x, len)
|
|
|
|
|
|
__END_DECLS
|
|
|
|
typedef struct wxSockInternal
|
|
{
|
|
long nothing ;
|
|
} ;
|
|
|
|
#endif /* !_GUSI_ */ |