You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by ji...@apache.org on 2015/03/09 21:25:38 UTC

[12/50] [abbrv] hadoop git commit: HDFS-7879. hdfs.dll does not export functions of the public libhdfs API. Contributed by Chris Nauroth.

HDFS-7879. hdfs.dll does not export functions of the public libhdfs API. Contributed by Chris Nauroth.


Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/aca0abef
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/aca0abef
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/aca0abef

Branch: refs/heads/HDFS-7285
Commit: aca0abefea5b6bd5249d0ee35875a598c1ed1e7c
Parents: 871bd4e
Author: Haohui Mai <wh...@apache.org>
Authored: Wed Mar 4 09:17:21 2015 -0800
Committer: Jing Zhao <ji...@apache.org>
Committed: Mon Mar 9 13:11:23 2015 -0700

----------------------------------------------------------------------
 hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt     |  3 +
 .../hadoop-hdfs/src/CMakeLists.txt              | 23 +++--
 .../hadoop-hdfs/src/main/native/libhdfs/hdfs.h  | 92 +++++++++++++++++++-
 3 files changed, 111 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/aca0abef/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
index 2037973..62006d3 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
+++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
@@ -1086,6 +1086,9 @@ Release 2.7.0 - UNRELEASED
     HDFS-7869. Inconsistency in the return information while performing rolling
     upgrade ( J.Andreina via vinayakumarb )
 
+    HDFS-7879. hdfs.dll does not export functions of the public libhdfs API.
+    (Chris Nauroth via wheat9)
+
     BREAKDOWN OF HDFS-7584 SUBTASKS AND RELATED JIRAS
 
       HDFS-7720. Quota by Storage Type API, tools and ClientNameNode

