/****************************************************************************** * * Copyright (c) 1996-2004 PalmSource, Inc. All rights reserved. * * File: sys_socket.h * * Release: * * Description: * This module contains the interface definitions that are * typically found in the unix header for use by * Pilot applications that wish to use the sockets API calls. * *****************************************************************************/ #ifndef __UNIX_SYS_SOCKET_H__ #define __UNIX_SYS_SOCKET_H__ // Include System headers #include // Include the Pilot Net Manager defines #include // Include other Unix headers #include #include #include #include #include #include #include #include #include #include #include #include #include // This is a set of unix calls that get stubbed out or replaced by // PilotOS calls. // // Although these don't really "belong" here, it seems like the best solution // rather than having a ton of other unix like header files that don't // provide all the functionality that unix does. #define sleep(x) SysTaskDelay(x*sysTicksPerSecond) #define isatty(x) 1 #define fork() -1 // can't support fork #define abort(x) // The following macros are only included if we're building without the // help of the standard ANSI C library, i.e. Native Pilot code only. // Essentially, if you include above this header, this stuff // does not get used. #ifndef _STDLIB #define getenv(x) 0 #endif /*=================================================================== * Definitions related to sockets: types, address families, options. ===================================================================*/ /* * Types */ #define SOCK_STREAM netSocketTypeStream /* stream socket */ #define SOCK_DGRAM netSocketTypeDatagram /* datagram socket */ #define SOCK_RAW netSocketTypeRaw /* raw-protocol interface */ #define SOCK_RDM netSocketTypeReliableMsg /* reliable message */ /* * Option flags per-socket. */ #define SO_DEBUG netSocketOptSockDebug /* turn on debugging info recording */ #define SO_ACCEPTCONN netSocketOptSockAcceptConn /* socket has had listen() */ #define SO_REUSEADDR netSocketOptSockReuseAddr /* allow local address reuse */ #define SO_KEEPALIVE netSocketOptSockKeepAlive /* keep connections alive */ #define SO_DONTROUTE netSocketOptSockDontRoute /* just use interface addresses */ #define SO_BROADCAST netSocketOptSockBroadcast /* permit sending of broadcast msgs */ #define SO_USELOOPBACK netSocketOptSockUseLoopback /* bypass hardware when possible */ #define SO_LINGER netSocketOptSockLinger /* linger on close if data present */ #define SO_OOBINLINE netSocketOptSockOOBInLine /* leave received OOB data in line */ /* * N.B.: The following definition is present only for compatibility * with release 3.0. It will disappear in later releases. */ #define SO_DONTLINGER (~SO_LINGER) /* ~SO_LINGER */ /* * Additional options, not kept in so_options. */ #define SO_SNDBUF netSocketOptSockSndBufSize /* send buffer size */ #define SO_RCVBUF netSocketOptSockRcvBufSize /* receive buffer size */ #define SO_SNDLOWAT netSocketOptSockSndLowWater /* send low-water mark */ #define SO_RCVLOWAT netSocketOptSockRcvLowWater /* receive low-water mark */ #define SO_SNDTIMEO netSocketOptSockSndTimeout /* send timeout */ #define SO_RCVTIMEO netSocketOptSockRcvTimeout /* receive timeout */ #define SO_ERROR netSocketOptSockErrorStatus /* get error status and clear */ #define SO_TYPE netSocketOptSockSocketType /* get socket type */ /* * Structure used for manipulating linger option. */ struct linger { Int16 l_onoff; /* option on/off */ Int16 l_linger; /* linger time */ }; /* * Level number for (get/set)sockopt() to apply to socket itself. */ #define SOL_SOCKET netSocketOptLevelSocket /* options for socket level */ /* * Address families. */ #define AF_INET netSocketAddrINET /* internetwork: UDP, TCP, etc. */ #define AF_RAW netSocketAddrRaw /* raw access to data-link interface */ /* * Structure used by kernel to store most * addresses. */ struct sockaddr { Int16 sa_family; /* address family */ UInt8 sa_data[14]; /* up to 14 bytes of direct address */ }; /* * Structure used by kernel to pass protocol * information in raw sockets. */ struct sockproto { UInt16 sp_family; /* address family */ UInt16 sp_protocol; /* protocol */ }; /* * Protocol families, same as address families for now. */ #define PF_INET AF_INET #define PF_RAW AF_RAW /* * Maximum queue length specifiable by listen. */ #define SOMAXCONN 5 /* * Message header for recvmsg and sendmsg calls. */ struct msghdr { Char * msg_name; /* optional address */ Int16 msg_namelen; /* size of address */ struct iovec *msg_iov; /* scatter/gather array */ Int16 msg_iovlen; /* # elements in msg_iov */ Char * msg_accrights; /* access rights sent/received */ Int16 msg_accrightslen; }; #define MSG_OOB netIOFlagOutOfBand /* process out-of-band data */ #define MSG_PEEK netIOFlagPeek /* peek at incoming message */ #define MSG_DONTROUTE netIOFlagDontRoute /* send without using routing tables */ #define MSG_MAXIOVLEN netIOVecMaxLen //=========================================================================== // Globals used by the Sockets API. These are declard in the Socket.c module // which must be linked in with any application that uses the sockets API. //=========================================================================== extern Err errno; extern Int32 AppNetTimeout; extern Char AppINETString[]; extern NetHostInfoBufType AppHostInfo; extern NetServInfoBufType AppServInfo; extern UInt16 AppNetRefnum; //=========================================================================== // Macros that convert BSD Sockets calls into native Pilot calls. //=========================================================================== #define accept(socket,addr,addrlen) \ NetLibSocketAccept(socket,(NetSocketAddrType*)addr,(Int16 *)addrlen,AppNetTimeout,&errno) #define bind(socket,localaddr,addrlen) \ NetLibSocketBind(socket,(NetSocketAddrType*)localaddr,addrlen,AppNetTimeout,&errno) #define close(socket) \ NetLibSocketClose(socket,AppNetTimeout,&errno) #define connect(socket,addr,addrlen) \ NetLibSocketConnect(socket,(NetSocketAddrType*)addr,addrlen,AppNetTimeout,&errno) #define getsockopt(socket,level,opt,optvalP,optlenP) \ NetLibSocketOptionGet(socket,level,opt,optvalP,(UInt16 *)optlenP,AppNetTimeout,&errno) #define listen(socket,queuelen) \ NetLibSocketListen(socket,queuelen,AppNetTimeout,&errno) #define read(socket,buffer,buflen) \ NetLibReceive(socket,buffer,buflen,0,0,0,AppNetTimeout,&errno) #define recv(socket,buffer,buflen,flags) \ NetLibReceive(socket,buffer,buflen,flags,0,0,AppNetTimeout,&errno) #define recvfrom(socket,buffer,buflen,flags,from,fromlen) \ NetLibReceive(socket,buffer,buflen,flags,from,(UInt16 *)fromlen,AppNetTimeout,&errno) #define recvmsg(socket,msg,flags) \ NetLibReceivePB(socket,(NetIOParamType*)msg,flags,AppNetTimeout,&errno) #define send(socket,buf,buflen,flags) \ NetLibSend(socket,buf,buflen,flags,0,0,AppNetTimeout,&errno) #define sendmsg(socket,msg,flags) \ NetLibSendPB(socket,(NetIOParamType*)msg,flags,AppNetTimeout,&errno) #define sendto(socket,buf,buflen,flags,to,tolen) \ NetLibSend(socket,buf,buflen,flags,to,tolen,AppNetTimeout,&errno) #define setsockopt(socket,level,opt,optvalP,optlen) \ NetLibSocketOptionSet(socket,level,opt,optvalP,optlen,AppNetTimeout,&errno) #define shutdown(socket,direction) \ NetLibSocketShutdown(socket,direction,AppNetTimeout,&errno) #define socket(domain,type,protocol) \ NetLibSocketOpen(domain,type,protocol,AppNetTimeout,&errno) #define write(socket,buf,buflen) \ NetLibSend(socket,(void *) buf,buflen,0,0,0,AppNetTimeout,&errno) #define getpeername(socket,nameP,nameLenP) \ NetLibSocketAddr(socket, 0, 0, (NetSocketAddrType*)nameP, (Int16 *)nameLenP, AppNetTimeout, &errno) #define getsockname(socket,nameP,nameLenP) \ NetLibSocketAddr(socket, (NetSocketAddrType*)nameP, (Int16 *)nameLenP, 0, 0, AppNetTimeout, &errno) //=========================================================================== // Sockets API calls that go through glue //=========================================================================== #ifdef __cplusplus extern "C" { #endif Int16 getdomainname(Char * nameP, Int16 namelen); Int16 setdomainname(Char * nameP, Int16 namelen); Int16 gethostname(Char * nameP, Int16 namelen); Int16 sethostname(Char * nameP, Int16 namelen); Int16 select(Int16 width, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout); Int16 gettimeofday(struct timeval* tp, struct timezone* tzp); Int16 settimeofday(struct timeval* tp, struct timezone* tzp); void * MemCalloc(UInt32 nmemb, UInt32 size); void * MemRealloc(void * p, UInt32 size); #ifdef __cplusplus } #endif //=========================================================================== // These are high level convenience functions. //=========================================================================== #ifdef __cplusplus extern "C" { #endif // Initialize the NetSocket glue code globals if not already initialized. // In particular, this sets up the AppNetRefnum global with the refnum of // the NetLib. Err NetUInit (void); // Open up a TCP socket and connect to the given host. If port is 0, the port // number will be looked up by the serviceName parameter. Returns socket // descriptor or -1 on error NetSocketRef NetUTCPOpen(const Char * hostName, const Char * serviceName, Int16 port); // Read N bytes from a descriptor. This call automatically makes repeated read // calls to the socket until all N bytes have been received // Returns number of bytes read or -1 if error Int32 NetUReadN(NetSocketRef fd, UInt8 * bufP, UInt32 numBytes); // Write N bytes to a descriptor. This call automatically makes repeated write // calls to the socket until all N bytes have been sent // Returns number of bytes written or -1 if error Int32 NetUWriteN(NetSocketRef fd, UInt8 * bufP, UInt32 numBytes); #ifdef __cplusplus } #endif #endif /* __UNIX_SYS_SOCKET_H__ */