From 1dfab46d367d11e9132506ee0f7d3eb2ceff5f3c Mon Sep 17 00:00:00 2001
Message-Id: <1dfab46d367d11e9132506ee0f7d3eb2ceff5f3c.1652913832.git.stefan@agner.ch>
From: Fabrice Fontaine <fontaine.fabrice@gmail.com>
Date: Mon, 30 Sep 2019 13:32:35 +0200
Subject: [PATCH] Rename poll.h into vm_poll.h to fix build failure on musl
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

musl libc redirects include of sys/poll.h to poll.h. But since poll.h is
also a local header file, the musl libc header is never included. This
leads to the following build failure:

In file included from asyncsocket.c:73:0:
.../host/i586-buildroot-linux-musl/sysroot/usr/include/sys/poll.h:1:2: warning: #warning redirecting incorrect #include <sys/poll.h> to <poll.h> [-Wcpp]
 #warning redirecting incorrect #include <sys/poll.h> to <poll.h>
asyncsocket.c: In function ‘AsyncTCPSocketPollWork’:
asyncsocket.c:2537:13: error: invalid use of undefined type ‘struct pollfd’
          pfd[i].fd = asock[i]->fd;
             ^
asyncsocket.c:2537:13: error: dereferencing pointer to incomplete type ‘struct pollfd’
asyncsocket.c:2538:13: error: invalid use of undefined type ‘struct pollfd’
          pfd[i].events = read ? POLLIN : POLLOUT;
             ^
asyncsocket.c:2538:33: error: ‘POLLIN’ undeclared (first use in this function); did you mean ‘POLL_IN’?
          pfd[i].events = read ? POLLIN : POLLOUT;

So rename poll.h into vm_poll.h as suggested by srowe in
https://github.com/vmware/open-vm-tools/issues/359#issuecomment-533529956

Fixes:
 - http://autobuild.buildroot.org/results/4f575ef42bbc4387a07e396205052b2da081c64d

