Merge branch 'win32' into win32-3
authorRonnie Sahlberg <ronniesahlberg@gmail.com>
Sat, 3 Sep 2011 00:57:42 +0000 (10:57 +1000)
committerRonnie Sahlberg <ronniesahlberg@gmail.com>
Sat, 3 Sep 2011 00:57:42 +0000 (10:57 +1000)
1  2 
include/libnfs.h
lib/libnfs-sync.c
lib/libnfs.c
lib/socket.c
nfs/nfs.c

diff --combined include/libnfs.h
index 3a8304a00f9187f782d951d1fa0ae9996d2c9e0e,c72b7cf537622ed29ea9a2b981d1d4d44fae6c3f..dd63f9623816f8b4a3d67b28ed89555e7af5048e
  struct nfs_context;
  struct rpc_context;
  
+ #if defined(WIN32)
+ #define EXTERN __declspec( dllexport )
+ #else
+ #define EXTERN 
+ #endif
+ #if defined(WIN32)
+ struct statvfs {
+       uint32_t        f_bsize;
+       uint32_t        f_frsize;
+       uint64_t        f_blocks;
+       uint64_t        f_bfree;
+       uint64_t        f_bavail;
+       uint32_t        f_files;
+       uint32_t        f_ffree;
+       uint32_t        f_favail;
+       uint32_t        f_fsid; 
+       uint32_t        f_flag;
+       uint32_t        f_namemax;
+ };
+ struct utimbuf {
+       time_t actime;
+       time_t modtime;
+ };
+ #define R_OK  4
+ #define W_OK  2
+ #define X_OK  1
+ #endif
  /*
   * Used for interfacing the async version of the api into an external eventsystem
   */
- int nfs_get_fd(struct nfs_context *nfs);
- int nfs_which_events(struct nfs_context *nfs);
- int nfs_service(struct nfs_context *nfs, int revents);
EXTERN int nfs_get_fd(struct nfs_context *nfs);
EXTERN int nfs_which_events(struct nfs_context *nfs);
EXTERN int nfs_service(struct nfs_context *nfs, int revents);
  
  /*
   * Used if you need different credentials than the default for the current user.
   */
  struct AUTH;
- void nfs_set_auth(struct nfs_context *nfs, struct AUTH *auth);
EXTERN void nfs_set_auth(struct nfs_context *nfs, struct AUTH *auth);
  
  
  /*
   * When an operation failed, this function can extract a detailed error string.
   */
- char *nfs_get_error(struct nfs_context *nfs);
EXTERN char *nfs_get_error(struct nfs_context *nfs);
  
  
  /*
@@@ -63,11 -92,11 +92,11 @@@ typedef void (*rpc_cb)(struct rpc_conte
   *  NULL : Failed to create a context.
   *  *nfs : A pointer to an nfs context.
   */
- struct nfs_context *nfs_init_context(void);
EXTERN struct nfs_context *nfs_init_context(void);
  /*
   * Destroy an nfs context.
   */
- void nfs_destroy_context(struct nfs_context *nfs);
EXTERN void nfs_destroy_context(struct nfs_context *nfs);
  
  
  struct nfsfh;
  /*
   * Get the maximum supported READ3 size by the server
   */
- size_t nfs_get_readmax(struct nfs_context *nfs);
EXTERN size_t nfs_get_readmax(struct nfs_context *nfs);
  
  /*
   * Get the maximum supported WRITE3 size by the server
   */
- size_t nfs_get_writemax(struct nfs_context *nfs);
EXTERN size_t nfs_get_writemax(struct nfs_context *nfs);
  
  
  /*
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_mount_async(struct nfs_context *nfs, const char *server, const char *exportname, nfs_cb cb, void *private_data);
EXTERN int nfs_mount_async(struct nfs_context *nfs, const char *server, const char *exportname, nfs_cb cb, void *private_data);
  /*
   * Sync nfs mount.
   * Function returns
   *      0 : The operation was successfull.
   * -errno : The command failed.
   */
- int nfs_mount(struct nfs_context *nfs, const char *server, const char *exportname);
EXTERN int nfs_mount(struct nfs_context *nfs, const char *server, const char *exportname);
  
  
  
   *          data is the error string.
   */
  struct stat;
- int nfs_stat_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void *private_data);
EXTERN int nfs_stat_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void *private_data);
  /*
   * Sync stat(<filename>)
   * Function returns
   *      0 : The operation was successfull.
   * -errno : The command failed.
   */
- int nfs_stat(struct nfs_context *nfs, const char *path, struct stat *st);
EXTERN int nfs_stat(struct nfs_context *nfs, const char *path, struct stat *st);
  
  
  /*
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_fstat_async(struct nfs_context *nfs, struct nfsfh *nfsfh, nfs_cb cb, void *private_data);
EXTERN int nfs_fstat_async(struct nfs_context *nfs, struct nfsfh *nfsfh, nfs_cb cb, void *private_data);
  /*
   * Sync fstat(nfsfh *)
   * Function returns
   *      0 : The operation was successfull.
   * -errno : The command failed.
   */
