Usermode/libnet - Starting work on DNS resolver
[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 <acess/sys.h>
12
13 enum {
14         UDP_IOCTL_GETSETLPORT = 4,
15         UDP_IOCTL_GETSETRPORT,
16         UDP_IOCTL_GETSETRMASK,
17         UDP_IOCTL_SETRADDR,
18 };
19
20 int Net_OpenSocket(int AddrType, const void *Addr, const char *Filename)
21 {
22          int    addrLen = Net_GetAddressSize(AddrType);
23         char    hexAddr[addrLen*2+1];
24         
25         {
26                 const uint8_t   *addrBuffer = Addr;
27                 for( unsigned int i = 0; i < addrLen; i ++ )
28                         sprintf(hexAddr+i*2, "%02x", addrBuffer[i]);
29         }
30         
31         if(Filename)
32         {
33                  int    len = snprintf(NULL, 0, "/Devices/ip/routes/@%i:%s/%s", AddrType, hexAddr, Filename);
34                 char    path[len+1];
35                 snprintf(path, len+1, "/Devices/ip/routes/@%i:%s/%s", AddrType, hexAddr, Filename);
36                 _SysDebug("%s", path);
37                 return _SysOpen(path, OPENFLAG_READ|OPENFLAG_WRITE);
38         }
39         else
40         {
41                  int    len = snprintf(NULL, 0, "/Devices/ip/routes/@%i:%s", AddrType, hexAddr);
42                 char    path[len+1];
43                 snprintf(path, len+1, "/Devices/ip/routes/@%i:%s", AddrType, hexAddr);
44                 return _SysOpen(path, OPENFLAG_READ);
45         }
46 }
47
48 int Net_OpenSocket_TCPC(int AddrType, const void *Addr, int Port)
49 {
50         int fd = Net_OpenSocket(AddrType, Addr, "tcpc");
51         if( fd == -1 )  return -1;
52         
53         _SysIOCtl(fd, 5, &Port);        // Remote Port
54         _SysIOCtl(fd, 6, (void*)Addr);  // Remote address (kernel shouldn't modify)
55         _SysIOCtl(fd, 7, NULL); // connect
56         return fd;
57 }
58
59 int Net_OpenSocket_UDP(int AddrType, const void *Addr, int RPort, int LPort)
60 {
61         int fd = Net_OpenSocket(AddrType, Addr, "udp");
62         if( fd == -1 )  return -1;
63         
64         _SysIOCtl(fd, UDP_IOCTL_GETSETLPORT, &LPort);   // Remote Port
65         int maskbits = Net_GetAddressSize(AddrType) * 8;
66         _SysIOCtl(fd, UDP_IOCTL_GETSETRPORT, &RPort);
67         _SysIOCtl(fd, UDP_IOCTL_GETSETRMASK, &maskbits);
68         _SysIOCtl(fd, UDP_IOCTL_SETRADDR, (void*)Addr); // Remote address (kernel shouldn't modify)
69         return fd;
70 }
71

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