Usermode/libnet - Starting work on DNS resolver
[tpg/acess2.git] / Usermode / Libraries / libnet.so_src / socket.c
index 85f7e54..68335ac 100644 (file)
 #include <stdint.h>
 #include <acess/sys.h>
 
-int Net_OpenSocket(int AddrType, void *Addr, const char *Filename)
+enum {
+       UDP_IOCTL_GETSETLPORT = 4,
+       UDP_IOCTL_GETSETRPORT,
+       UDP_IOCTL_GETSETRMASK,
+       UDP_IOCTL_SETRADDR,
+};
+
+int Net_OpenSocket(int AddrType, const void *Addr, const char *Filename)
 {
         int    addrLen = Net_GetAddressSize(AddrType);
-        int    i;
-       uint8_t *addrBuffer = Addr;
        char    hexAddr[addrLen*2+1];
        
-       for( i = 0; i < addrLen; i ++ )
-               sprintf(hexAddr+i*2, "%02x", addrBuffer[i]);
+       {
+               const uint8_t   *addrBuffer = Addr;
+               for( unsigned int i = 0; i < addrLen; i ++ )
+                       sprintf(hexAddr+i*2, "%02x", addrBuffer[i]);
+       }
        
        if(Filename)
        {
@@ -37,14 +45,27 @@ int Net_OpenSocket(int AddrType, void *Addr, const char *Filename)
        }
 }
 
-int Net_OpenSocket_TCPC(int AddrType, void *Addr, int Port)
+int Net_OpenSocket_TCPC(int AddrType, const void *Addr, int Port)
 {
        int fd = Net_OpenSocket(AddrType, Addr, "tcpc");
        if( fd == -1 )  return -1;
        
        _SysIOCtl(fd, 5, &Port);        // Remote Port
-        _SysIOCtl(fd, 6, Addr);        // Remote address
+        _SysIOCtl(fd, 6, (void*)Addr); // Remote address (kernel shouldn't modify)
        _SysIOCtl(fd, 7, NULL); // connect
        return fd;
 }
 
+int Net_OpenSocket_UDP(int AddrType, const void *Addr, int RPort, int LPort)
+{
+       int fd = Net_OpenSocket(AddrType, Addr, "udp");
+       if( fd == -1 )  return -1;
+       
+       _SysIOCtl(fd, UDP_IOCTL_GETSETLPORT, &LPort);   // Remote Port
+       int maskbits = Net_GetAddressSize(AddrType) * 8;
+       _SysIOCtl(fd, UDP_IOCTL_GETSETRPORT, &RPort);
+       _SysIOCtl(fd, UDP_IOCTL_GETSETRMASK, &maskbits);
+        _SysIOCtl(fd, UDP_IOCTL_SETRADDR, (void*)Addr);        // Remote address (kernel shouldn't modify)
+       return fd;
+}
+

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