1#ifndef _NFS_ADD_ON_H
2#define _NFS_ADD_ON_H
3
4/* wrappers */
5#ifdef __HAIKU__
6#	include <fs_interface.h>
7#	include <fs_info.h>
8#	include <NodeMonitor.h>
9typedef dev_t nspace_id;
10#	define WSTAT_MODE B_STAT_MODE
11#	define WSTAT_UID B_STAT_UID
12#	define WSTAT_GID B_STAT_GID
13#	define WSTAT_SIZE B_STAT_SIZE
14#	define WSTAT_ATIME B_STAT_ACCESS_TIME
15#	define WSTAT_MTIME B_STAT_MODIFICATION_TIME
16#	define WSTAT_CRTIME B_STAT_CREATION_TIME
17
18#else
19#	include "fsproto.h"
20#	define publish_vnode new_vnode
21typedef int socklen_t;
22#endif
23
24#include "RPCPendingCalls.h"
25#include "XDROutPacket.h"
26#include "XDRInPacket.h"
27#include "nfs.h"
28
29#include <Errors.h>
30#include <sys/stat.h>
31#include <SupportDefs.h>
32
33
34struct mount_nfs_params {
35	unsigned int serverIP;
36	char *server;
37	char *_export;
38	uid_t uid;
39	gid_t gid;
40	char *hostname;
41};
42
43struct fs_node {
44	int mode;
45	ino_t vnid;
46	struct nfs_fhandle fhandle;
47	struct fs_node *next;
48};
49
50struct fs_nspace {
51	nspace_id nsid;
52
53	thread_id tid;
54	bool quit;
55	int s;
56	struct RPCPendingCalls pendingCalls;
57
58	struct sockaddr_in mountAddr,nfsAddr;
59
60	int32 xid;
61
62	ino_t rootid;
63
64	sem_id sem;
65	struct fs_node *first;
66
67	struct mount_nfs_params params;
68
69	bigtime_t last_rfsstat;
70
71};
72
73void fs_nspaceInit (struct fs_nspace *nspace);
74void fs_nspaceDestroy (struct fs_nspace *nspace);
75
76struct fs_file_cookie
77{
78	int omode;
79	off_t original_size;
80	struct stat st;
81};
82
83typedef struct fs_nspace fs_nspace;
84typedef struct fs_node fs_node;
85typedef struct nfs_cookie nfs_cookie;
86typedef struct fs_file_cookie fs_file_cookie;
87typedef struct nfs_fhandle nfs_fhandle;
88
89status_t create_socket(fs_nspace *ns);
90status_t init_postoffice(fs_nspace *ns);
91void shutdown_postoffice(fs_nspace *ns);
92status_t postoffice_func(fs_nspace *ns);
93
94extern uint8 *send_rpc_call(fs_nspace *ns, const struct sockaddr_in *addr, int32 prog, int32 vers, int32 proc, const struct XDROutPacket *packet);
95extern bool is_successful_reply(struct XDRInPacket *reply);
96extern status_t get_remote_address(fs_nspace *ns, int32 prog, int32 vers, int32 prot, struct sockaddr_in *addr);
97extern status_t nfs_mount(fs_nspace *ns, const char *path, nfs_fhandle *fhandle);
98extern status_t map_nfs_to_system_error(status_t nfsstatus);
99extern void get_nfs_attr(struct XDRInPacket *reply, struct stat *st);
100extern status_t nfs_lookup(fs_nspace *ns, const nfs_fhandle *dir, const char *filename, nfs_fhandle *fhandle, struct stat *st);
101extern status_t nfs_truncate_file(fs_nspace *ns, const nfs_fhandle *fhandle, struct stat *st);
102
103nfs_fhandle handle_from_vnid (fs_nspace *ns, ino_t vnid);
104
105extern status_t nfs_getattr(fs_nspace *ns, const nfs_fhandle *fhandle, struct stat *st);
106extern void insert_node(fs_nspace *ns, fs_node *node);
107extern void remove_node(fs_nspace *ns, ino_t vnid);
108
109enum {
110	C_ERROR_STALE = B_ERRORS_END + 1
111};
112
113
114extern fs_volume_ops sNFSVolumeOps;
115extern fs_vnode_ops sNFSVnodeOps;
116
117#define USE_SYSTEM_AUTHENTICATION 1
118
119#endif	/* _NFS_ADD_ON_H */
120