X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=lib%2Flibnfs-sync.c;h=82578f1e9a07fbfb39798ad88986065e9ebcf3cd;hb=31a2602e3df86815033f691d8b21238f135d76c4;hp=bd6048eb2751233cf3f66e4f105ec39333a091cb;hpb=a3d44462cb5b10be80d622b964aabd12b212442a;p=deb_libnfs.git diff --git a/lib/libnfs-sync.c b/lib/libnfs-sync.c index bd6048e..82578f1 100644 --- a/lib/libnfs-sync.c +++ b/lib/libnfs-sync.c @@ -47,6 +47,7 @@ #include #endif +#include "libnfs-zdr.h" #include "libnfs.h" #include "libnfs-raw.h" #include "libnfs-raw-mount.h" @@ -56,7 +57,7 @@ struct sync_cb_data { int is_finished; int status; - off_t offset; + uint64_t offset; void *return_data; int return_int; }; @@ -248,7 +249,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; @@ -268,7 +269,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); } @@ -343,7 +344,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; @@ -362,7 +363,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); } @@ -417,7 +418,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; @@ -450,7 +451,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; @@ -576,7 +577,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; +} /* @@ -668,11 +699,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; @@ -1116,7 +1147,7 @@ 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; cb_data->is_finished = 1; cb_data->status = status; @@ -1127,6 +1158,7 @@ void mount_getexports_cb(struct rpc_context *mount_context, int status, void *da return; } + export = *(exports *)data; while (export != NULL) { exports new_export;