4 * Copyright (c) 1997-2009 Erez Zadok
5 * Copyright (c) 1989 Jan-Simon Pendry
6 * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
7 * Copyright (c) 1989 The Regents of the University of California.
10 * This code is derived from software contributed to Berkeley by
11 * Jan-Simon Pendry at Imperial College, London.
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
16 * 1. Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution.
21 * 3. All advertising materials mentioning features or use of this software
22 * must display the following acknowledgment:
23 * This product includes software developed by the University of
24 * California, Berkeley and its contributors.
25 * 4. Neither the name of the University nor the names of its contributors
26 * may be used to endorse or promote products derived from this software
27 * without specific prior written permission.
29 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
30 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
31 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
33 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
38 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
42 * File: am-utils/hlfsd/nfs_prot_svc.c
48 #endif /* HAVE_CONFIG_H */
52 /* EXTERNAL FUNCTIONS */
53 extern voidp
nfsproc_null_2_svc(voidp
, struct svc_req
*);
54 extern nfsattrstat
*nfsproc_getattr_2_svc(am_nfs_fh
*, struct svc_req
*);
55 extern nfsattrstat
*nfsproc_setattr_2_svc(nfssattrargs
*, struct svc_req
*);
56 extern voidp
nfsproc_root_2_svc(voidp
, struct svc_req
*);
57 extern nfsdiropres
*nfsproc_lookup_2_svc(nfsdiropargs
*, struct svc_req
*);
58 extern nfsreadlinkres
*nfsproc_readlink_2_svc(am_nfs_fh
*, struct svc_req
*);
59 extern nfsreadres
*nfsproc_read_2_svc(nfsreadargs
*, struct svc_req
*);
60 extern voidp
nfsproc_writecache_2_svc(voidp
, struct svc_req
*);
61 extern nfsattrstat
*nfsproc_write_2_svc(nfswriteargs
*, struct svc_req
*);
62 extern nfsdiropres
*nfsproc_create_2_svc(nfscreateargs
*, struct svc_req
*);
63 extern nfsstat
*nfsproc_remove_2_svc(nfsdiropargs
*, struct svc_req
*);
64 extern nfsstat
*nfsproc_rename_2_svc(nfsrenameargs
*, struct svc_req
*);
65 extern nfsstat
*nfsproc_link_2_svc(nfslinkargs
*, struct svc_req
*);
66 extern nfsstat
*nfsproc_symlink_2_svc(nfssymlinkargs
*, struct svc_req
*);
67 extern nfsdiropres
*nfsproc_mkdir_2_svc(nfscreateargs
*, struct svc_req
*);
68 extern nfsstat
*nfsproc_rmdir_2_svc(nfsdiropargs
*, struct svc_req
*);
69 extern nfsreaddirres
*nfsproc_readdir_2_svc(nfsreaddirargs
*, struct svc_req
*);
70 extern nfsstatfsres
*nfsproc_statfs_2_svc(am_nfs_fh
*, struct svc_req
*);
73 SVCXPRT
*nfs_program_2_transp
;
76 typedef char *(*nfssvcproc_t
)(voidp
, struct svc_req
*);
80 nfs_program_2(struct svc_req
*rqstp
, SVCXPRT
*transp
)
83 am_nfs_fh nfsproc_getattr_2_arg
;
84 nfssattrargs nfsproc_setattr_2_arg
;
85 nfsdiropargs nfsproc_lookup_2_arg
;
86 am_nfs_fh nfsproc_readlink_2_arg
;
87 nfsreadargs nfsproc_read_2_arg
;
88 nfswriteargs nfsproc_write_2_arg
;
89 nfscreateargs nfsproc_create_2_arg
;
90 nfsdiropargs nfsproc_remove_2_arg
;
91 nfsrenameargs nfsproc_rename_2_arg
;
92 nfslinkargs nfsproc_link_2_arg
;
93 nfssymlinkargs nfsproc_symlink_2_arg
;
94 nfscreateargs nfsproc_mkdir_2_arg
;
95 nfsdiropargs nfsproc_rmdir_2_arg
;
96 nfsreaddirargs nfsproc_readdir_2_arg
;
97 am_nfs_fh nfsproc_statfs_2_arg
;
100 xdrproc_t xdr_argument
, xdr_result
;
103 nfs_program_2_transp
= NULL
;
105 switch (rqstp
->rq_proc
) {
108 xdr_argument
= (xdrproc_t
) xdr_void
;
109 xdr_result
= (xdrproc_t
) xdr_void
;
110 local
= (nfssvcproc_t
) nfsproc_null_2_svc
;
113 case NFSPROC_GETATTR
:
114 xdr_argument
= (xdrproc_t
) xdr_nfs_fh
;
115 xdr_result
= (xdrproc_t
) xdr_attrstat
;
116 local
= (nfssvcproc_t
) nfsproc_getattr_2_svc
;
119 case NFSPROC_SETATTR
:
120 xdr_argument
= (xdrproc_t
) xdr_sattrargs
;
121 xdr_result
= (xdrproc_t
) xdr_attrstat
;
122 local
= (nfssvcproc_t
) nfsproc_setattr_2_svc
;
126 xdr_argument
= (xdrproc_t
) xdr_void
;
127 xdr_result
= (xdrproc_t
) xdr_void
;
128 local
= (nfssvcproc_t
) nfsproc_root_2_svc
;
132 xdr_argument
= (xdrproc_t
) xdr_diropargs
;
133 xdr_result
= (xdrproc_t
) xdr_diropres
;
134 local
= (nfssvcproc_t
) nfsproc_lookup_2_svc
;
136 * Cheap way to pass transp down to afs_lookuppn so it can
137 * be stored in the am_node structure and later used for
140 nfs_program_2_transp
= transp
;
143 case NFSPROC_READLINK
:
144 xdr_argument
= (xdrproc_t
) xdr_nfs_fh
;
145 xdr_result
= (xdrproc_t
) xdr_readlinkres
;
146 local
= (nfssvcproc_t
) nfsproc_readlink_2_svc
;
150 xdr_argument
= (xdrproc_t
) xdr_readargs
;
151 xdr_result
= (xdrproc_t
) xdr_readres
;
152 local
= (nfssvcproc_t
) nfsproc_read_2_svc
;
155 case NFSPROC_WRITECACHE
:
156 xdr_argument
= (xdrproc_t
) xdr_void
;
157 xdr_result
= (xdrproc_t
) xdr_void
;
158 local
= (nfssvcproc_t
) nfsproc_writecache_2_svc
;
162 xdr_argument
= (xdrproc_t
) xdr_writeargs
;
163 xdr_result
= (xdrproc_t
) xdr_attrstat
;
164 local
= (nfssvcproc_t
) nfsproc_write_2_svc
;
168 xdr_argument
= (xdrproc_t
) xdr_createargs
;
169 xdr_result
= (xdrproc_t
) xdr_diropres
;
170 local
= (nfssvcproc_t
) nfsproc_create_2_svc
;
174 xdr_argument
= (xdrproc_t
) xdr_diropargs
;
175 xdr_result
= (xdrproc_t
) xdr_nfsstat
;
176 local
= (nfssvcproc_t
) nfsproc_remove_2_svc
;
180 xdr_argument
= (xdrproc_t
) xdr_renameargs
;
181 xdr_result
= (xdrproc_t
) xdr_nfsstat
;
182 local
= (nfssvcproc_t
) nfsproc_rename_2_svc
;
186 xdr_argument
= (xdrproc_t
) xdr_linkargs
;
187 xdr_result
= (xdrproc_t
) xdr_nfsstat
;
188 local
= (nfssvcproc_t
) nfsproc_link_2_svc
;
191 case NFSPROC_SYMLINK
:
192 xdr_argument
= (xdrproc_t
) xdr_symlinkargs
;
193 xdr_result
= (xdrproc_t
) xdr_nfsstat
;
194 local
= (nfssvcproc_t
) nfsproc_symlink_2_svc
;
198 xdr_argument
= (xdrproc_t
) xdr_createargs
;
199 xdr_result
= (xdrproc_t
) xdr_diropres
;
200 local
= (nfssvcproc_t
) nfsproc_mkdir_2_svc
;
204 xdr_argument
= (xdrproc_t
) xdr_diropargs
;
205 xdr_result
= (xdrproc_t
) xdr_nfsstat
;
206 local
= (nfssvcproc_t
) nfsproc_rmdir_2_svc
;
209 case NFSPROC_READDIR
:
210 xdr_argument
= (xdrproc_t
) xdr_readdirargs
;
211 xdr_result
= (xdrproc_t
) xdr_readdirres
;
212 local
= (nfssvcproc_t
) nfsproc_readdir_2_svc
;
216 xdr_argument
= (xdrproc_t
) xdr_nfs_fh
;
217 xdr_result
= (xdrproc_t
) xdr_statfsres
;
218 local
= (nfssvcproc_t
) nfsproc_statfs_2_svc
;
222 svcerr_noproc(transp
);
226 memset((char *) &argument
, 0, sizeof(argument
));
227 if (!svc_getargs(transp
,
228 (XDRPROC_T_TYPE
) xdr_argument
,
229 (SVC_IN_ARG_TYPE
) &argument
)) {
231 "NFS xdr decode failed for %d %d %d",
232 (int) rqstp
->rq_prog
, (int) rqstp
->rq_vers
, (int) rqstp
->rq_proc
);
233 svcerr_decode(transp
);
236 result
= (*local
) (&argument
, rqstp
);
238 nfs_program_2_transp
= NULL
;
240 if (result
!= NULL
&& !svc_sendreply(transp
,
241 (XDRPROC_T_TYPE
) xdr_result
,
243 svcerr_systemerr(transp
);
245 if (!svc_freeargs(transp
,
246 (XDRPROC_T_TYPE
) xdr_argument
,
247 (SVC_IN_ARG_TYPE
) & argument
)) {
248 plog(XLOG_FATAL
, "unable to free rpc arguments in nfs_program_2");