Download Reference Manual
The Developer's Library for D
About Wiki Forums Source Search Contact

Ticket #1652: patch.diff

File patch.diff, 17.3 kB (added by fawzi, 10 years ago)

corrected new patch with windows stuff moved to WsaSock??

  • user/tango/net/device/Berkeley.d

    old new  
    55private import  tango.core.Exception; 
    66 
    77import  consts=tango.stdc.constants.socket; 
     8private import tango.stdc.config;  
    89 
    910/******************************************************************************* 
    1011 
     
    173174        pragma (lib, "ws2_32.lib"); 
    174175         
    175176        private import tango.sys.win32.WsaSock; 
    176  
    177         private typedef int socket_t = ~0; 
    178  
    179         extern (Windows) 
    180         { 
    181                 alias closesocket close; 
    182          
    183                 socket_t socket(int af, int type, int protocol); 
    184                 int ioctlsocket(socket_t s, int cmd, uint* argp); 
    185                 uint inet_addr(char* cp); 
    186                 int bind(socket_t s, sockaddr* name, int namelen); 
    187                 int connect(socket_t s, sockaddr* name, int namelen); 
    188                 int listen(socket_t s, int backlog); 
    189                 socket_t accept(socket_t s, sockaddr* addr, int* addrlen); 
    190                 int closesocket(socket_t s); 
    191                 int shutdown(socket_t s, int how); 
    192                 int getpeername(socket_t s, sockaddr* name, int* namelen); 
    193                 int getsockname(socket_t s, sockaddr* name, int* namelen); 
    194                 int send(socket_t s, void* buf, int len, int flags); 
    195                 int sendto(socket_t s, void* buf, int len, int flags, sockaddr* to, int tolen); 
    196                 int recv(socket_t s, void* buf, int len, int flags); 
    197                 int recvfrom(socket_t s, void* buf, int len, int flags, sockaddr* from, int* fromlen); 
    198                 int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* errorfds, timeval* timeout); 
    199                 int getsockopt(socket_t s, int level, int optname, void* optval, int* optlen); 
    200                 int setsockopt(socket_t s, int level, int optname, void* optval, int optlen); 
    201                 int gethostname(void* namebuffer, int buflen); 
    202                 char* inet_ntoa(uint ina); 
    203                 hostent* gethostbyname(char* name); 
    204                 hostent* gethostbyaddr(void* addr, int len, int type); 
    205         } 
    206  
    207         extern (Windows) 
    208         { 
    209                 bool function (socket_t, uint, void*, DWORD, DWORD, DWORD, DWORD*, OVERLAPPED*) AcceptEx; 
    210                 bool function (socket_t, HANDLE, DWORD, DWORD, OVERLAPPED*, void*, DWORD) TransmitFile; 
    211                 bool function (socket_t, void*, int, void*, DWORD, DWORD*, OVERLAPPED*) ConnectEx; 
    212         } 
    213  
    214         static this() 
    215         { 
    216                 WSADATA wd = void; 
    217                 if (WSAStartup (0x0202, &wd)) 
    218                     throw new SocketException("version of socket library is too old"); 
    219  
    220                 DWORD result; 
    221  
    222                 Guid acceptG   = {0xb5367df1, 0xcbac, 0x11cf, [0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92]}; 
    223                 Guid connectG  = {0x25a207b9, 0xddf3, 0x4660, [0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e]}; 
    224                 Guid transmitG = {0xb5367df0, 0xcbac, 0x11cf, [0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92]}; 
    225  
    226                 auto s = cast(HANDLE) socket (AddressFamily.INET, SocketType.STREAM, ProtocolType.TCP); 
    227                 assert (s != cast(HANDLE) -1); 
    228                 WSAIoctl (s, SIO_GET_EXTENSION_FUNCTION_POINTER,  
    229                           &connectG, connectG.sizeof, &ConnectEx,  
    230                           ConnectEx.sizeof, &result, null, null); 
    231  
    232                 WSAIoctl (s, SIO_GET_EXTENSION_FUNCTION_POINTER,  
    233                           &acceptG, acceptG.sizeof, &AcceptEx,  
    234                           AcceptEx.sizeof, &result, null, null); 
    235  
    236                 WSAIoctl (s, SIO_GET_EXTENSION_FUNCTION_POINTER,  
    237                           &transmitG, transmitG.sizeof, &TransmitFile,  
    238                           TransmitFile.sizeof, &result, null, null); 
    239                 closesocket (cast(socket_t) s); 
    240         } 
    241  
    242         static ~this() 
    243         { 
    244                 WSACleanup(); 
    245         } 
    246177} 
    247178else 
    248179{ 
     180        private import tango.stdc.posix.sys.time;  
    249181        private import tango.stdc.errno; 
    250  
     182        private import tango.stdc.posix.sys.socket: sockaddr; 
     183        private import tango.stdc.posix.sys.select: fd_set; 
     184        private import tango.stdc.posix.netdb; 
    251185        private typedef int socket_t = -1; 
    252186 
    253187        extern  (C) 
    254                 { 
     188                { // this redeclaration of tango.stdc.posix.sys.socket just to use socket_t is *very* ugly and should go 
    255189                socket_t socket(int af, int type, int protocol); 
    256190                int fcntl(socket_t s, int f, ...); 
    257191                uint inet_addr(char* cp); 
     
    272206                int setsockopt(socket_t s, int level, int optname, void* optval, int optlen); 
    273207                int gethostname(void* namebuffer, int buflen); 
    274208                char* inet_ntoa(uint ina); 
    275                 hostent* gethostbyname(char* name); 
    276                 hostent* gethostbyaddr(void* addr, int len, int type); 
    277209                } 
    278210} 
    279211 
     
    17491681        static int select (SocketSet checkRead, SocketSet checkWrite, SocketSet checkError, long microseconds) 
    17501682        {        
    17511683                timeval tv = { 
    1752                              cast(int)(microseconds / 1000000),  
    1753                              cast(int)(microseconds % 1000000) 
     1684                             cast(c_long)(microseconds / 1000000),  
     1685                             cast(c_long)(microseconds % 1000000) 
    17541686                             }; 
    17551687                return select (checkRead, checkWrite, checkError, &tv); 
    17561688        } 
     
    17701702 
    17711703/******************************************************************************* 
    17721704 
    1773  
    1774 *******************************************************************************/ 
    1775  
    1776 private struct sockaddr 
    1777 { 
    1778         ushort   sa_family; 
    1779         char[14] sa_data = 0; 
    1780 } 
    1781  
    1782 private struct timeval 
    1783 { 
    1784         int seconds;  
    1785         int microseconds;  
    1786 } 
    1787  
    1788 private struct fd_set 
    1789 { 
    1790 } 
    1791  
    1792 /******************************************************************************* 
    1793  
    1794  
    1795 *******************************************************************************/ 
    1796  
    1797 private struct hostent 
    1798 { 
    1799         char* h_name; 
    1800         char** h_aliases; 
    1801         version(Win32) 
    1802         { 
    1803                 short h_addrtype; 
    1804                 short h_length; 
    1805         } 
    1806         else  
    1807         { 
    1808                 int h_addrtype; 
    1809                 int h_length; 
    1810         } 
    1811         char** h_addr_list; 
    1812  
    1813         char* h_addr() 
    1814         { 
    1815                 return h_addr_list[0]; 
    1816         } 
    1817 } 
    1818  
    1819  
    1820 /******************************************************************************* 
    1821  
    18221705        Old implementation ... needs to be phased out 
    18231706 
    18241707*******************************************************************************/ 
  • user/tango/net/Socket.d

    old new  
    109109 
    110110*******************************************************************************/ 
    111111 
    112 version (Win32) 
    113         { 
    114         pragma(lib, "ws2_32.lib"); 
     112version (Win32){ 
     113    private import tango.sys.win32.WsaSock; 
     114
    115115 
    116         private typedef int socket_t = ~0; 
    117  
    118         private const int IOCPARM_MASK =  0x7f; 
    119         private const int IOC_IN =        cast(int)0x80000000; 
    120         private const int FIONBIO =       cast(int) (IOC_IN | ((int.sizeof & IOCPARM_MASK) << 16) | (102 << 8) | 126); 
    121  
    122         private const int WSADESCRIPTION_LEN = 256; 
    123         private const int WSASYS_STATUS_LEN = 128; 
    124         private const int WSAEWOULDBLOCK =  10035; 
    125         private const int WSAEINTR =        10004; 
    126  
    127  
    128         struct WSADATA 
    129         { 
    130                         WORD wVersion; 
    131                         WORD wHighVersion; 
    132                         char szDescription[WSADESCRIPTION_LEN+1]; 
    133                         char szSystemStatus[WSASYS_STATUS_LEN+1]; 
    134                         ushort iMaxSockets; 
    135                         ushort iMaxUdpDg; 
    136                         char* lpVendorInfo; 
    137         } 
    138         alias WSADATA* LPWSADATA; 
    139  
    140         extern  (Windows) 
    141                 { 
    142                 alias closesocket close; 
    143                 int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData); 
    144                 int WSACleanup(); 
    145                 socket_t socket(int af, int type, int protocol); 
    146                 int ioctlsocket(socket_t s, int cmd, uint* argp); 
    147                 uint inet_addr(char* cp); 
    148                 int bind(socket_t s, sockaddr* name, int namelen); 
    149                 int connect(socket_t s, sockaddr* name, int namelen); 
    150                 int listen(socket_t s, int backlog); 
    151                 socket_t accept(socket_t s, sockaddr* addr, int* addrlen); 
    152                 int closesocket(socket_t s); 
    153                 int shutdown(socket_t s, int how); 
    154                 int getpeername(socket_t s, sockaddr* name, int* namelen); 
    155                 int getsockname(socket_t s, sockaddr* name, int* namelen); 
    156                 int send(socket_t s, void* buf, int len, int flags); 
    157                 int sendto(socket_t s, void* buf, int len, int flags, sockaddr* to, int tolen); 
    158                 int recv(socket_t s, void* buf, int len, int flags); 
    159                 int recvfrom(socket_t s, void* buf, int len, int flags, sockaddr* from, int* fromlen); 
    160                 int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* errorfds, timeval* timeout); 
    161                 //int __WSAFDIsSet(socket_t s, fd_set* fds); 
    162                 int getsockopt(socket_t s, int level, int optname, void* optval, int* optlen); 
    163                 int setsockopt(socket_t s, int level, int optname, void* optval, int optlen); 
    164                 int gethostname(void* namebuffer, int buflen); 
    165                 char* inet_ntoa(uint ina); 
    166                 hostent* gethostbyname(char* name); 
    167                 hostent* gethostbyaddr(void* addr, int len, int type); 
    168                 int WSAGetLastError(); 
    169                 } 
    170  
    171         static this() 
    172         { 
    173                 WSADATA wd; 
    174                 if (WSAStartup (0x0101, &wd)) 
    175                     throw new SocketException("Unable to initialize socket library"); 
    176         } 
    177  
    178  
    179         static ~this() 
    180         { 
    181                 WSACleanup(); 
    182         } 
    183  
    184         } 
    185  
    186116version (BsdSockets) 
    187117        { 
    188118        private import tango.stdc.errno; 
     119        private import tango.stdc.posix.sys.time; 
     120        private import tango.stdc.posix.sys.socket: sockaddr; 
     121        private import tango.stdc.posix.sys.select: fd_set; 
     122        private import tango.stdc.posix.netdb; 
    189123 
    190124        private typedef int socket_t = -1; 
     125        // very ugly redeclarations, to remove 
    191126 
    192127        private const int F_GETFL       = 3; 
    193128        private const int F_SETFL       = 4; 
     
    234169private const socket_t INVALID_SOCKET = socket_t.init; 
    235170private const int SOCKET_ERROR = -1; 
    236171 
    237  
    238  
    239172/******************************************************************************* 
    240173 
    241         Internal structs: 
    242  
    243 *******************************************************************************/ 
    244  
    245 struct timeval 
    246 { 
    247         int tv_sec; //seconds 
    248         int tv_usec; //microseconds 
    249 } 
    250  
    251  
    252 //transparent 
    253 struct fd_set 
    254 { 
    255 } 
    256  
    257  
    258 struct sockaddr 
    259 { 
    260         ushort sa_family; 
    261         char[14] sa_data = 0; 
    262 } 
    263  
    264  
    265 struct hostent 
    266 { 
    267         char* h_name; 
    268         char** h_aliases; 
    269         version(Win32) 
    270         { 
    271                 short h_addrtype; 
    272                 short h_length; 
    273         } 
    274         else version(BsdSockets) 
    275         { 
    276                 int h_addrtype; 
    277                 int h_length; 
    278         } 
    279         char** h_addr_list; 
    280  
    281  
    282         char* h_addr() 
    283         { 
    284                 return h_addr_list[0]; 
    285         } 
    286 } 
    287  
    288  
    289 /******************************************************************************* 
    290  
    291174        conversions for network byte-order 
    292175 
    293176*******************************************************************************/ 
     
    15361419        static timeval toTimeval (TimeSpan time) 
    15371420        { 
    15381421                timeval tv; 
    1539                 tv.tv_sec = cast(uint) time.seconds; 
    1540                 tv.tv_usec = cast(uint) time.micros % 1_000_000; 
     1422                tv.tv_sec = time.seconds; 
     1423                tv.tv_usec = time.micros % 1_000_000; 
    15411424                return tv; 
    15421425        } 
    15431426} 
  • user/tango/stdc/posix/netdb.d

    old new  
     1/+ 
     2+ stdc netdb.h header file. 
     3+ more function are defined, see http://www.opengroup.org/onlinepubs/009695399/basedefs/netdb.h.html 
     4+ if needed add them, at the moment only the basic ones are defined 
     5+ 
     6+ license: tango/apache 
     7+ author: fawzi 
     8+/ 
     9module tango.stdc.posix.netdb; 
     10import tango.stdc.posix.sys.socket: socklen_t; 
     11 
     12extern(C): 
     13 
     14void endhostent(); 
     15 
     16hostent *gethostbyaddr(void *addr, socklen_t len, int type); 
     17hostent *gethostbyname(char *name); 
     18hostent *gethostbyname2(char *name, int af); 
     19 
     20hostent * gethostent(); 
     21 
     22//extern int h_errno; 
     23//void herror(char *string); 
     24//char *hstrerror(int err); 
     25 
     26void sethostent(int stayopen); 
     27 
     28struct hostent 
     29{ 
     30    char* h_name; 
     31    char** h_aliases; 
     32    int h_addrtype; 
     33    int h_length; 
     34    char** h_addr_list; 
     35 
     36    char* h_addr() 
     37    { 
     38            return h_addr_list[0]; 
     39    } 
     40} 
  • user/tango/sys/win32/WsaSock.d

    old new  
    11module tango.sys.win32.WsaSock; 
    22 
    33public import tango.sys.Common; 
     4private import tango.stdc.config;  
    45 
    56struct Guid 
    67{ 
     
    5354        int WSASend (HANDLE, WSABUF*, DWORD, DWORD*, DWORD, OVERLAPPED*, void*); 
    5455} 
    5556 
     57pragma (lib, "ws2_32.lib"); 
     58 
     59struct timeval {  
     60    c_long seconds;  
     61    c_long microseconds;  
     62}  
     63 
     64struct sockaddr 
     65{ 
     66        ushort   sa_family; 
     67        char[14] sa_data = 0; 
     68} 
     69 
     70//transparent 
     71struct fd_set 
     72{ 
     73} 
     74 
     75private struct hostent 
     76{ 
     77        char* h_name; 
     78        char** h_aliases; 
     79        short h_addrtype; 
     80        short h_length; 
     81        char** h_addr_list; 
     82 
     83        char* h_addr() 
     84        { 
     85                return h_addr_list[0]; 
     86        } 
     87} 
     88 
     89typedef int socket_t = ~0; 
     90 
     91extern (Windows) 
     92{ 
     93        alias closesocket close; 
     94 
     95        socket_t socket(int af, int type, int protocol); 
     96        int ioctlsocket(socket_t s, int cmd, uint* argp); 
     97        uint inet_addr(char* cp); 
     98        int bind(socket_t s, sockaddr* name, int namelen); 
     99        int connect(socket_t s, sockaddr* name, int namelen); 
     100        int listen(socket_t s, int backlog); 
     101        socket_t accept(socket_t s, sockaddr* addr, int* addrlen); 
     102        int closesocket(socket_t s); 
     103        int shutdown(socket_t s, int how); 
     104        int getpeername(socket_t s, sockaddr* name, int* namelen); 
     105        int getsockname(socket_t s, sockaddr* name, int* namelen); 
     106        int send(socket_t s, void* buf, int len, int flags); 
     107        int sendto(socket_t s, void* buf, int len, int flags, sockaddr* to, int tolen); 
     108        int recv(socket_t s, void* buf, int len, int flags); 
     109        int recvfrom(socket_t s, void* buf, int len, int flags, sockaddr* from, int* fromlen); 
     110        int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* errorfds, timeval* timeout); 
     111        int getsockopt(socket_t s, int level, int optname, void* optval, int* optlen); 
     112        int setsockopt(socket_t s, int level, int optname, void* optval, int optlen); 
     113        int gethostname(void* namebuffer, int buflen); 
     114        char* inet_ntoa(uint ina); 
     115        hostent* gethostbyname(char* name); 
     116        hostent* gethostbyaddr(void* addr, int len, int type); 
     117} 
     118 
     119extern (Windows) 
     120{ 
     121        bool function (socket_t, uint, void*, DWORD, DWORD, DWORD, DWORD*, OVERLAPPED*) AcceptEx; 
     122        bool function (socket_t, HANDLE, DWORD, DWORD, OVERLAPPED*, void*, DWORD) TransmitFile; 
     123        bool function (socket_t, void*, int, void*, DWORD, DWORD*, OVERLAPPED*) ConnectEx; 
     124} 
     125 
     126static this() 
     127{ 
     128        WSADATA wd = void; 
     129        if (WSAStartup (0x0202, &wd)) 
     130            throw new SocketException("version of socket library is too old"); 
     131 
     132        DWORD result; 
     133 
     134        Guid acceptG   = {0xb5367df1, 0xcbac, 0x11cf, [0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92]}; 
     135        Guid connectG  = {0x25a207b9, 0xddf3, 0x4660, [0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e]}; 
     136        Guid transmitG = {0xb5367df0, 0xcbac, 0x11cf, [0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92]}; 
     137 
     138        auto s = cast(HANDLE) socket (AddressFamily.INET, SocketType.STREAM, ProtocolType.TCP); 
     139        assert (s != cast(HANDLE) -1); 
     140        WSAIoctl (s, SIO_GET_EXTENSION_FUNCTION_POINTER,  
     141                  &connectG, connectG.sizeof, &ConnectEx,  
     142                  ConnectEx.sizeof, &result, null, null); 
     143 
     144        WSAIoctl (s, SIO_GET_EXTENSION_FUNCTION_POINTER,  
     145                  &acceptG, acceptG.sizeof, &AcceptEx,  
     146                  AcceptEx.sizeof, &result, null, null); 
     147 
     148        WSAIoctl (s, SIO_GET_EXTENSION_FUNCTION_POINTER,  
     149                  &transmitG, transmitG.sizeof, &TransmitFile,  
     150                  TransmitFile.sizeof, &result, null, null); 
     151        closesocket (cast(socket_t) s); 
     152} 
     153 
     154static ~this() 
     155{ 
     156        WSACleanup(); 
     157}