X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=include%2Fnfsc%2Flibnfs.h;h=27efa466269126685b077acebca785766f198659;hb=6505b5396731ca6ec1a6786fa9a67dd528cdf947;hp=1ea756181ba79e2b5e5c8ec8c71c3641adbdb0a5;hpb=9126c9c0366028cb799978d145fd361c6635b5f4;p=deb_libnfs.git diff --git a/include/nfsc/libnfs.h b/include/nfsc/libnfs.h index 1ea7561..27efa46 100644 --- a/include/nfsc/libnfs.h +++ b/include/nfsc/libnfs.h @@ -17,6 +17,10 @@ /* * This is the highlevel interface to access NFS resources using a posix-like interface */ + +#ifndef _LIBNFS_H_ +#define _LIBNFS_H_ + #include #if defined(ANDROID) #include @@ -24,6 +28,16 @@ #if defined(AROS) #include #endif +#if defined(__APPLE__) && defined(__MACH__) +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define LIBNFS_FEATURE_READAHEAD +#define NFS_BLKSIZE 4096 struct nfs_context; struct rpc_context; @@ -37,7 +51,7 @@ struct nfs_url { #if defined(WIN32) #define EXTERN __declspec( dllexport ) #else -#define EXTERN +#define EXTERN #endif #if defined(WIN32) @@ -50,7 +64,7 @@ struct statvfs { uint32_t f_files; uint32_t f_ffree; uint32_t f_favail; - uint32_t f_fsid; + uint32_t f_fsid; uint32_t f_flag; uint32_t f_namemax; }; @@ -111,6 +125,24 @@ EXTERN struct nfs_context *nfs_init_context(void); EXTERN void nfs_destroy_context(struct nfs_context *nfs); +/* + * URL parsing functions. + * These functions all parse a URL of the form + * nfs://server/path/file?argv=val[&arg=val]* + * and returns a nfs_url. + * + * Apart from parsing the URL the functions will also update + * the nfs context to reflect settings controlled via url arguments. + * + * Current URL arguments are : + * tcp-syncnt= : Number of SYNs to send during the seccion establish + * before failing settin up the tcp connection to the + * server. + * uid= : UID value to use when talking to the server. + * default it 65534 on Windows and getuid() on unixen. + * gid= : GID value to use when talking to the server. + * default it 65534 on Windows and getgid() on unixen. + */ /* * Parse a complete NFS URL including, server, path and * filename. Fail if any component is missing. @@ -148,6 +180,14 @@ EXTERN uint64_t nfs_get_readmax(struct nfs_context *nfs); */ EXTERN uint64_t nfs_get_writemax(struct nfs_context *nfs); +/* + * MODIFY CONNECT PARAMTERS + */ + +EXTERN void nfs_set_tcp_syncnt(struct nfs_context *nfs, int v); +EXTERN void nfs_set_uid(struct nfs_context *nfs, int uid); +EXTERN void nfs_set_gid(struct nfs_context *nfs, int gid); +EXTERN void nfs_set_readahead(struct nfs_context *nfs, uint32_t v); /* * MOUNT THE EXPORT @@ -191,6 +231,7 @@ EXTERN int nfs_mount(struct nfs_context *nfs, const char *server, const char *ex * -errno : An error occured. * data is the error string. */ +/* This function is deprecated. Use nfs_stat64_async() instead */ struct stat; EXTERN int nfs_stat_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void *private_data); /* @@ -199,8 +240,91 @@ EXTERN int nfs_stat_async(struct nfs_context *nfs, const char *path, nfs_cb cb, * 0 : The operation was successfull. * -errno : The command failed. */ +/* This function is deprecated. Use nfs_stat64() instead */ +#ifdef WIN32 +EXTERN int nfs_stat(struct nfs_context *nfs, const char *path, struct __stat64 *st); +#else EXTERN int nfs_stat(struct nfs_context *nfs, const char *path, struct stat *st); +#endif + + +/* nfs_stat64 + * 64 bit version if stat. All fields are always 64bit. + * Use these functions instead of nfs_stat[_async](), especially if you + * have weird stat structures. + */ +/* + * STAT() + */ +struct nfs_stat_64 { + uint64_t nfs_dev; + uint64_t nfs_ino; + uint64_t nfs_mode; + uint64_t nfs_nlink; + uint64_t nfs_uid; + uint64_t nfs_gid; + uint64_t nfs_rdev; + uint64_t nfs_size; + uint64_t nfs_blksize; + uint64_t nfs_blocks; + uint64_t nfs_atime; + uint64_t nfs_mtime; + uint64_t nfs_ctime; + uint64_t nfs_atime_nsec; + uint64_t nfs_mtime_nsec; + uint64_t nfs_ctime_nsec; + uint64_t nfs_used; +}; +/* + * Async stat() + * Function returns + * 0 : The operation was initiated. Once the operation finishes, the callback will be invoked. + * <0 : An error occured when trying to set up the operation. The callback will not be invoked. + * + * When the callback is invoked, status indicates the result: + * 0 : Success. + * data is struct nfs_stat_64 * + * -errno : An error occured. + * data is the error string. + */ +EXTERN int nfs_stat64_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void *private_data); +/* + * Sync stat() + * Function returns + * 0 : The operation was successfull. + * -errno : The command failed. + */ +EXTERN int nfs_stat64(struct nfs_context *nfs, const char *path, struct nfs_stat_64 *st); + +/* + * Async stat() + * + * Like stat except if the destination is a symbolic link, it acts on the + * symbolic link itself. + * + * Function returns + * 0 : The operation was initiated. Once the operation finishes, the callback will be invoked. + * <0 : An error occured when trying to set up the operation. The callback will not be invoked. + * + * When the callback is invoked, status indicates the result: + * 0 : Success. + * data is struct nfs_stat_64 * + * -errno : An error occured. + * data is the error string. + */ +EXTERN int nfs_lstat64_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void *private_data); +/* + * Sync stat() + * + * Like stat except if the destination is a symbolic link, it acts on the + * symbolic link itself. + * + * Function returns + * 0 : The operation was successfull. + * -errno : The command failed. + */ +EXTERN int nfs_lstat64(struct nfs_context *nfs, const char *path, struct nfs_stat_64 *st); /* * FSTAT() @@ -217,6 +341,7 @@ EXTERN int nfs_stat(struct nfs_context *nfs, const char *path, struct stat *st); * -errno : An error occured. * data is the error string. */ +/* This function is deprecated. Use nfs_fstat64_async() instead */ EXTERN int nfs_fstat_async(struct nfs_context *nfs, struct nfsfh *nfsfh, nfs_cb cb, void *private_data); /* * Sync fstat(nfsfh *) @@ -224,7 +349,40 @@ EXTERN int nfs_fstat_async(struct nfs_context *nfs, struct nfsfh *nfsfh, nfs_cb * 0 : The operation was successfull. * -errno : The command failed. */ +#ifdef WIN32 +EXTERN int nfs_fstat(struct nfs_context *nfs, struct nfsfh *nfsfh, struct __stat64 *st); +#else EXTERN int nfs_fstat(struct nfs_context *nfs, struct nfsfh *nfsfh, struct stat *st); +#endif + +/* nfs_fstat64 + * 64 bit version of fstat. All fields are always 64bit. + * Use these functions instead of nfs_fstat[_async](), especially if you + * have weird stat structures. + */ +/* + * FSTAT() + */ +/* + * Async fstat(nfsfh *) + * Function returns + * 0 : The operation was initiated. Once the operation finishes, the callback will be invoked. + * <0 : An error occured when trying to set up the operation. The callback will not be invoked. + * + * When the callback is invoked, status indicates the result: + * 0 : Success. + * data is struct stat * + * -errno : An error occured. + * data is the error string. + */ +EXTERN int nfs_fstat64_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. + */ +EXTERN int nfs_fstat64(struct nfs_context *nfs, struct nfsfh *nfsfh, struct nfs_stat_64 *st); @@ -234,12 +392,21 @@ EXTERN int nfs_fstat(struct nfs_context *nfs, struct nfsfh *nfsfh, struct stat * /* * Async open() * - * mode is a combination of the flags : O_RDOLNY, O_WRONLY, O_RDWR , O_SYNC + * mode is a combination of the flags : + * O_RDOLNY, O_WRONLY, O_RDWR , O_SYNC, O_APPEND, O_TRUNC * * Function returns * 0 : The operation was initiated. Once the operation finishes, the callback will be invoked. * <0 : An error occured when trying to set up the operation. The callback will not be invoked. * + * Supported flags are + * O_APPEND + * O_RDONLY + * O_WRONLY + * O_RDWR + * O_SYNC + * O_TRUNC (Only valid with O_RDWR or O_WRONLY. Ignored otherwise.) + * * When the callback is invoked, status indicates the result: * 0 : Success. * data is a struct *nfsfh; @@ -247,14 +414,14 @@ EXTERN int nfs_fstat(struct nfs_context *nfs, struct nfsfh *nfsfh, struct stat * * -errno : An error occured. * data is the error string. */ -EXTERN 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 flags, nfs_cb cb, void *private_data); /* - * Sync stat() + * Sync open() * Function returns * 0 : The operation was successfull. *nfsfh is filled in. * -errno : The command failed. */ -EXTERN 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 flags, struct nfsfh **nfsfh); @@ -410,14 +577,14 @@ EXTERN int nfs_write(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t coun * -errno : An error occured. * data is the error string. */ -EXTERN int nfs_lseek_async(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offset, int whence, nfs_cb cb, void *private_data); +EXTERN int nfs_lseek_async(struct nfs_context *nfs, struct nfsfh *nfsfh, int64_t offset, int whence, nfs_cb cb, void *private_data); /* * Sync lseek() * Function returns * >=0 : numer of bytes read. * -errno : An error occured. */ -EXTERN int nfs_lseek(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offset, int whence, uint64_t *current_offset); +EXTERN int nfs_lseek(struct nfs_context *nfs, struct nfsfh *nfsfh, int64_t offset, int whence, uint64_t *current_offset); /* @@ -579,6 +746,34 @@ EXTERN int nfs_creat_async(struct nfs_context *nfs, const char *path, int mode, */ EXTERN int nfs_creat(struct nfs_context *nfs, const char *path, int mode, struct nfsfh **nfsfh); +/* + * Async create() + * + * Same as nfs_creat_async but allows passing flags: + * O_APPEND + * O_SYNC + * O_EXCL + * O_TRUNC + * + * Function returns + * 0 : The operation was initiated. Once the operation finishes, the callback will be invoked. + * <0 : An error occured when trying to set up the operation. The callback will not be invoked. + * + * When the callback is invoked, status indicates the result: + * 0 : Success. + * data is a struct *nfsfh; + * -errno : An error occured. + * data is the error string. + */ +EXTERN int nfs_create_async(struct nfs_context *nfs, const char *path, int flags, int mode, nfs_cb cb, void *private_data); +/* + * Sync create() + * Function returns + * 0 : Success + * -errno : An error occured. + */ +EXTERN int nfs_create(struct nfs_context *nfs, const char *path, int flags, int mode, struct nfsfh **nfsfh); + /* * MKNOD() @@ -672,13 +867,25 @@ struct nfsdirent { char *name; uint64_t inode; - /* some extra fields we get for free through the READDIRPLUS3 call. You need libnfs-raw-nfs.h for these */ + /* Some extra fields we get for free through the READDIRPLUS3 call. + You need libnfs-raw-nfs.h for type/mode constants */ uint32_t type; /* NF3REG, NF3DIR, NF3BLK, ... */ uint32_t mode; uint64_t size; struct timeval atime; struct timeval mtime; struct timeval ctime; + uint32_t uid; + uint32_t gid; + uint32_t nlink; + uint64_t dev; + uint64_t rdev; + uint64_t blksize; + uint64_t blocks; + uint64_t used; + uint32_t atime_nsec; + uint32_t mtime_nsec; + uint32_t ctime_nsec; }; /* * nfs_readdir() never blocks, so no special sync/async versions are available @@ -688,7 +895,7 @@ EXTERN struct nfsdirent *nfs_readdir(struct nfs_context *nfs, struct nfsdir *nfs /* - * READDIR() + * CLOSEDIR() */ /* * nfs_closedir() never blocks, so no special sync/async versions are available @@ -696,6 +903,49 @@ EXTERN struct nfsdirent *nfs_readdir(struct nfs_context *nfs, struct nfsdir *nfs EXTERN void nfs_closedir(struct nfs_context *nfs, struct nfsdir *nfsdir); +/* + * CHDIR() + */ +/* + * Async chdir() + * + * Function returns + * 0 : The operation was initiated. Once the operation finishes, the callback will be invoked. + * <0 : An error occured when trying to set up the operation. The callback will not be invoked. + * + * When the callback is invoked, status indicates the result: + * 0 : Success. + * data is NULL; + * -errno : An error occured. + * data is the error string. + */ +EXTERN int nfs_chdir_async(struct nfs_context *nfs, const char *path, nfs_cb cb, void *private_data); +/* + * Sync chdir() + * Function returns + * 0 : The operation was successfull. + * -errno : The command failed. + */ +EXTERN int nfs_chdir(struct nfs_context *nfs, const char *path); + +/* + * GETCWD() + */ +/* + * nfs_getcwd() never blocks, so no special sync/async versions are available + */ +/* + * Sync getcwd() + * This function returns a pointer to the current working directory. + * This pointer is only stable until the next [f]chdir or when the + * context is destroyed. + * + * Function returns + * 0 : The operation was successfull and *cwd is filled in. + * -errno : The command failed. + */ +EXTERN void nfs_getcwd(struct nfs_context *nfs, const char **cwd); + /* * STATVFS() @@ -826,6 +1076,34 @@ EXTERN int nfs_chown_async(struct nfs_context *nfs, const char *path, int uid, i * -errno : The command failed. */ EXTERN int nfs_chown(struct nfs_context *nfs, const char *path, int uid, int gid); +/* + * Async chown() + * + * Like chown except if the destination is a symbolic link, it acts on the + * symbolic link itself. + * + * Function returns + * 0 : The operation was initiated. Once the operation finishes, the callback will be invoked. + * <0 : An error occured when trying to set up the operation. The callback will not be invoked. + * + * When the callback is invoked, status indicates the result: + * 0 : Success. + * data is NULL + * -errno : An error occured. + * data is the error string. + */ +EXTERN int nfs_lchown_async(struct nfs_context *nfs, const char *path, int uid, int gid, nfs_cb cb, void *private_data); +/* + * Sync chown() + * + * Like chown except if the destination is a symbolic link, it acts on the + * symbolic link itself. + * + * Function returns + * 0 : The operation was successfull. + * -errno : The command failed. + */ +EXTERN int nfs_lchown(struct nfs_context *nfs, const char *path, int uid, int gid); @@ -879,6 +1157,34 @@ EXTERN int nfs_utimes_async(struct nfs_context *nfs, const char *path, struct ti * -errno : The command failed. */ EXTERN int nfs_utimes(struct nfs_context *nfs, const char *path, struct timeval *times); +/* + * Async utimes() + * + * Like utimes except if the destination is a symbolic link, it acts on the + * symbolic link itself. + * + * Function returns + * 0 : The operation was initiated. Once the operation finishes, the callback will be invoked. + * <0 : An error occured when trying to set up the operation. The callback will not be invoked. + * + * When the callback is invoked, status indicates the result: + * 0 : Success. + * data is NULL + * -errno : An error occured. + * data is the error string. + */ +EXTERN int nfs_lutimes_async(struct nfs_context *nfs, const char *path, struct timeval *times, nfs_cb cb, void *private_data); +/* + * Sync utimes() + * + * Like utimes except if the destination is a symbolic link, it acts on the + * symbolic link itself. + * + * Function returns + * 0 : The operation was successfull. + * -errno : The command failed. + */ +EXTERN int nfs_lutimes(struct nfs_context *nfs, const char *path, struct timeval *times); /* @@ -1039,7 +1345,7 @@ EXTERN int mount_getexports_async(struct rpc_context *rpc, const char *server, r * Function returns * NULL : something failed * exports export : a linked list of exported directories - * + * * returned data must be freed by calling mount_free_export_list(exportnode); */ EXTERN struct exportnode *mount_getexports(const char *server); @@ -1068,8 +1374,14 @@ struct nfs_server_list { * NULL : something failed * * struct nfs_server_list : a linked list of all discovered servers - * + * * returned data must be freed by nfs_free_srvr_list(srv); */ struct nfs_server_list *nfs_find_local_servers(void); void free_nfs_srvr_list(struct nfs_server_list *srv); + +#ifdef __cplusplus +} +#endif + +#endif /* !_LIBNFS_H_ */