- int nfs_fstat(struct nfs_context *nfs, struct nfsfh *nfsfh, struct stat *st);
EXTERN int nfs_fstat(struct nfs_context *nfs, struct nfsfh *nfsfh, struct stat *st);
  
  
  
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_open_async(struct nfs_context *nfs, const char *path, int mode, nfs_cb cb, void *private_data);
EXTERN int nfs_open_async(struct nfs_context *nfs, const char *path, int mode, nfs_cb cb, void *private_data);
  /*
   * Sync stat(<filename>)
   * Function returns
   *      0 : The operation was successfull. *nfsfh is filled in.
   * -errno : The command failed.
   */
- int nfs_open(struct nfs_context *nfs, const char *path, int mode, struct nfsfh **nfsfh);
EXTERN int nfs_open(struct nfs_context *nfs, const char *path, int mode, struct nfsfh **nfsfh);
  
  
  
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_close_async(struct nfs_context *nfs, struct nfsfh *nfsfh, nfs_cb cb, void *private_data);
EXTERN int nfs_close_async(struct nfs_context *nfs, struct nfsfh *nfsfh, nfs_cb cb, void *private_data);
  /*
   * Sync close(nfsfh)
   * Function returns
   *      0 : The operation was successfull.
   * -errno : The command failed.
   */
- int nfs_close(struct nfs_context *nfs, struct nfsfh *nfsfh);
EXTERN int nfs_close(struct nfs_context *nfs, struct nfsfh *nfsfh);
  
  
  /*
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_pread_async(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset, size_t count, nfs_cb cb, void *private_data);
EXTERN int nfs_pread_async(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset, size_t count, nfs_cb cb, void *private_data);
  /*
   * Sync pread()
   * Function returns
   *    >=0 : numer of bytes read.
   * -errno : An error occured.
   */
- int nfs_pread(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset, size_t count, char *buf);
EXTERN int nfs_pread(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset, size_t count, char *buf);
  
  
  
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_read_async(struct nfs_context *nfs, struct nfsfh *nfsfh, size_t count, nfs_cb cb, void *private_data);
EXTERN int nfs_read_async(struct nfs_context *nfs, struct nfsfh *nfsfh, size_t count, nfs_cb cb, void *private_data);
  /*
   * Sync read()
   * Function returns
   *    >=0 : numer of bytes read.
   * -errno : An error occured.
   */
- int nfs_read(struct nfs_context *nfs, struct nfsfh *nfsfh, size_t count, char *buf);
EXTERN int nfs_read(struct nfs_context *nfs, struct nfsfh *nfsfh, size_t count, char *buf);
  
  
  
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_pwrite_async(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset, size_t count, char *buf, nfs_cb cb, void *private_data);
EXTERN int nfs_pwrite_async(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset, size_t count, char *buf, nfs_cb cb, void *private_data);
  /*
   * Sync pwrite()
   * Function returns
   *    >=0 : numer of bytes written.
   * -errno : An error occured.
   */
- int nfs_pwrite(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset, size_t count, char *buf);
EXTERN int nfs_pwrite(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset, size_t count, char *buf);
  
  
  /*
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_write_async(struct nfs_context *nfs, struct nfsfh *nfsfh, size_t count, char *buf, nfs_cb cb, void *private_data);
EXTERN int nfs_write_async(struct nfs_context *nfs, struct nfsfh *nfsfh, size_t count, char *buf, nfs_cb cb, void *private_data);
  /*
   * Sync write()
   * Function returns
   *    >=0 : numer of bytes written.
   * -errno : An error occured.
   */
- int nfs_write(struct nfs_context *nfs, struct nfsfh *nfsfh, size_t count, char *buf);
EXTERN int nfs_write(struct nfs_context *nfs, struct nfsfh *nfsfh, size_t count, char *buf);
  
  
  /*
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_lseek_async(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset, int whence, nfs_cb cb, void *private_data);
EXTERN int nfs_lseek_async(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset, int whence, nfs_cb cb, void *private_data);
  /*
   * Sync lseek()
   * Function returns
   *    >=0 : numer of bytes read.
   * -errno : An error occured.
   */
- int nfs_lseek(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset, int whence, off_t *current_offset);
EXTERN int nfs_lseek(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset, int whence, off_t *current_offset);
  
  
  /*
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_fsync_async(struct nfs_context *nfs, struct nfsfh *nfsfh, nfs_cb cb, void *private_data);
EXTERN int nfs_fsync_async(struct nfs_context *nfs, struct nfsfh *nfsfh, nfs_cb cb, void *private_data);
  /*
   * Sync fsync()
   * Function returns
   *      0 : Success
   * -errno : An error occured.
   */
- int nfs_fsync(struct nfs_context *nfs, struct nfsfh *nfsfh);
EXTERN int nfs_fsync(struct nfs_context *nfs, struct nfsfh *nfsfh);
  
  
  
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_truncate_async(struct nfs_context *nfs, const char *path, off_t length, nfs_cb cb, void *private_data);
EXTERN int nfs_truncate_async(struct nfs_context *nfs, const char *path, off_t length, nfs_cb cb, void *private_data);
  /*
   * Sync truncate()
   * Function returns
   *      0 : Success
   * -errno : An error occured.
   */
