Conditional compiling for fnet-adc.c.
[doldaconnect.git] / daemon / net.c
index 5471e45..e0d12af 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Dolda Connect - Modular multiuser Direct Connect-style client
- *  Copyright (C) 2004 Fredrik Tolf (fredrik@dolda2000.com)
+ *  Copyright (C) 2004 Fredrik Tolf <fredrik@dolda2000.com>
  *  
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -388,12 +388,17 @@ static void sockrecv(struct socket *sk)
 #if defined(HAVE_LINUX_SOCKIOS_H) && defined(SIOCINQ)
        /* SIOCINQ is Linux-specific AFAIK, but I really have no idea
         * how to read the inqueue size on other OSs */
-       if(ioctl(sk->fd, SIOCINQ, &inq))
-       {
-           /* I don't really know what could go wrong here, so let's
-            * assume it's transient. */
-           flog(LOG_WARNING, "SIOCINQ return %s on socket %i, falling back to 2048 bytes", strerror(errno), sk->fd);
-           inq = 2048;
+       if(sk->isrealsocket) {
+           if(ioctl(sk->fd, SIOCINQ, &inq))
+           {
+               /* I don't really know what could go wrong here, so let's
+                * assume it's transient. */
+               flog(LOG_WARNING, "SIOCINQ return %s on socket %i, falling back to 2048 bytes", strerror(errno), sk->fd);
+               inq = 2048;
+           }
+       } else {
+           /* There are perils when trying to use SIOCINQ on files >2GiB... */
+           inq = 65536;
        }
 #else
        inq = 2048;
@@ -549,7 +554,7 @@ void closesock(struct socket *sk)
 {
     struct sockaddr_un *un;
     
-    if((sk->family == AF_UNIX) && !sockgetlocalname(sk, (struct sockaddr **)&un, NULL) && (un->sun_family == PF_UNIX))
+    if((sk->family == AF_UNIX) && !sockgetlocalname(sk, (struct sockaddr **)(void *)&un, NULL) && (un->sun_family == PF_UNIX))
     {
        if((sk->state == SOCK_LST) && strchr(un->sun_path, '/'))
        {
@@ -1019,7 +1024,7 @@ int socksettos(struct socket *sk, int tos)
            flog(LOG_WARNING, "attempted to set unknown TOS value %i to IPv4 sock", tos);
            return(-1);
        }
-       if(setsockopt(sk->fd, SOL_IP, IP_TOS, &buf, sizeof(buf)) < 0)
+       if(setsockopt(sk->fd, IPPROTO_IP, IP_TOS, &buf, sizeof(buf)) < 0)
        {
            flog(LOG_WARNING, "could not set sock TOS to %i: %s", tos, strerror(errno));
            return(-1);
@@ -1083,7 +1088,7 @@ static void resolvecb(pid_t pid, int status, struct resolvedata *data)
     {
        if((ret = read(data->fd, buf, sizeof(buf))) != 4)
        {
-           errno = ENONET;
+           errno = ENOENT;
            data->callback(NULL, 0, data->data);
        } else {
            ipv4 = (struct sockaddr_in *)&data->addr;
@@ -1091,7 +1096,7 @@ static void resolvecb(pid_t pid, int status, struct resolvedata *data)
            data->callback((struct sockaddr *)ipv4, sizeof(*ipv4), data->data);
        }
     } else {
-       errno = ENONET;
+       errno = ENOENT;
        data->callback(NULL, 0, data->data);
     }
     close(data->fd);