[PATCH] compat: Add another rudimentary poll() emulation
From: Jonathan Nieder <hidden>
Date: 2016-06-15 22:48:52
Subsystem:
kernel build + files below scripts/ (unless maintained elsewhere), the rest · Maintainers:
Nathan Chancellor, Nicolas Schier, Linus Torvalds
Implement the subset of poll() semantics needed by git in terms of select(), for use by the Interix port. Inspired by commit 6ed807f (Windows: A rudimentary poll() emulation, 2007-12-01). Cc: Johannes Sixt <redacted> Cc: Jonathan Callen <redacted> Signed-off-by: Jonathan Nieder <redacted> --- Jonathan Callen wrote:
Some systems do not have sys/poll.h or poll(2).
Maybe this could help. Thanks to DrNick on IRC for the suggestion. Warning: untested. Makefile | 8 ++++++++ compat/poll.c | 33 +++++++++++++++++++++++++++++++++ compat/poll.h | 13 +++++++++++++ git-compat-util.h | 6 +++++- 4 files changed, 59 insertions(+), 1 deletions(-) create mode 100644 compat/poll.c create mode 100644 compat/poll.h
diff --git a/Makefile b/Makefile
index 2f5d631..6715528 100644
--- a/Makefile
+++ b/Makefile@@ -111,6 +111,9 @@ all:: # # Define NO_PTHREADS if you do not have or do not want to use Pthreads. # +# Define NO_POLL if you have a problem with the poll() system call (e.g. +# Interix). +# # Define NO_PREAD if you have a problem with pread() system call (e.g. # cygwin1.dll before v1.5.22). #
@@ -470,6 +473,7 @@ LIB_H += commit.h LIB_H += compat/bswap.h LIB_H += compat/cygwin.h LIB_H += compat/mingw.h +LIB_H += compat/poll.h LIB_H += compat/win32/pthread.h LIB_H += csum-file.h LIB_H += decorate.h
@@ -1284,6 +1288,10 @@ endif ifdef OBJECT_CREATION_USES_RENAMES COMPAT_CFLAGS += -DOBJECT_CREATION_MODE=1 endif +ifdef NO_POLL + BASIC_CFLAGS += -DNO_POLL + COMPAT_OBJS += compat/poll.o +endif ifdef NO_PREAD COMPAT_CFLAGS += -DNO_PREAD COMPAT_OBJS += compat/pread.o
diff --git a/compat/poll.c b/compat/poll.c
new file mode 100644
index 0000000..33c6ae0
--- /dev/null
+++ b/compat/poll.c@@ -0,0 +1,33 @@ +#include "../git-compat-util.h" + +int git_poll(struct git_pollfd *ufds, int nfds, int timeout) +{ + int i, maxfd, result; + fd_set fds; + + if (timeout >= 0) { + if (nfds == 0) { + sleep(timeout); + return 0; + } + return errno = EINVAL, error("poll timeout not supported"); + } + + FD_ZERO(&fds); + maxfd = 0; + for (i = 0; i < nfds; i++) { + if (ufds[i].events != POLLIN) + return errno = EINVAL, error("poll: unsupported events"); + maxfd = (ufds[i].fd > maxfd) ? ufds[i].fd : maxfd; + FD_SET(ufds[i].fd, &fds); + } + + result = select(maxfd + 1, &fds, NULL, NULL, NULL); + if (result == -1) + return result; + for (i = 0; i < nfds; i++) { + if (FD_ISSET(ufds[i].fd, &fds)) + ufds[i].revents |= POLLIN; + } + return result; +}
diff --git a/compat/poll.h b/compat/poll.h
new file mode 100644
index 0000000..65775ab
--- /dev/null
+++ b/compat/poll.h@@ -0,0 +1,13 @@ +#ifndef POLLIN +#define POLLIN 1 +#define POLLHUP 2 +#endif + +#define pollfd git_pollfd +#define poll git_poll +struct git_pollfd { + int fd; /* file descriptor */ + short events; /* requested events */ + short revents; /* returned events */ +}; +extern int git_poll(struct git_pollfd *fds, int nfds, int timeout);
diff --git a/git-compat-util.h b/git-compat-util.h
index 824c175..2494378 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h@@ -94,13 +94,17 @@ #include <utime.h> #ifndef __MINGW32__ #include <sys/wait.h> -#include <sys/poll.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <termios.h> #ifndef NO_SYS_SELECT_H #include <sys/select.h> #endif +#ifdef NO_POLL +#include "compat/poll.h" +#else +#include <sys/poll.h> +#endif #include <netinet/in.h> #include <netinet/tcp.h> #include <arpa/inet.h>
--
1.7.1