- int nfs_truncate(struct nfs_context *nfs, const char *path, off_t length);
EXTERN int nfs_truncate(struct nfs_context *nfs, const char *path, off_t length);
  
  
  
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_ftruncate_async(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t length, nfs_cb cb, void *private_data);
EXTERN int nfs_ftruncate_async(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t length, nfs_cb cb, void *private_data);
  /*
   * Sync ftruncate()
   * Function returns
   *      0 : Success
   * -errno : An error occured.
   */
- int nfs_ftruncate(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t length);
EXTERN int nfs_ftruncate(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t length);
  
  
  
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_mkdir_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void *private_data);
EXTERN int nfs_mkdir_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void *private_data);
  /*
   * Sync mkdir()
   * Function returns
   *      0 : Success
   * -errno : An error occured.
   */
- int nfs_mkdir(struct nfs_context *nfs, const char *path);
EXTERN int nfs_mkdir(struct nfs_context *nfs, const char *path);
  
  
  
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_rmdir_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void *private_data);
EXTERN int nfs_rmdir_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void *private_data);
  /*
   * Sync rmdir()
   * Function returns
   *      0 : Success
   * -errno : An error occured.
   */
- int nfs_rmdir(struct nfs_context *nfs, const char *path);
EXTERN int nfs_rmdir(struct nfs_context *nfs, const char *path);
  
  
  
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_creat_async(struct nfs_context *nfs, const char *path, int mode, nfs_cb cb, void *private_data);
EXTERN int nfs_creat_async(struct nfs_context *nfs, const char *path, int mode, nfs_cb cb, void *private_data);
  /*
   * Sync creat()
   * Function returns
   *      0 : Success
   * -errno : An error occured.
   */
- int nfs_creat(struct nfs_context *nfs, const char *path, int mode, struct nfsfh **nfsfh);
EXTERN int nfs_creat(struct nfs_context *nfs, const char *path, int mode, struct nfsfh **nfsfh);
  
  
  
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_unlink_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void *private_data);
EXTERN int nfs_unlink_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void *private_data);
  /*
   * Sync unlink()
   * Function returns
   *      0 : Success
   * -errno : An error occured.
   */
- int nfs_unlink(struct nfs_context *nfs, const char *path);
EXTERN int nfs_unlink(struct nfs_context *nfs, const char *path);
  
  
  
@@@ -564,14 -593,14 +593,14 @@@ struct nfsdir
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_opendir_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void *private_data);
EXTERN int nfs_opendir_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void *private_data);
  /*
   * Sync opendir()
   * Function returns
   *      0 : Success
   * -errno : An error occured.
   */
- int nfs_opendir(struct nfs_context *nfs, const char *path, struct nfsdir **nfsdir);
EXTERN int nfs_opendir(struct nfs_context *nfs, const char *path, struct nfsdir **nfsdir);
  
  
  
@@@ -582,19 -611,11 +611,19 @@@ struct nfsdirent  
         struct nfsdirent *next;
         char *name;
         uint64_t inode;
 +
 +       /* some extra fields we get for free through the READDIRPLUS3 call. You need libnfs-raw-nfs.h for these */
 +       uint32_t type; /* NF3REG, NF3DIR, NF3BLK, ... */
 +       uint32_t mode;
 +       uint64_t size;
 +       struct timeval atime;
 +       struct timeval mtime;
 +       struct timeval ctime;
  };
  /*
   * nfs_readdir() never blocks, so no special sync/async versions are available
   */
- struct nfsdirent *nfs_readdir(struct nfs_context *nfs, struct nfsdir *nfsdir);
EXTERN struct nfsdirent *nfs_readdir(struct nfs_context *nfs, struct nfsdir *nfsdir);
  
  
  
  /*
   * nfs_closedir() never blocks, so no special sync/async versions are available
   */
- void nfs_closedir(struct nfs_context *nfs, struct nfsdir *nfsdir);
EXTERN void nfs_closedir(struct nfs_context *nfs, struct nfsdir *nfsdir);
  
  
  
   *          data is the error string.
   */
  struct statvfs;
- int nfs_statvfs_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void *private_data);
EXTERN int nfs_statvfs_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void *private_data);
  /*
   * Sync statvfs(<dirname>)
   * Function returns
   *      0 : The operation was successfull.
   * -errno : The command failed.
   */
- int nfs_statvfs(struct nfs_context *nfs, const char *path, struct statvfs *svfs);
EXTERN int nfs_statvfs(struct nfs_context *nfs, const char *path, struct statvfs *svfs);
  
  
  /*
   *          data is the error string.
   */
  struct statvfs;
- int nfs_readlink_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void *private_data);
EXTERN int nfs_readlink_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void *private_data);
  /*
   * Sync readlink(<name>)
   * Function returns
   *      0 : The operation was successfull.
   * -errno : The command failed.
   */
