[win32] - make it compile on win32
[deb_libnfs.git] / lib / libnfs.c
index df8ae802cf6149537c73ced356bff11e8406fa5b..1f64bd0fef4acfb16afb19feabc6657ddfea33bb 100644 (file)
 /*
  * High level api to nfs filesystems
  */
-
-#define _GNU_SOURCE
-
-#if defined(WIN32)
-#include <winsock2.h>
+#ifdef WIN32
+#include "win32_compat.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
+#endif/*WIN32*/
+
+#define _GNU_SOURCE
 
 #include <stdio.h>
 #include <stdarg.h>
@@ -493,7 +489,7 @@ int nfs_mount_async(struct nfs_context *nfs, const char *server, const char *exp
                rpc_set_error(nfs->rpc, "out of memory. failed to allocate memory for nfs mount data");
                return -1;
        }
-       bzero(data, sizeof(struct nfs_cb_data));
+       memset(data, 0, sizeof(struct nfs_cb_data));
        new_server = strdup(server);
        new_export = strdup(export);
        if (nfs->server != NULL) {
@@ -614,7 +610,7 @@ static int nfs_lookuppath_async(struct nfs_context *nfs, const char *path, nfs_c
                rpc_set_error(nfs->rpc, "out of memory: failed to allocate nfs_cb_data structure");
                return -1;
        }
-       bzero(data, sizeof(struct nfs_cb_data));
+       memset(data, 0, sizeof(struct nfs_cb_data));
        data->nfs                = nfs;
        data->cb                 = cb;
        data->continue_cb        = continue_cb;
@@ -681,10 +677,10 @@ static void nfs_stat_1_cb(struct rpc_context *rpc _U_, int status, void *command
         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)
+#ifndef WIN32
         st.st_blksize = 4096;
         st.st_blocks  = res->GETATTR3res_u.resok.obj_attributes.size / 4096;
-#endif
+#endif//WIN32        
         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;
@@ -779,7 +775,7 @@ static void nfs_open_cb(struct rpc_context *rpc _U_, int status, void *command_d
                free_nfs_cb_data(data);
                return;
        }
-       bzero(nfsfh, sizeof(struct nfsfh));
+       memset(nfsfh, 0, sizeof(struct nfsfh));
 
        if (data->continue_int & O_SYNC) {
                nfsfh->is_sync = 1;
@@ -933,7 +929,7 @@ int nfs_pread_async(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset,
                rpc_set_error(nfs->rpc, "out of memory: failed to allocate nfs_cb_data structure");
                return -1;
        }
-       bzero(data, sizeof(struct nfs_cb_data));
+       memset(data, 0, sizeof(struct nfs_cb_data));
        data->nfs          = nfs;
        data->cb           = cb;
        data->private_data = private_data;
@@ -979,7 +975,7 @@ int nfs_pread_async(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset,
                        rpc_set_error(nfs->rpc, "out of memory: failed to allocate nfs_mcb_data structure");
                        return -1;
                }
-               bzero(mdata, sizeof(struct nfs_mcb_data));
+               memset(mdata, 0, sizeof(struct nfs_mcb_data));
                mdata->data   = data;
                mdata->offset = offset;
                mdata->count  = readcount;
@@ -1050,7 +1046,7 @@ int nfs_pwrite_async(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset,
                rpc_set_error(nfs->rpc, "out of memory: failed to allocate nfs_cb_data structure");
                return -1;
        }
-       bzero(data, sizeof(struct nfs_cb_data));
+       memset(data, 0, sizeof(struct nfs_cb_data));
        data->nfs          = nfs;
        data->cb           = cb;
        data->private_data = private_data;
@@ -1109,7 +1105,7 @@ int nfs_fstat_async(struct nfs_context *nfs, struct nfsfh *nfsfh, nfs_cb cb, voi
                rpc_set_error(nfs->rpc, "out of memory: failed to allocate nfs_cb_data structure");
                return -1;
        }
-       bzero(data, sizeof(struct nfs_cb_data));
+       memset(data, 0, sizeof(struct nfs_cb_data));
        data->nfs          = nfs;
        data->cb           = cb;
        data->private_data = private_data;
@@ -1166,7 +1162,7 @@ int nfs_fsync_async(struct nfs_context *nfs, struct nfsfh *nfsfh, nfs_cb cb, voi
                rpc_set_error(nfs->rpc, "out of memory: failed to allocate nfs_cb_data structure");
                return -1;
        }
-       bzero(data, sizeof(struct nfs_cb_data));
+       memset(data, 0, sizeof(struct nfs_cb_data));
        data->nfs          = nfs;
        data->cb           = cb;
        data->private_data = private_data;
@@ -1225,12 +1221,12 @@ int nfs_ftruncate_async(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t leng
                rpc_set_error(nfs->rpc, "out of memory: failed to allocate nfs_cb_data structure");
                return -1;
        }
-       bzero(data, sizeof(struct nfs_cb_data));
+       memset(data, 0, sizeof(struct nfs_cb_data));
        data->nfs          = nfs;
        data->cb           = cb;
        data->private_data = private_data;
 
-       bzero(&args, sizeof(SETATTR3args));
+       memset(&args, 0, sizeof(SETATTR3args));
        args.object.data.data_len = nfsfh->fh.data.data_len;
        args.object.data.data_val = nfsfh->fh.data.data_val;
        args.new_attributes.size.set_it = 1;
@@ -1483,7 +1479,7 @@ static void nfs_create_2_cb(struct rpc_context *rpc _U_, int status, void *comma
                free_nfs_cb_data(data);
                return;
        }
-       bzero(nfsfh, sizeof(struct nfsfh));
+       memset(nfsfh, 0, sizeof(struct nfsfh));
 
        /* steal the filehandle */
        nfsfh->fh.data.data_len = data->fh.data.data_len;
@@ -1663,13 +1659,13 @@ int nfs_unlink_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void
  */
 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 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);
@@ -1695,7 +1691,7 @@ static void nfs_opendir_cb(struct rpc_context *rpc _U_, int status, void *comman
                return;
        }
 
-       entry =res->READDIR3res_u.resok.reply.entries;
+       entry =res->READDIRPLUS3res_u.resok.reply.entries;
        while (entry != NULL) {
                struct nfsdirent *nfsdirent;
 
@@ -1707,7 +1703,7 @@ static void nfs_opendir_cb(struct rpc_context *rpc _U_, int status, void *comman
                        free_nfs_cb_data(data);
                        return;
                }
-               bzero(nfsdirent, sizeof(struct nfsdirent));
+               memset(nfsdirent, 0, sizeof(struct nfsdirent));
                nfsdirent->name = strdup(entry->name);
                if (nfsdirent->name == NULL) {
                        data->cb(-ENOMEM, nfs, "Failed to allocate dirent->name", data->private_data);
@@ -1717,6 +1713,19 @@ static void nfs_opendir_cb(struct rpc_context *rpc _U_, int status, void *comman
                        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;
 
@@ -1724,9 +1733,9 @@ static void nfs_opendir_cb(struct rpc_context *rpc _U_, int status, void *comman
                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;
@@ -1748,9 +1757,9 @@ static int nfs_opendir_continue_internal(struct nfs_context *nfs, struct nfs_cb_
 {
        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);
+       memset(cv, 0, sizeof(cookieverf3));
+       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;
@@ -1767,7 +1776,7 @@ int nfs_opendir_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void
                rpc_set_error(nfs->rpc, "failed to allocate buffer for nfsdir");
                return -1;
        }
-       bzero(nfsdir, sizeof(struct nfsdir));
+       memset(nfsdir, 0, sizeof(struct nfsdir));
 
        if (nfs_lookuppath_async(nfs, path, cb, private_data, nfs_opendir_continue_internal, nfsdir, free, 0) != 0) {
                rpc_set_error(nfs->rpc, "Out of memory: failed to start parsing the path components");
@@ -1887,7 +1896,9 @@ static void nfs_statvfs_1_cb(struct rpc_context *rpc _U_, int status, void *comm
        FSSTAT3res *res;
        struct nfs_cb_data *data = private_data;
        struct nfs_context *nfs = data->nfs;
+#ifndef WIN32
        struct statvfs svfs;
+#endif/*WIN32*/
 
        if (status == RPC_STATUS_ERROR) {
                data->cb(-EFAULT, nfs, command_data, data->private_data);
@@ -1908,6 +1919,7 @@ static void nfs_statvfs_1_cb(struct rpc_context *rpc _U_, int status, void *comm
                return;
        }
 
+#ifndef WIN32
        svfs.f_bsize   = 4096;
        svfs.f_frsize  = 4096;
        svfs.f_blocks  = res->FSSTAT3res_u.resok.tbytes/4096;
@@ -1921,6 +1933,9 @@ static void nfs_statvfs_1_cb(struct rpc_context *rpc _U_, int status, void *comm
        svfs.f_namemax = 256;
 
        data->cb(0, nfs, &svfs, data->private_data);
+#else
+  data->cb(0, nfs,NULL, data->private_data);  
+#endif/*WIN32*/
        free_nfs_cb_data(data);
 }
 
@@ -2041,7 +2056,7 @@ static int nfs_chmod_continue_internal(struct nfs_context *nfs, struct nfs_cb_da
 {
        SETATTR3args args;
 
-       bzero(&args, sizeof(SETATTR3args));
+       memset(&args, 0, sizeof(SETATTR3args));
        args.object.data.data_len = data->fh.data.data_len;
        args.object.data.data_val = data->fh.data.data_val;
        args.new_attributes.mode.set_it = 1;
@@ -2079,7 +2094,7 @@ int nfs_fchmod_async(struct nfs_context *nfs, struct nfsfh *nfsfh, int mode, nfs
                rpc_set_error(nfs->rpc, "out of memory. failed to allocate memory for nfs mount data");
                return -1;
        }
-       bzero(data, sizeof(struct nfs_cb_data));
+       memset(data, 0, sizeof(struct nfs_cb_data));
        data->nfs          = nfs;
        data->cb           = cb;
        data->private_data = private_data;
@@ -2145,7 +2160,7 @@ static int nfs_chown_continue_internal(struct nfs_context *nfs, struct nfs_cb_da
        SETATTR3args args;
        struct nfs_chown_data *chown_data = data->continue_data;
 
-       bzero(&args, sizeof(SETATTR3args));
+       memset(&args, 0, sizeof(SETATTR3args));
        args.object.data.data_len = data->fh.data.data_len;
        args.object.data.data_val = data->fh.data.data_val;
        if (chown_data->uid != (uid_t)-1) {
@@ -2212,7 +2227,7 @@ int nfs_fchown_async(struct nfs_context *nfs, struct nfsfh *nfsfh, int uid, int
                rpc_set_error(nfs->rpc, "out of memory. failed to allocate memory for fchown data");
                return -1;
        }
-       bzero(data, sizeof(struct nfs_cb_data));
+       memset(data, 0, sizeof(struct nfs_cb_data));
        data->nfs           = nfs;
        data->cb            = cb;
        data->private_data  = private_data;
@@ -2276,7 +2291,7 @@ static int nfs_utimes_continue_internal(struct nfs_context *nfs, struct nfs_cb_d
        SETATTR3args args;
        struct timeval *utimes_data = data->continue_data;
 
-       bzero(&args, sizeof(SETATTR3args));
+       memset(&args, 0, sizeof(SETATTR3args));
        args.object.data.data_len = data->fh.data.data_len;
        args.object.data.data_val = data->fh.data.data_val;
        if (utimes_data != NULL) {
@@ -2524,7 +2539,7 @@ int nfs_symlink_async(struct nfs_context *nfs, const char *oldpath, const char *
                rpc_set_error(nfs->rpc, "Out of memory, failed to allocate buffer for symlink data");
                return -1;
        }
-       bzero(symlink_data, sizeof(struct nfs_symlink_data));
+       memset(symlink_data, 0, sizeof(struct nfs_symlink_data));
 
        symlink_data->oldpath = strdup(oldpath);
        if (symlink_data->oldpath == NULL) {
@@ -2678,7 +2693,7 @@ int nfs_rename_async(struct nfs_context *nfs, const char *oldpath, const char *n
                rpc_set_error(nfs->rpc, "Out of memory, failed to allocate buffer for rename data");
                return -1;
        }
-       bzero(rename_data, sizeof(struct nfs_rename_data));
+       memset(rename_data, 0, sizeof(struct nfs_rename_data));
 
        rename_data->oldpath = strdup(oldpath);
        if (rename_data->oldpath == NULL) {
@@ -2834,7 +2849,7 @@ int nfs_link_async(struct nfs_context *nfs, const char *oldpath, const char *new
                rpc_set_error(nfs->rpc, "Out of memory, failed to allocate buffer for link data");
                return -1;
        }
-       bzero(link_data, sizeof(struct nfs_link_data));
+       memset(link_data, 0, sizeof(struct nfs_link_data));
 
        link_data->oldpath = strdup(oldpath);
        if (link_data->oldpath == NULL) {
@@ -2905,7 +2920,7 @@ void nfs_set_error(struct nfs_context *nfs, char *error_string, ...)
                free(nfs->rpc->error_string);
        }
        nfs->rpc->error_string = str;
-        va_end(ap);
+    va_end(ap);
 }
 
 
@@ -3054,7 +3069,7 @@ int mount_getexports_async(struct rpc_context *rpc, const char *server, rpc_cb c
        if (data == NULL) {
                return -1;
        }
-       bzero(data, sizeof(struct mount_cb_data));
+       memset(data, 0, sizeof(struct mount_cb_data));
        data->cb           = cb;
        data->private_data = private_data;
        data->server       = strdup(server);
@@ -3111,6 +3126,7 @@ int poll(struct pollfd *fds, int nfsd, int timeout)
        if (FD_ISSET(fds->fd, &efds)) {
                fds->revents |= POLLHUP;
        }
+       return 1;
 }
 #endif