Hook NFS proxy together with BlueSky core.
[bluesky.git] / nfs3 / nfs3.c
1 /*
2  * This is sample code generated by rpcgen.
3  * These are only templates and you can use them
4  * as a guideline for developing your own functions.
5  */
6
7 #include "nfs3_prot.h"
8 #include "bluesky.h"
9
10 extern BlueSkyFS *fs;
11
12 static int null_int;
13 static void *null_result = (void *)&null_int;
14
15 /* Look up a BlueSkyInode given an NFS filehandle.  Returns NULL if the
16  * filehandle is invalid. */
17 BlueSkyInode *lookup_fh(nfs_fh3 *fh)
18 {
19     BlueSkyInode *inode = NULL;
20     if (fh->data.data_len == 8) {
21         uint64_t inum = GUINT64_FROM_BE(*(uint64_t *)(fh->data.data_val));
22         inode = bluesky_get_inode(fs, inum);
23     }
24     return inode;
25 }
26
27 /* Copy inode attributes into NFS response.  The BlueSkyInode should be locked
28  * by the caller. */
29 void encode_fattr3(struct fattr3 *result, BlueSkyInode *inode)
30 {
31     result->type = inode->type;
32     result->mode = inode->mode;
33     result->nlink = inode->nlink;
34     result->uid = inode->uid;
35     result->gid = inode->gid;
36     result->size = inode->size;
37     result->used = 0;
38     result->rdev.major = 0;
39     result->rdev.minor = 0;
40     result->fsid = 0;
41     result->fileid = inode->inum;
42     result->atime.seconds = inode->atime / 1000000;
43     result->atime.nseconds = (inode->atime % 1000000) * 1000;
44     result->mtime.seconds = inode->mtime / 1000000;
45     result->mtime.nseconds = (inode->mtime % 1000000) * 1000;
46     result->ctime.seconds = inode->ctime / 1000000;
47     result->ctime.nseconds = (inode->ctime % 1000000) * 1000;
48 }
49
50 void *
51 nfsproc3_null_3_svc(void *argp, struct svc_req *rqstp)
52 {
53     return null_result;
54 }
55
56 getattr3res *
57 nfsproc3_getattr_3_svc(nfs_fh3 *argp, struct svc_req *rqstp)
58 {
59     static getattr3res result;
60
61     BlueSkyInode *inode = lookup_fh(argp);
62     if (inode != NULL) {
63         result.status = NFS3_OK;
64         encode_fattr3(&result.getattr3res_u.attributes, inode);
65     } else {
66         result.status = NFS3ERR_STALE;
67     }
68
69     return &result;
70 }
71
72 wccstat3 *
73 nfsproc3_setattr_3_svc(setattr3args *argp, struct svc_req *rqstp)
74 {
75     static wccstat3 result;
76
77     result.status = NFS3ERR_NOTSUPP;
78
79     return &result;
80 }
81
82 lookup3res *
83 nfsproc3_lookup_3_svc(diropargs3 *argp, struct svc_req *rqstp)
84 {
85     static lookup3res result;
86
87     result.status = NFS3ERR_NOTSUPP;
88
89     return &result;
90 }
91
92 access3res *
93 nfsproc3_access_3_svc(access3args *argp, struct svc_req *rqstp)
94 {
95     static access3res result;
96
97     result.status = NFS3ERR_NOTSUPP;
98
99     return &result;
100 }
101
102 readlink3res *
103 nfsproc3_readlink_3_svc(nfs_fh3 *argp, struct svc_req *rqstp)
104 {
105     static readlink3res result;
106
107     result.status = NFS3ERR_NOTSUPP;
108
109     return &result;
110 }
111
112 read3res *
113 nfsproc3_read_3_svc(read3args *argp, struct svc_req *rqstp)
114 {
115     static read3res result;
116
117     result.status = NFS3ERR_NOTSUPP;
118
119     return &result;
120 }
121
122 write3res *
123 nfsproc3_write_3_svc(write3args *argp, struct svc_req *rqstp)
124 {
125     static write3res result;
126
127     result.status = NFS3ERR_NOTSUPP;
128
129     return &result;
130 }
131
132 diropres3 *
133 nfsproc3_create_3_svc(create3args *argp, struct svc_req *rqstp)
134 {
135     static diropres3 result;
136
137     result.status = NFS3ERR_NOTSUPP;
138
139     return &result;
140 }
141
142 diropres3 *
143 nfsproc3_mkdir_3_svc(mkdir3args *argp, struct svc_req *rqstp)
144 {
145     static diropres3 result;
146
147     result.status = NFS3ERR_NOTSUPP;
148
149     return &result;
150 }
151
152 diropres3 *
153 nfsproc3_symlink_3_svc(symlink3args *argp, struct svc_req *rqstp)
154 {
155     static diropres3 result;
156
157     result.status = NFS3ERR_NOTSUPP;
158
159     return &result;
160 }
161
162 diropres3 *
163 nfsproc3_mknod_3_svc(mknod3args *argp, struct svc_req *rqstp)
164 {
165     static diropres3 result;
166
167     result.status = NFS3ERR_NOTSUPP;
168
169     return &result;
170 }
171
172 wccstat3 *
173 nfsproc3_remove_3_svc(diropargs3 *argp, struct svc_req *rqstp)
174 {
175     static wccstat3 result;
176
177     result.status = NFS3ERR_NOTSUPP;
178
179     return &result;
180 }
181
182 wccstat3 *
183 nfsproc3_rmdir_3_svc(diropargs3 *argp, struct svc_req *rqstp)
184 {
185     static wccstat3 result;
186
187     result.status = NFS3ERR_NOTSUPP;
188
189     return &result;
190 }
191
192 rename3res *
193 nfsproc3_rename_3_svc(rename3args *argp, struct svc_req *rqstp)
194 {
195     static rename3res result;
196
197     result.status = NFS3ERR_NOTSUPP;
198
199     return &result;
200 }
201
202 link3res *
203 nfsproc3_link_3_svc(link3args *argp, struct svc_req *rqstp)
204 {
205     static link3res result;
206
207     result.status = NFS3ERR_NOTSUPP;
208
209     return &result;
210 }
211
212 readdir3res *
213 nfsproc3_readdir_3_svc(readdir3args *argp, struct svc_req *rqstp)
214 {
215     static readdir3res result;
216
217     result.status = NFS3ERR_NOTSUPP;
218
219     return &result;
220 }
221
222 readdirplus3res *
223 nfsproc3_readdirplus_3_svc(readdirplus3args *argp, struct svc_req *rqstp)
224 {
225     static readdirplus3res result;
226
227     result.status = NFS3ERR_NOTSUPP;
228
229     return &result;
230 }
231
232 fsstat3res *
233 nfsproc3_fsstat_3_svc(nfs_fh3 *argp, struct svc_req *rqstp)
234 {
235     static fsstat3res result;
236
237     result.status = NFS3ERR_NOTSUPP;
238
239     return &result;
240 }
241
242 fsinfo3res *
243 nfsproc3_fsinfo_3_svc(nfs_fh3 *argp, struct svc_req *rqstp)
244 {
245     static fsinfo3res result;
246
247     BlueSkyInode *inode = bluesky_get_inode(fs, 1);
248     result.status = NFS3_OK;
249     result.fsinfo3res_u.resok.obj_attributes.present = TRUE;
250     encode_fattr3(&result.fsinfo3res_u.resok.obj_attributes.post_op_attr_u.attributes, inode);
251     result.fsinfo3res_u.resok.rtmax = 32768;
252     result.fsinfo3res_u.resok.rtpref = 32768;
253     result.fsinfo3res_u.resok.rtmult = 4096;
254     result.fsinfo3res_u.resok.wtmax = 32768;
255     result.fsinfo3res_u.resok.wtpref = 32768;
256     result.fsinfo3res_u.resok.wtmult = 4096;
257     result.fsinfo3res_u.resok.dtpref = 4096;
258     result.fsinfo3res_u.resok.maxfilesize = 0x7fffffffffffffffULL;
259     result.fsinfo3res_u.resok.time_delta.seconds = 0;
260     result.fsinfo3res_u.resok.time_delta.nseconds = 1000;
261     result.fsinfo3res_u.resok.properties
262         = FSF3_LINK | FSF3_SYMLINK | FSF3_HOMOGENEOUS | FSF3_CANSETTIME;
263
264     return &result;
265 }
266
267 pathconf3res *
268 nfsproc3_pathconf_3_svc(nfs_fh3 *argp, struct svc_req *rqstp)
269 {
270     static pathconf3res result;
271
272     BlueSkyInode *inode = bluesky_get_inode(fs, 1);
273     result.status = NFS3_OK;
274     result.pathconf3res_u.resok.obj_attributes.present = TRUE;
275     encode_fattr3(&result.pathconf3res_u.resok.obj_attributes.post_op_attr_u.attributes, inode);
276     result.pathconf3res_u.resok.linkmax = 0xffffffff;
277     result.pathconf3res_u.resok.name_max = 255;
278     result.pathconf3res_u.resok.no_trunc = TRUE;
279     result.pathconf3res_u.resok.chown_restricted = TRUE;
280     result.pathconf3res_u.resok.case_insensitive = FALSE;
281     result.pathconf3res_u.resok.case_preserving = TRUE;
282
283     return &result;
284 }
285
286 commit3res *
287 nfsproc3_commit_3_svc(commit3args *argp, struct svc_req *rqstp)
288 {
289     static commit3res result;
290
291     result.status = NFS3ERR_NOTSUPP;
292
293     return &result;
294 }