#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip6.h>
+#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <stdarg.h>
static void cmd_connect(struct socket *sk, struct uidata *data, int argc, wchar_t **argv)
{
int valid;
+ struct in6_addr mv4lo;
if(confgetint("ui", "onlylocal"))
{
valid = ((struct sockaddr_in *)sk->remote)->sin_addr.s_addr == INADDR_LOOPBACK;
break;
case AF_INET6:
- valid = !memcmp(&((struct sockaddr_in6 *)sk->remote)->sin6_addr, &in6addr_loopback, sizeof(in6addr_loopback));
+ inet_pton(AF_INET6, "::ffff:127.0.0.1", &mv4lo);
+ valid = 0;
+ if(!memcmp(&((struct sockaddr_in6 *)sk->remote)->sin6_addr, &in6addr_loopback, sizeof(in6addr_loopback)))
+ valid = 1;
+ if(!memcmp(&((struct sockaddr_in6 *)sk->remote)->sin6_addr, &mv4lo, sizeof(in6addr_loopback)))
+ valid = 1;
break;
default:
valid = 0;
sq(sk, 0, L"200", L"%%i", total, L"tth", L"%%i", hashed, NULL);
}
+static void cmd_transstatus(struct socket *sk, struct uidata *data, int argc, wchar_t **argv)
+{
+ wchar_t *buf1, *buf2;
+
+ havepriv(PERM_TRANS);
+ buf1 = swprintf2(L"%lli", bytesdownload);
+ buf2 = swprintf2(L"%lli", bytesupload);
+ sq(sk, 0, L"200", L"%%ls", buf1, L"%%ls", buf2, NULL);
+ free(buf1);
+ free(buf2);
+}
+
#undef haveargs
#undef havepriv
{L"filtercmd", cmd_filtercmd},
{L"lstrarg", cmd_lstrarg},
{L"hashstatus", cmd_hashstatus},
+ {L"transstatus", cmd_transstatus},
{NULL, NULL}
};