socket-util: add new getpeergroups() call
It's a wrapper around the new SO_PEERGROUPS sockopt, similar in style as getpeersec() and getpeercred().
This commit is contained in:
@@ -621,6 +621,10 @@ struct btrfs_ioctl_quota_ctl_args {
|
||||
# define SO_REUSEPORT 15
|
||||
#endif
|
||||
|
||||
#ifndef SO_PEERGROUPS
|
||||
# define SO_PEERGROUPS 59
|
||||
#endif
|
||||
|
||||
#ifndef EVIOCREVOKE
|
||||
# define EVIOCREVOKE _IOW('E', 0x91, int)
|
||||
#endif
|
||||
|
||||
@@ -1019,6 +1019,39 @@ int getpeersec(int fd, char **ret) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int getpeergroups(int fd, gid_t **ret) {
|
||||
socklen_t n = sizeof(gid_t) * 64;
|
||||
_cleanup_free_ gid_t *d = NULL;
|
||||
|
||||
assert(fd);
|
||||
assert(ret);
|
||||
|
||||
for (;;) {
|
||||
d = malloc(n);
|
||||
if (!d)
|
||||
return -ENOMEM;
|
||||
|
||||
if (getsockopt(fd, SOL_SOCKET, SO_PEERGROUPS, d, &n) >= 0)
|
||||
break;
|
||||
|
||||
if (errno != ERANGE)
|
||||
return -errno;
|
||||
|
||||
d = mfree(d);
|
||||
}
|
||||
|
||||
assert_se(n % sizeof(gid_t) == 0);
|
||||
n /= sizeof(gid_t);
|
||||
|
||||
if ((socklen_t) (int) n != n)
|
||||
return -E2BIG;
|
||||
|
||||
*ret = d;
|
||||
d = NULL;
|
||||
|
||||
return (int) n;
|
||||
}
|
||||
|
||||
int send_one_fd_sa(
|
||||
int transport_fd,
|
||||
int fd,
|
||||
|
||||
@@ -138,6 +138,7 @@ bool address_label_valid(const char *p);
|
||||
|
||||
int getpeercred(int fd, struct ucred *ucred);
|
||||
int getpeersec(int fd, char **ret);
|
||||
int getpeergroups(int fd, gid_t **ret);
|
||||
|
||||
int send_one_fd_sa(int transport_fd,
|
||||
int fd,
|
||||
|
||||
Reference in New Issue
Block a user