1 /* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2009 PacketVideo 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13 * express or implied. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * ------------------------------------------------------------------- 17 */ 18 // -*- c++ -*- 19 // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 20 21 // O S C L C O N F I G _ I O 22 23 // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 24 25 26 /*! \file osclconfig_io.h 27 * \brief This file contains common typedefs based on the ANSI C limits.h header 28 * 29 * This header file should work for any ANSI C compiler to determine the 30 * proper native C types to use for OSCL integer types. 31 */ 32 33 34 #ifndef OSCLCONFIG_IO_H_INCLUDED 35 #define OSCLCONFIG_IO_H_INCLUDED 36 37 #ifndef OSCLCONFIG_H_INCLUDED 38 #include "osclconfig.h" 39 #endif 40 41 #if (OSCL_HAS_ANDROID_SUPPORT) && (ENABLE_MEMORY_PLAYBACK) 42 #include <media/MediaPlayerInterface.h> 43 #endif 44 45 #include <stdio.h> 46 #include <stdlib.h> 47 #include <stdarg.h> 48 #include <sys/socket.h> 49 #include <netinet/in.h> 50 #include <arpa/inet.h> 51 #include <fcntl.h> 52 #include <signal.h> 53 #include <netdb.h> 54 #include <sys/mman.h> 55 #include <sys/types.h> 56 #include <errno.h> 57 #include <sys/vfs.h> 58 #include <dirent.h> 59 //#include <glob.h> 60 #if (OSCL_HAS_ANSI_STDLIB_SUPPORT) 61 #if (OSCL_HAS_UNIX_SUPPORT) 62 #include <sys/stat.h> 63 #endif 64 #endif 65 66 //For File I/O 67 #define OSCL_HAS_GLOB 0 68 #define OSCL_HAS_ANSI_FILE_IO_SUPPORT 1 69 #define OSCL_HAS_SYMBIAN_COMPATIBLE_IO_FUNCTION 0 70 #define OSCL_HAS_NATIVE_FILE_CACHE_ENABLE 1 71 #define OSCL_FILE_BUFFER_MAX_SIZE 32768 72 #define OSCL_HAS_PV_FILE_CACHE 0 73 #define OSCL_HAS_LARGE_FILE_SUPPORT 1 74 75 //For Sockets 76 #define OSCL_HAS_SYMBIAN_SOCKET_SERVER 0 77 #define OSCL_HAS_SYMBIAN_DNS_SERVER 0 78 #define OSCL_HAS_BERKELEY_SOCKETS 1 79 #define OSCL_HAS_SOCKET_SUPPORT 1 80 81 //basic socket types 82 typedef int TOsclSocket; 83 typedef struct sockaddr_in TOsclSockAddr; 84 typedef socklen_t TOsclSockAddrLen; 85 86 //Init addr macro, inet_addr returns an uint32 87 #define OsclValidInetAddr(addr) (inet_addr(addr)!=INADDR_NONE) 88 89 //address conversion macro-- from string to network address. 90 #define OsclMakeSockAddr(sockaddr,port,addrstr,ok)\ 91 sockaddr.sin_family=OSCL_AF_INET;\ 92 sockaddr.sin_port=htons(port);\ 93 int32 result=inet_aton((const char*)addrstr,&sockaddr.sin_addr);\ 94 ok=(result!=0); 95 96 //address conversion macro-- from network address to string 97 #define OsclUnMakeSockAddr(sockaddr,addrstr)\ 98 addrstr=inet_ntoa(sockaddr.sin_addr); 99 100 //wrappers for berkeley socket calls 101 #define OsclSetRecvBufferSize(s,val,ok,err) \ 102 ok=(setsockopt(s,SOL_SOCKET,SO_RCVBUF,(char*)&val, sizeof(int)) !=-1);\ 103 if (!ok)err=errno 104 105 #define OsclBind(s,addr,ok,err)\ 106 TOsclSockAddr* tmpadr = &addr;\ 107 sockaddr* sadr = OSCL_STATIC_CAST(sockaddr*, tmpadr);\ 108 ok=(bind(s,sadr,sizeof(addr))!=(-1));\ 109 if (!ok)err=errno 110 111 #define OsclJoin(s,addr,ok,err)\ 112 {\ 113 struct ip_mreq mreq; \ 114 void* p = &addr; \ 115 ok=(bind(s,(sockaddr*)p,sizeof(addr))!=(-1));\ 116 mreq.imr_multiaddr.s_addr = addr.sin_addr.s_addr ; \ 117 mreq.imr_interface.s_addr = htonl(INADDR_ANY); \ 118 ok=(setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(struct ip_mreq))!=(-1)); \ 119 if (!ok)err=errno;\ 120 } 121 122 123 #define OsclListen(s,size,ok,err)\ 124 ok=(listen(iSocket,qSize)!=(-1));\ 125 if (!ok)err=errno 126 127 #define OsclAccept(s,accept_s,ok,err,wouldblock)\ 128 accept_s=accept(s,NULL,NULL);\ 129 ok=(accept_s!=(-1));\ 130 if (!ok){err=errno;wouldblock=(err==EAGAIN||err==EWOULDBLOCK);} 131 132 #define OsclSetNonBlocking(s,ok,err)\ 133 ok=(fcntl(s,F_SETFL,O_NONBLOCK)!=(-1));\ 134 if (!ok)err=errno 135 136 #define OsclShutdown(s,how,ok,err)\ 137 ok=(shutdown(iSocket,how)!=(-1));\ 138 if (!ok)err=errno 139 140 #define OsclSocket(s,fam,type,prot,ok,err)\ 141 s=socket(fam,type,prot);\ 142 ok=(s!=(-1));\ 143 if (!ok)err=errno 144 145 #define OsclSendTo(s,buf,len,addr,ok,err,nbytes,wouldblock)\ 146 TOsclSockAddr* tmpadr = &addr;\ 147 sockaddr* sadr = OSCL_STATIC_CAST(sockaddr*, tmpadr);\ 148 nbytes=sendto(s,(const void*)(buf),(size_t)(len),0,sadr,(socklen_t)sizeof(addr));\ 149 ok=(nbytes!=(-1));\ 150 if (!ok){err=errno;wouldblock=(err==EAGAIN||err==EWOULDBLOCK);} 151 152 #define OsclSend(s,buf,len,ok,err,nbytes,wouldblock)\ 153 nbytes=send(s,(const void*)(buf),(size_t)(len),0);\ 154 ok=(nbytes!=(-1));\ 155 if (!ok){err=errno;wouldblock=(err==EAGAIN||err==EWOULDBLOCK);} 156 157 #define OsclCloseSocket(s,ok,err)\ 158 ok=(close(s)!=(-1));\ 159 if (!ok)err=errno 160 161 #define OsclConnect(s,addr,ok,err,wouldblock)\ 162 TOsclSockAddr* tmpadr = &addr;\ 163 sockaddr* sadr = OSCL_STATIC_CAST(sockaddr*, tmpadr);\ 164 ok=(connect(s,sadr,sizeof(addr))!=(-1));\ 165 if (!ok){err=errno;wouldblock=(err==EINPROGRESS);} 166 167 #define OsclGetAsyncSockErr(s,ok,err)\ 168 int opterr;socklen_t optlen=sizeof(opterr);\ 169 ok=(getsockopt(s,SOL_SOCKET,SO_ERROR,(void *)&opterr,&optlen)!=(-1));\ 170 if(ok)err=opterr;else err=errno; 171 172 //unix reports connect completion in write set in the getsockopt 173 //error. 174 #define OsclConnectComplete(s,wset,eset,success,fail,ok,err)\ 175 success=fail=false;\ 176 if (FD_ISSET(s,&eset))\ 177 {fail=true;OsclGetAsyncSockErr(s,ok,err);}\ 178 else if (FD_ISSET(s,&wset))\ 179 {OsclGetAsyncSockErr(s,ok,err);if (ok && err==0)success=true;else fail=true;} 180 181 #define OsclRecv(s,buf,len,ok,err,nbytes,wouldblock)\ 182 nbytes=recv(s,(void *)(buf),(size_t)(len),0);\ 183 ok=(nbytes!=(-1));\ 184 if (!ok){err=errno;wouldblock=(err==EAGAIN);} 185 186 #define OsclRecvFrom(s,buf,len,paddr,paddrlen,ok,err,nbytes,wouldblock)\ 187 {\ 188 void* p=paddr;\ 189 nbytes=recvfrom(s,(void*)(buf),(size_t)(len),0,(struct sockaddr*)p,paddrlen);\ 190 ok=(nbytes!=(-1));\ 191 if (!ok){err=errno;wouldblock=(err==EAGAIN);}\ 192 } 193 194 195 #define OsclSocketSelect(nfds,rd,wr,ex,timeout,ok,err,nhandles)\ 196 nhandles=select(nfds,&rd,&wr,&ex,&timeout);\ 197 ok=(nhandles!=(-1));\ 198 if (!ok)err=errno 199 200 //there's not really any socket startup needed on unix, but 201 //you need to define a signal handler for SIGPIPE to avoid 202 //broken pipe crashes. 203 #define OsclSocketStartup(ok)\ 204 signal(SIGPIPE,SIG_IGN);\ 205 ok=true 206 207 #define OsclSocketCleanup(ok)\ 208 signal(SIGPIPE,SIG_DFL);\ 209 ok=true 210 211 //hostent type 212 typedef struct hostent TOsclHostent; 213 214 //wrapper for gethostbyname 215 #define OsclGethostbyname(name,hostent,ok,err)\ 216 hostent=gethostbyname((const char*)name);\ 217 ok=(hostent!=NULL);\ 218 if (!ok)err=errno; 219 220 //extract dotted address from a hostent 221 #define OsclGetDottedAddr(hostent,dottedaddr,ok)\ 222 long *_hostaddr=(long*)hostent->h_addr_list[0];\ 223 struct in_addr _inaddr;\ 224 _inaddr.s_addr=*_hostaddr;\ 225 dottedaddr=inet_ntoa(_inaddr);\ 226 ok=(dottedaddr!=NULL); 227 228 //socket shutdown codes 229 #define OSCL_SD_RECEIVE SHUT_RD 230 #define OSCL_SD_SEND SHUT_WR 231 #define OSCL_SD_BOTH SHUT_RDWR 232 233 //address family codes 234 #define OSCL_AF_INET AF_INET 235 236 //socket type codes 237 #define OSCL_SOCK_STREAM SOCK_STREAM 238 #define OSCL_SOCK_DATAGRAM SOCK_DGRAM 239 240 //IP protocol codes 241 #define OSCL_IPPROTO_TCP IPPROTO_TCP 242 #define OSCL_IPPROTO_UDP IPPROTO_UDP 243 244 //End sockets 245 // file IO support 246 #if (OSCL_HAS_LARGE_FILE_SUPPORT) 247 #define _FILE_OFFSET_BITS 64 248 typedef off_t TOsclFileOffset; 249 #else 250 typedef int32 TOsclFileOffset; 251 #endif 252 253 #include "osclconfig_io_check.h" 254 255 #endif 256 257