X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Fnet.c;h=9b5a34a8828c8c6fb9ddcc119d05d8b3ec216b9d;hb=refs%2Fheads%2Fjava;hp=78df0becab99e62587bd0f85b0eed155c972d7b4;hpb=987518f8933f88fae1987c600890dd75464a54d2;p=doldaconnect.git diff --git a/daemon/net.c b/daemon/net.c index 78df0be..9b5a34a 100644 --- a/daemon/net.c +++ b/daemon/net.c @@ -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 * * 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 } } @@ -546,7 +549,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, '/')) { @@ -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);