more include cleanups it starts to look almost decent now
[deb_libnfs.git] / lib / libnfs-sync.c
index 0340edaabbc728f5d271132f9cc75581bfd3c1dd..0527bbf7ff752498418bc4863a890a0713ed638d 100644 (file)
 /*
  * High level api to nfs filesystems
  */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef AROS
+#include "aros_compat.h"
+#endif
+
 #ifdef WIN32
 #include "win32_compat.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 /*WIN32*/
+
+#ifdef ANDROID
+#include <netinet/in.h>
+#define statvfs statfs
 #endif
 
-#ifdef HAVE_CONFIG_H
-#include "config.h"
+#ifdef HAVE_SYS_VFS_H
+#include <sys/vfs.h>
+#endif
+
+#ifdef HAVE_SYS_STATVFS_H
+#include <sys/statvfs.h>
+#endif
+
+#ifdef HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif
+
+#ifdef HAVE_POLL_H
+#include <poll.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
 #endif
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <assert.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
@@ -47,6 +72,7 @@
 #include <sys/sockio.h>
 #endif
 
+#include "libnfs-zdr.h"
 #include "libnfs.h"
 #include "libnfs-raw.h"
 #include "libnfs-raw-mount.h"
@@ -56,7 +82,7 @@
 struct sync_cb_data {
        int is_finished;
        int status;
-       off_t offset;
+       uint64_t offset;
        void *return_data;
        int return_int;
 };