- int nfs_readlink(struct nfs_context *nfs, const char *path, char *buf, int bufsize);
EXTERN int nfs_readlink(struct nfs_context *nfs, const char *path, char *buf, int bufsize);
  
  
  
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_chmod_async(struct nfs_context *nfs, const char *path, int mode, nfs_cb cb, void *private_data);
EXTERN int nfs_chmod_async(struct nfs_context *nfs, const char *path, int mode, nfs_cb cb, void *private_data);
  /*
   * Sync chmod(<name>)
   * Function returns
   *      0 : The operation was successfull.
   * -errno : The command failed.
   */
- int nfs_chmod(struct nfs_context *nfs, const char *path, int mode);
EXTERN int nfs_chmod(struct nfs_context *nfs, const char *path, int mode);
  
  
  
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_fchmod_async(struct nfs_context *nfs, struct nfsfh *nfsfh, int mode, nfs_cb cb, void *private_data);
EXTERN int nfs_fchmod_async(struct nfs_context *nfs, struct nfsfh *nfsfh, int mode, nfs_cb cb, void *private_data);
  /*
   * Sync fchmod(<handle>)
   * Function returns
   *      0 : The operation was successfull.
   * -errno : The command failed.
   */
- int nfs_fchmod(struct nfs_context *nfs, struct nfsfh *nfsfh, int mode);
EXTERN int nfs_fchmod(struct nfs_context *nfs, struct nfsfh *nfsfh, int mode);
  
  
  
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_chown_async(struct nfs_context *nfs, const char *path, int uid, int gid, nfs_cb cb, void *private_data);
EXTERN int nfs_chown_async(struct nfs_context *nfs, const char *path, int uid, int gid, nfs_cb cb, void *private_data);
  /*
   * Sync chown(<name>)
   * Function returns
   *      0 : The operation was successfull.
   * -errno : The command failed.
   */
- int nfs_chown(struct nfs_context *nfs, const char *path, int uid, int gid);
EXTERN int nfs_chown(struct nfs_context *nfs, const char *path, int uid, int gid);
  
  
  
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_fchown_async(struct nfs_context *nfs, struct nfsfh *nfsfh, int uid, int gid, nfs_cb cb, void *private_data);
EXTERN int nfs_fchown_async(struct nfs_context *nfs, struct nfsfh *nfsfh, int uid, int gid, nfs_cb cb, void *private_data);
  /*
   * Sync fchown(<handle>)
   * Function returns
   *      0 : The operation was successfull.
   * -errno : The command failed.
   */
- int nfs_fchown(struct nfs_context *nfs, struct nfsfh *nfsfh, int uid, int gid);
EXTERN int nfs_fchown(struct nfs_context *nfs, struct nfsfh *nfsfh, int uid, int gid);
  
  
  
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_utimes_async(struct nfs_context *nfs, const char *path, struct timeval *times, nfs_cb cb, void *private_data);
EXTERN int nfs_utimes_async(struct nfs_context *nfs, const char *path, struct timeval *times, nfs_cb cb, void *private_data);
  /*
   * Sync utimes(<path>)
   * Function returns
   *      0 : The operation was successfull.
   * -errno : The command failed.
   */
- int nfs_utimes(struct nfs_context *nfs, const char *path, struct timeval *times);
EXTERN int nfs_utimes(struct nfs_context *nfs, const char *path, struct timeval *times);
  
  
  /*
   *          data is the error string.
   */
  struct utimbuf;
- int nfs_utime_async(struct nfs_context *nfs, const char *path, struct utimbuf *times, nfs_cb cb, void *private_data);
EXTERN int nfs_utime_async(struct nfs_context *nfs, const char *path, struct utimbuf *times, nfs_cb cb, void *private_data);
  /*
   * Sync utime(<path>)
   * Function returns
   *      0 : The operation was successfull.
   * -errno : The command failed.
   */
- int nfs_utime(struct nfs_context *nfs, const char *path, struct utimbuf *times);
EXTERN int nfs_utime(struct nfs_context *nfs, const char *path, struct utimbuf *times);
  
  
  
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_access_async(struct nfs_context *nfs, const char *path, int mode, nfs_cb cb, void *private_data);
EXTERN int nfs_access_async(struct nfs_context *nfs, const char *path, int mode, nfs_cb cb, void *private_data);
  /*
   * Sync access(<path>)
   * Function returns
   *      0 : The operation was successfull.
   * -errno : The command failed.
   */
- int nfs_access(struct nfs_context *nfs, const char *path, int mode);
EXTERN int nfs_access(struct nfs_context *nfs, const char *path, int mode);
  
  
  
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_symlink_async(struct nfs_context *nfs, const char *oldpath, const char *newpath, nfs_cb cb, void *private_data);
EXTERN int nfs_symlink_async(struct nfs_context *nfs, const char *oldpath, const char *newpath, nfs_cb cb, void *private_data);
  /*
   * Sync symlink(<path>)
   * Function returns
   *      0 : The operation was successfull.
   * -errno : The command failed.
   */
