X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibnet.so_src%2Fsocket.c;h=68335acc34828e13375334f8f57b2f779979fab3;hb=545c440973f9676efe7cb01edf9ec47b61023513;hp=f5933f2241dce56540424e539cadae3ffe1bc1e5;hpb=479d0634670b58da044bc58149662adba0ad1d0b;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libnet.so_src/socket.c b/Usermode/Libraries/libnet.so_src/socket.c index f5933f22..68335acc 100644 --- a/Usermode/Libraries/libnet.so_src/socket.c +++ b/Usermode/Libraries/libnet.so_src/socket.c @@ -10,41 +10,62 @@ #include #include -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) { - int len = snprintf(NULL, 100, "/Devices/ip/routes/@%i:%s/%s", AddrType, hexAddr, Filename); + int len = snprintf(NULL, 0, "/Devices/ip/routes/@%i:%s/%s", AddrType, hexAddr, Filename); char path[len+1]; - snprintf(path, 100, "/Devices/ip/routes/@%i:%s/%s", AddrType, hexAddr, Filename); + snprintf(path, len+1, "/Devices/ip/routes/@%i:%s/%s", AddrType, hexAddr, Filename); _SysDebug("%s", path); return _SysOpen(path, OPENFLAG_READ|OPENFLAG_WRITE); } else { - int len = snprintf(NULL, 100, "/Devices/ip/routes/@%i:%s", AddrType, hexAddr); + int len = snprintf(NULL, 0, "/Devices/ip/routes/@%i:%s", AddrType, hexAddr); char path[len+1]; - snprintf(path, 100, "/Devices/ip/routes/@%i:%s", AddrType, hexAddr); + snprintf(path, len+1, "/Devices/ip/routes/@%i:%s", AddrType, hexAddr); return _SysOpen(path, OPENFLAG_READ); } } -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; +} +