Networking - DNS resolution semi-working
[tpg/acess2.git] / Usermode / Libraries / libnet.so_src / socket.c
index 68335ac..825dc6f 100644 (file)
@@ -8,6 +8,7 @@
 #include <net.h>
 #include <stdio.h>
 #include <stdint.h>
+#include <string.h>    // memcpy
 #include <acess/sys.h>
 
 enum {
@@ -15,6 +16,8 @@ enum {
        UDP_IOCTL_GETSETRPORT,
        UDP_IOCTL_GETSETRMASK,
        UDP_IOCTL_SETRADDR,
+       UDP_IOCTL_SENDTO,
+       UDP_IOCTL_RECVFROM,
 };
 
 int Net_OpenSocket(int AddrType, const void *Addr, const char *Filename)
@@ -50,10 +53,16 @@ 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, (void*)Addr); // Remote address (kernel shouldn't modify)
-       _SysIOCtl(fd, 7, NULL); // connect
+       if( _SysIOCtl(fd, 5, &Port) < 0 )       // Remote Port
+               goto err;
+       if( _SysIOCtl(fd, 6, (void*)Addr) < 0 ) // Remote address (kernel shouldn't modify)
+               goto err;
+       if( _SysIOCtl(fd, 7, NULL) < 0) // connect
+               goto err;
        return fd;
+err:
+       _SysClose(fd);
+       return -1;
 }
 
 int Net_OpenSocket_UDP(int AddrType, const void *Addr, int RPort, int LPort)
@@ -61,11 +70,60 @@ 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
+       if( _SysIOCtl(fd, UDP_IOCTL_GETSETLPORT, &LPort) < 0 )
+               goto err;
+       if( _SysIOCtl(fd, UDP_IOCTL_GETSETRPORT, &RPort) < 0 )
+               goto err;
        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)
+       if( _SysIOCtl(fd, UDP_IOCTL_GETSETRMASK, &maskbits) < 0 )
+               goto err;
+       if( _SysIOCtl(fd, UDP_IOCTL_SETRADDR, (void*)Addr) < 0 )        // Remote address (kernel shouldn't modify)
+               goto err;
        return fd;
+err:
+       _SysClose(fd);
+       return -1;
+}
+
+int Net_UDP_SendTo(int FD, int Port, int AddrType, const void *Addr, size_t Length, const void *Data)
+{
+       struct {
+               uint16_t port;
+               uint16_t addr_type;
+               char    addr[16];
+       } ep;
+       ep.port = Port;
+       ep.addr_type = AddrType;
+       memcpy(ep.addr, Addr, Net_GetAddressSize(AddrType));
+       struct {
+               const void *ep;
+               const void *buf;
+               uint16_t len;
+       } info = { .ep = &ep, .buf = Data, .len = Length };
+       
+       return _SysIOCtl(FD, UDP_IOCTL_SENDTO, &info);
+}
+
+int Net_UDP_RecvFrom(int FD, int* Port, int* AddrType, void *Addr, size_t Length, void *Data)
+{
+       struct {
+               uint16_t port;
+               uint16_t addr_type;
+               char    addr[16];
+       } ep;
+       struct {
+               void *ep;
+               void *buf;
+               uint16_t len;
+       } info = { .ep = &ep, .buf = Data, .len = Length };
+       
+       int rv = _SysIOCtl(FD, UDP_IOCTL_RECVFROM, &info);
+       if( rv > 0 )
+       {
+               if(Port)        *Port = ep.port;
+               if(AddrType)    *AddrType = ep.addr_type;
+               if(Addr)        memcpy(Addr, ep.addr, Net_GetAddressSize(ep.addr_type));
+       }
+       return rv;
 }
 

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