Networking - DNS resolution semi-working
[tpg/acess2.git] / Usermode / Libraries / libnet.so_src / socket.c
1 /*
2  * Acess2 Networking Toolkit
3  * By John Hodge (thePowersGang)
4  * 
5  * socket.c
6  * - 
7  */
8 #include <net.h>
9 #include <stdio.h>
10 #include <stdint.h>
11 #include <string.h>     // memcpy
12 #include <acess/sys.h>
13
14 enum {
15         UDP_IOCTL_GETSETLPORT = 4,
16         UDP_IOCTL_GETSETRPORT,
17         UDP_IOCTL_GETSETRMASK,
18         UDP_IOCTL_SETRADDR,
19         UDP_IOCTL_SENDTO,
20         UDP_IOCTL_RECVFROM,
21 };
22
23 int Net_OpenSocket(int AddrType, const void *Addr, const char *Filename)
24 {
25          int    addrLen = Net_GetAddressSize(AddrType);
26         char    hexAddr[addrLen*2+1];
27         
28         {
29                 const uint8_t   *addrBuffer = Addr;
30                 for( unsigned int i = 0; i < addrLen; i ++ )
31                         sprintf(hexAddr+i*2, "%02x", addrBuffer[i]);
32         }
33         
34         if(Filename)
35         {
36                  int    len = snprintf(NULL, 0, "/Devices/ip/routes/@%i:%s/%s", AddrType, hexAddr, Filename);
37                 char    path[len+1];
38                 snprintf(path, len+1, "/Devices/ip/routes/@%i:%s/%s", AddrType, hexAddr, Filename);
39                 _SysDebug("%s", path);
40                 return _SysOpen(path, OPENFLAG_READ|OPENFLAG_WRITE);
41         }
42         else
43         {
44                  int    len = snprintf(NULL, 0, "/Devices/ip/routes/@%i:%s", AddrType, hexAddr);
45                 char    path[len+1];
46                 snprintf(path, len+1, "/Devices/ip/routes/@%i:%s", AddrType, hexAddr);
47                 return _SysOpen(path, OPENFLAG_READ);
48         }
49 }
50
51 int Net_OpenSocket_TCPC(int AddrType, const void *Addr, int Port)
52 {
53         int fd = Net_OpenSocket(AddrType, Addr, "tcpc");
54         if( fd == -1 )  return -1;
55         
56         if( _SysIOCtl(fd, 5, &Port) < 0 )       // Remote Port
57                 goto err;
58         if( _SysIOCtl(fd, 6, (void*)Addr) < 0 ) // Remote address (kernel shouldn't modify)
59                 goto err;
60         if( _SysIOCtl(fd, 7, NULL) < 0) // connect
61                 goto err;
62         return fd;
63 err:
64         _SysClose(fd);
65         return -1;
66 }
67
68 int Net_OpenSocket_UDP(int AddrType, const void *Addr, int RPort, int LPort)
69 {
70         int fd = Net_OpenSocket(AddrType, Addr, "udp");
71         if( fd == -1 )  return -1;
72         
73         if( _SysIOCtl(fd, UDP_IOCTL_GETSETLPORT, &LPort) < 0 )
74                 goto err;
75         if( _SysIOCtl(fd, UDP_IOCTL_GETSETRPORT, &RPort) < 0 )
76                 goto err;
77         int maskbits = Net_GetAddressSize(AddrType) * 8;
78         if( _SysIOCtl(fd, UDP_IOCTL_GETSETRMASK, &maskbits) < 0 )
79                 goto err;
80         if( _SysIOCtl(fd, UDP_IOCTL_SETRADDR, (void*)Addr) < 0 )        // Remote address (kernel shouldn't modify)
81                 goto err;
82         return fd;
83 err:
84         _SysClose(fd);
85         return -1;
86 }
87
88 int Net_UDP_SendTo(int FD, int Port, int AddrType, const void *Addr, size_t Length, const void *Data)
89 {
90         struct {
91                 uint16_t port;
92                 uint16_t addr_type;
93                 char    addr[16];
94         } ep;
95         ep.port = Port;
96         ep.addr_type = AddrType;
97         memcpy(ep.addr, Addr, Net_GetAddressSize(AddrType));
98         struct {
99                 const void *ep;
100                 const void *buf;
101                 uint16_t len;
102         } info = { .ep = &ep, .buf = Data, .len = Length };
103         
104         return _SysIOCtl(FD, UDP_IOCTL_SENDTO, &info);
105 }
106
107 int Net_UDP_RecvFrom(int FD, int* Port, int* AddrType, void *Addr, size_t Length, void *Data)
108 {
109         struct {
110                 uint16_t port;
111                 uint16_t addr_type;
112                 char    addr[16];
113         } ep;
114         struct {
115                 void *ep;
116                 void *buf;
117                 uint16_t len;
118         } info = { .ep = &ep, .buf = Data, .len = Length };
119         
120         int rv = _SysIOCtl(FD, UDP_IOCTL_RECVFROM, &info);
121         if( rv > 0 )
122         {
123                 if(Port)        *Port = ep.port;
124                 if(AddrType)    *AddrType = ep.addr_type;
125                 if(Addr)        memcpy(Addr, ep.addr, Net_GetAddressSize(ep.addr_type));
126         }
127         return rv;
128 }
129

UCC git Repository :: git.ucc.asn.au