Fix #359

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
[Upstream status: https://github.com/vmware/open-vm-tools/pull/383]
---
 lib/asyncsocket/asyncsocket.c |   4 +-
 lib/hgfsServer/hgfsServer.c   |   2 +-
 lib/include/asyncsocket.h     |   2 +-
 lib/include/poll.h            | 337 --------------------
 lib/include/pollImpl.h        |   2 +-
 lib/include/vm_poll.h         | 337 ++++++++++++++++++++
 lib/rpcIn/rpcin.c             |   2 +-
 7 files changed, 343 insertions(+), 343 deletions(-)
 delete mode 100644 lib/include/poll.h
 create mode 100644 lib/include/vm_poll.h

diff --git a/lib/asyncsocket/asyncsocket.c b/open-vm-tools/lib/asyncsocket/asyncsocket.c
index 05147d2e..16949567 100644
--- a/lib/asyncsocket/asyncsocket.c
+++ b/lib/asyncsocket/asyncsocket.c
@@ -70,8 +70,8 @@
 #else
 #include <stddef.h>
 #include <ctype.h>
+#include <poll.h>
 #include <sys/types.h>
-#include <sys/poll.h>
 #include <sys/socket.h>
 #include <sys/un.h>
 #include <netdb.h>
@@ -87,7 +87,7 @@
 #include "random.h"
 #include "asyncsocket.h"
 #include "asyncSocketBase.h"
-#include "poll.h"
+#include "vm_poll.h"
 #include "log.h"
 #include "err.h"
 #include "hostinfo.h"
diff --git a/lib/hgfsServer/hgfsServer.c b/open-vm-tools/lib/hgfsServer/hgfsServer.c
index 98f5b3f0..b436f0c7 100644
--- a/lib/hgfsServer/hgfsServer.c
+++ b/lib/hgfsServer/hgfsServer.c
@@ -51,7 +51,7 @@
 #include "hgfsDirNotify.h"
 #include "hgfsThreadpool.h"
 #include "userlock.h"
-#include "poll.h"
+#include "vm_poll.h"
 #include "mutexRankLib.h"
 #include "vm_basic_asm.h"
 #include "unicodeOperations.h"
diff --git a/lib/include/asyncsocket.h b/open-vm-tools/lib/include/asyncsocket.h
index 47b5b873..b8b0149e 100644
--- a/lib/include/asyncsocket.h
+++ b/lib/include/asyncsocket.h
@@ -171,7 +171,7 @@ typedef struct AsyncSocket AsyncSocket;
  * Or the client can specify its favorite poll class and locking behavior.
  * Use of IVmdbPoll is only supported for regular sockets and for Attach.
  */
-#include "poll.h"
+#include "vm_poll.h"
 struct IVmdbPoll;
 typedef struct AsyncSocketPollParams {
    int flags;               /* Default 0, only POLL_FLAG_NO_BULL is valid */
diff --git a/lib/include/poll.h b/open-vm-tools/lib/include/poll.h
deleted file mode 100644
index c90f5dcd..00000000
--- a/lib/include/poll.h
+++ /dev/null
@@ -1,337 +0,0 @@
-/*********************************************************
- * Copyright (C) 1998-2020 VMware, Inc. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as published
- * by the Free Software Foundation version 2.1 and no later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the Lesser GNU General Public
- * License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA.
- *
- *********************************************************/
-
-/*********************************************************
- * The contents of this file are subject to the terms of the Common
- * Development and Distribution License (the "License") version 1.0
- * and no later version.  You may not use this file except in
- * compliance with the License.
- *
- * You can obtain a copy of the License at
- *         http://www.opensource.org/licenses/cddl1.php
- *
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- *********************************************************/
-
-
-#ifndef _POLL_H_
-#define _POLL_H_
-
-#define INCLUDE_ALLOW_USERLEVEL
-#define INCLUDE_ALLOW_VMCORE
-#include "includeCheck.h"
-
-#include "vm_basic_types.h"
-#include "vm_basic_defs.h"
-#include "vmware.h"
-#include "userlock.h"
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#ifdef _WIN32
-#define HZ 100
-#elif defined __linux__
-#include <asm/param.h>
-#elif __APPLE__
-#include <TargetConditionals.h>
-/*
- * Old SDKs don't define TARGET_OS_IPHONE at all.
- * New ones define it to 0 on Mac OS X, 1 on iOS.
- */
-#if !defined(TARGET_OS_IPHONE) || TARGET_OS_IPHONE == 0
-#include <sys/kernel.h>
-#endif
-#include <sys/poll.h>
-#define HZ 100
-#endif
-#ifdef __ANDROID__
-/*
- * <poll.h> of android should be included, but its name is same
- * with this file. So its content is put here to avoid conflict.
- */
-#include <asm/poll.h>
-#define HZ 100
-typedef unsigned int  nfds_t;
-int poll(struct pollfd *, nfds_t, long);
-#endif
-
-
-/*
- * Poll event types: each type has a different reason for firing,
- * or condition that must be met before firing.
- */
-
-typedef enum {
-   /*
-    * Actual Poll queue types against which you can register callbacks.
-    */
-   POLL_VIRTUALREALTIME = -1, /* Negative because it doesn't have its own Q */
-   POLL_VTIME = 0,
-   POLL_REALTIME,
-   POLL_DEVICE,
-   POLL_MAIN_LOOP,
-   POLL_NUM_QUEUES
-} PollEventType;
-
-
-/*
- * Classes of events
- *
- * These are the predefined classes.  More can be declared
- * with Poll_AllocClass().
- */
-
-typedef enum PollClass {
-   POLL_CLASS_MAIN,
-   POLL_CLASS_PAUSE,
-   POLL_CLASS_IPC,
-   POLL_CLASS_CPT,
-   POLL_CLASS_MKS,
-   POLL_FIXED_CLASSES,
-   POLL_DEFAULT_FIXED_CLASSES,
-   /* Size enum to maximum */
-   POLL_MAX_CLASSES = 31,
-} PollClass;
-
-/*
- * Do not use; Special pseudo private poll class supported by
- * PollDefault only
- */
-#define POLL_DEFAULT_CLASS_NET POLL_FIXED_CLASSES
-#define POLL_DEFAULT_CS_NET    PollClassSet_Singleton(POLL_DEFAULT_CLASS_NET)
-
-/*
- * Each callback is registered in a set of classes
- */
-
-typedef struct PollClassSet {
-   uintptr_t bits;
-} PollClassSet;
-
-/* An empty PollClassSet. */
-static INLINE PollClassSet
-PollClassSet_Empty(void)
-{
-   PollClassSet set = { 0 };
-   return set;
-}
-
-/* A PollClassSet with the single member. */
-static INLINE PollClassSet
-PollClassSet_Singleton(PollClass c)
-{
-   PollClassSet s = PollClassSet_Empty();
-
-   ASSERT_ON_COMPILE(POLL_MAX_CLASSES < sizeof s.bits * 8);
-   ASSERT(c < POLL_MAX_CLASSES);
-
-   s.bits = CONST3264U(1) << c;
-   return s;
-}
-
-/* Combine two PollClassSets. */
-static INLINE PollClassSet
-PollClassSet_Union(PollClassSet lhs, PollClassSet rhs)
-{
-   PollClassSet set;
-   set.bits = lhs.bits | rhs.bits;
-   return set;
-}
-
-/* Add single class to PollClassSet. */
-static INLINE PollClassSet
-PollClassSet_Include(PollClassSet set, PollClass c)
-{
-   return PollClassSet_Union(set, PollClassSet_Singleton(c));
-}
-
-
-#define POLL_CS_MAIN    PollClassSet_Singleton(POLL_CLASS_MAIN)
-#define POLL_CS_PAUSE   PollClassSet_Union(POLL_CS_MAIN,            \
-                           PollClassSet_Singleton(POLL_CLASS_PAUSE))
-#define POLL_CS_CPT     PollClassSet_Union(POLL_CS_PAUSE,           \
-                           PollClassSet_Singleton(POLL_CLASS_CPT))
-#define POLL_CS_IPC     PollClassSet_Union(POLL_CS_CPT,             \
-                           PollClassSet_Singleton(POLL_CLASS_IPC))
-#define POLL_CS_VMDB    POLL_CS_PAUSE /* POLL_CLASS_VMDB is retired */
-#define POLL_CS_MKS	PollClassSet_Singleton(POLL_CLASS_MKS)
-/* 
- * DANGER.  You don't need POLL_CS_ALWAYS.  Really.  So don't use it.
- */
-#define POLL_CS_ALWAYS  PollClassSet_Union(POLL_CS_CPT, POLL_CS_IPC)
-
-/*
- * Poll class-set taxonomy:
- * POLL_CS_MAIN
- *    - Unless you NEED another class, use POLL_CS_MAIN.
- * POLL_CS_PAUSE
- *    - For callbacks that must occur even if the guest is paused.
- *      Most VMDB or Foundry commands are in this category.
- * POLL_CS_CPT
- *    - Only for callbacks which can trigger intermediate Checkpoint 
- *      transitions.
- *      The ONLY such callback is Migrate.
- * POLL_CS_IPC
- *    - Only for callbacks which can contain Msg_(Post|Hint|Question) 
- *      responses, and for signal handlers (why)?
- *      Vigor, VMDB, and Foundry can contain Msg_* responses.
- * POLL_CS_MKS
- *    - Callback runs in MKS thread.
- * POLL_CS_ALWAYS
- *    - Only for events that must be processed immediately.
- *      The ONLY such callback is OvhdMemVmxSizeCheck.
- */
-
-
-/*
- * Poll_Callback flags
- */
-
-#define POLL_FLAG_PERIODIC		0x01    // keep after firing
-#define POLL_FLAG_REMOVE_AT_POWEROFF	0x02  	// self-explanatory
-#define POLL_FLAG_READ			0x04	// device is ready for reading
-#define POLL_FLAG_WRITE			0x08	// device is ready for writing
-#define POLL_FLAG_SOCKET                0x10    // device is a Windows socket
-#define POLL_FLAG_NO_BULL               0x20    // callback does its own locking
-#define POLL_FLAG_WINSOCK               0x40    // Winsock style write events
-#define POLL_FLAG_FD                    0x80    // device is a Windows file descriptor.
-#define POLL_FLAG_ACCEPT_INVALID_FDS    0x100   // For broken 3rd party libs, e.g. curl
-#define POLL_FLAG_THUNK_TO_WND          0x200   // thunk callback to window message loop
-
-
-typedef void (*PollerFunction)(void *clientData);
-typedef void (*PollerFireWrapper)(PollerFunction func,
-                                  void *funcData,
-                                  void *wrapperData);
-typedef Bool (*PollerErrorFn)(const char *errorStr);
-
-/*
- * Initialisers:
- *
- *      For the sake of convenience, we declare the initialisers
- *      for custom implmentations here, even though the actual
- *      implementations are distinct from the core poll code.
- */
-
-
-/* Socket pair created with non-blocking mode */
-#define POLL_OPTIONS_SOCKET_PAIR_NONBLOCK_CONN  0x01
-
-typedef unsigned int SocketSpecialOpts;
-
-typedef struct PollOptions {
-   Bool locked;           // Use internal MXUser for locking
-   Bool allowFullQueue;   // Don't assert when device event queue is full.
-   VThreadID windowsMsgThread;       // thread that processes Windows messages
-   PollerFireWrapper fireWrapperFn;  // optional; may be useful for stats
-   void *fireWrapperData; // optional
-   PollerErrorFn errorFn; // optional; called upon unrecoverable error
-   SocketSpecialOpts pollSocketOpts;
-} PollOptions;
-
-
-void Poll_InitDefault(void);
-void Poll_InitDefaultEx(const PollOptions *opts);
-void Poll_InitGtk(void); // On top of glib for Linux
-void Poll_InitCF(void);  // On top of CoreFoundation for OSX
-
-
-/*
- * Functions
- */
-int Poll_SocketPair(Bool vmci, Bool stream, int fds[2], SocketSpecialOpts opts);
-void Poll_Loop(Bool loop, Bool *exit, PollClass c);
-void Poll_LoopTimeout(Bool loop, Bool *exit, PollClass c, int timeout);
-Bool Poll_LockingEnabled(void);
-void Poll_Exit(void);
-
-
-/*
- * Poll_Callback adds a callback regardless of whether an identical one exists.
- * The exception to this rule is POLL_DEVICE callbacks: there is a maximum of
- * one read and one write callback per fd.
- *
- * Poll_CallbackRemove removes one callback. If there are multiple identical
- * callbacks, which one is removed is an implementation detail. Note that in
- * the case of POLL_DEVICE and POLL_REALTIME callbacks, the fd/delay used to
- * create the callback is not specified when removing, so all callbacks
- * of those types with the same flags, function, and clientData are considered
- * "identical" even if their fd/delay differed.
- */
-
-VMwareStatus Poll_Callback(PollClassSet classSet,
-                           int flags,
-                           PollerFunction f,
-                           void *clientData,
-                           PollEventType type,
-                           PollDevHandle info, // fd/microsec delay
-                           MXUserRecLock *lck);
-Bool Poll_CallbackRemove(PollClassSet classSet,
-                         int flags,
-                         PollerFunction f,
-                         void *clientData,
-                         PollEventType type);
-Bool Poll_CallbackRemoveOneByCB(PollClassSet classSet,
-                                int flags,
-                                PollerFunction f,
-                                PollEventType type,
-                                void **clientData);
-
-void Poll_NotifyChange(PollClassSet classSet);
-
-/*
- * Wrappers for Poll_Callback and Poll_CallbackRemove that present
- * simpler subsets of those interfaces.
- */
-
-VMwareStatus Poll_CB_Device(PollerFunction f,
-                            void *clientData,
-                            PollDevHandle device,
-                            Bool periodic);
-
-Bool Poll_CB_DeviceRemove(PollerFunction f,
-                          void *clientData,
-                          Bool periodic);
-
-
-VMwareStatus Poll_CB_RTime(PollerFunction f,
-                           void *clientData,
-                           int64 delay,   // microseconds
-                           Bool periodic,
-                           MXUserRecLock *lock);
-
-Bool Poll_CB_RTimeRemove(PollerFunction f,
-                         void *clientData,
-                         Bool periodic);
-
-
-#ifdef _WIN32
-void Poll_SetPumpsWindowsMessages(Bool pumps);
-void Poll_SetWindowMessageRecipient(HWND hWnd, UINT msg, Bool alwaysThunk);
-Bool Poll_FireWndCallback(void *lparam);
-#endif
-
-#if defined(__cplusplus)
-}  // extern "C"
-#endif
-
-#endif // _POLL_H_
diff --git a/lib/include/pollImpl.h b/open-vm-tools/lib/include/pollImpl.h
index 46442e55..8bc66997 100644
--- a/lib/include/pollImpl.h
+++ b/lib/include/pollImpl.h
@@ -44,7 +44,7 @@
 #define INCLUDE_ALLOW_USERLEVEL
 #include "includeCheck.h"
 
