Use proper e-mail address format everywhere.
[doldaconnect.git] / daemon / net.c
index 78df0be..6af0e0a 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
@@ -183,7 +183,8 @@ static struct socket *newsock(int type)
     new->close = 0;
     new->remote = NULL;
     new->remotelen = 0;
-    memset(&new->ucred, 0, sizeof(new->ucred));
+    new->ucred.uid = -1;
+    new->ucred.gid = -1;
     switch(type)
     {
     case SOCK_STREAM:
@@ -350,19 +351,21 @@ void *sockgetinbuf(struct socket *sk, size_t *size)
 static void recvcmsg(struct socket *sk, struct msghdr *msg)
 {
     struct cmsghdr *cmsg;
-    struct ucred *cred;
     
     for(cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL; cmsg = CMSG_NXTHDR(msg, cmsg))
     {
+#if UNIX_AUTH_STYLE == 1
        if((cmsg->cmsg_level == SOL_SOCKET) && (cmsg->cmsg_type == SCM_CREDENTIALS))
        {
-           if(sk->ucred.pid == 0)
+           struct ucred *cred;
+           if(sk->ucred.uid == -1)
            {
                cred = (struct ucred *)CMSG_DATA(cmsg);
-               memcpy(&sk->ucred, cred, sizeof(*cred));
-               flog(LOG_INFO, "received Unix creds: pid %i, uid %i, gid %i", cred->pid, cred->uid, cred->gid);
+               sk->ucred.uid = cred->uid;
+               sk->ucred.gid = cred->gid;
            }
        }
+#endif
     }
 }
 
@@ -820,8 +823,17 @@ static void acceptunix(struct socket *sk)
     int buf;
     
     buf = 1;
+#if UNIX_AUTH_STYLE == 1
     if(setsockopt(sk->fd, SOL_SOCKET, SO_PASSCRED, &buf, sizeof(buf)) < 0)
        flog(LOG_WARNING, "could not enable SO_PASSCRED on Unix socket %i: %s", sk->fd, strerror(errno));
+#elif UNIX_AUTH_STYLE == 2
+    if(getpeereid(sk->fd, &sk->ucred.uid, &sk->ucred.gid) < 0)
+    {
+       flog(LOG_WARNING, "could not get peer creds on Unix socket %i: %s", sk->fd, strerror(errno));
+       sk->ucred.uid = -1;
+       sk->ucred.gid = -1;
+    }
+#endif
 }
 
 int pollsocks(int timeout)
@@ -1007,7 +1019,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);
@@ -1071,7 +1083,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;
@@ -1079,7 +1091,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);