Index: sys/sys/protosw.h =================================================================== RCS file: /cvsroot/syssrc/sys/sys/protosw.h,v retrieving revision 1.17 diff -u -r1.17 protosw.h --- protosw.h 1998/06/02 20:55:53 1.17 +++ protosw.h 2000/08/09 00:17:38 @@ -152,8 +152,9 @@ #define PRU_SLOWTIMO 19 /* 500ms timeout */ #define PRU_PROTORCV 20 /* receive from below */ #define PRU_PROTOSEND 21 /* send to below */ +#define PRU_PEEREID 22 /* get local peer eid */ -#define PRU_NREQ 22 +#define PRU_NREQ 23 #ifdef PRUREQUESTS char *prurequests[] = { @@ -162,7 +163,7 @@ "RCVD", "SEND", "ABORT", "CONTROL", "SENSE", "RCVOOB", "SENDOOB", "SOCKADDR", "PEERADDR", "CONNECT2", "FASTTIMO", "SLOWTIMO", - "PROTORCV", "PROTOSEND", + "PROTORCV", "PROTOSEND", "PEEREID", }; #endif Index: sys/sys/socket.h =================================================================== RCS file: /cvsroot/syssrc/sys/sys/socket.h,v retrieving revision 1.43 diff -u -r1.43 socket.h --- socket.h 1999/02/11 20:33:26 1.43 +++ socket.h 2000/08/09 00:17:42 @@ -399,6 +399,7 @@ int accept __P((int, struct sockaddr *, socklen_t *)); int bind __P((int, const struct sockaddr *, socklen_t)); int connect __P((int, const struct sockaddr *, socklen_t)); +int getpeereid __P((int, uid_t *, gid_t *)); int getpeername __P((int, struct sockaddr *, socklen_t *)); int getsockname __P((int, struct sockaddr *, socklen_t *)); int getsockopt __P((int, int, int, void *, socklen_t *)); Index: sys/sys/unpcb.h =================================================================== RCS file: /cvsroot/syssrc/sys/sys/unpcb.h,v retrieving revision 1.11 diff -u -r1.11 unpcb.h --- unpcb.h 1998/01/07 22:49:47 1.11 +++ unpcb.h 2000/08/09 00:17:43 @@ -69,6 +69,10 @@ * N.B.: updating st_[am]time when reading/writing the pipe is not required, * so we just use a single timespec and do not implement that. */ +struct unpcbid { + uid_t unp_euid; + gid_t unp_egid; +}; struct unpcb { struct socket *unp_socket; /* pointer back to socket */ struct vnode *unp_vnode; /* if associated with file */ @@ -78,6 +82,8 @@ struct unpcb *unp_nextref; /* link in unp_refs list */ struct sockaddr_un *unp_addr; /* bound address of socket */ size_t unp_addrlen; /* size of socket address */ + int unp_eids; /* this unpcb contains peer eids */ + struct unpcbid unp_connid; /* id of peer process */ int unp_cc; /* copy of rcv.sb_cc */ int unp_mbcnt; /* copy of rcv.sb_mbcnt */ struct timespec unp_ctime; /* holds creation time */ Index: sys/kern/syscalls.master =================================================================== RCS file: /cvsroot/syssrc/sys/kern/syscalls.master,v retrieving revision 1.90 diff -u -r1.90 syscalls.master --- syscalls.master 1999/03/28 17:29:52 1.90 +++ syscalls.master 2000/08/09 00:17:51 @@ -566,3 +566,4 @@ 295 STD { int sys___sigreturn14(struct sigcontext *sigcntxp); } 296 STD { int sys___getcwd(char *bufp, size_t length); } 297 STD { int sys_fchroot(int fd); } +298 STD { int sys_getpeereid(int fdes, uid_t *euid, gid_t *egid); } Index: sys/kern/uipc_syscalls.c =================================================================== RCS file: /cvsroot/syssrc/sys/kern/uipc_syscalls.c,v retrieving revision 1.41.2.1 diff -u -r1.41.2.1 uipc_syscalls.c --- uipc_syscalls.c 1999/06/21 19:22:11 1.41.2.1 +++ uipc_syscalls.c 2000/08/09 00:18:06 @@ -61,6 +61,7 @@ #include #include #include +#include #include #ifdef KTRACE #include @@ -1010,6 +1011,52 @@ if (error) goto bad; error = copyout((caddr_t)&len, (caddr_t)SCARG(uap, alen), sizeof(len)); +bad: + m_freem(m); + return (error); +} + +/* + * Get eid of peer for connected socket. + */ +/* ARGSUSED */ +int +sys_getpeereid(p, v, retval) + struct proc *p; + void *v; + register_t *retval; +{ + register struct sys_getpeereid_args /* { + syscallarg(int) fdes; + syscallarg(uid_t *) euid; + syscallarg(gid_t *) egid; + } */ *uap = v; + struct file *fp; + register struct socket *so; + struct mbuf *m; + struct unpcbid *id; + int error; + + if ((error = getsock(p->p_fd, SCARG(uap, fdes), &fp)) != 0) + return (error); + so = (struct socket *)fp->f_data; + if (so->so_proto != pffindtype(AF_LOCAL,SOCK_STREAM)) + return (EOPNOTSUPP); + m = m_getclr(M_WAIT, MT_SONAME); + if (m == NULL) + return (ENOBUFS); + error = (*so->so_proto->pr_usrreq)(so, PRU_PEEREID, (struct mbuf *)0, + m, (struct mbuf *)0, (struct proc *)0); + if ((!error) && (m->m_len != sizeof(struct unpcbid))) + error = EOPNOTSUPP; + if (error) + goto bad; + id = mtod(m, struct unpcbid *); + error = copyout((caddr_t)(&(id->unp_euid)), + (caddr_t)SCARG(uap, euid), sizeof(uid_t)); + if (error == 0) + error = copyout((caddr_t)(&(id->unp_egid)), + (caddr_t)SCARG(uap, egid), sizeof(gid_t)); bad: m_freem(m); return (error); Index: sys/kern/uipc_usrreq.c =================================================================== RCS file: /cvsroot/syssrc/sys/kern/uipc_usrreq.c,v retrieving revision 1.39.2.1 diff -u -r1.39.2.1 uipc_usrreq.c --- uipc_usrreq.c 1999/05/05 20:59:12 1.39.2.1 +++ uipc_usrreq.c 2000/08/09 00:18:16 @@ -163,6 +163,22 @@ memcpy(mtod(nam, caddr_t), sun, (size_t)nam->m_len); } +void +unp_setpeereid(unp, nam) + register struct unpcb *unp; + struct mbuf *nam; +{ + if (unp->unp_eids) { + nam->m_len = sizeof(struct unpcbid); + if (nam->m_len > MLEN) + MEXTMALLOC(nam, nam->m_len, M_WAITOK); + memcpy(mtod(nam, caddr_t), + (caddr_t)(&(unp->unp_connid)), + (size_t)nam->m_len); + } else + nam->m_len = 0; +} + /*ARGSUSED*/ int uipc_usrreq(so, req, m, nam, control, p) @@ -380,6 +396,10 @@ unp_setpeeraddr(unp, nam); break; + case PRU_PEEREID: + unp_setpeereid(unp, nam); + break; + default: panic("piusrreq"); } @@ -672,6 +692,9 @@ unp2->unp_addrlen); unp3->unp_addrlen = unp2->unp_addrlen; } + unp3->unp_connid.unp_euid = p->p_ucred->cr_uid; + unp3->unp_connid.unp_egid = p->p_ucred->cr_gid; + unp3->unp_eids = 1; unp3->unp_flags = unp2->unp_flags; so2 = so3; } Index: lib/libc/sys/Makefile.inc =================================================================== RCS file: /cvsroot/basesrc/lib/libc/sys/Makefile.inc,v retrieving revision 1.91.2.1 diff -u -r1.91.2.1 Makefile.inc --- Makefile.inc 1999/11/11 21:34:23 1.91.2.1 +++ Makefile.inc 2000/08/09 00:18:18 @@ -37,7 +37,7 @@ fdatasync.o fktrace.o flock.o fpathconf.o __fstat13.o fstatfs.o \ fsync.o futimes.o __getcwd.o \ getdents.o getfh.o getfsstat.o getgroups.o getitimer.o \ - __getlogin.o getpeername.o getpgid.o getpgrp.o \ + __getlogin.o getpeereid.o getpeername.o getpgid.o getpgrp.o \ getpriority.o getrlimit.o getrusage.o getsid.o getsockname.o \ getsockopt.o gettimeofday.o ioctl.o kill.o ktrace.o \ lchmod.o lchown.o __lstat13.o lfs_bmapv.o lfs_markv.o \