From 3edfa6fe2b712a4638ca5f1683adf553ffad2ba5 Mon Sep 17 00:00:00 2001 From: Ycarus Date: Mon, 29 Apr 2019 22:57:16 +0200 Subject: [PATCH] Package available upstream --- open-vm-tools/Makefile | 130 --- open-vm-tools/files/shutdown | 8 - open-vm-tools/files/tools.conf | 2 - open-vm-tools/files/vmtoolsd.init | 14 - open-vm-tools/patches/openwrt-patches.patch | 962 -------------------- 5 files changed, 1116 deletions(-) delete mode 100644 open-vm-tools/Makefile delete mode 100644 open-vm-tools/files/shutdown delete mode 100644 open-vm-tools/files/tools.conf delete mode 100644 open-vm-tools/files/vmtoolsd.init delete mode 100644 open-vm-tools/patches/openwrt-patches.patch diff --git a/open-vm-tools/Makefile b/open-vm-tools/Makefile deleted file mode 100644 index 7f3f14050..000000000 --- a/open-vm-tools/Makefile +++ /dev/null @@ -1,130 +0,0 @@ -# -# Copyright (C) 2018 OpenWrt.org -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# -# This package come from https://github.com/fangli/openwrt-vm-tools - -include $(TOPDIR)/rules.mk - -PKG_NAME:=open-vm-tools -PKG_VERSION:=10.3.5 -PKG_RELEASE:=1 - -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) -PKG_SOURCE_PROTO:=git -PKG_SOURCE_URL=https://github.com/vmware/open-vm-tools.git -PKG_SOURCE_VERSION:=stable-$(PKG_VERSION) - -PKG_FIXUP:=autoreconf -PKG_LICENSE:=LGPL-2.1 - -include $(INCLUDE_DIR)/package.mk - -define Package/open-vm-tools - SECTION:=utils - CATEGORY:=Utilities - DEPENDS:=@TARGET_x86 +glib2 +libpthread +libtirpc - TITLE:=open-vm-tools - URL:=https://github.com/vmware/open-vm-tools -endef - -define Package/open-vm-tools-vm-tools/description - Open Virtual Machine Tools for VMware guest OS -endef - - -CONFIGURE_PATH = open-vm-tools -MAKE_PATH = open-vm-tools - -CONFIGURE_ARGS+= \ - --without-icu \ - --disable-multimon \ - --disable-docs \ - --disable-tests \ - --without-gtkmm \ - --without-gtkmm3 \ - --without-xerces \ - --without-pam \ - --disable-grabbitmqproxy \ - --disable-vgauth \ - --disable-deploypkg \ - --without-root-privileges \ - --without-kernel-modules \ - --without-dnet \ - --with-tirpc \ - --without-x \ - --without-gtk2 \ - --without-gtk3 \ - --without-xerces - - -define Package/open-vm-tools/install - $(INSTALL_DIR) $(1)/etc/init.d/ - $(INSTALL_BIN) ./files/vmtoolsd.init $(1)/etc/init.d/vmtoolsd - - $(INSTALL_DIR) $(1)/etc/vmware-tools/ - $(INSTALL_DATA) ./files/tools.conf $(1)/etc/vmware-tools/ - $(INSTALL_BIN) $(PKG_BUILD_DIR)/open-vm-tools/scripts/poweroff-vm-default $(1)/etc/vmware-tools/ - $(INSTALL_BIN) $(PKG_BUILD_DIR)/open-vm-tools/scripts/poweron-vm-default $(1)/etc/vmware-tools/ - $(INSTALL_BIN) $(PKG_BUILD_DIR)/open-vm-tools/scripts/resume-vm-default $(1)/etc/vmware-tools/ - $(INSTALL_BIN) $(PKG_BUILD_DIR)/open-vm-tools/scripts/suspend-vm-default $(1)/etc/vmware-tools/ - $(INSTALL_DATA) $(PKG_BUILD_DIR)/open-vm-tools/scripts/common/statechange.subr $(1)/etc/vmware-tools/ - - $(INSTALL_DIR) $(1)/etc/vmware-tools/scripts/vmware/ - $(INSTALL_BIN) $(PKG_BUILD_DIR)/open-vm-tools/scripts/linux/network $(1)/etc/vmware-tools/scripts/vmware/ - - $(INSTALL_DIR) $(1)/bin/ - $(INSTALL_BIN) $(PKG_BUILD_DIR)/open-vm-tools/checkvm/.libs/vmware-checkvm $(1)/bin/ - $(INSTALL_BIN) $(PKG_BUILD_DIR)/open-vm-tools/namespacetool/.libs/vmware-namespace-cmd $(1)/bin/ - $(INSTALL_BIN) $(PKG_BUILD_DIR)/open-vm-tools/xferlogs/.libs/vmware-xferlogs $(1)/bin/ - $(INSTALL_BIN) $(PKG_BUILD_DIR)/open-vm-tools/hgfsclient/.libs/vmware-hgfsclient $(1)/bin/ - $(INSTALL_BIN) $(PKG_BUILD_DIR)/open-vm-tools/services/vmtoolsd/.libs/vmtoolsd $(1)/bin/ - $(INSTALL_BIN) $(PKG_BUILD_DIR)/open-vm-tools/rpctool/vmware-rpctool $(1)/bin/ - $(INSTALL_BIN) $(PKG_BUILD_DIR)/open-vm-tools/toolbox/.libs/vmware-toolbox-cmd $(1)/bin/ - - $(INSTALL_DIR) $(1)/sbin/ - $(INSTALL_BIN) $(PKG_BUILD_DIR)/open-vm-tools/hgfsmounter/mount.vmhgfs $(1)/sbin/ - $(INSTALL_BIN) ./files/shutdown $(1)/sbin/ - - $(INSTALL_DIR) $(1)/lib/ - $(INSTALL_DATA) $(PKG_BUILD_DIR)/open-vm-tools/libhgfs/.libs/libhgfs.so.0.0.0 $(1)/lib/ - $(LN) libhgfs.so.0.0.0 $(1)/lib/libhgfs.so.0 - $(LN) libhgfs.so.0.0.0 $(1)/lib/libhgfs.so - $(INSTALL_DATA) $(PKG_BUILD_DIR)/open-vm-tools/libguestlib/.libs/libguestlib.so.0.0.0 $(1)/lib/ - $(LN) libguestlib.so.0.0.0 $(1)/lib/libguestlib.so.0 - $(LN) libguestlib.so.0.0.0 $(1)/lib/libguestlib.so - $(INSTALL_DATA) $(PKG_BUILD_DIR)/open-vm-tools/libvmtools/.libs/libvmtools.so.0.0.0 $(1)/lib/ - $(LN) libvmtools.so.0.0.0 $(1)/lib/libvmtools.so.0 - $(LN) libvmtools.so.0.0.0 $(1)/lib/libvmtools.so - - $(INSTALL_DIR) $(1)/usr/lib/open-vm-tools/plugins/common/ - $(INSTALL_DATA) $(PKG_BUILD_DIR)/open-vm-tools/services/plugins/vix/.libs/libvix.so $(1)/usr/lib/open-vm-tools/plugins/common/ - $(INSTALL_DATA) $(PKG_BUILD_DIR)/open-vm-tools/services/plugins/hgfsServer/.libs/libhgfsServer.so $(1)/usr/lib/open-vm-tools/plugins/common/ - - $(INSTALL_DIR) $(1)/usr/lib/open-vm-tools/plugins/vmsvc/ - $(INSTALL_DATA) $(PKG_BUILD_DIR)/open-vm-tools/services/plugins/resolutionKMS/.libs/libresolutionKMS.so $(1)/usr/lib/open-vm-tools/plugins/vmsvc/ - $(INSTALL_DATA) $(PKG_BUILD_DIR)/open-vm-tools/services/plugins/powerOps/.libs/libpowerOps.so $(1)/usr/lib/open-vm-tools/plugins/vmsvc/ - $(INSTALL_DATA) $(PKG_BUILD_DIR)/open-vm-tools/services/plugins/timeSync/.libs/libtimeSync.so $(1)/usr/lib/open-vm-tools/plugins/vmsvc/ - $(INSTALL_DATA) $(PKG_BUILD_DIR)/open-vm-tools/services/plugins/guestInfo/.libs/libguestInfo.so $(1)/usr/lib/open-vm-tools/plugins/vmsvc/ - $(INSTALL_DATA) $(PKG_BUILD_DIR)/open-vm-tools/services/plugins/vmbackup/.libs/libvmbackup.so $(1)/usr/lib/open-vm-tools/plugins/vmsvc/ - - $(INSTALL_DIR) $(1)/lib/udev/rules.d/ - $(INSTALL_DATA) $(PKG_BUILD_DIR)/open-vm-tools/udev/99-vmware-scsi-udev.rules $(1)/lib/udev/rules.d/ - - $(INSTALL_DIR) $(1)/usr/share/open-vm-tools/messages/ko/ - $(INSTALL_DATA) $(PKG_BUILD_DIR)/open-vm-tools/services/vmtoolsd/l10n/ko.vmsg $(1)/usr/share/open-vm-tools/messages/ko/vmtoolsd.vmsg - $(INSTALL_DATA) $(PKG_BUILD_DIR)/open-vm-tools/toolbox/l10n/ko.vmsg $(1)/usr/share/open-vm-tools/messages/ko/toolboxcmd.vmsg - $(INSTALL_DIR) $(1)/usr/share/open-vm-tools/messages/de/ - $(INSTALL_DATA) $(PKG_BUILD_DIR)/open-vm-tools/services/vmtoolsd/l10n/de.vmsg $(1)/usr/share/open-vm-tools/messages/de/vmtoolsd.vmsg - $(INSTALL_DATA) $(PKG_BUILD_DIR)/open-vm-tools/toolbox/l10n/de.vmsg $(1)/usr/share/open-vm-tools/messages/de/toolboxcmd.vmsg - $(INSTALL_DIR) $(1)/usr/share/open-vm-tools/messages/ja/ - $(INSTALL_DATA) $(PKG_BUILD_DIR)/open-vm-tools/services/vmtoolsd/l10n/ja.vmsg $(1)/usr/share/open-vm-tools/messages/ja/vmtoolsd.vmsg - $(INSTALL_DATA) $(PKG_BUILD_DIR)/open-vm-tools/toolbox/l10n/ja.vmsg $(1)/usr/share/open-vm-tools/messages/ja/toolboxcmd.vmsg - $(INSTALL_DIR) $(1)/usr/share/open-vm-tools/messages/zh_CN/ - $(INSTALL_DATA) $(PKG_BUILD_DIR)/open-vm-tools/toolbox/l10n/zh_CN.vmsg $(1)/usr/share/open-vm-tools/messages/zh_CN/toolboxcmd.vmsg -endef - -$(eval $(call BuildPackage,open-vm-tools)) diff --git a/open-vm-tools/files/shutdown b/open-vm-tools/files/shutdown deleted file mode 100644 index e814571ff..000000000 --- a/open-vm-tools/files/shutdown +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -#compatibility script for openvmtools - -if [ "$1" == "-r" ]; then - /sbin/reboot -else - /sbin/poweroff -fi diff --git a/open-vm-tools/files/tools.conf b/open-vm-tools/files/tools.conf deleted file mode 100644 index f6cae70cc..000000000 --- a/open-vm-tools/files/tools.conf +++ /dev/null @@ -1,2 +0,0 @@ -[guestinfo] -disable-perf-mon=1 diff --git a/open-vm-tools/files/vmtoolsd.init b/open-vm-tools/files/vmtoolsd.init deleted file mode 100644 index 22a002088..000000000 --- a/open-vm-tools/files/vmtoolsd.init +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh /etc/rc.common - -START=10 - -USE_PROCD=1 -PROG=/bin/vmtoolsd - -start_service() { - procd_open_instance - procd_set_param command "$PROG" - procd_set_param respawn - procd_close_instance -} - diff --git a/open-vm-tools/patches/openwrt-patches.patch b/open-vm-tools/patches/openwrt-patches.patch deleted file mode 100644 index 25ded67b4..000000000 --- a/open-vm-tools/patches/openwrt-patches.patch +++ /dev/null @@ -1,962 +0,0 @@ -diff -urN a/open-vm-tools/configure.ac b/open-vm-tools/configure.ac ---- a/open-vm-tools/configure.ac 2019-01-23 16:28:44.000000000 +0800 -+++ b/open-vm-tools/configure.ac 2019-01-23 15:59:55.000000000 +0800 -@@ -937,7 +937,7 @@ - AC_VMW_CHECK_LIB([dnet], - [DNET], - [], -- [dnet-config], -+ [], - [], - [dnet.h], - [intf_open], -@@ -1151,6 +1151,7 @@ - AC_TYPE_PID_T - AC_TYPE_SIZE_T - AC_CHECK_MEMBERS([struct stat.st_rdev]) -+AC_CHECK_MEMBERS([struct timespec.tv_sec],[],[],[[#include ]]) - AC_HEADER_TIME - AC_STRUCT_TM - AC_C_VOLATILE -diff -urN a/open-vm-tools/lib/asyncsocket/asyncsocket.c b/open-vm-tools/lib/asyncsocket/asyncsocket.c ---- a/open-vm-tools/lib/asyncsocket/asyncsocket.c 2019-01-23 16:28:44.000000000 +0800 -+++ b/open-vm-tools/lib/asyncsocket/asyncsocket.c 2019-01-23 16:10:13.000000000 +0800 -@@ -69,8 +69,8 @@ - #else - #include - #include -+#include - #include --#include - #include - #include - #include -@@ -86,7 +86,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 -urN a/open-vm-tools/lib/err/errPosix.c b/open-vm-tools/lib/err/errPosix.c ---- a/open-vm-tools/lib/err/errPosix.c 2019-01-23 16:28:44.000000000 +0800 -+++ b/open-vm-tools/lib/err/errPosix.c 2019-01-23 16:15:29.000000000 +0800 -@@ -31,6 +31,7 @@ - #include - #include - #include -+#include - - #include "vmware.h" - #include "errInt.h" -@@ -63,11 +64,13 @@ - { - char *p; - --#if defined(__linux__) && !defined(__ANDROID__) -+#if defined(__GLIBC__) && !defined(__ANDROID__) - p = strerror_r(errorNumber, buf, bufSize); - #else -- p = strerror(errorNumber); --#endif -+ if (strerror_r(errorNumber, buf, bufSize) != 0) -+ snprintf(buf, bufSize, "unknown error %i", errorNumber); -+ p = buf; -+#endif /* defined __GLIBC__ */ - ASSERT(p != NULL); - return p; - } -diff -urN a/open-vm-tools/lib/file/fileIOPosix.c b/open-vm-tools/lib/file/fileIOPosix.c ---- a/open-vm-tools/lib/file/fileIOPosix.c 2019-01-23 16:28:44.000000000 +0800 -+++ b/open-vm-tools/lib/file/fileIOPosix.c 2019-01-23 16:16:39.000000000 +0800 -@@ -206,10 +206,10 @@ - * the symbols (and anyone building XOPEN<700 gets nothing). - */ - extern ssize_t preadv64(int fd, const struct iovec *iov, int iovcnt, -- __off64_t offset) __attribute__ ((weak)); -+ off64_t offset) __attribute__ ((weak)); - - extern ssize_t pwritev64(int fd, const struct iovec *iov, int iovcnt, -- __off64_t offset) __attribute__ ((weak)); -+ off64_t offset) __attribute__ ((weak)); - #else - #error "Large file support unavailable. Aborting." - #endif -diff -urN a/open-vm-tools/lib/hgfsServer/hgfsServer.c b/open-vm-tools/lib/hgfsServer/hgfsServer.c ---- a/open-vm-tools/lib/hgfsServer/hgfsServer.c 2019-01-23 16:28:44.000000000 +0800 -+++ b/open-vm-tools/lib/hgfsServer/hgfsServer.c 2019-01-23 16:10:36.000000000 +0800 -@@ -48,7 +48,7 @@ - #include "hgfsServerOplock.h" - #include "hgfsDirNotify.h" - #include "userlock.h" --#include "poll.h" -+#include "vm_poll.h" - #include "mutexRankLib.h" - #include "vm_basic_asm.h" - #include "unicodeOperations.h" -diff -urN a/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c b/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c ---- a/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c 2019-01-23 16:28:44.000000000 +0800 -+++ b/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c 2019-01-23 16:16:01.000000000 +0800 -@@ -108,8 +108,10 @@ - * ALLPERMS (mode 07777) and ACCESSPERMS (mode 0777) are not defined in the - * Solaris version of . - */ --#ifdef sun -+#ifndef ACCESSPERMS - # define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) -+#endif -+#ifndef ALLPERMS - # define ALLPERMS (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO) - #endif - -@@ -5292,8 +5294,8 @@ - goto exit; - } - -- LOG(6, ("%s: File Size limits: 0x%"FMT64"x 0x%"FMT64"x\n", -- __FUNCTION__, fileSize.rlim_cur, fileSize.rlim_max)); -+ LOG(6, ("%s: File Size limits: 0x%jx 0x%jx\n", -+ __FUNCTION__, (uintmax_t)fileSize.rlim_cur, (uintmax_t)fileSize.rlim_max)); - - /* - * Check the offset is within the file size range. -diff -urN a/open-vm-tools/lib/include/asyncsocket.h b/open-vm-tools/lib/include/asyncsocket.h ---- a/open-vm-tools/lib/include/asyncsocket.h 2019-01-23 16:28:44.000000000 +0800 -+++ b/open-vm-tools/lib/include/asyncsocket.h 2019-01-23 16:10:59.000000000 +0800 -@@ -164,7 +164,7 @@ - * 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 -urN a/open-vm-tools/lib/include/hgfsUtil.h b/open-vm-tools/lib/include/hgfsUtil.h ---- a/open-vm-tools/lib/include/hgfsUtil.h 2019-01-23 16:28:44.000000000 +0800 -+++ b/open-vm-tools/lib/include/hgfsUtil.h 2019-01-23 16:00:49.000000000 +0800 -@@ -53,13 +53,7 @@ - # include - # endif - # include "vm_basic_types.h" --# if !defined _STRUCT_TIMESPEC && \ -- !defined _TIMESPEC_DECLARED && \ -- !defined __timespec_defined && \ -- !defined sun && \ -- !defined __FreeBSD__ && \ -- !__APPLE__ && \ -- !defined _WIN32 -+# if !defined HAVE_STRUCT_TIMESPEC_TV_SEC - struct timespec { - time_t tv_sec; - long tv_nsec; -diff -urN a/open-vm-tools/lib/include/poll.h b/open-vm-tools/lib/include/poll.h ---- a/open-vm-tools/lib/include/poll.h 2019-01-23 16:28:44.000000000 +0800 -+++ b/open-vm-tools/lib/include/poll.h 1970-01-01 08:00:00.000000000 +0800 -@@ -1,330 +0,0 @@ --/********************************************************* -- * Copyright (C) 1998-2018 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 --#elif __APPLE__ --#include --/* -- * 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 --#endif --#include --#define HZ 100 --#endif --#ifdef __ANDROID__ --/* -- * of android should be included, but its name is same -- * with this file. So its content is put here to avoid conflict. -- */ --#include --#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. -- */ -- --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 --} 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]); --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 -urN a/open-vm-tools/lib/include/pollImpl.h b/open-vm-tools/lib/include/pollImpl.h ---- a/open-vm-tools/lib/include/pollImpl.h 2019-01-23 16:28:44.000000000 +0800 -+++ b/open-vm-tools/lib/include/pollImpl.h 2019-01-23 16:11:18.000000000 +0800 -@@ -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 -urN a/open-vm-tools/lib/include/vm_poll.h b/open-vm-tools/lib/include/vm_poll.h ---- a/open-vm-tools/lib/include/vm_poll.h 1970-01-01 08:00:00.000000000 +0800 -+++ b/open-vm-tools/lib/include/vm_poll.h 2019-01-23 16:13:08.000000000 +0800 -@@ -0,0 +1,330 @@ -+/********************************************************* -+ * Copyright (C) 1998-2018 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 -+#elif __APPLE__ -+#include -+/* -+ * 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 -+#endif -+#include -+#define HZ 100 -+#endif -+#ifdef __ANDROID__ -+/* -+ * of android should be included, but its name is same -+ * with this file. So its content is put here to avoid conflict. -+ */ -+#include -+#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. -+ */ -+ -+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 -+} 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]); -+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 -urN a/open-vm-tools/lib/misc/idLinux.c b/open-vm-tools/lib/misc/idLinux.c ---- a/open-vm-tools/lib/misc/idLinux.c 2019-01-23 16:28:44.000000000 +0800 -+++ b/open-vm-tools/lib/misc/idLinux.c 2019-01-23 16:07:55.000000000 +0800 -@@ -27,12 +27,9 @@ - #include - #include - #include --#ifdef __linux__ --#if defined(__GLIBC__) && \ -- (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 16)) -+#ifdef HAVE_SYS_AUXV_H - #include - #endif --#endif - #ifdef __APPLE__ - #include - #include -@@ -1004,10 +1001,6 @@ - static Bool - IdIsSetUGid(void) - { --#if defined(__ANDROID__) -- /* Android does not have a secure_getenv, so be conservative. */ -- return TRUE; --#else - /* - * We use __secure_getenv, which returns NULL if the binary is - * setuid or setgid. Alternatives include, -@@ -1018,17 +1011,20 @@ - * Use (a) when we are based on glibc 2.16, or newer. - */ - --#if defined(__GLIBC__) && \ -- (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 16)) -+#if HAVE_ISSETUGID -+ return issetugid(); -+#elif HAVE_GETAUXVAL - return getauxval(AT_SECURE) != 0; --#else -+#elif HAVE___SECURE_GETENV - static const char envName[] = "VMW_SETUGID_TEST"; - - if (setenv(envName, "1", TRUE) == -1) { - return TRUE; /* Conservative */ - } - return __secure_getenv(envName) == NULL; --#endif -+#else -+ /* Android does not have a secure_getenv, so be conservative. */ -+ return TRUE; - #endif - } - #endif -diff -urN a/open-vm-tools/lib/nicInfo/nicInfoPosix.c b/open-vm-tools/lib/nicInfo/nicInfoPosix.c ---- a/open-vm-tools/lib/nicInfo/nicInfoPosix.c 2019-01-23 16:28:44.000000000 +0800 -+++ b/open-vm-tools/lib/nicInfo/nicInfoPosix.c 2019-01-23 16:08:41.000000000 +0800 -@@ -34,9 +34,13 @@ - #include - #include - #include --#if defined(__FreeBSD__) || defined(__APPLE__) -+#if HAVE_SYS_SYSCTL_H - # include -+#endif -+#if HAVE_IFADDRS_H - # include -+#endif -+#if HAVE_NET_IF_H - # include - #endif - #ifndef NO_DNET -diff -urN a/open-vm-tools/lib/rpcIn/rpcin.c b/open-vm-tools/lib/rpcIn/rpcin.c ---- a/open-vm-tools/lib/rpcIn/rpcin.c 2019-01-23 16:28:44.000000000 +0800 -+++ b/open-vm-tools/lib/rpcIn/rpcin.c 2019-01-23 16:13:42.000000000 +0800 -@@ -57,7 +57,7 @@ - - #if defined(VMTOOLS_USE_VSOCKET) - # include --# include "poll.h" -+# include "vm_poll.h" - # include "asyncsocket.h" - # include "vmci_defs.h" - #include "dataMap.h" -diff -urN a/open-vm-tools/lib/wiper/wiperPosix.c b/open-vm-tools/lib/wiper/wiperPosix.c ---- a/open-vm-tools/lib/wiper/wiperPosix.c 2019-01-23 16:28:44.000000000 +0800 -+++ b/open-vm-tools/lib/wiper/wiperPosix.c 2019-01-23 15:59:12.000000000 +0800 -@@ -43,6 +43,9 @@ - # include - # endif /* __FreeBSD_version >= 500000 */ - #endif -+#if defined(__linux__) -+#include -+#endif - #include - - #include "vmware.h" -diff -urN a/open-vm-tools/services/plugins/dndcp/dnd/dndLinux.c b/open-vm-tools/services/plugins/dndcp/dnd/dndLinux.c ---- a/open-vm-tools/services/plugins/dndcp/dnd/dndLinux.c 2019-01-23 16:28:44.000000000 +0800 -+++ b/open-vm-tools/services/plugins/dndcp/dnd/dndLinux.c 2019-01-23 16:03:18.000000000 +0800 -@@ -52,7 +52,7 @@ - - #define DND_ROOTDIR_PERMS (S_IRWXU | S_IRWXG | S_IRWXO) - #define DND_STAGINGDIR_PERMS (S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) --#ifdef sun -+#ifndef ACCESSPERMS - #define ACCESSPERMS (S_IRWXU | S_IRWXG | S_IRWXO) - #endif - #ifdef __ANDROID__ -@@ -61,7 +61,6 @@ - */ - #define NO_SETMNTENT - #define NO_ENDMNTENT --#define ACCESSPERMS (S_IRWXU | S_IRWXG | S_IRWXO) - #endif - - -diff -urN a/open-vm-tools/services/plugins/vix/vixTools.c b/open-vm-tools/services/plugins/vix/vixTools.c ---- a/open-vm-tools/services/plugins/vix/vixTools.c 2019-01-23 16:28:44.000000000 +0800 -+++ b/open-vm-tools/services/plugins/vix/vixTools.c 2019-01-23 16:09:07.000000000 +0800 -@@ -66,7 +66,7 @@ - #include - #endif - --#if defined(sun) || defined(__FreeBSD__) || defined(__APPLE__) -+#ifdef HAVE_SYS_STAT_H - #include - #endif -