*/
#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"
void nfs_set_auth(struct nfs_context *nfs, struct AUTH *auth)
{
- return rpc_set_auth(nfs->rpc, auth);
+ rpc_set_auth(nfs->rpc, auth);
}
int nfs_get_fd(struct nfs_context *nfs)
return NULL;
}
+ nfs->server = NULL;
+ nfs->export = NULL;
+
+ nfs->rootfh.data.data_len = 0;
+ nfs->rootfh.data.data_val = NULL;
+
return nfs;
}
int nfs_mount_async(struct nfs_context *nfs, const char *server, const char *export, nfs_cb cb, void *private_data)
{
struct nfs_cb_data *data;
+ char *new_server, *new_export;
data = malloc(sizeof(struct nfs_cb_data));
if (data == NULL) {
return -1;
}
bzero(data, sizeof(struct nfs_cb_data));
- nfs->server = strdup(server);
- nfs->export = strdup(export);
+ new_server = strdup(server);
+ new_export = strdup(export);
+ if (nfs->server != NULL) {
+ free(nfs->server);
+ nfs->server = NULL;
+ }
+ nfs->server = new_server;
+ if (nfs->export != NULL) {
+ free(nfs->export);
+ nfs->export = NULL;
+ }
+ nfs->export = new_export;
data->nfs = nfs;
data->cb = cb;
data->private_data = private_data;
}
path = data->path;
- str = index(path, '/');
+ str = strchr(path, '/');
if (str != NULL) {
*str = 0;
data->path = str+1;
st.st_dev = -1;
st.st_ino = res->GETATTR3res_u.resok.obj_attributes.fileid;
st.st_mode = res->GETATTR3res_u.resok.obj_attributes.mode;
+ if (res->GETATTR3res_u.resok.obj_attributes.type == NF3DIR) {
+ st.st_mode |= S_IFDIR ;
+ }
st.st_nlink = res->GETATTR3res_u.resok.obj_attributes.nlink;
st.st_uid = res->GETATTR3res_u.resok.obj_attributes.uid;
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;
if (res->status != NFS3_OK) {
rpc_set_error(nfs->rpc, "NFS: Read failed with %s(%d)", nfsstat3_to_str(res->status), nfsstat3_to_errno(res->status));
data->error = 1;
- } else {
- memcpy(&data->buffer[mdata->offset], res->READ3res_u.resok.data.data_val, res->READ3res_u.resok.count);
- if ((unsigned)data->max_offset < mdata->offset + res->READ3res_u.resok.count) {
- data->max_offset = mdata->offset + res->READ3res_u.resok.count;
+ } else {
+ if (res->READ3res_u.resok.count > 0) {
+ memcpy(&data->buffer[mdata->offset - data->start_offset], res->READ3res_u.resok.data.data_val, res->READ3res_u.resok.count);
+ if ((unsigned)data->max_offset < mdata->offset + res->READ3res_u.resok.count) {
+ data->max_offset = mdata->offset + res->READ3res_u.resok.count;
+ }
}
}
}
return;
}
-
if (data->error != 0) {
data->cb(-EFAULT, nfs, command_data, data->private_data);
free_nfs_cb_data(data);
data->nfsfh->offset = data->max_offset;
data->cb(data->max_offset - data->start_offset, nfs, data->buffer, data->private_data);
+
free_nfs_cb_data(data);
free(mdata);
}
* reads and collect into a reassembly buffer.
* we send all reads in parallell so that performance is still good.
*/
+ data->max_offset = offset;
data->start_offset = offset;
data->buffer = malloc(count);
mdata->data = data;
mdata->offset = offset;
mdata->count = readcount;
-
if (rpc_nfs_read_async(nfs->rpc, nfs_pread_mcb, &nfsfh->fh, offset, readcount, mdata) != 0) {
rpc_set_error(nfs->rpc, "RPC error: Failed to send READ call for %s", data->path);
data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
return -1;
}
- ptr = rindex(new_path, '/');
+ ptr = strrchr(new_path, '/');
if (ptr == NULL) {
rpc_set_error(nfs->rpc, "Invalid path %s", path);
return -1;
return -1;
}
- ptr = rindex(new_path, '/');
+ ptr = strrchr(new_path, '/');
if (ptr == NULL) {
rpc_set_error(nfs->rpc, "Invalid path %s", path);
return -1;
return -1;
}
- ptr = rindex(new_path, '/');
+ ptr = strrchr(new_path, '/');
if (ptr == NULL) {
rpc_set_error(nfs->rpc, "Invalid path %s", path);
return -1;
return -1;
}
- ptr = rindex(new_path, '/');
+ ptr = strrchr(new_path, '/');
if (ptr == NULL) {
rpc_set_error(nfs->rpc, "Invalid path %s", path);
return -1;
READDIR3res *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;
uint64_t cookie;
return -1;
}
- ptr = rindex(symlink_data->newpathparent, '/');
+ ptr = strrchr(symlink_data->newpathparent, '/');
if (ptr == NULL) {
rpc_set_error(nfs->rpc, "Invalid path %s", oldpath);
free_nfs_symlink_data(symlink_data);
free_nfs_rename_data(rename_data);
return -1;
}
- ptr = rindex(rename_data->oldpath, '/');
+ ptr = strrchr(rename_data->oldpath, '/');
if (ptr == NULL) {
rpc_set_error(nfs->rpc, "Invalid path %s", oldpath);
free_nfs_rename_data(rename_data);
free_nfs_rename_data(rename_data);
return -1;
}
- ptr = rindex(rename_data->newpath, '/');
+ ptr = strrchr(rename_data->newpath, '/');
if (ptr == NULL) {
rpc_set_error(nfs->rpc, "Invalid path %s", newpath);
free_nfs_rename_data(rename_data);
free_nfs_link_data(link_data);
return -1;
}
- ptr = rindex(link_data->newpath, '/');
+ ptr = strrchr(link_data->newpath, '/');
if (ptr == NULL) {
rpc_set_error(nfs->rpc, "Invalid path %s", newpath);
free_nfs_link_data(link_data);
void nfs_set_error(struct nfs_context *nfs, char *error_string, ...)
{
va_list ap;
- char *str;
+ char *str = NULL;
+ va_start(ap, error_string);
+ vasprintf(&str, error_string, ap);
if (nfs->rpc->error_string != NULL) {
free(nfs->rpc->error_string);
}
- va_start(ap, error_string);
- vasprintf(&str, error_string, ap);
nfs->rpc->error_string = str;
va_end(ap);
}
return 0;
}
+struct rpc_context *nfs_get_rpc_context(struct nfs_context *nfs)
+{
+ return nfs->rpc;
+}
+
+const char *nfs_get_server(struct nfs_context *nfs) {
+ return nfs->server;
+}
+
+const char *nfs_get_export(struct nfs_context *nfs) {
+ return nfs->export;
+}