make it possible to build on systems without SO_PEERCRED (still doesn't work)
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@14555 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -46,7 +46,11 @@ struct descr {
|
|||||||
struct sockaddr_storage __ss;
|
struct sockaddr_storage __ss;
|
||||||
struct sockaddr *sa;
|
struct sockaddr *sa;
|
||||||
socklen_t sock_len;
|
socklen_t sock_len;
|
||||||
struct ucred peercred;
|
struct {
|
||||||
|
uid_t uid;
|
||||||
|
gid_t gid;
|
||||||
|
pid_t pid;
|
||||||
|
} peercred;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -104,6 +108,13 @@ init_socket(struct descr *d)
|
|||||||
setsockopt(d->s, SOL_SOCKET, SO_REUSEADDR, (void *)&one, sizeof(one));
|
setsockopt(d->s, SOL_SOCKET, SO_REUSEADDR, (void *)&one, sizeof(one));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef LOCAL_CREDS
|
||||||
|
{
|
||||||
|
int one = 1;
|
||||||
|
setsockopt(d->s, 0, LOCAL_CREDS, (void *)&one, sizeof(one));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
d->type = SOCK_STREAM;
|
d->type = SOCK_STREAM;
|
||||||
|
|
||||||
unlink(d->path);
|
unlink(d->path);
|
||||||
@@ -325,7 +336,6 @@ handle_stream(struct descr *d, int index, int min_free)
|
|||||||
unsigned char buf[1024];
|
unsigned char buf[1024];
|
||||||
int n;
|
int n;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
socklen_t peercredlen;
|
|
||||||
|
|
||||||
if (d[index].timeout == 0) {
|
if (d[index].timeout == 0) {
|
||||||
add_new_stream (d, index, min_free);
|
add_new_stream (d, index, min_free);
|
||||||
@@ -336,11 +346,24 @@ handle_stream(struct descr *d, int index, int min_free)
|
|||||||
d[index].peercred.uid = -1;
|
d[index].peercred.uid = -1;
|
||||||
d[index].peercred.gid = -1;
|
d[index].peercred.gid = -1;
|
||||||
|
|
||||||
if (getsockopt(d[index].s, SOL_SOCKET, SO_PEERCRED, (void *)&d[index].peercred,
|
#ifdef SO_PEERCRED
|
||||||
&peercredlen) != 0) {
|
{
|
||||||
krb5_warn(kcm_context, errno, "failed to determine peer identity");
|
socklen_t pclen;
|
||||||
return;
|
struct ucred pc;
|
||||||
|
|
||||||
|
if (getsockopt(d[index].s, SOL_SOCKET, SO_PEERCRED, (void *)&pc,
|
||||||
|
&pclen) != 0) {
|
||||||
|
krb5_warn(kcm_context, errno, "failed to determine peer identity");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
d[index].peercred.uid = pc.uid;
|
||||||
|
d[index].peercred.gid = pc.gid;
|
||||||
|
d[index].peercred.pid = pc.pid;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
krb5_warnx(kcm_context, "code unimplemented to get peer identity");
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
n = recvfrom(d[index].s, buf, sizeof(buf), 0, NULL, NULL);
|
n = recvfrom(d[index].s, buf, sizeof(buf), 0, NULL, NULL);
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
|
Reference in New Issue
Block a user