Dolda2000 GitWeb
/
doldaconnect.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Require Gtk 2.6 in dolcon apkg, for treeview progress bars.
[doldaconnect.git]
/
daemon
/
net.c
diff --git
a/daemon/net.c
b/daemon/net.c
index
78df0be
..
6af0e0a
100644
(file)
--- a/
daemon/net.c
+++ b/
daemon/net.c
@@
-1,6
+1,6
@@
/*
* Dolda Connect - Modular multiuser Direct Connect-style client
/*
* 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
*
* 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;
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:
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;
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))
{
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((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);
{
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;
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));
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)
}
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);
}
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);
{
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)
{
{
if((ret = read(data->fd, buf, sizeof(buf))) != 4)
{
- errno = ENO
NE
T;
+ errno = ENO
EN
T;
data->callback(NULL, 0, data->data);
} else {
ipv4 = (struct sockaddr_in *)&data->addr;
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 {
data->callback((struct sockaddr *)ipv4, sizeof(*ipv4), data->data);
}
} else {
- errno = ENO
NE
T;
+ errno = ENO
EN
T;
data->callback(NULL, 0, data->data);
}
close(data->fd);
data->callback(NULL, 0, data->data);
}
close(data->fd);