Use poll instead of select

Close #637
This commit is contained in:
topjohnwu 2018-10-04 15:06:13 -04:00
parent 37860181d4
commit e8e39e0f3c
4 changed files with 23 additions and 23 deletions

View File

@ -40,23 +40,11 @@ int create_rand_socket(struct sockaddr_un *sun) {
}
int socket_accept(int sockfd, int timeout) {
struct timeval tv;
fd_set fds;
int rc;
tv.tv_sec = timeout;
tv.tv_usec = 0;
FD_ZERO(&fds);
FD_SET(sockfd, &fds);
do {
rc = select(sockfd + 1, &fds, NULL, NULL, &tv);
} while (rc < 0 && errno == EINTR);
if (rc < 1) {
PLOGE("select");
return -1;
}
return xaccept4(sockfd, NULL, NULL, SOCK_CLOEXEC);
struct pollfd pfd = {
.fd = sockfd,
.events = POLL_IN
};
return xpoll(&pfd, 1, timeout * 1000) <= 0 ? -1 : xaccept4(sockfd, NULL, NULL, SOCK_CLOEXEC);
}
/*

View File

@ -168,12 +168,14 @@ static struct su_info *get_su_info(unsigned uid) {
// Connect manager
app_connect(addr.sun_path + 1, info);
int fd = socket_accept(sockfd, 60);
socket_send_request(fd, info);
int ret = read_int_be(fd);
info->access.policy = ret < 0 ? DENY : ret;
close(fd);
if (fd < 0) {
info->access.policy = DENY;
} else {
socket_send_request(fd, info);
int ret = read_int_be(fd);
info->access.policy = ret < 0 ? DENY : ret;
close(fd);
}
close(sockfd);
}

View File

@ -7,6 +7,7 @@
#include <stdio.h>
#include <dirent.h>
#include <pthread.h>
#include <poll.h>
#include <sys/socket.h>
#include <sys/stat.h>
@ -78,6 +79,7 @@ void *xmmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);
ssize_t xsendfile(int out_fd, int in_fd, off_t *offset, size_t count);
pid_t xfork();
int xpoll(struct pollfd *fds, nfds_t nfds, int timeout);
// misc.c

View File

@ -394,3 +394,11 @@ pid_t xfork() {
}
return ret;
}
int xpoll(struct pollfd *fds, nfds_t nfds, int timeout) {
int ret = poll(fds, nfds, timeout);
if (ret == -1) {
PLOGE("poll");
}
return ret;
}