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) { int socket_accept(int sockfd, int timeout) {
struct timeval tv; struct pollfd pfd = {
fd_set fds; .fd = sockfd,
int rc; .events = POLL_IN
};
tv.tv_sec = timeout; return xpoll(&pfd, 1, timeout * 1000) <= 0 ? -1 : xaccept4(sockfd, NULL, NULL, SOCK_CLOEXEC);
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);
} }
/* /*

View File

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

View File

@ -7,6 +7,7 @@
#include <stdio.h> #include <stdio.h>
#include <dirent.h> #include <dirent.h>
#include <pthread.h> #include <pthread.h>
#include <poll.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/stat.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); int fd, off_t offset);
ssize_t xsendfile(int out_fd, int in_fd, off_t *offset, size_t count); ssize_t xsendfile(int out_fd, int in_fd, off_t *offset, size_t count);
pid_t xfork(); pid_t xfork();
int xpoll(struct pollfd *fds, nfds_t nfds, int timeout);
// misc.c // misc.c

View File

@ -394,3 +394,11 @@ pid_t xfork() {
} }
return ret; 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;
}