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);
/*
* 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);
* -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);
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)
*/
#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"
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;
*/
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;
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;
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);
}
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
+