hackman has asked for the wisdom of the Perl Monks concerning the following question:
I wish to have something similar to this C function:use constant SOCK_PATH => '/tmp/catsock'; socket(Server, AF_UNIX, SOCK_STREAM,0) or die "socket: $!"; setsockopt(Server, SOL_SOCKET, SO_PASSCRED, 1) or die "SO_PASSCRED: $! +\n"; unlink(SOCK_PATH); bind (Server, sockaddr_un(SOCK_PATH)) or die "bind: $!"; listen(Server, SOMAXCONN) or die "listen: $!"; for ( $waitedpid = 0; accept(Client,Server) || $waitedpid; $waitedpid += 0, close Client) { next if $waitedpid; my $n = unpack_sockaddr_un(getsockname(Client)); logmsg 'peer: ' . $n . "\n" . <Client>; }
int svc_recv(int fd, char *buffer, size_t size, struct ucred *cred) { char control[1024]; struct msghdr msg; struct cmsghdr *cmsg; struct iovec iov; int result; memset(&msg, 0, sizeof(msg)); iov.iov_base = buffer; iov.iov_len = size; msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_control = control; msg.msg_controllen = sizeof(control); if (recvmsg(fd, &msg, 0) < 0) return -1; result = -1; cmsg = CMSG_FIRSTHDR(&msg); while (cmsg != NULL) { if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_CREDENTIALS) { memcpy(cred, CMSG_DATA(cmsg), sizeof(*cred)); result = iov.iov_len; } else if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) { dispose_fds((int *) CMSG_DATA(cmsg), (cmsg->cmsg_len - CMSG_LEN(0))/sizeof( +int)); } cmsg = CMSG_NXTHDR(&msg, cmsg); } return result; }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: How to read UNIX socket credentials?
by hackman (Acolyte) on Jan 07, 2011 at 05:19 UTC | |
by ikegami (Patriarch) on Jan 07, 2011 at 09:14 UTC | |
by hackman (Acolyte) on Jan 08, 2011 at 10:32 UTC | |
by sayotte (Initiate) on Feb 09, 2012 at 18:28 UTC | |
by cdarke (Prior) on Jan 07, 2011 at 08:38 UTC |