http://git-wip-us.apache.org/repos/asf/hadoop/blob/aca0abef/hadoop-hdfs-project/hadoop-hdfs/src/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/CMakeLists.txt b/hadoop-hdfs-project/hadoop-hdfs/src/CMakeLists.txt
index aceeac1..563727b 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/CMakeLists.txt
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/CMakeLists.txt
@@ -27,7 +27,15 @@ include(../../../hadoop-common-project/hadoop-common/src/JNIFlags.cmake NO_POLIC
 function(add_dual_library LIBNAME)
     add_library(${LIBNAME} SHARED ${ARGN})
     add_library(${LIBNAME}_static STATIC ${ARGN})
-    set_target_properties(${LIBNAME}_static PROPERTIES OUTPUT_NAME ${LIBNAME})
+    # Linux builds traditionally ship a libhdfs.a (static linking) and libhdfs.so
+    # (dynamic linking).  On Windows, we cannot use the same base name for both
+    # static and dynamic, because Windows does not use distinct file extensions
+    # for a statically linked library vs. a DLL import library.  Both use the
+    # .lib extension.  On Windows, we'll build the static library as
+    # hdfs_static.lib.
+    if (NOT WIN32)
+        set_target_properties(${LIBNAME}_static PROPERTIES OUTPUT_NAME ${LIBNAME})
+    endif (NOT WIN32)
 endfunction(add_dual_library)
 
 # Link both a static and a dynamic target against some libraries
@@ -105,11 +113,14 @@ else (WIN32)
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall -O2")
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_REENTRANT -D_GNU_SOURCE")
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
     set(OS_DIR main/native/libhdfs/os/posix)
     set(OS_LINK_LIBRARIES pthread)
     set(OUT_DIR target/usr/local/lib)
 endif (WIN32)
 
+add_definitions(-DLIBHDFS_DLL_EXPORT)
+
 include_directories(
     ${GENERATED_JAVAH}
     ${CMAKE_CURRENT_SOURCE_DIR}
@@ -150,7 +161,7 @@ add_executable(test_libhdfs_ops
     main/native/libhdfs/test/test_libhdfs_ops.c
 )
 target_link_libraries(test_libhdfs_ops
-    hdfs
+    hdfs_static
     ${JAVA_JVM_LIBRARY}
 )
 
@@ -158,7 +169,7 @@ add_executable(test_libhdfs_read
     main/native/libhdfs/test/test_libhdfs_read.c
 )
 target_link_libraries(test_libhdfs_read
-    hdfs
+    hdfs_static
     ${JAVA_JVM_LIBRARY}
 )
 
@@ -166,7 +177,7 @@ add_executable(test_libhdfs_write
     main/native/libhdfs/test/test_libhdfs_write.c
 )
 target_link_libraries(test_libhdfs_write
-    hdfs
+    hdfs_static
     ${JAVA_JVM_LIBRARY}
 )
 
@@ -196,7 +207,7 @@ add_executable(test_libhdfs_threaded
     ${OS_DIR}/thread.c
 )
 target_link_libraries(test_libhdfs_threaded
-    hdfs
+    hdfs_static
     native_mini_dfs
     ${OS_LINK_LIBRARIES}
 )
@@ -206,7 +217,7 @@ add_executable(test_libhdfs_zerocopy
     main/native/libhdfs/test/test_libhdfs_zerocopy.c
 )
 target_link_libraries(test_libhdfs_zerocopy
-    hdfs
+    hdfs_static
     native_mini_dfs
     ${OS_LINK_LIBRARIES}
 )

http://git-wip-us.apache.org/repos/asf/hadoop/blob/aca0abef/hadoop-hdfs-project/hadoop-hdfs/src/main/native/libhdfs/hdfs.h
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/native/libhdfs/hdfs.h b/hadoop-hdfs-project/hadoop-hdfs/src/main/native/libhdfs/hdfs.h
index 3406d6b..64889ed 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/native/libhdfs/hdfs.h
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/native/libhdfs/hdfs.h
@@ -24,6 +24,30 @@
 #include <stdint.h> /* for uint64_t, etc. */
 #include <time.h> /* for time_t */
 
+/*
+ * Support export of DLL symbols during libhdfs build, and import of DLL symbols
+ * during client application build.  A client application may optionally define
+ * symbol LIBHDFS_DLL_IMPORT in its build.  This is not strictly required, but
+ * the compiler can produce more efficient code with it.
+ */
+#ifdef WIN32
+    #ifdef LIBHDFS_DLL_EXPORT
+        #define LIBHDFS_EXTERNAL __declspec(dllexport)
+    #elif LIBHDFS_DLL_IMPORT
+        #define LIBHDFS_EXTERNAL __declspec(dllimport)
+    #else
+        #define LIBHDFS_EXTERNAL
+    #endif
+#else
+    #ifdef LIBHDFS_DLL_EXPORT
+        #define LIBHDFS_EXTERNAL __attribute__((visibility("default")))
+    #elif LIBHDFS_DLL_IMPORT
+        #define LIBHDFS_EXTERNAL __attribute__((visibility("default")))
+    #else
+        #define LIBHDFS_EXTERNAL
+    #endif
+#endif
+
 #ifndef O_RDONLY
 #define O_RDONLY 1
 #endif
@@ -77,6 +101,7 @@ extern  "C" {
      * @param file     The HDFS file
      * @return         1 if the file is open for read; 0 otherwise
      */
+    LIBHDFS_EXTERNAL
     int hdfsFileIsOpenForRead(hdfsFile file);
 
     /**
@@ -85,6 +110,7 @@ extern  "C" {
      * @param file     The HDFS file
      * @return         1 if the file is open for write; 0 otherwise
      */
+    LIBHDFS_EXTERNAL
     int hdfsFileIsOpenForWrite(hdfsFile file);
 
     struct hdfsReadStatistics {
@@ -107,6 +133,7 @@ extern  "C" {
      *                 ENOTSUP.  webhdfs, LocalFilesystem, and so forth may
      *                 not support read statistics.
      */
+    LIBHDFS_EXTERNAL
     int hdfsFileGetReadStatistics(hdfsFile file,
                                   struct hdfsReadStatistics **stats);
 
@@ -115,6 +142,7 @@ extern  "C" {
      *
      * @return the number of remote bytes read.
      */
+    LIBHDFS_EXTERNAL
     int64_t hdfsReadStatisticsGetRemoteBytesRead(
                             const struct hdfsReadStatistics *stats);
 
@@ -129,6 +157,7 @@ extern  "C" {
      *                  statistics.
      *                  Errno will also be set to this code on failure.
      */
+    LIBHDFS_EXTERNAL
     int hdfsFileClearReadStatistics(hdfsFile file);
 
     /**
@@ -136,6 +165,7 @@ extern  "C" {
      *
      * @param stats    The HDFS read statistics to free.
      */
+    LIBHDFS_EXTERNAL
     void hdfsFileFreeReadStatistics(struct hdfsReadStatistics *stats);
 
     /** 
@@ -147,6 +177,7 @@ extern  "C" {
      * @return Returns a handle to the filesystem or NULL on error.
      * @deprecated Use hdfsBuilderConnect instead. 
      */
+     LIBHDFS_EXTERNAL
      hdfsFS hdfsConnectAsUser(const char* nn, tPort port, const char *user);
 
     /** 
@@ -157,6 +188,7 @@ extern  "C" {
      * @return Returns a handle to the filesystem or NULL on error.
      * @deprecated Use hdfsBuilderConnect instead. 
      */
+     LIBHDFS_EXTERNAL
      hdfsFS hdfsConnect(const char* nn, tPort port);
 
     /** 
@@ -170,6 +202,7 @@ extern  "C" {
      * @return       Returns a handle to the filesystem or NULL on error.
      * @deprecated   Use hdfsBuilderConnect instead. 
      */
+     LIBHDFS_EXTERNAL
      hdfsFS hdfsConnectAsUserNewInstance(const char* nn, tPort port, const char *user );
 
     /** 
@@ -182,6 +215,7 @@ extern  "C" {
      * @return       Returns a handle to the filesystem or NULL on error.
      * @deprecated   Use hdfsBuilderConnect instead. 
      */
+     LIBHDFS_EXTERNAL
      hdfsFS hdfsConnectNewInstance(const char* nn, tPort port);
 
     /** 
@@ -196,6 +230,7 @@ extern  "C" {
      * @param bld    The HDFS builder
      * @return       Returns a handle to the filesystem, or NULL on error.
      */
+     LIBHDFS_EXTERNAL
      hdfsFS hdfsBuilderConnect(struct hdfsBuilder *bld);
 
     /**
@@ -203,6 +238,7 @@ extern  "C" {
      *
      * @return The HDFS builder, or NULL on error.
      */
+    LIBHDFS_EXTERNAL
     struct hdfsBuilder *hdfsNewBuilder(void);
 
     /**
@@ -211,6 +247,7 @@ extern  "C" {
      *
      * @param bld The HDFS builder
      */
+    LIBHDFS_EXTERNAL
     void hdfsBuilderSetForceNewInstance(struct hdfsBuilder *bld);
 
     /**
@@ -234,6 +271,7 @@ extern  "C" {
      *             hdfsBuilderSetNameNodePort.  However, you must not pass the
      *             port in two different ways.
      */
+    LIBHDFS_EXTERNAL
     void hdfsBuilderSetNameNode(struct hdfsBuilder *bld, const char *nn);
 
     /**
@@ -242,6 +280,7 @@ extern  "C" {
      * @param bld The HDFS builder
      * @param port The port.
      */
+    LIBHDFS_EXTERNAL
     void hdfsBuilderSetNameNodePort(struct hdfsBuilder *bld, tPort port);
 
     /**
@@ -250,6 +289,7 @@ extern  "C" {
      * @param bld The HDFS builder
      * @param userName The user name.  The string will be shallow-copied.
      */
+    LIBHDFS_EXTERNAL
     void hdfsBuilderSetUserName(struct hdfsBuilder *bld, const char *userName);
 
     /**
@@ -260,6 +300,7 @@ extern  "C" {
      * @param kerbTicketCachePath The Kerberos ticket cache path.  The string
      *                            will be shallow-copied.
      */
+    LIBHDFS_EXTERNAL
     void hdfsBuilderSetKerbTicketCachePath(struct hdfsBuilder *bld,
                                    const char *kerbTicketCachePath);
 
@@ -271,6 +312,7 @@ extern  "C" {
      *
      * @param bld The HDFS builder
      */
+    LIBHDFS_EXTERNAL
     void hdfsFreeBuilder(struct hdfsBuilder *bld);
 
     /**
@@ -284,6 +326,7 @@ extern  "C" {
      *
      * @return         0 on success; nonzero error code otherwise.
      */
+    LIBHDFS_EXTERNAL
     int hdfsBuilderConfSetStr(struct hdfsBuilder *bld, const char *key,
                               const char *val);
 
@@ -298,6 +341,7 @@ extern  "C" {
      * @return         0 on success; nonzero error code otherwise.
      *                 Failure to find the key is not an error.
      */
+    LIBHDFS_EXTERNAL
     int hdfsConfGetStr(const char *key, char **val);
 
     /**
@@ -310,6 +354,7 @@ extern  "C" {
      * @return         0 on success; nonzero error code otherwise.
      *                 Failure to find the key is not an error.
      */
+    LIBHDFS_EXTERNAL
     int hdfsConfGetInt(const char *key, int32_t *val);
 
     /**
@@ -317,6 +362,7 @@ extern  "C" {
      *
      * @param val      A configuration string obtained from hdfsConfGetStr
      */
+    LIBHDFS_EXTERNAL
     void hdfsConfStrFree(char *val);
 
     /** 
@@ -327,6 +373,7 @@ extern  "C" {
      *         Even if there is an error, the resources associated with the
      *         hdfsFS will be freed.
      */
+    LIBHDFS_EXTERNAL
     int hdfsDisconnect(hdfsFS fs);
         
 
@@ -344,6 +391,7 @@ extern  "C" {
      * default configured values.
      * @return Returns the handle to the open file or NULL on error.
      */
+    LIBHDFS_EXTERNAL
     hdfsFile hdfsOpenFile(hdfsFS fs, const char* path, int flags,
                           int bufferSize, short replication, tSize blocksize);
 
@@ -355,6 +403,7 @@ extern  "C" {
      *              ENOTSUP if the file does not support unbuffering
      *              Errno will also be set to this value.
      */
+    LIBHDFS_EXTERNAL
     int hdfsUnbufferFile(hdfsFile file);
 
     /** 
@@ -367,6 +416,7 @@ extern  "C" {
      *         be freed at the end of this call, even if there was an I/O
      *         error.
      */
+    LIBHDFS_EXTERNAL
     int hdfsCloseFile(hdfsFS fs, hdfsFile file);
 
 
@@ -376,6 +426,7 @@ extern  "C" {
      * @param path The path to look for
      * @return Returns 0 on success, -1 on error.  
      */
+    LIBHDFS_EXTERNAL
     int hdfsExists(hdfsFS fs, const char *path);
 
 
@@ -387,6 +438,7 @@ extern  "C" {
      * @param desiredPos Offset into the file to seek into.
      * @return Returns 0 on success, -1 on error.  
      */
+    LIBHDFS_EXTERNAL
     int hdfsSeek(hdfsFS fs, hdfsFile file, tOffset desiredPos); 
 
 
@@ -396,6 +448,7 @@ extern  "C" {
      * @param file The file handle.
      * @return Current offset, -1 on error.
      */
+    LIBHDFS_EXTERNAL
     tOffset hdfsTell(hdfsFS fs, hdfsFile file);
 
 
@@ -413,6 +466,7 @@ extern  "C" {
      *              and set errno to EINTR if data is temporarily unavailable,
      *              but we are not yet at the end of the file.
      */
+    LIBHDFS_EXTERNAL
     tSize hdfsRead(hdfsFS fs, hdfsFile file, void* buffer, tSize length);
 
     /** 
@@ -424,6 +478,7 @@ extern  "C" {
      * @param length The length of the buffer.
      * @return      See hdfsRead
      */
+    LIBHDFS_EXTERNAL
     tSize hdfsPread(hdfsFS fs, hdfsFile file, tOffset position,
                     void* buffer, tSize length);
 
@@ -436,6 +491,7 @@ extern  "C" {
      * @param length The no. of bytes to write. 
      * @return Returns the number of bytes written, -1 on error.
      */
+    LIBHDFS_EXTERNAL
     tSize hdfsWrite(hdfsFS fs, hdfsFile file, const void* buffer,
                     tSize length);
 
@@ -446,6 +502,7 @@ extern  "C" {
      * @param file The file handle.
      * @return Returns 0 on success, -1 on error. 
      */
+    LIBHDFS_EXTERNAL
     int hdfsFlush(hdfsFS fs, hdfsFile file);
 
 
@@ -456,6 +513,7 @@ extern  "C" {
      * @param file file handle
      * @return 0 on success, -1 on error and sets errno
      */
+    LIBHDFS_EXTERNAL
     int hdfsHFlush(hdfsFS fs, hdfsFile file);
 
 
@@ -467,6 +525,7 @@ extern  "C" {
      * @param file file handle
      * @return 0 on success, -1 on error and sets errno
      */
+    LIBHDFS_EXTERNAL
     int hdfsHSync(hdfsFS fs, hdfsFile file);
 
 
@@ -477,6 +536,7 @@ extern  "C" {
      * @param file The file handle.
      * @return Returns available bytes; -1 on error. 
      */
+    LIBHDFS_EXTERNAL
     int hdfsAvailable(hdfsFS fs, hdfsFile file);
 
 
@@ -488,6 +548,7 @@ extern  "C" {
      * @param dst The path of destination file. 
      * @return Returns 0 on success, -1 on error. 
      */
+    LIBHDFS_EXTERNAL
     int hdfsCopy(hdfsFS srcFS, const char* src, hdfsFS dstFS, const char* dst);
 
 
@@ -499,6 +560,7 @@ extern  "C" {
      * @param dst The path of destination file. 
      * @return Returns 0 on success, -1 on error. 
      */
+    LIBHDFS_EXTERNAL
     int hdfsMove(hdfsFS srcFS, const char* src, hdfsFS dstFS, const char* dst);
 
 
@@ -511,6 +573,7 @@ extern  "C" {
      * case of a file the recursive argument is irrelevant.
      * @return Returns 0 on success, -1 on error. 
      */
+    LIBHDFS_EXTERNAL
     int hdfsDelete(hdfsFS fs, const char* path, int recursive);
 
     /**
@@ -520,6 +583,7 @@ extern  "C" {
      * @param newPath The path of the destination file. 
      * @return Returns 0 on success, -1 on error. 
      */
+    LIBHDFS_EXTERNAL
     int hdfsRename(hdfsFS fs, const char* oldPath, const char* newPath);
 
 
@@ -531,6 +595,7 @@ extern  "C" {
      * @param bufferSize The length of user-buffer.
      * @return Returns buffer, NULL on error.
      */
+    LIBHDFS_EXTERNAL
     char* hdfsGetWorkingDirectory(hdfsFS fs, char *buffer, size_t bufferSize);
 
 
@@ -541,6 +606,7 @@ extern  "C" {
      * @param path The path of the new 'cwd'. 
      * @return Returns 0 on success, -1 on error. 
      */
+    LIBHDFS_EXTERNAL
     int hdfsSetWorkingDirectory(hdfsFS fs, const char* path);
 
 
@@ -551,6 +617,7 @@ extern  "C" {
      * @param path The path of the directory. 
      * @return Returns 0 on success, -1 on error. 
      */
+    LIBHDFS_EXTERNAL
     int hdfsCreateDirectory(hdfsFS fs, const char* path);
 
 
@@ -561,6 +628,7 @@ extern  "C" {
      * @param path The path of the file. 
      * @return Returns 0 on success, -1 on error. 
      */
+    LIBHDFS_EXTERNAL
     int hdfsSetReplication(hdfsFS fs, const char* path, int16_t replication);
 
 
@@ -590,6 +658,7 @@ extern  "C" {
      * @return Returns a dynamically-allocated array of hdfsFileInfo
      * objects; NULL on error.
      */
+    LIBHDFS_EXTERNAL
     hdfsFileInfo *hdfsListDirectory(hdfsFS fs, const char* path,
                                     int *numEntries);
 
@@ -603,6 +672,7 @@ extern  "C" {
      * @return Returns a dynamically-allocated hdfsFileInfo object;
      * NULL on error.
      */
+    LIBHDFS_EXTERNAL
     hdfsFileInfo *hdfsGetPathInfo(hdfsFS fs, const char* path);
 
 
@@ -612,6 +682,7 @@ extern  "C" {
      * objects.
      * @param numEntries The size of the array.
      */
+    LIBHDFS_EXTERNAL
     void hdfsFreeFileInfo(hdfsFileInfo *hdfsFileInfo, int numEntries);
 
     /**
@@ -620,6 +691,7 @@ extern  "C" {
      * @return -1 if there was an error (errno will be set), 0 if the file is
      *         not encrypted, 1 if the file is encrypted.
      */
+    LIBHDFS_EXTERNAL
     int hdfsFileIsEncrypted(hdfsFileInfo *hdfsFileInfo);
 
 
@@ -635,6 +707,7 @@ extern  "C" {
      * @return Returns a dynamically-allocated 2-d array of blocks-hosts;
      * NULL on error.
      */
+    LIBHDFS_EXTERNAL
     char*** hdfsGetHosts(hdfsFS fs, const char* path, 
             tOffset start, tOffset length);
 
@@ -645,6 +718,7 @@ extern  "C" {
      * objects.
      * @param numEntries The size of the array.
      */
+    LIBHDFS_EXTERNAL
     void hdfsFreeHosts(char ***blockHosts);
 
 
@@ -656,6 +730,7 @@ extern  "C" {
      *
      * @return              Returns the default blocksize, or -1 on error.
      */
+    LIBHDFS_EXTERNAL
     tOffset hdfsGetDefaultBlockSize(hdfsFS fs);
 
 
@@ -669,6 +744,7 @@ extern  "C" {
      *
      * @return              Returns the default blocksize, or -1 on error.
      */
+    LIBHDFS_EXTERNAL
     tOffset hdfsGetDefaultBlockSizeAtPath(hdfsFS fs, const char *path);
 
 
@@ -677,6 +753,7 @@ extern  "C" {
      * @param fs The configured filesystem handle.
      * @return Returns the raw-capacity; -1 on error. 
      */
+    LIBHDFS_EXTERNAL
     tOffset hdfsGetCapacity(hdfsFS fs);
 
 
@@ -685,6 +762,7 @@ extern  "C" {
      * @param fs The configured filesystem handle.
      * @return Returns the total-size; -1 on error. 
      */
+    LIBHDFS_EXTERNAL
     tOffset hdfsGetUsed(hdfsFS fs);
 
     /** 
@@ -696,6 +774,7 @@ extern  "C" {
      * @param group         Group string.  Set to NULL for 'no change'
      * @return              0 on success else -1
      */
+    LIBHDFS_EXTERNAL
     int hdfsChown(hdfsFS fs, const char* path, const char *owner,
                   const char *group);
 
@@ -706,7 +785,8 @@ extern  "C" {
      * @param mode the bitmask to set it to
      * @return 0 on success else -1
      */
-      int hdfsChmod(hdfsFS fs, const char* path, short mode);
+    LIBHDFS_EXTERNAL
+    int hdfsChmod(hdfsFS fs, const char* path, short mode);
 
     /** 
      * hdfsUtime
@@ -716,6 +796,7 @@ extern  "C" {
      * @param atime new access time or -1 for no change
      * @return 0 on success else -1
      */
+    LIBHDFS_EXTERNAL
     int hdfsUtime(hdfsFS fs, const char* path, tTime mtime, tTime atime);
 
     /**
@@ -728,6 +809,7 @@ extern  "C" {
      *                    not be allocated.  If NULL is returned, errno will
      *                    contain the error number.
      */
+    LIBHDFS_EXTERNAL
     struct hadoopRzOptions *hadoopRzOptionsAlloc(void);
 
     /**
@@ -739,6 +821,7 @@ extern  "C" {
      *
      * @return            0 on success; -1 plus errno on failure.
      */
+    LIBHDFS_EXTERNAL
     int hadoopRzOptionsSetSkipChecksum(
             struct hadoopRzOptions *opts, int skip);
 
@@ -756,6 +839,7 @@ extern  "C" {
      *                    instantiated;
      *                    -1 plus errno otherwise.
      */
+    LIBHDFS_EXTERNAL
     int hadoopRzOptionsSetByteBufferPool(
             struct hadoopRzOptions *opts, const char *className);
 
@@ -765,6 +849,7 @@ extern  "C" {
      * @param opts        The options structure to free.
      *                    Any associated ByteBufferPool will also be freed.
      */
+    LIBHDFS_EXTERNAL
     void hadoopRzOptionsFree(struct hadoopRzOptions *opts);
 
     /**
@@ -790,6 +875,7 @@ extern  "C" {
      *                   zero-copy read, and there was no ByteBufferPool
      *                   supplied.
      */
+    LIBHDFS_EXTERNAL
     struct hadoopRzBuffer* hadoopReadZero(hdfsFile file,
             struct hadoopRzOptions *opts, int32_t maxLength);
 
@@ -799,6 +885,7 @@ extern  "C" {
      * @param buffer     a buffer returned from readZero.
      * @return           the length of the buffer.
      */
+    LIBHDFS_EXTERNAL
     int32_t hadoopRzBufferLength(const struct hadoopRzBuffer *buffer);
 
     /**
@@ -811,6 +898,7 @@ extern  "C" {
      * @return           a pointer to the start of the buffer.  This will be
      *                   NULL when end-of-file has been reached.
      */
+    LIBHDFS_EXTERNAL
     const void *hadoopRzBufferGet(const struct hadoopRzBuffer *buffer);
 
     /**
@@ -820,12 +908,14 @@ extern  "C" {
      *                   the same stream you called hadoopReadZero on.
      * @param buffer     The buffer to release.
      */
+    LIBHDFS_EXTERNAL
     void hadoopRzBufferFree(hdfsFile file, struct hadoopRzBuffer *buffer);
 
 #ifdef __cplusplus
 }
 #endif
 
+#undef LIBHDFS_EXTERNAL
 #endif /*LIBHDFS_HDFS_H*/
 
 /**