- int nfs_symlink(struct nfs_context *nfs, const char *oldpath, const char *newpath);
EXTERN int nfs_symlink(struct nfs_context *nfs, const char *oldpath, const char *newpath);
  
  
  /*
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_rename_async(struct nfs_context *nfs, const char *oldpath, const char *newpath, nfs_cb cb, void *private_data);
EXTERN int nfs_rename_async(struct nfs_context *nfs, const char *oldpath, const char *newpath, nfs_cb cb, void *private_data);
  /*
   * Sync rename(<oldpath>, <newpath>)
   * Function returns
   *      0 : The operation was successfull.
   * -errno : The command failed.
   */
- int nfs_rename(struct nfs_context *nfs, const char *oldpath, const char *newpath);
EXTERN int nfs_rename(struct nfs_context *nfs, const char *oldpath, const char *newpath);
  
  
  
   * -errno : An error occured.
   *          data is the error string.
   */
- int nfs_link_async(struct nfs_context *nfs, const char *oldpath, const char *newpath, nfs_cb cb, void *private_data);
EXTERN int nfs_link_async(struct nfs_context *nfs, const char *oldpath, const char *newpath, nfs_cb cb, void *private_data);
  /*
   * Sync link(<oldpath>, <newpath>)
   * Function returns
   *      0 : The operation was successfull.
   * -errno : The command failed.
   */
- int nfs_link(struct nfs_context *nfs, const char *oldpath, const char *newpath);
EXTERN int nfs_link(struct nfs_context *nfs, const char *oldpath, const char *newpath);
  
  
  /*
   * -errno : An error occured.
   *          data is the error string.
   */
- int mount_getexports_async(struct rpc_context *rpc, const char *server, rpc_cb cb, void *private_data);
EXTERN int mount_getexports_async(struct rpc_context *rpc, const char *server, rpc_cb cb, void *private_data);
  /*
   * Sync getexports(<server>)
   * Function returns
   * 
   * returned data must be freed by calling mount_free_export_list(exportnode);
   */
- struct exportnode *mount_getexports(const char *server);
EXTERN struct exportnode *mount_getexports(const char *server);
  
- void mount_free_export_list(struct exportnode *exports);
EXTERN void mount_free_export_list(struct exportnode *exports);
  
  
  //qqq replace later with lseek(cur, 0)
diff --combined lib/libnfs-sync.c
index 510772fa1efe6f7e889ac7af2e7b1277157475a7,3d3692b403ebcf18c1d117b890f3984bb1b50cd9..cfeb5759989ae3835172001e6719efca138758e0
   * High level api to nfs filesystems
   */
  
+ #if defined (WIN32)
+ #include <winsock2.h>
+ #define DllExport
+ #else
+ #include <strings.h>
+ #include <unistd.h>
+ #include <sys/statvfs.h>
+ #include <poll.h>
+ #include <sys/ioctl.h>
+ #include <netdb.h>
+ #include <sys/socket.h>
+ #include <net/if.h>
+ #endif
+ #ifdef HAVE_CONFIG_H
  #include "config.h"
+ #endif
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
- #include <strings.h>
  #include <sys/types.h>
  #include <sys/stat.h>
- #include <sys/statvfs.h>
- #include <sys/ioctl.h>
- #include <unistd.h>
  #include <fcntl.h>
  #include <errno.h>
 +#include <poll.h>
 +#include <sys/socket.h>
 +#include <net/if.h>
 +#include <netdb.h>
 +#ifdef HAVE_SYS_SOCKIO_H
 +#include <sys/sockio.h>
 +#endif
  #include "libnfs.h"
  #include "libnfs-raw.h"
  #include "libnfs-raw-mount.h"