-#include "poll.h"
+#include "vm_poll.h"
 #include "vm_basic_asm.h"
 
 #if defined(__cplusplus)
diff --git a/lib/include/vm_poll.h b/open-vm-tools/lib/include/vm_poll.h
new file mode 100644
index 00000000..c90f5dcd
--- /dev/null
+++ b/lib/include/vm_poll.h
@@ -0,0 +1,337 @@
+/*********************************************************
+ * Copyright (C) 1998-2020 VMware, Inc. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation version 2.1 and no later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the Lesser GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA.
+ *
+ *********************************************************/
+
+/*********************************************************
+ * The contents of this file are subject to the terms of the Common
+ * Development and Distribution License (the "License") version 1.0
+ * and no later version.  You may not use this file except in
+ * compliance with the License.
+ *
+ * You can obtain a copy of the License at
+ *         http://www.opensource.org/licenses/cddl1.php
+ *
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ *********************************************************/
+
+
+#ifndef _POLL_H_
+#define _POLL_H_
+
+#define INCLUDE_ALLOW_USERLEVEL
+#define INCLUDE_ALLOW_VMCORE
+#include "includeCheck.h"
+
+#include "vm_basic_types.h"
+#include "vm_basic_defs.h"
+#include "vmware.h"
+#include "userlock.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#ifdef _WIN32
+#define HZ 100
+#elif defined __linux__
+#include <asm/param.h>
+#elif __APPLE__
+#include <TargetConditionals.h>
+/*
+ * Old SDKs don't define TARGET_OS_IPHONE at all.
+ * New ones define it to 0 on Mac OS X, 1 on iOS.
+ */
+#if !defined(TARGET_OS_IPHONE) || TARGET_OS_IPHONE == 0
+#include <sys/kernel.h>
+#endif
+#include <sys/poll.h>
+#define HZ 100
+#endif
+#ifdef __ANDROID__
+/*
+ * <poll.h> of android should be included, but its name is same
+ * with this file. So its content is put here to avoid conflict.
+ */
+#include <asm/poll.h>
+#define HZ 100
+typedef unsigned int  nfds_t;
+int poll(struct pollfd *, nfds_t, long);
+#endif
+
+
+/*
+ * Poll event types: each type has a different reason for firing,
+ * or condition that must be met before firing.
+ */
+
+typedef enum {
+   /*
+    * Actual Poll queue types against which you can register callbacks.
+    */
+   POLL_VIRTUALREALTIME = -1, /* Negative because it doesn't have its own Q */
+   POLL_VTIME = 0,
+   POLL_REALTIME,
+   POLL_DEVICE,
+   POLL_MAIN_LOOP,
+   POLL_NUM_QUEUES
+} PollEventType;
+
+
+/*
+ * Classes of events
+ *
+ * These are the predefined classes.  More can be declared
+ * with Poll_AllocClass().
+ */
+
+typedef enum PollClass {
+   POLL_CLASS_MAIN,
+   POLL_CLASS_PAUSE,
+   POLL_CLASS_IPC,
+   POLL_CLASS_CPT,
+   POLL_CLASS_MKS,
+   POLL_FIXED_CLASSES,
+   POLL_DEFAULT_FIXED_CLASSES,
+   /* Size enum to maximum */
+   POLL_MAX_CLASSES = 31,
+} PollClass;
+
+/*
+ * Do not use; Special pseudo private poll class supported by
+ * PollDefault only
+ */
+#define POLL_DEFAULT_CLASS_NET POLL_FIXED_CLASSES
+#define POLL_DEFAULT_CS_NET    PollClassSet_Singleton(POLL_DEFAULT_CLASS_NET)
+
+/*
+ * Each callback is registered in a set of classes
+ */
+
+typedef struct PollClassSet {
+   uintptr_t bits;
+} PollClassSet;
+
+/* An empty PollClassSet. */
+static INLINE PollClassSet
+PollClassSet_Empty(void)
+{
+   PollClassSet set = { 0 };
+   return set;
+}
+
+/* A PollClassSet with the single member. */
+static INLINE PollClassSet
+PollClassSet_Singleton(PollClass c)
+{
+   PollClassSet s = PollClassSet_Empty();
+
+   ASSERT_ON_COMPILE(POLL_MAX_CLASSES < sizeof s.bits * 8);
+   ASSERT(c < POLL_MAX_CLASSES);
+
+   s.bits = CONST3264U(1) << c;
+   return s;
+}
+
+/* Combine two PollClassSets. */
+static INLINE PollClassSet
+PollClassSet_Union(PollClassSet lhs, PollClassSet rhs)
+{
+   PollClassSet set;
+   set.bits = lhs.bits | rhs.bits;
+   return set;
+}
+
+/* Add single class to PollClassSet. */
+static INLINE PollClassSet
+PollClassSet_Include(PollClassSet set, PollClass c)
+{
+   return PollClassSet_Union(set, PollClassSet_Singleton(c));
+}
+
+
+#define POLL_CS_MAIN    PollClassSet_Singleton(POLL_CLASS_MAIN)
+#define POLL_CS_PAUSE   PollClassSet_Union(POLL_CS_MAIN,            \
+                           PollClassSet_Singleton(POLL_CLASS_PAUSE))
+#define POLL_CS_CPT     PollClassSet_Union(POLL_CS_PAUSE,           \
+                           PollClassSet_Singleton(POLL_CLASS_CPT))
+#define POLL_CS_IPC     PollClassSet_Union(POLL_CS_CPT,             \
+                           PollClassSet_Singleton(POLL_CLASS_IPC))
+#define POLL_CS_VMDB    POLL_CS_PAUSE /* POLL_CLASS_VMDB is retired */
+#define POLL_CS_MKS	PollClassSet_Singleton(POLL_CLASS_MKS)
+/* 
+ * DANGER.  You don't need POLL_CS_ALWAYS.  Really.  So don't use it.
+ */
+#define POLL_CS_ALWAYS  PollClassSet_Union(POLL_CS_CPT, POLL_CS_IPC)
+
+/*
+ * Poll class-set taxonomy:
+ * POLL_CS_MAIN
+ *    - Unless you NEED another class, use POLL_CS_MAIN.
+ * POLL_CS_PAUSE
+ *    - For callbacks that must occur even if the guest is paused.
+ *      Most VMDB or Foundry commands are in this category.
+ * POLL_CS_CPT
+ *    - Only for callbacks which can trigger intermediate Checkpoint 
+ *      transitions.
+ *      The ONLY such callback is Migrate.
+ * POLL_CS_IPC
+ *    - Only for callbacks which can contain Msg_(Post|Hint|Question) 
+ *      responses, and for signal handlers (why)?
+ *      Vigor, VMDB, and Foundry can contain Msg_* responses.
+ * POLL_CS_MKS
+ *    - Callback runs in MKS thread.
+ * POLL_CS_ALWAYS
+ *    - Only for events that must be processed immediately.
+ *      The ONLY such callback is OvhdMemVmxSizeCheck.
+ */
+
+
+/*
+ * Poll_Callback flags
+ */
+
+#define POLL_FLAG_PERIODIC		0x01    // keep after firing
+#define POLL_FLAG_REMOVE_AT_POWEROFF	0x02  	// self-explanatory
+#define POLL_FLAG_READ			0x04	// device is ready for reading
+#define POLL_FLAG_WRITE			0x08	// device is ready for writing
+#define POLL_FLAG_SOCKET                0x10    // device is a Windows socket
+#define POLL_FLAG_NO_BULL               0x20    // callback does its own locking
+#define POLL_FLAG_WINSOCK               0x40    // Winsock style write events
+#define POLL_FLAG_FD                    0x80    // device is a Windows file descriptor.
+#define POLL_FLAG_ACCEPT_INVALID_FDS    0x100   // For broken 3rd party libs, e.g. curl
+#define POLL_FLAG_THUNK_TO_WND          0x200   // thunk callback to window message loop
+
+
+typedef void (*PollerFunction)(void *clientData);
+typedef void (*PollerFireWrapper)(PollerFunction func,
+                                  void *funcData,
+                                  void *wrapperData);
+typedef Bool (*PollerErrorFn)(const char *errorStr);
+
+/*
+ * Initialisers:
+ *
+ *      For the sake of convenience, we declare the initialisers
+ *      for custom implmentations here, even though the actual
+ *      implementations are distinct from the core poll code.
+ */
+
+
+/* Socket pair created with non-blocking mode */
+#define POLL_OPTIONS_SOCKET_PAIR_NONBLOCK_CONN  0x01
+
+typedef unsigned int SocketSpecialOpts;
+
+typedef struct PollOptions {
+   Bool locked;           // Use internal MXUser for locking
+   Bool allowFullQueue;   // Don't assert when device event queue is full.
+   VThreadID windowsMsgThread;       // thread that processes Windows messages
+   PollerFireWrapper fireWrapperFn;  // optional; may be useful for stats
+   void *fireWrapperData; // optional
+   PollerErrorFn errorFn; // optional; called upon unrecoverable error
+   SocketSpecialOpts pollSocketOpts;
+} PollOptions;
+
+
+void Poll_InitDefault(void);
+void Poll_InitDefaultEx(const PollOptions *opts);
+void Poll_InitGtk(void); // On top of glib for Linux
+void Poll_InitCF(void);  // On top of CoreFoundation for OSX
+
+
+/*
+ * Functions
+ */
+int Poll_SocketPair(Bool vmci, Bool stream, int fds[2], SocketSpecialOpts opts);
+void Poll_Loop(Bool loop, Bool *exit, PollClass c);
+void Poll_LoopTimeout(Bool loop, Bool *exit, PollClass c, int timeout);
+Bool Poll_LockingEnabled(void);
+void Poll_Exit(void);
+
+
+/*
+ * Poll_Callback adds a callback regardless of whether an identical one exists.
+ * The exception to this rule is POLL_DEVICE callbacks: there is a maximum of
+ * one read and one write callback per fd.
+ *
+ * Poll_CallbackRemove removes one callback. If there are multiple identical
+ * callbacks, which one is removed is an implementation detail. Note that in
+ * the case of POLL_DEVICE and POLL_REALTIME callbacks, the fd/delay used to
+ * create the callback is not specified when removing, so all callbacks
+ * of those types with the same flags, function, and clientData are considered
+ * "identical" even if their fd/delay differed.
+ */
+
+VMwareStatus Poll_Callback(PollClassSet classSet,
+                           int flags,
+                           PollerFunction f,
+                           void *clientData,
+                           PollEventType type,
+                           PollDevHandle info, // fd/microsec delay
+                           MXUserRecLock *lck);
+Bool Poll_CallbackRemove(PollClassSet classSet,
+                         int flags,
+                         PollerFunction f,
+                         void *clientData,
+                         PollEventType type);
+Bool Poll_CallbackRemoveOneByCB(PollClassSet classSet,
+                                int flags,
+                                PollerFunction f,
+                                PollEventType type,
+                                void **clientData);
+
+void Poll_NotifyChange(PollClassSet classSet);
+
+/*
+ * Wrappers for Poll_Callback and Poll_CallbackRemove that present
+ * simpler subsets of those interfaces.
+ */
+
+VMwareStatus Poll_CB_Device(PollerFunction f,
+                            void *clientData,
+                            PollDevHandle device,
+                            Bool periodic);
+
+Bool Poll_CB_DeviceRemove(PollerFunction f,
+                          void *clientData,
+                          Bool periodic);
+
+
+VMwareStatus Poll_CB_RTime(PollerFunction f,
+                           void *clientData,
+                           int64 delay,   // microseconds
+                           Bool periodic,
+                           MXUserRecLock *lock);
+
+Bool Poll_CB_RTimeRemove(PollerFunction f,
+                         void *clientData,
+                         Bool periodic);
+
+
+#ifdef _WIN32
+void Poll_SetPumpsWindowsMessages(Bool pumps);
+void Poll_SetWindowMessageRecipient(HWND hWnd, UINT msg, Bool alwaysThunk);
+Bool Poll_FireWndCallback(void *lparam);
+#endif
+
+#if defined(__cplusplus)
+}  // extern "C"
+#endif
+
+#endif // _POLL_H_
diff --git a/lib/rpcIn/rpcin.c b/open-vm-tools/lib/rpcIn/rpcin.c
index 8b1fe759..f22fcd40 100644
--- a/lib/rpcIn/rpcin.c
+++ b/lib/rpcIn/rpcin.c
@@ -57,7 +57,7 @@
 
 #if defined(VMTOOLS_USE_VSOCKET)
 #  include <glib.h>
-#  include "poll.h"
+#  include "vm_poll.h"
 #  include "asyncsocket.h"
 #  include "vmci_defs.h"
 #include "dataMap.h"
-- 
2.36.1

