Skip to content

Commit

Permalink
Merge branch 'js/poll-emu'
Browse files Browse the repository at this point in the history
* js/poll-emu:
  make poll() work on platforms that can't recv() on a non-socket
  poll() exits too early with EFAULT if 1st arg is NULL
  fix some win32 specific dependencies in poll.c
  make poll available for other platforms lacking it
  • Loading branch information
Junio C Hamano committed Sep 25, 2012
2 parents 0ec6aa5 + a677294 commit d782797
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 8 deletions.
20 changes: 15 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,11 @@ all::
#
# Define NO_MMAP if you want to avoid mmap.
#
# Define NO_SYS_POLL_H if you don't have sys/poll.h.
#
# Define NO_POLL if you do not have or don't want to use poll().
# This also implies NO_SYS_POLL_H.
#
# Define NO_PTHREADS if you do not have or do not want to use Pthreads.
#
# Define NO_PREAD if you have a problem with pread() system call (e.g.
Expand Down Expand Up @@ -604,10 +609,10 @@ LIB_H += compat/bswap.h
LIB_H += compat/cygwin.h
LIB_H += compat/mingw.h
LIB_H += compat/obstack.h
LIB_H += compat/poll/poll.h
LIB_H += compat/precompose_utf8.h
LIB_H += compat/terminal.h
LIB_H += compat/win32/dirent.h
LIB_H += compat/win32/poll.h
LIB_H += compat/win32/pthread.h
LIB_H += compat/win32/syslog.h
LIB_H += connected.h
Expand Down Expand Up @@ -1225,7 +1230,7 @@ ifeq ($(uname_S),Windows)
NO_PREAD = YesPlease
NEEDS_CRYPTO_WITH_SSL = YesPlease
NO_LIBGEN_H = YesPlease
NO_SYS_POLL_H = YesPlease
NO_POLL = YesPlease
NO_SYMLINK_HEAD = YesPlease
NO_IPV6 = YesPlease
NO_UNIX_SOCKETS = YesPlease
Expand Down Expand Up @@ -1266,7 +1271,7 @@ ifeq ($(uname_S),Windows)
BASIC_CFLAGS = -nologo -I. -I../zlib -Icompat/vcbuild -Icompat/vcbuild/include -DWIN32 -D_CONSOLE -DHAVE_STRING_H -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE
COMPAT_OBJS = compat/msvc.o compat/winansi.o \
compat/win32/pthread.o compat/win32/syslog.o \
compat/win32/poll.o compat/win32/dirent.o
compat/win32/dirent.o
COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DNOGDI -DHAVE_STRING_H -DHAVE_ALLOCA_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\"
BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -SUBSYSTEM:CONSOLE -NODEFAULTLIB:MSVCRT.lib
EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.lib
Expand Down Expand Up @@ -1321,7 +1326,7 @@ ifneq (,$(findstring MINGW,$(uname_S)))
NO_PREAD = YesPlease
NEEDS_CRYPTO_WITH_SSL = YesPlease
NO_LIBGEN_H = YesPlease
NO_SYS_POLL_H = YesPlease
NO_POLL = YesPlease
NO_SYMLINK_HEAD = YesPlease
NO_UNIX_SOCKETS = YesPlease
NO_SETENV = YesPlease
Expand Down Expand Up @@ -1356,7 +1361,7 @@ ifneq (,$(findstring MINGW,$(uname_S)))
COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
COMPAT_OBJS += compat/mingw.o compat/winansi.o \
compat/win32/pthread.o compat/win32/syslog.o \
compat/win32/poll.o compat/win32/dirent.o
compat/win32/dirent.o
EXTLIBS += -lws2_32
PTHREAD_LIBS =
X = .exe
Expand Down Expand Up @@ -1610,6 +1615,11 @@ ifdef NO_GETTEXT
BASIC_CFLAGS += -DNO_GETTEXT
USE_GETTEXT_SCHEME ?= fallthrough
endif
ifdef NO_POLL
NO_SYS_POLL_H = YesPlease
COMPAT_CFLAGS += -DNO_POLL -Icompat/poll
COMPAT_OBJS += compat/poll/poll.o
endif
ifdef NO_STRCASESTR
COMPAT_CFLAGS += -DNO_STRCASESTR
COMPAT_OBJS += compat/strcasestr.o
Expand Down
14 changes: 11 additions & 3 deletions compat/win32/poll.c → compat/poll/poll.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@
# pragma GCC diagnostic ignored "-Wtype-limits"
#endif

#include <malloc.h>
#if defined(WIN32)
# include <malloc.h>
#endif

#include <sys/types.h>

Expand All @@ -48,7 +50,9 @@
#else
# include <sys/time.h>
# include <sys/socket.h>
# include <sys/select.h>
# ifndef NO_SYS_SELECT_H
# include <sys/select.h>
# endif
# include <unistd.h>
#endif

Expand Down Expand Up @@ -302,6 +306,10 @@ compute_revents (int fd, int sought, fd_set *rfds, fd_set *wfds, fd_set *efds)
|| socket_errno == ECONNABORTED || socket_errno == ENETRESET)
happened |= POLLHUP;

/* some systems can't use recv() on non-socket, including HP NonStop */
else if (/* (r == -1) && */ socket_errno == ENOTSOCK)
happened |= (POLLIN | POLLRDNORM) & sought;

else
happened |= POLLERR;
}
Expand Down Expand Up @@ -349,7 +357,7 @@ poll (struct pollfd *pfd, nfds_t nfd, int timeout)

/* EFAULT is not necessary to implement, but let's do it in the
simplest case. */
if (!pfd)
if (!pfd && nfd)
{
errno = EFAULT;
return -1;
Expand Down
File renamed without changes.

0 comments on commit d782797

Please sign in to comment.