@@@ -1174,7 -1180,7 +1187,7 @@@ void mount_free_export_list(struct expo
  
  
  
+ #if !defined(WIN32)
  void free_nfs_srvr_list(struct nfs_server_list *srv)
  {
        while (srv != NULL) {
@@@ -1380,3 -1386,4 +1393,4 @@@ struct nfs_server_list *nfs_find_local_
  
        return data.srvrs;
  }
+ #endif
diff --combined lib/libnfs.c
index 75372359f261b6f7dc7b07b0c1ce78e1e4a8f2ee,df8ae802cf6149537c73ced356bff11e8406fa5b..eee5d5a6dbb8e4b6c8f755f7adbe2129289d35e6
   */
  
  #define _GNU_SOURCE
+ #if defined(WIN32)
+ #include <winsock2.h>
+ #define DllExport
+ #define O_SYNC 0
+ typedef int uid_t;
+ typedef int gid_t;
+ #else
+ #include <strings.h>
+ #include <sys/statvfs.h>
+ #include <utime.h>
+ #include <unistd.h>
+ #endif
  #include <stdio.h>
  #include <stdarg.h>
  #include <stdlib.h>
  #include <string.h>
- #include <strings.h>
  #include <errno.h>
  #include <sys/types.h>
  #include <sys/stat.h>
- #include <sys/statvfs.h>
- #include <utime.h>
- #include <unistd.h>
  #include <fcntl.h>
  #include "libnfs.h"
  #include "libnfs-raw.h"
@@@ -671,8 -681,10 +681,10 @@@ static void nfs_stat_1_cb(struct rpc_co
          st.st_gid     = res->GETATTR3res_u.resok.obj_attributes.gid;
          st.st_rdev    = 0;
          st.st_size    = res->GETATTR3res_u.resok.obj_attributes.size;
+ #if !defined(WIN32)
          st.st_blksize = 4096;
          st.st_blocks  = res->GETATTR3res_u.resok.obj_attributes.size / 4096;
+ #endif
          st.st_atime   = res->GETATTR3res_u.resok.obj_attributes.atime.seconds;
          st.st_mtime   = res->GETATTR3res_u.resok.obj_attributes.mtime.seconds;
          st.st_ctime   = res->GETATTR3res_u.resok.obj_attributes.ctime.seconds;
@@@ -1651,13 -1663,13 +1663,13 @@@ int nfs_unlink_async(struct nfs_contex
   */
  static void nfs_opendir_cb(struct rpc_context *rpc _U_, int status, void *command_data, void *private_data)
  {
 -      READDIR3res *res;
 +      READDIRPLUS3res *res;
        struct nfs_cb_data *data = private_data;
        struct nfs_context *nfs = data->nfs;
-       struct nfsdir *nfsdir = data->continue_data;;
+       struct nfsdir *nfsdir = data->continue_data;
 -      struct entry3 *entry;
 +      struct entryplus3 *entry;
        uint64_t cookie;
 -      
 +
        if (status == RPC_STATUS_ERROR) {
                data->cb(-EFAULT, nfs, command_data, data->private_data);
                nfs_free_nfsdir(nfsdir);
                return;
        }
  
 -      entry =res->READDIR3res_u.resok.reply.entries;
 +      entry =res->READDIRPLUS3res_u.resok.reply.entries;
        while (entry != NULL) {
                struct nfsdirent *nfsdirent;
  
                        return;
                }
                nfsdirent->inode = entry->fileid;
 +              if (entry->name_attributes.attributes_follow) {
 +                      nfsdirent->type = entry->name_attributes.post_op_attr_u.attributes.type;
 +                      nfsdirent->mode = entry->name_attributes.post_op_attr_u.attributes.mode;
 +                      nfsdirent->size = entry->name_attributes.post_op_attr_u.attributes.size;
 +
 +                      nfsdirent->atime.tv_sec  = entry->name_attributes.post_op_attr_u.attributes.atime.seconds;
 +                      nfsdirent->atime.tv_usec = entry->name_attributes.post_op_attr_u.attributes.atime.nseconds/1000;
 +                      nfsdirent->mtime.tv_sec  = entry->name_attributes.post_op_attr_u.attributes.mtime.seconds;
 +                      nfsdirent->mtime.tv_usec = entry->name_attributes.post_op_attr_u.attributes.mtime.nseconds/1000;
 +                      nfsdirent->ctime.tv_sec  = entry->name_attributes.post_op_attr_u.attributes.ctime.seconds;
 +                      nfsdirent->ctime.tv_usec = entry->name_attributes.post_op_attr_u.attributes.ctime.nseconds/1000;
 +              }
 +
                nfsdirent->next  = nfsdir->entries;
                nfsdir->entries  = nfsdirent;
  
                entry  = entry->nextentry;
        }
  
 -      if (res->READDIR3res_u.resok.reply.eof == 0) {
 -              if (rpc_nfs_readdir_async(nfs->rpc, nfs_opendir_cb, &data->fh, cookie, res->READDIR3res_u.resok.cookieverf, 20000, data) != 0) {
 -                      rpc_set_error(nfs->rpc, "RPC error: Failed to send READDIR call for %s", data->path);
 +      if (res->READDIRPLUS3res_u.resok.reply.eof == 0) {
 +              if (rpc_nfs_readdirplus_async(nfs->rpc, nfs_opendir_cb, &data->fh, cookie, res->READDIRPLUS3res_u.resok.cookieverf, 8192, data) != 0) {
 +                      rpc_set_error(nfs->rpc, "RPC error: Failed to send READDIRPLUS call for %s", data->path);
                        data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
                        nfs_free_nfsdir(nfsdir);
                        data->continue_data = NULL;
@@@ -1750,8 -1749,8 +1762,8 @@@ static int nfs_opendir_continue_interna
        cookieverf3 cv;
  
        bzero(cv, sizeof(cookieverf3));
 -      if (rpc_nfs_readdir_async(nfs->rpc, nfs_opendir_cb, &data->fh, 0, (char *)&cv, 20000, data) != 0) {
 -              rpc_set_error(nfs->rpc, "RPC error: Failed to send READDIR call for %s", data->path);
 +      if (rpc_nfs_readdirplus_async(nfs->rpc, nfs_opendir_cb, &data->fh, 0, (char *)&cv, 8192, data) != 0) {
 +              rpc_set_error(nfs->rpc, "RPC error: Failed to send READDIRPLUS call for %s", data->path);
                data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
                free_nfs_cb_data(data);
                return -1;
@@@ -2900,7 -2899,8 +2912,8 @@@ void nfs_set_error(struct nfs_context *
        char *str = NULL;
  
          va_start(ap, error_string);
-       vasprintf(&str, error_string, ap);
+       str = malloc(1024);
+       vsnprintf(str, 1024, error_string, ap);
        if (nfs->rpc->error_string != NULL) {
                free(nfs->rpc->error_string);
        }
@@@ -3082,3 -3082,35 +3095,36 @@@ const char *nfs_get_server(struct nfs_c
  const char *nfs_get_export(struct nfs_context *nfs) {
        return nfs->export;
  }
+ #if defined(WIN32)
+ int poll(struct pollfd *fds, int nfsd, int timeout)
+ {
+       fd_set rfds, wfds, efds;
+       int ret;
+       FD_ZERO(&rfds);
+       FD_ZERO(&wfds);
+       FD_ZERO(&efds);
+       if (fds->events & POLLIN) {
+               FD_SET(fds->fd, &rfds);
+       }
+       if (fds->events & POLLOUT) {
+               FD_SET(fds->fd, &wfds);
+       }
+       FD_SET(fds->fd, &efds);
+       select(fds->fd + 1, &rfds, &wfds, &efds, NULL);
+       fds->revents = 0;
+       if (FD_ISSET(fds->fd, &rfds)) {
+               fds->revents |= POLLIN;
+       }
+       if (FD_ISSET(fds->fd, &wfds)) {
+               fds->revents |= POLLOUT;
+       }
+       if (FD_ISSET(fds->fd, &efds)) {
+               fds->revents |= POLLHUP;
+       }
++      return 1;
+ }
+ #endif
diff --combined lib/socket.c
index e96636ae7fa4198774ee14e5b2ac8c4e53d703b5,4d4859edf3aa151ad23dea11e0072475870c1ee0..e9c103e55b0cd124ce04baaeef1721fb43d5e5fd
     along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
  
+ #if defined(WIN32)
+ #include <winsock2.h>
+ #include <ws2tcpip.h>
+ #include <basetsd.h>
+ #define ssize_t SSIZE_T
+ #define MSG_DONTWAIT 0
+ #else
+ #include <unistd.h>
+ #include <poll.h>
+ #include <arpa/inet.h>
+ #include <sys/ioctl.h>
+ #include <sys/socket.h>
+ #include <netdb.h>
+ #endif
  #ifdef HAVE_CONFIG_H
  #include "config.h"
  #endif
  #include <stdio.h>
  #include <stdlib.h>
- #include <unistd.h>
  #include <fcntl.h>
- #include <poll.h>
  #include <string.h>
  #include <errno.h>
  #include <rpc/rpc.h>
  #include <rpc/xdr.h>
- #include <arpa/inet.h>
  #ifdef HAVE_SYS_FILIO_H
  #include <sys/filio.h>
  #endif
- #include <sys/ioctl.h>
 +#ifdef HAVE_SYS_SOCKIO_H
 +#include <sys/sockio.h>
 +#endif
  #include <sys/types.h>
- #include <sys/socket.h>
- #include <netdb.h>
  #include "libnfs.h"
  #include "libnfs-raw.h"
  #include "libnfs-private.h"
@@@ -47,9 -53,12 +56,12 @@@ static int rpc_disconnect_requeue(struc
  
  static void set_nonblocking(int fd)
  {
+ #if defined(WIN32)
+ #else
        unsigned v;
        v = fcntl(fd, F_GETFL, 0);
          fcntl(fd, F_SETFL, v | O_NONBLOCK);
+ #endif
  }
  
  int rpc_get_fd(struct rpc_context *rpc)
@@@ -89,7 -98,11 +101,11 @@@ static int rpc_write_to_socket(struct r
  
                total = rpc->outqueue->outdata.size;
  
+ #if defined(WIN32)
+               count = send(rpc->fd, rpc->outqueue->outdata.data + rpc->outqueue->written, total - rpc->outqueue->written, 0);
+ #else
                count = write(rpc->fd, rpc->outqueue->outdata.data + rpc->outqueue->written, total - rpc->outqueue->written);
+ #endif
                if (count == -1) {
                        if (errno == EAGAIN || errno == EWOULDBLOCK) {
                                return 0;
@@@ -116,7 -129,11 +132,11 @@@ static int rpc_read_from_socket(struct 
        int pdu_size;
        ssize_t count;
  
+ #if defined(WIN32)
+       if (ioctlsocket(rpc->fd, FIONREAD, &available) != 0) {
+ #else
        if (ioctl(rpc->fd, FIONREAD, &available) != 0) {
+ #endif
                rpc_set_error(rpc, "Ioctl FIONREAD returned error : %d. Closing socket.", errno);
                return -1;
        }
        if (rpc->inpos < 4) {
                size = 4 - rpc->inpos;
  
+ #if defined(WIN32)
+               count = recv(rpc->fd, rpc->inbuf + rpc->inpos, size, 0);
+ #else
                count = read(rpc->fd, rpc->inbuf + rpc->inpos, size);
+ #endif
                if (count == -1) {
                        if (errno == EINTR) {
                                return 0;
                size = rpc->insize - rpc->inpos;
        }
  
+ #if defined(WIN32)
+       count = recv(rpc->fd, rpc->inbuf + rpc->inpos, size, 0);
+ #else
        count = read(rpc->fd, rpc->inbuf + rpc->inpos, size);
+ #endif
        if (count == -1) {
                if (errno == EINTR) {
                        return 0;
@@@ -319,7 -344,7 +347,7 @@@ int rpc_connect_async(struct rpc_contex
  #ifdef HAVE_SOCKADDR_LEN
                sin->sin_len = socksize;
  #endif
-               rpc->fd = socket(AF_INET, SOCK_STREAM, 0);
+               rpc->fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
                break;
        }
  
  int rpc_disconnect(struct rpc_context *rpc, char *error)
  {
        if (rpc->fd != -1) {
+ #if defined(WIN32)
+               closesocket(rpc->fd);
+ #else
                close(rpc->fd);
+ #endif
        }
        rpc->fd  = -1;
  
@@@ -361,7 -390,11 +393,11 @@@ static int rpc_disconnect_requeue(struc
        struct rpc_pdu *pdu;
  
        if (rpc->fd != -1) {
+ #if defined(WIN32)
+               closesocket(rpc->fd);
+ #else
                close(rpc->fd);
+ #endif
        }
        rpc->fd  = -1;
  
@@@ -389,7 -422,7 +425,7 @@@ int rpc_bind_udp(struct rpc_context *rp
                return -1;
        }
  
-       snprintf(service, 6, "%d", port);
+       sprintf(service, "%d", port);
        if (getaddrinfo(addr, service, NULL, &ai) != 0) {
                rpc_set_error(rpc, "Invalid address:%s. "
                        "Can not resolv into IPv4/v6 structure.");
@@@ -432,7 -465,7 +468,7 @@@ int rpc_set_udp_destination(struct rpc_
                return -1;
        }
  
-       snprintf(service, 6, "%d", port);
+       sprintf(service, "%d", port);
        if (getaddrinfo(addr, service, NULL, &ai) != 0) {
                rpc_set_error(rpc, "Invalid address:%s. "
                        "Can not resolv into IPv4/v6 structure.");
diff --combined nfs/nfs.c
index 5b655cb3369e2aeea6f2a4f55f4ca1be320132a7,a32521e4a8b1e6d24ab1b21ce978586ec89b0264..0c8ff79857f84670e2f9dc48891d4f03c7f88c8b
+++ b/nfs/nfs.c
     along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
  
+ #if defined(WIN32)
+ #include <winsock2.h>
+ #define S_IRUSR 0000400
+ #define S_IWUSR 0000200
+ #define S_IXUSR 0000100
+ #define S_IRGRP 0000040
+ #define S_IWGRP 0000020
+ #define S_IXGRP 0000010
+ #define S_IROTH 0000004
+ #define S_IWOTH 0000002
+ #define S_IXOTH 0000001
+ #endif
  #include <stdio.h>
  #include <errno.h>
  #include <sys/stat.h>
@@@ -476,6 -489,7 +489,6 @@@ int rpc_nfs_remove_async(struct rpc_con
        return 0;
  }
  
 -
  int rpc_nfs_readdir_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, uint64_t cookie, char *cookieverf, int count, void *private_data)
  {
        struct rpc_pdu *pdu;
        return 0;
  }
  
 +int rpc_nfs_readdirplus_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, uint64_t cookie, char *cookieverf, int count, void *private_data)
 +{
 +      struct rpc_pdu *pdu;
 +      READDIRPLUS3args args;
 +
 +      pdu = rpc_allocate_pdu(rpc, NFS_PROGRAM, NFS_V3, NFS3_READDIRPLUS, cb, private_data, (xdrproc_t)xdr_READDIRPLUS3res, sizeof(READDIRPLUS3res));
 +      if (pdu == NULL) {
 +              rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nfs/readdirplus call");
 +              return -1;
 +      }
 +
 +      bzero(&args, sizeof(READDIRPLUS3args));
 +      args.dir.data.data_len = fh->data.data_len;
 +      args.dir.data.data_val = fh->data.data_val;
 +      args.cookie = cookie;
 +      memcpy(&args.cookieverf, cookieverf, sizeof(cookieverf3)); 
 +      args.dircount = count;
 +      args.maxcount = count;
 +
 +      if (xdr_READDIRPLUS3args(&pdu->xdr, &args) == 0) {
 +              rpc_set_error(rpc, "XDR error: Failed to encode READDIRPLUS3args");
 +              rpc_free_pdu(rpc, pdu);
 +              return -2;
 +      }
 +
 +      if (rpc_queue_pdu(rpc, pdu) != 0) {
 +              rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nfs/readdirplus call");
 +              rpc_free_pdu(rpc, pdu);
 +              return -3;
 +      }
 +
 +      return 0;
 +}
 +
  int rpc_nfs_fsstat_async(struct rpc_context *rpc, rpc_cb cb, struct nfs_fh3 *fh, void *private_data)
  {
        struct rpc_pdu *pdu;