@@ -66,6 +92,8 @@ static void wait_for_reply(struct rpc_context *rpc, struct sync_cb_data *cb_data
 {
        struct pollfd pfd;
 
+       assert(rpc->magic == RPC_CONTEXT_MAGIC);
+
        while (!cb_data->is_finished) {
 
                pfd.fd = rpc_get_fd(rpc);
@@ -132,6 +160,9 @@ static void mount_cb(int status, struct nfs_context *nfs, void *data, void *priv
 int nfs_mount(struct nfs_context *nfs, const char *server, const char *export)
 {
        struct sync_cb_data cb_data;
+       struct rpc_context *rpc = nfs_get_rpc_context(nfs);
+
+       assert(rpc->magic == RPC_CONTEXT_MAGIC);
 
        cb_data.is_finished = 0;
 
@@ -142,6 +173,9 @@ int nfs_mount(struct nfs_context *nfs, const char *server, const char *export)
 
        wait_for_nfs_reply(nfs, &cb_data);
 
+       /* Dont want any more callbacks even if the socket is closed */
+       rpc->connect_cb = NULL;
+
        return cb_data.status;
 }
 
@@ -244,7 +278,7 @@ static void pread_cb(int status, struct nfs_context *nfs, void *data, void *priv
        memcpy(buffer, (char *)data, status);
 }
 
-int nfs_pread(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset, size_t count, char *buffer)
+int nfs_pread(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offset, uint64_t count, char *buffer)
 {
        struct sync_cb_data cb_data;
 
@@ -264,7 +298,7 @@ int nfs_pread(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset, size_t
 /*
  * read()
  */
-int nfs_read(struct nfs_context *nfs, struct nfsfh *nfsfh, size_t count, char *buffer)
+int nfs_read(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t count, char *buffer)
 {
        return nfs_pread(nfs, nfsfh, nfs_get_current_offset(nfsfh), count, buffer);
 }
@@ -339,7 +373,7 @@ static void pwrite_cb(int status, struct nfs_context *nfs, void *data, void *pri
        }
 }
 
-int nfs_pwrite(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset, size_t count, char *buf)
+int nfs_pwrite(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offset, uint64_t count, char *buf)
 {
        struct sync_cb_data cb_data;
 
@@ -358,7 +392,7 @@ int nfs_pwrite(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset, size_
 /*
  * write()
  */
-int nfs_write(struct nfs_context *nfs, struct nfsfh *nfsfh, size_t count, char *buf)
+int nfs_write(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t count, char *buf)
 {
        return nfs_pwrite(nfs, nfsfh, nfs_get_current_offset(nfsfh), count, buf);
 }
@@ -413,7 +447,7 @@ static void ftruncate_cb(int status, struct nfs_context *nfs, void *data, void *
        }
 }
 
-int nfs_ftruncate(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t length)
+int nfs_ftruncate(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t length)
 {
        struct sync_cb_data cb_data;
 
@@ -446,7 +480,7 @@ static void truncate_cb(int status, struct nfs_context *nfs, void *data, void *p
        }
 }
 
-int nfs_truncate(struct nfs_context *nfs, const char *path, off_t length)
+int nfs_truncate(struct nfs_context *nfs, const char *path, uint64_t length)
 {
        struct sync_cb_data cb_data;
 
@@ -572,7 +606,37 @@ int nfs_creat(struct nfs_context *nfs, const char *path, int mode, struct nfsfh
        return cb_data.status;
 }
 
+/*
+ * mknod()
+ */
+static void mknod_cb(int status, struct nfs_context *nfs, void *data, void *private_data)
+{
+       struct sync_cb_data *cb_data = private_data;
+
+       cb_data->is_finished = 1;
+       cb_data->status = status;
+
+       if (status < 0) {
+               nfs_set_error(nfs, "mknod call failed with \"%s\"", (char *)data);
+               return;
+       }
+}
+
+int nfs_mknod(struct nfs_context *nfs, const char *path, int mode, int dev)
+{
+       struct sync_cb_data cb_data;
 
+       cb_data.is_finished = 0;
+
+       if (nfs_mknod_async(nfs, path, mode, dev, mknod_cb, &cb_data) != 0) {
+               nfs_set_error(nfs, "nfs_creat_async failed");
+               return -1;
+       }
+
+       wait_for_nfs_reply(nfs, &cb_data);
+
+       return cb_data.status;
+}
 
 
 /*
@@ -664,11 +728,11 @@ static void lseek_cb(int status, struct nfs_context *nfs, void *data, void *priv
        }
 
        if (cb_data->return_data != NULL) {
-               memcpy(cb_data->return_data, data, sizeof(off_t));
+               memcpy(cb_data->return_data, data, sizeof(uint64_t));
        }
 }
 
-int nfs_lseek(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset, int whence, off_t *current_offset)
+int nfs_lseek(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offset, int whence, uint64_t *current_offset)
 {
        struct sync_cb_data cb_data;
 
@@ -1112,7 +1176,9 @@ int nfs_link(struct nfs_context *nfs, const char *oldpath, const char *newpath)
 void mount_getexports_cb(struct rpc_context *mount_context, int status, void *data, void *private_data)
 {
        struct sync_cb_data *cb_data = private_data;
-       exports export = *(exports *)data;
+       exports export;
+
+       assert(mount_context->magic == RPC_CONTEXT_MAGIC);
 
        cb_data->is_finished = 1;
        cb_data->status = status;
@@ -1123,6 +1189,7 @@ void mount_getexports_cb(struct rpc_context *mount_context, int status, void *da
                return;
        }
 
+       export = *(exports *)data;
        while (export != NULL) {
                exports new_export;
 
@@ -1194,6 +1261,8 @@ void callit_cb(struct rpc_context *rpc, int status, void *data _U_, void *privat
        char hostdd[16];
        struct nfs_server_list *srvr;
 
+       assert(rpc->magic == RPC_CONTEXT_MAGIC);
+
        if (status == RPC_STATUS_CANCEL) {
                return;
        }
@@ -1247,6 +1316,8 @@ static int send_nfsd_probes(struct rpc_context *rpc, INTERFACE_INFO *InterfaceLi
 {
   int i=0;
 
+  assert(rpc->magic == RPC_CONTEXT_MAGIC);
+
   for(i = 0; i < numIfs; i++) 
   {
     SOCKADDR *pAddress;
@@ -1377,6 +1448,8 @@ static int send_nfsd_probes(struct rpc_context *rpc, struct ifconf *ifc, struct
 {
        char *ptr;
 
+       assert(rpc->magic == RPC_CONTEXT_MAGIC);
+
        for (ptr =(char *)(ifc->ifc_buf); ptr < (char *)(ifc->ifc_buf) + ifc->ifc_len; ) {
                struct ifreq *ifr;
                char bcdd[16];