Minor CMake fix (delete redundant line).
[bluesky.git] / nfs3 / rpc.c
1 /* Blue Sky: File Systems in the Cloud
2  *
3  * Copyright (C) 2009  The Regents of the University of California
4  * Written by Michael Vrable <mvrable@cs.ucsd.edu>
5  *
6  * TODO: Licensing
7  */
8
9 /* RPC handling: registration, marshalling and unmarshalling of messages.  For
10  * now this uses the standard Sun RPC mechanisms in the standard C library.
11  * Later, it might be changed to use something better.  Much of this code was
12  * generated with rpcgen from the XDR specifications, but has been hand-edited
13  * slightly. */
14
15 #include "mount_prot.h"
16 #include "nfs3_prot.h"
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <rpc/pmap_clnt.h>
20 #include <string.h>
21 #include <memory.h>
22 #include <sys/socket.h>
23 #include <netinet/in.h>
24
25 static void
26 mount_program_3(struct svc_req *rqstp, register SVCXPRT *transp)
27 {
28     union {
29         dirpath mountproc3_mnt_3_arg;
30         dirpath mountproc3_umnt_3_arg;
31     } argument;
32     char *result;
33     xdrproc_t _xdr_argument, _xdr_result;
34     char *(*local)(char *, struct svc_req *);
35
36     switch (rqstp->rq_proc) {
37     case MOUNTPROC3_NULL:
38         _xdr_argument = (xdrproc_t) xdr_void;
39         _xdr_result = (xdrproc_t) xdr_void;
40         local = (char *(*)(char *, struct svc_req *)) mountproc3_null_3_svc;
41         break;
42
43     case MOUNTPROC3_MNT:
44         _xdr_argument = (xdrproc_t) xdr_dirpath;
45         _xdr_result = (xdrproc_t) xdr_mountres3;
46         local = (char *(*)(char *, struct svc_req *)) mountproc3_mnt_3_svc;
47         break;
48
49     case MOUNTPROC3_DUMP:
50         _xdr_argument = (xdrproc_t) xdr_void;
51         _xdr_result = (xdrproc_t) xdr_mountlist;
52         local = (char *(*)(char *, struct svc_req *)) mountproc3_dump_3_svc;
53         break;
54
55     case MOUNTPROC3_UMNT:
56         _xdr_argument = (xdrproc_t) xdr_dirpath;
57         _xdr_result = (xdrproc_t) xdr_void;
58         local = (char *(*)(char *, struct svc_req *)) mountproc3_umnt_3_svc;
59         break;
60
61     case MOUNTPROC3_UMNTALL:
62         _xdr_argument = (xdrproc_t) xdr_void;
63         _xdr_result = (xdrproc_t) xdr_void;
64         local = (char *(*)(char *, struct svc_req *)) mountproc3_umntall_3_svc;
65         break;
66
67     case MOUNTPROC3_EXPORT:
68         _xdr_argument = (xdrproc_t) xdr_void;
69         _xdr_result = (xdrproc_t) xdr_exports;
70         local = (char *(*)(char *, struct svc_req *)) mountproc3_export_3_svc;
71         break;
72
73     default:
74         svcerr_noproc (transp);
75         return;
76     }
77     memset ((char *)&argument, 0, sizeof (argument));
78     if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
79         svcerr_decode (transp);
80         return;
81     }
82     result = (*local)((char *)&argument, rqstp);
83     if (result != NULL && !svc_sendreply(transp, (xdrproc_t) _xdr_result, result)) {
84         svcerr_systemerr (transp);
85     }
86     if (!svc_freeargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
87         fprintf (stderr, "%s", "unable to free arguments");
88         exit (1);
89     }
90     return;
91 }
92
93 static void
94 nfs_program_3(struct svc_req *rqstp, register SVCXPRT *transp)
95 {
96     union {
97         nfs_fh3 nfsproc3_getattr_3_arg;
98         setattr3args nfsproc3_setattr_3_arg;
99         diropargs3 nfsproc3_lookup_3_arg;
100         access3args nfsproc3_access_3_arg;
101         nfs_fh3 nfsproc3_readlink_3_arg;
102         read3args nfsproc3_read_3_arg;
103         write3args nfsproc3_write_3_arg;
104         create3args nfsproc3_create_3_arg;
105         mkdir3args nfsproc3_mkdir_3_arg;
106         symlink3args nfsproc3_symlink_3_arg;
107         mknod3args nfsproc3_mknod_3_arg;
108         diropargs3 nfsproc3_remove_3_arg;
109         diropargs3 nfsproc3_rmdir_3_arg;
110         rename3args nfsproc3_rename_3_arg;
111         link3args nfsproc3_link_3_arg;
112         readdir3args nfsproc3_readdir_3_arg;
113         readdirplus3args nfsproc3_readdirplus_3_arg;
114         nfs_fh3 nfsproc3_fsstat_3_arg;
115         nfs_fh3 nfsproc3_fsinfo_3_arg;
116         nfs_fh3 nfsproc3_pathconf_3_arg;
117         commit3args nfsproc3_commit_3_arg;
118     } argument;
119     char *result;
120     xdrproc_t _xdr_argument, _xdr_result;
121     char *(*local)(char *, struct svc_req *);
122
123     switch (rqstp->rq_proc) {
124     case NFSPROC3_NULL:
125         _xdr_argument = (xdrproc_t) xdr_void;
126         _xdr_result = (xdrproc_t) xdr_void;
127         local = (char *(*)(char *, struct svc_req *)) nfsproc3_null_3_svc;
128         break;
129
130     case NFSPROC3_GETATTR:
131         _xdr_argument = (xdrproc_t) xdr_nfs_fh3;
132         _xdr_result = (xdrproc_t) xdr_getattr3res;
133         local = (char *(*)(char *, struct svc_req *)) nfsproc3_getattr_3_svc;
134         break;
135
136     case NFSPROC3_SETATTR:
137         _xdr_argument = (xdrproc_t) xdr_setattr3args;
138         _xdr_result = (xdrproc_t) xdr_wccstat3;
139         local = (char *(*)(char *, struct svc_req *)) nfsproc3_setattr_3_svc;
140         break;
141
142     case NFSPROC3_LOOKUP:
143         _xdr_argument = (xdrproc_t) xdr_diropargs3;
144         _xdr_result = (xdrproc_t) xdr_lookup3res;
145         local = (char *(*)(char *, struct svc_req *)) nfsproc3_lookup_3_svc;
146         break;
147
148     case NFSPROC3_ACCESS:
149         _xdr_argument = (xdrproc_t) xdr_access3args;
150         _xdr_result = (xdrproc_t) xdr_access3res;
151         local = (char *(*)(char *, struct svc_req *)) nfsproc3_access_3_svc;
152         break;
153
154     case NFSPROC3_READLINK:
155         _xdr_argument = (xdrproc_t) xdr_nfs_fh3;
156         _xdr_result = (xdrproc_t) xdr_readlink3res;
157         local = (char *(*)(char *, struct svc_req *)) nfsproc3_readlink_3_svc;
158         break;
159
160     case NFSPROC3_READ:
161         _xdr_argument = (xdrproc_t) xdr_read3args;
162         _xdr_result = (xdrproc_t) xdr_read3res;
163         local = (char *(*)(char *, struct svc_req *)) nfsproc3_read_3_svc;
164         break;
165
166     case NFSPROC3_WRITE:
167         _xdr_argument = (xdrproc_t) xdr_write3args;
168         _xdr_result = (xdrproc_t) xdr_write3res;
169         local = (char *(*)(char *, struct svc_req *)) nfsproc3_write_3_svc;
170         break;
171
172     case NFSPROC3_CREATE:
173         _xdr_argument = (xdrproc_t) xdr_create3args;
174         _xdr_result = (xdrproc_t) xdr_diropres3;
175         local = (char *(*)(char *, struct svc_req *)) nfsproc3_create_3_svc;
176         break;
177
178     case NFSPROC3_MKDIR:
179         _xdr_argument = (xdrproc_t) xdr_mkdir3args;
180         _xdr_result = (xdrproc_t) xdr_diropres3;
181         local = (char *(*)(char *, struct svc_req *)) nfsproc3_mkdir_3_svc;
182         break;
183
184     case NFSPROC3_SYMLINK:
185         _xdr_argument = (xdrproc_t) xdr_symlink3args;
186         _xdr_result = (xdrproc_t) xdr_diropres3;
187         local = (char *(*)(char *, struct svc_req *)) nfsproc3_symlink_3_svc;
188         break;
189
190     case NFSPROC3_MKNOD:
191         _xdr_argument = (xdrproc_t) xdr_mknod3args;
192         _xdr_result = (xdrproc_t) xdr_diropres3;
193         local = (char *(*)(char *, struct svc_req *)) nfsproc3_mknod_3_svc;
194         break;
195
196     case NFSPROC3_REMOVE:
197         _xdr_argument = (xdrproc_t) xdr_diropargs3;
198         _xdr_result = (xdrproc_t) xdr_wccstat3;
199         local = (char *(*)(char *, struct svc_req *)) nfsproc3_remove_3_svc;
200         break;
201
202     case NFSPROC3_RMDIR:
203         _xdr_argument = (xdrproc_t) xdr_diropargs3;
204         _xdr_result = (xdrproc_t) xdr_wccstat3;
205         local = (char *(*)(char *, struct svc_req *)) nfsproc3_rmdir_3_svc;
206         break;
207
208     case NFSPROC3_RENAME:
209         _xdr_argument = (xdrproc_t) xdr_rename3args;
210         _xdr_result = (xdrproc_t) xdr_rename3res;
211         local = (char *(*)(char *, struct svc_req *)) nfsproc3_rename_3_svc;
212         break;
213
214     case NFSPROC3_LINK:
215         _xdr_argument = (xdrproc_t) xdr_link3args;
216         _xdr_result = (xdrproc_t) xdr_link3res;
217         local = (char *(*)(char *, struct svc_req *)) nfsproc3_link_3_svc;
218         break;
219
220     case NFSPROC3_READDIR:
221         _xdr_argument = (xdrproc_t) xdr_readdir3args;
222         _xdr_result = (xdrproc_t) xdr_readdir3res;
223         local = (char *(*)(char *, struct svc_req *)) nfsproc3_readdir_3_svc;
224         break;
225
226     case NFSPROC3_READDIRPLUS:
227         _xdr_argument = (xdrproc_t) xdr_readdirplus3args;
228         _xdr_result = (xdrproc_t) xdr_readdirplus3res;
229         local = (char *(*)(char *, struct svc_req *)) nfsproc3_readdirplus_3_svc;
230         break;
231
232     case NFSPROC3_FSSTAT:
233         _xdr_argument = (xdrproc_t) xdr_nfs_fh3;
234         _xdr_result = (xdrproc_t) xdr_fsstat3res;
235         local = (char *(*)(char *, struct svc_req *)) nfsproc3_fsstat_3_svc;
236         break;
237
238     case NFSPROC3_FSINFO:
239         _xdr_argument = (xdrproc_t) xdr_nfs_fh3;
240         _xdr_result = (xdrproc_t) xdr_fsinfo3res;
241         local = (char *(*)(char *, struct svc_req *)) nfsproc3_fsinfo_3_svc;
242         break;
243
244     case NFSPROC3_PATHCONF:
245         _xdr_argument = (xdrproc_t) xdr_nfs_fh3;
246         _xdr_result = (xdrproc_t) xdr_pathconf3res;
247         local = (char *(*)(char *, struct svc_req *)) nfsproc3_pathconf_3_svc;
248         break;
249
250     case NFSPROC3_COMMIT:
251         _xdr_argument = (xdrproc_t) xdr_commit3args;
252         _xdr_result = (xdrproc_t) xdr_commit3res;
253         local = (char *(*)(char *, struct svc_req *)) nfsproc3_commit_3_svc;
254         break;
255
256     default:
257         svcerr_noproc (transp);
258         return;
259     }
260     memset ((char *)&argument, 0, sizeof (argument));
261     if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
262         svcerr_decode (transp);
263         return;
264     }
265     result = (*local)((char *)&argument, rqstp);
266     if (result != NULL && !svc_sendreply(transp, (xdrproc_t) _xdr_result, result)) {
267         svcerr_systemerr (transp);
268     }
269     if (!svc_freeargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
270         fprintf (stderr, "%s", "unable to free arguments");
271         exit (1);
272     }
273     return;
274 }
275
276 void register_rpc()
277 {
278     SVCXPRT *transp;
279
280     /* MOUNT protocol */
281     pmap_unset (MOUNT_PROGRAM, MOUNT_V3);
282
283     transp = svcudp_create(RPC_ANYSOCK);
284     if (transp == NULL) {
285         fprintf(stderr, "%s", "cannot create udp service.");
286         exit(1);
287     }
288     if (!svc_register(transp, MOUNT_PROGRAM, MOUNT_V3, mount_program_3, IPPROTO_UDP)) {
289         fprintf(stderr, "%s", "unable to register (MOUNT_PROGRAM, MOUNT_V3, udp).");
290         exit(1);
291     }
292
293     transp = svctcp_create(RPC_ANYSOCK, 0, 0);
294     if (transp == NULL) {
295         fprintf(stderr, "%s", "cannot create tcp service.");
296         exit(1);
297     }
298     if (!svc_register(transp, MOUNT_PROGRAM, MOUNT_V3, mount_program_3, IPPROTO_TCP)) {
299         fprintf(stderr, "%s", "unable to register (MOUNT_PROGRAM, MOUNT_V3, tcp).");
300         exit(1);
301     }
302
303     /* NFS protocol (version 3) */
304     pmap_unset (NFS_PROGRAM, NFS_V3);
305
306     transp = svcudp_create(RPC_ANYSOCK);
307     if (transp == NULL) {
308         fprintf (stderr, "%s", "cannot create udp service.");
309         exit(1);
310     }
311     if (!svc_register(transp, NFS_PROGRAM, NFS_V3, nfs_program_3, IPPROTO_UDP)) {
312         fprintf (stderr, "%s", "unable to register (NFS_PROGRAM, NFS_V3, udp).");
313         exit(1);
314     }
315
316     transp = svctcp_create(RPC_ANYSOCK, 0, 0);
317     if (transp == NULL) {
318         fprintf (stderr, "%s", "cannot create tcp service.");
319         exit(1);
320     }
321     if (!svc_register(transp, NFS_PROGRAM, NFS_V3, nfs_program_3, IPPROTO_TCP)) {
322         fprintf (stderr, "%s", "unable to register (NFS_PROGRAM, NFS_V3, tcp).");
323         exit(1);
324     }
325 }