2 * This software has been released under the terms of the IBM Public
3 * License. For details, see the LICENSE file in the top-level source
4 * directory or online at http://www.openafs.org/dl/license10.html
10 #include <afsconfig.h>
11 #include "afs/param.h"
16 /* Ugly Ugly Ugly but precludes conflicting XDR macros; We want kernel xdr */
17 #define __XDR_INCLUDE__
19 #include "afs/sysincludes.h" /* Standard vendor system headers */
20 #if defined(AFS_SUN55_ENV) && !defined(AFS_NONFSTRANS)
21 #include "rpc/types.h"
23 #include "rpc/auth_unix.h"
24 #include "rpc/auth_des.h"
25 #if !defined(AFS_SUN58_ENV)
26 #include "rpc/auth_kerb.h"
28 #include "sys/tiuser.h"
32 #include "nfs/export.h"
33 #include "nfs/nfs_clnt.h"
34 #include "nfs/nfs_acl.h"
35 #include "afs/afsincludes.h"
36 #include "afs/afs_stats.h"
37 #include "afs/exporter.h"
39 static int xlatorinit_v2_done = 0;
40 static int xlatorinit_v3_done = 0;
41 extern int afs_nobody;
42 extern int afs_NFSRootOnly;
46 xdrproc_t dis_xdrargs;
47 xdrproc_t dis_fastxdrargs;
50 xdrproc_t dis_fastxdrres;
52 void (*dis_resfree) ();
54 fhandle_t(*dis_getfh) ();
57 struct afs_nfs_disp_tbl {
61 struct afs_nfs2_resp {
66 #if defined(AFS_SUN510_ENV)
72 struct afs_nfs_disp_tbl afs_rfs_disp_tbl[RFS_NPROC];
73 struct afs_nfs_disp_tbl afs_acl_disp_tbl[ACL2_NPROC];
76 is_afs_fh(fhandle_t * fhp)
78 if ((fhp->fh_fsid.val[0] == AFS_VFSMAGIC)
79 && (fhp->fh_fsid.val[1] == AFS_VFSFSID))
85 nfs2_to_afs_call(int which, caddr_t * args, fhandle_t ** fhpp,
93 afs_Trace1(afs_iclSetp, CM_TRACE_NFSIN, ICL_TYPE_INT32, which);
94 *fh2pp = (fhandle_t *) 0;
99 fhp1 = (fhandle_t *) args;
103 struct nfssaargs *sargs = (struct nfssaargs *)args;
104 fhp1 = (fhandle_t *) & sargs->saa_fh;
109 struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
110 fhp1 = sargs->da_fhandle;
115 struct nfsreadargs *sargs = (struct nfsreadargs *)args;
116 fhp1 = (fhandle_t *) & sargs->ra_fhandle;
121 struct nfswriteargs *sargs = (struct nfswriteargs *)args;
122 fhp1 = (fhandle_t *) & sargs->wa_fhandle;
127 struct nfscreatargs *sargs = (struct nfscreatargs *)args;
128 fhp1 = sargs->ca_da.da_fhandle;
133 struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
134 fhp1 = sargs->da_fhandle;
139 struct nfsrnmargs *sargs = (struct nfsrnmargs *)args;
140 fhp1 = sargs->rna_from.da_fhandle;
141 fhp2 = sargs->rna_to.da_fhandle;
146 struct nfslinkargs *sargs = (struct nfslinkargs *)args;
147 fhp1 = sargs->la_from;
148 fhp2 = sargs->la_to.da_fhandle;
153 struct nfsslargs *sargs = (struct nfsslargs *)args;
154 fhp1 = sargs->sla_from.da_fhandle;
159 struct nfscreatargs *sargs = (struct nfscreatargs *)args;
160 fhp1 = sargs->ca_da.da_fhandle;
165 struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
166 fhp1 = sargs->da_fhandle;
171 struct nfsrddirargs *sargs = (struct nfsrddirargs *)args;
172 fhp1 = (fhandle_t *) & sargs->rda_fh;
179 /* Ok if arg 1 is in AFS or if 2 args and arg 2 is in AFS */
180 if (fhp1 && is_afs_fh(fhp1)) {
186 if (fhp2 && is_afs_fh(fhp2)) {
195 acl2_to_afs_call(int which, caddr_t * args, fhandle_t ** fhpp)
204 case ACLPROC2_GETACL:
206 struct GETACL2args *sargs = (struct GETACL2args *)args;
210 case ACLPROC2_SETACL:
212 struct SETACL2args *sargs = (struct SETACL2args *)args;
216 case ACLPROC2_GETATTR:
218 struct GETATTR2args *sargs = (struct GETATTR2args *)args;
222 case ACLPROC2_ACCESS:
224 struct ACCESS2args *sargs = (struct ACCESS2args *)args;
228 #if defined(AFS_SUN510_ENV)
229 case ACLPROC2_GETXATTRDIR:
231 struct GETXATTRDIR2args *sargs = (struct GETXATTRDIR2args *)args;
240 if (fhp && is_afs_fh(fhp)) {
249 afs_nfs2_dispatcher(int type, afs_int32 which, char *argp,
250 struct exportinfo **expp, struct svc_req *rp,
251 struct AFS_UCRED *crp)
255 afs_int32 client = 0;
257 fhandle_t *fh = (fhandle_t *) argp;
258 fhandle_t *fh2 = (fhandle_t *) 0;
260 if (!xlatorinit_v2_done)
263 sa = (struct sockaddr *)svc_getrpccaller(rp->rq_xprt)->buf;
264 if (sa->sa_family == AF_INET)
265 client = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
271 code = (client && nfs2_to_afs_call(which, argp, &fh, &fh2));
274 code = (client && acl2_to_afs_call(which, argp, &fh));
281 struct afs_exporter *out = 0;
284 struct SmallFid Sfid;
286 memcpy((char *)&Sfid, fh->fh_data, SIZEOF_SMALLFID);
288 afs_Trace2(afs_iclSetp, CM_TRACE_NFSIN1, ICL_TYPE_POINTER, client,
289 ICL_TYPE_FID, &Sfid);
293 if (!once && *expp) {
294 afs_nobody = (*expp)->exi_export.ex_anon;
298 afs_nfsclient_reqhandler((struct afs_exporter *)0, &crp, client,
313 afs_nfs2_smallfidder(struct nfsdiropres *dr)
315 register fhandle_t *fhp = (fhandle_t *) & dr->dr_fhandle;
319 #if defined(AFS_SUN57_64BIT_ENV)
320 /* See also afs_fid() */
321 memcpy((char *)addr, fhp->fh_data, SIZEOF_SMALLFID);
322 addr[1] = (addr[1] >> 48) & 0xffff;
324 memcpy((char *)addr, fhp->fh_data, 2 * sizeof(long));
328 vcp = VTOAFS((struct vnode *)addr[0]);
330 if (addr[1] == AFS_XLATOR_MAGIC) {
331 if (dr->dr_status == NFS_OK) {
332 struct SmallFid Sfid;
335 /* Make up and copy out a SmallFid */
336 tcell = afs_GetCell(vcp->f.fid.Cell, READ_LOCK);
337 Sfid.Volume = vcp->f.fid.Fid.Volume;
339 ((tcell->cellIndex << 24) | (vcp->f.fid.Fid.Unique & 0xffffff));
340 afs_PutCell(tcell, READ_LOCK);
341 Sfid.Vnode = (u_short) (vcp->f.fid.Fid.Vnode & 0xffff);
342 fhp->fh_len = SIZEOF_SMALLFID;
343 memcpy(dr->dr_fhandle.fh_data, (char *)&Sfid, fhp->fh_len);
345 afs_Trace3(afs_iclSetp, CM_TRACE_NFSOUT, ICL_TYPE_INT32, 0,
346 ICL_TYPE_POINTER, vcp, ICL_TYPE_FID, &Sfid);
349 /* If we have a ref, release it */
350 if (vcp->vrefCount >= 1)
351 AFS_RELE(AFSTOV(vcp));
357 afs_nfs2_noaccess(struct afs_nfs2_resp *resp)
359 resp->status = NFSERR_ACCES;
363 afs_nfs2_null(char *args, char *xp, char *exp, char *rp, char *crp)
368 afs_nfs2_root(char *args, char *xp, char *exp, char *rp, char *crp)
373 afs_nfs2_writecache(char *args, char *xp, char *exp, char *rp, char *crp)
378 afs_nfs2_getattr(char *args, char *xp, char *exp, char *rp, char *crp)
381 struct AFS_UCRED *svcred = curthread->t_cred;
382 curthread->t_cred = (struct AFS_UCRED *)crp;
383 call = afs_nfs2_dispatcher(0, RFS_GETATTR, (char *)args, &exp, rp, crp);
385 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
387 (*afs_rfs_disp_tbl[RFS_GETATTR].orig_proc) (args, xp, exp, rp, crp);
388 curthread->t_cred = svcred;
393 afs_nfs2_setattr(char *args, char *xp, char *exp, char *rp, char *crp)
396 struct AFS_UCRED *svcred = curthread->t_cred;
397 curthread->t_cred = (struct AFS_UCRED *)crp;
398 call = afs_nfs2_dispatcher(0, RFS_SETATTR, (char *)args, &exp, rp, crp);
400 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
402 (*afs_rfs_disp_tbl[RFS_SETATTR].orig_proc) (args, xp, exp, rp, crp);
403 curthread->t_cred = svcred;
408 afs_nfs2_lookup(char *args, char *xp, char *exp, char *rp, char *crp)
411 struct AFS_UCRED *svcred = curthread->t_cred;
412 curthread->t_cred = (struct AFS_UCRED *)crp;
413 call = afs_nfs2_dispatcher(0, RFS_LOOKUP, (char *)args, &exp, rp, crp);
415 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
417 (*afs_rfs_disp_tbl[RFS_LOOKUP].orig_proc) (args, xp, exp, rp, crp);
418 if (afs_NFSRootOnly && call)
419 afs_nfs2_smallfidder(xp);
421 curthread->t_cred = svcred;
426 afs_nfs2_readlink(char *args, char *xp, char *exp, char *rp, char *crp)
429 struct AFS_UCRED *svcred = curthread->t_cred;
430 curthread->t_cred = (struct AFS_UCRED *)crp;
431 call = afs_nfs2_dispatcher(0, RFS_READLINK, (char *)args, &exp, rp, crp);
433 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
435 (*afs_rfs_disp_tbl[RFS_READLINK].orig_proc) (args, xp, exp, rp, crp);
436 curthread->t_cred = svcred;
441 afs_nfs2_read(char *args, char *xp, char *exp, char *rp, char *crp)
444 struct AFS_UCRED *svcred = curthread->t_cred;
445 curthread->t_cred = (struct AFS_UCRED *)crp;
446 call = afs_nfs2_dispatcher(0, RFS_READ, (char *)args, &exp, rp, crp);
448 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
450 (*afs_rfs_disp_tbl[RFS_READ].orig_proc) (args, xp, exp, rp, crp);
451 curthread->t_cred = svcred;
456 afs_nfs2_write(char *args, char *xp, char *exp, char *rp, char *crp)
459 struct AFS_UCRED *svcred = curthread->t_cred;
460 curthread->t_cred = (struct AFS_UCRED *)crp;
461 call = afs_nfs2_dispatcher(0, RFS_WRITE, (char *)args, &exp, rp, crp);
463 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
465 (*afs_rfs_disp_tbl[RFS_WRITE].orig_proc) (args, xp, exp, rp, crp);
466 curthread->t_cred = svcred;
471 afs_nfs2_create(char *args, char *xp, char *exp, char *rp, char *crp)
474 struct AFS_UCRED *svcred = curthread->t_cred;
475 curthread->t_cred = (struct AFS_UCRED *)crp;
476 call = afs_nfs2_dispatcher(0, RFS_CREATE, (char *)args, &exp, rp, crp);
478 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
480 (*afs_rfs_disp_tbl[RFS_CREATE].orig_proc) (args, xp, exp, rp, crp);
481 if (afs_NFSRootOnly && call)
482 afs_nfs2_smallfidder(xp);
484 curthread->t_cred = svcred;
489 afs_nfs2_remove(char *args, char *xp, char *exp, char *rp, char *crp)
492 struct AFS_UCRED *svcred = curthread->t_cred;
493 curthread->t_cred = (struct AFS_UCRED *)crp;
494 call = afs_nfs2_dispatcher(0, RFS_REMOVE, (char *)args, &exp, rp, crp);
496 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
498 (*afs_rfs_disp_tbl[RFS_REMOVE].orig_proc) (args, xp, exp, rp, crp);
499 curthread->t_cred = svcred;
504 afs_nfs2_rename(char *args, char *xp, char *exp, char *rp, char *crp)
507 struct AFS_UCRED *svcred = curthread->t_cred;
508 curthread->t_cred = (struct AFS_UCRED *)crp;
509 call = afs_nfs2_dispatcher(0, RFS_RENAME, (char *)args, &exp, rp, crp);
511 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
513 (*afs_rfs_disp_tbl[RFS_RENAME].orig_proc) (args, xp, exp, rp, crp);
514 curthread->t_cred = svcred;
519 afs_nfs2_link(char *args, char *xp, char *exp, char *rp, char *crp)
522 struct AFS_UCRED *svcred = curthread->t_cred;
523 curthread->t_cred = (struct AFS_UCRED *)crp;
524 call = afs_nfs2_dispatcher(0, RFS_LINK, (char *)args, &exp, rp, crp);
526 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
528 (*afs_rfs_disp_tbl[RFS_LINK].orig_proc) (args, xp, exp, rp, crp);
529 curthread->t_cred = svcred;
534 afs_nfs2_symlink(char *args, char *xp, char *exp, char *rp, char *crp)
537 struct AFS_UCRED *svcred = curthread->t_cred;
538 curthread->t_cred = (struct AFS_UCRED *)crp;
539 call = afs_nfs2_dispatcher(0, RFS_SYMLINK, (char *)args, &exp, rp, crp);
541 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
543 (*afs_rfs_disp_tbl[RFS_SYMLINK].orig_proc) (args, xp, exp, rp, crp);
544 curthread->t_cred = svcred;
549 afs_nfs2_mkdir(char *args, char *xp, char *exp, char *rp, char *crp)
552 struct AFS_UCRED *svcred = curthread->t_cred;
553 curthread->t_cred = (struct AFS_UCRED *)crp;
554 call = afs_nfs2_dispatcher(0, RFS_MKDIR, (char *)args, &exp, rp, crp);
556 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
558 (*afs_rfs_disp_tbl[RFS_MKDIR].orig_proc) (args, xp, exp, rp, crp);
559 if (afs_NFSRootOnly && call)
560 afs_nfs2_smallfidder(xp);
562 curthread->t_cred = svcred;
567 afs_nfs2_rmdir(char *args, char *xp, char *exp, char *rp, char *crp)
570 struct AFS_UCRED *svcred = curthread->t_cred;
571 curthread->t_cred = (struct AFS_UCRED *)crp;
572 call = afs_nfs2_dispatcher(0, RFS_RMDIR, (char *)args, &exp, rp, crp);
574 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
576 (*afs_rfs_disp_tbl[RFS_RMDIR].orig_proc) (args, xp, exp, rp, crp);
577 curthread->t_cred = svcred;
582 afs_nfs2_readdir(char *args, char *xp, char *exp, char *rp, char *crp)
585 struct AFS_UCRED *svcred = curthread->t_cred;
586 curthread->t_cred = (struct AFS_UCRED *)crp;
587 call = afs_nfs2_dispatcher(0, RFS_READDIR, (char *)args, &exp, rp, crp);
589 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
591 (*afs_rfs_disp_tbl[RFS_READDIR].orig_proc) (args, xp, exp, rp, crp);
592 curthread->t_cred = svcred;
597 afs_nfs2_statfs(char *args, char *xp, char *exp, char *rp, char *crp)
600 struct AFS_UCRED *svcred = curthread->t_cred;
601 curthread->t_cred = (struct AFS_UCRED *)crp;
602 call = afs_nfs2_dispatcher(0, RFS_STATFS, (char *)args, &exp, rp, crp);
604 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
606 (*afs_rfs_disp_tbl[RFS_STATFS].orig_proc) (args, xp, exp, rp, crp);
607 curthread->t_cred = svcred;
611 struct afs_nfs_disp_tbl afs_rfs_disp_tbl[RFS_NPROC] = {
619 {afs_nfs2_writecache},
633 afs_acl2_getacl(char *args, char *xp, char *exp, char *rp, char *crp)
636 struct AFS_UCRED *svcred = curthread->t_cred;
637 curthread->t_cred = (struct AFS_UCRED *)crp;
639 afs_nfs2_dispatcher(1, ACLPROC2_GETACL, (char *)args, &exp, rp, crp);
641 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
643 (*afs_acl_disp_tbl[ACLPROC2_GETACL].orig_proc) (args, xp, exp, rp,
645 curthread->t_cred = svcred;
650 afs_acl2_setacl(char *args, char *xp, char *exp, char *rp, char *crp)
653 struct AFS_UCRED *svcred = curthread->t_cred;
654 curthread->t_cred = (struct AFS_UCRED *)crp;
656 afs_nfs2_dispatcher(1, ACLPROC2_SETACL, (char *)args, &exp, rp, crp);
658 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
660 (*afs_acl_disp_tbl[ACLPROC2_SETACL].orig_proc) (args, xp, exp, rp,
662 curthread->t_cred = svcred;
667 afs_acl2_getattr(char *args, char *xp, char *exp, char *rp, char *crp)
670 struct AFS_UCRED *svcred = curthread->t_cred;
671 curthread->t_cred = (struct AFS_UCRED *)crp;
673 afs_nfs2_dispatcher(1, ACLPROC2_GETATTR, (char *)args, &exp, rp, crp);
675 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
677 (*afs_acl_disp_tbl[ACLPROC2_GETATTR].orig_proc) (args, xp, exp, rp,
679 curthread->t_cred = svcred;
684 afs_acl2_access(char *args, char *xp, char *exp, char *rp, char *crp)
687 struct AFS_UCRED *svcred = curthread->t_cred;
688 curthread->t_cred = (struct AFS_UCRED *)crp;
690 afs_nfs2_dispatcher(1, ACLPROC2_ACCESS, (char *)args, &exp, rp, crp);
692 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
694 (*afs_acl_disp_tbl[ACLPROC2_ACCESS].orig_proc) (args, xp, exp, rp,
696 curthread->t_cred = svcred;
700 #if defined(AFS_SUN510_ENV)
702 afs_acl2_getxattrdir(char *args, char *xp, char *exp, char *rp, char *crp)
705 struct AFS_UCRED *svcred = curthread->t_cred;
706 curthread->t_cred = (struct AFS_UCRED *)crp;
708 afs_nfs2_dispatcher(1, ACLPROC2_GETXATTRDIR, (char *)args, &exp, rp, crp);
710 afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
712 (*afs_acl_disp_tbl[ACLPROC2_GETXATTRDIR].orig_proc) (args, xp, exp, rp,
714 curthread->t_cred = svcred;
719 struct afs_nfs_disp_tbl afs_acl_disp_tbl[ACL2_NPROC] = {
725 #if defined(AFS_SUN510_ENV)
726 {afs_acl2_getxattrdir}
730 /* Munge the dispatch tables to link us in first */
732 afs_xlatorinit_v2(struct rfs_disp_tbl *_rfs_tbl,
733 struct rfs_disp_tbl *_acl_tbl)
737 if (xlatorinit_v2_done++)
740 for (i = 0; i < RFS_NPROC; i++) {
741 afs_rfs_disp_tbl[i].orig_proc = _rfs_tbl[i].dis_proc;
742 _rfs_tbl[i].dis_proc = afs_rfs_disp_tbl[i].afs_proc;
745 for (i = 0; i < 5; i++) {
746 afs_acl_disp_tbl[i].orig_proc = _acl_tbl[i].dis_proc;
747 _acl_tbl[i].dis_proc = afs_acl_disp_tbl[i].afs_proc;
752 #define RFS3_NPROC 22
756 #if defined(AFS_SUN510_ENV)
763 struct afs_nfs_disp_tbl afs_rfs3_disp_tbl[RFS3_NPROC];
764 struct afs_nfs_disp_tbl afs_acl3_disp_tbl[ACL3_NPROC];
766 struct afs_nfs3_resp {
770 typedef struct afs_nfs3_resp afs_nfs3_resp;
773 is_afs_fh3(nfs_fh3 * fhp)
775 if ((fhp->fh3_fsid.val[0] == AFS_VFSMAGIC)
776 && (fhp->fh3_fsid.val[1] == AFS_VFSFSID))
782 afs_nfs3_noaccess(struct afs_nfs3_resp *resp)
784 resp->status = NFS3ERR_ACCES;
789 afs_nfs3_notsupp(struct afs_nfs3_resp *resp)
791 resp->status = NFS3ERR_NOTSUPP;
796 nfs3_to_afs_call(int which, caddr_t * args, nfs_fh3 ** fhpp, nfs_fh3 ** fh2pp)
803 afs_Trace1(afs_iclSetp, CM_TRACE_NFS3IN, ICL_TYPE_INT32, which);
804 *fh2pp = (nfs_fh3 *) 0;
806 case NFSPROC3_GETATTR:
808 GETATTR3args *arg = (GETATTR3args *) args;
809 fhp1 = (nfs_fh3 *) & arg->object;
812 case NFSPROC3_SETATTR:
814 SETATTR3args *arg = (SETATTR3args *) args;
815 fhp1 = (nfs_fh3 *) & arg->object;
818 case NFSPROC3_LOOKUP:
820 LOOKUP3args *arg = (LOOKUP3args *) args;
822 fhp1 = (nfs_fh3 *) arg->what.dirp;
824 fhp1 = (nfs_fh3 *) & arg->what.dir;
828 case NFSPROC3_ACCESS:
830 ACCESS3args *arg = (ACCESS3args *) args;
831 fhp1 = (nfs_fh3 *) & arg->object;
834 case NFSPROC3_READLINK:
836 READLINK3args *arg = (READLINK3args *) args;
837 fhp1 = (nfs_fh3 *) & arg->symlink;
842 READ3args *arg = (READ3args *) args;
843 fhp1 = (nfs_fh3 *) & arg->file;
848 WRITE3args *arg = (WRITE3args *) args;
849 fhp1 = (nfs_fh3 *) & arg->file;
852 case NFSPROC3_CREATE:
854 CREATE3args *arg = (CREATE3args *) args;
856 fhp1 = (nfs_fh3 *) arg->where.dirp;
858 fhp1 = (nfs_fh3 *) & arg->where.dir;
864 MKDIR3args *arg = (MKDIR3args *) args;
866 fhp1 = (nfs_fh3 *) arg->where.dirp;
868 fhp1 = (nfs_fh3 *) & arg->where.dir;
872 case NFSPROC3_SYMLINK:
874 SYMLINK3args *arg = (SYMLINK3args *) args;
876 fhp1 = (nfs_fh3 *) arg->where.dirp;
878 fhp1 = (nfs_fh3 *) & arg->where.dir;
884 MKNOD3args *arg = (MKNOD3args *) args;
886 fhp1 = (nfs_fh3 *) arg->where.dirp;
888 fhp1 = (nfs_fh3 *) & arg->where.dir;
892 case NFSPROC3_REMOVE:
894 REMOVE3args *arg = (REMOVE3args *) args;
896 fhp1 = (nfs_fh3 *) arg->object.dirp;
898 fhp1 = (nfs_fh3 *) & arg->object.dir;
904 RMDIR3args *arg = (RMDIR3args *) args;
906 fhp1 = (nfs_fh3 *) arg->object.dirp;
908 fhp1 = (nfs_fh3 *) & arg->object.dir;
912 case NFSPROC3_RENAME:
914 RENAME3args *arg = (RENAME3args *) args;
916 fhp1 = (nfs_fh3 *) arg->from.dirp;
917 fhp2 = (nfs_fh3 *) arg->to.dirp;
919 fhp1 = (nfs_fh3 *) & arg->from.dir;
920 fhp2 = (nfs_fh3 *) & arg->to.dir;
926 LINK3args *arg = (LINK3args *) args;
927 fhp1 = (nfs_fh3 *) & arg->file;
929 fhp2 = (nfs_fh3 *) arg->link.dirp;
931 fhp2 = (nfs_fh3 *) & arg->link.dir;
935 case NFSPROC3_READDIR:
937 READDIR3args *arg = (READDIR3args *) args;
938 fhp1 = (nfs_fh3 *) & arg->dir;
941 case NFSPROC3_READDIRPLUS:
943 READDIRPLUS3args *arg = (READDIRPLUS3args *) args;
944 fhp1 = (nfs_fh3 *) & arg->dir;
947 case NFSPROC3_FSSTAT:
949 FSSTAT3args *arg = (FSSTAT3args *) args;
950 fhp1 = (nfs_fh3 *) & arg->fsroot;
953 case NFSPROC3_FSINFO:
955 FSINFO3args *arg = (FSINFO3args *) args;
956 fhp1 = (nfs_fh3 *) & arg->fsroot;
959 case NFSPROC3_PATHCONF:
961 PATHCONF3args *arg = (PATHCONF3args *) args;
962 fhp1 = (nfs_fh3 *) & arg->object;
965 case NFSPROC3_COMMIT:
967 COMMIT3args *arg = (COMMIT3args *) args;
968 fhp1 = (nfs_fh3 *) & arg->file;
975 if (fhp1 && is_afs_fh3(fhp1)) {
981 if (fhp2 && is_afs_fh3(fhp2)) {
990 acl3_to_afs_call(int which, caddr_t * args, nfs_fh3 ** fhpp)
995 case ACLPROC3_GETACL:
997 struct GETACL3args *sargs = (struct GETACL3args *)args;
1001 case ACLPROC3_SETACL:
1003 struct SETACL3args *sargs = (struct SETACL3args *)args;
1007 #if defined(AFS_SUN510_ENV)
1008 case ACLPROC3_GETXATTRDIR:
1010 struct GETXATTRDIR3args *sargs = (struct GETXATTRDIR3args *)args;
1019 if (fhp && is_afs_fh3(fhp)) {
1028 afs_nfs3_dispatcher(int type, afs_int32 which, char *argp,
1029 struct exportinfo **expp, struct svc_req *rp,
1030 struct AFS_UCRED *crp)
1034 afs_int32 client = 0;
1035 struct sockaddr *sa;
1036 nfs_fh3 *fh = (nfs_fh3 *) argp;
1037 nfs_fh3 *fh2 = (nfs_fh3 *) 0;
1039 if (!xlatorinit_v3_done)
1042 sa = (struct sockaddr *)svc_getrpccaller(rp->rq_xprt)->buf;
1046 if (sa->sa_family == AF_INET)
1047 client = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
1053 code = (client && nfs3_to_afs_call(which, argp, &fh, &fh2));
1056 code = (client && acl3_to_afs_call(which, argp, &fh));
1063 struct afs_exporter *out = 0;
1065 static int once = 0;
1066 struct SmallFid Sfid;
1068 memcpy((char *)&Sfid, fh->fh3_data, SIZEOF_SMALLFID);
1070 afs_Trace2(afs_iclSetp, CM_TRACE_NFS3IN1, ICL_TYPE_INT32, client,
1071 ICL_TYPE_FID, &Sfid);
1074 if (!once && *expp) {
1075 afs_nobody = (*expp)->exi_export.ex_anon;
1079 afs_nfsclient_reqhandler((struct afs_exporter *)0, &crp, client,
1095 afs_nfs3_smallfidder(struct nfs_fh3 *fhp, int status)
1100 #if defined(AFS_SUN57_64BIT_ENV)
1101 /* See also afs_fid() */
1102 memcpy((char *)addr, fhp->fh3_data, 10);
1103 addr[1] = (addr[1] >> 48) & 0xffff;
1105 memcpy((char *)addr, fhp->fh3_data, 2 * sizeof(long));
1109 vcp = VTOAFS((struct vnode *)addr[0]);
1111 /* See also afs_osi_vget */
1112 if (addr[1] == AFS_XLATOR_MAGIC) {
1113 if (status == NFS_OK) {
1114 struct SmallFid Sfid;
1117 /* Make up and copy out a SmallFid */
1118 tcell = afs_GetCell(vcp->f.fid.Cell, READ_LOCK);
1119 Sfid.Volume = vcp->f.fid.Fid.Volume;
1120 Sfid.CellAndUnique =
1121 ((tcell->cellIndex << 24) | (vcp->f.fid.Fid.Unique & 0xffffff));
1122 afs_PutCell(tcell, READ_LOCK);
1123 Sfid.Vnode = (u_short) (vcp->f.fid.Fid.Vnode & 0xffff);
1124 fhp->fh3_len = SIZEOF_SMALLFID;
1125 memcpy(fhp->fh3_data, (char *)&Sfid, fhp->fh3_len);
1127 afs_Trace3(afs_iclSetp, CM_TRACE_NFS3OUT, ICL_TYPE_INT32, status,
1128 ICL_TYPE_POINTER, vcp, ICL_TYPE_FID, &Sfid);
1131 /* If we have a ref, release it */
1132 if (vcp->vrefCount >= 1)
1133 AFS_RELE(AFSTOV(vcp));
1139 afs_nfs3_getattr(char *args, char *xp, char *exp, char *rp, char *crp)
1142 afs_nfs3_resp dummy;
1143 struct AFS_UCRED *svcred = curthread->t_cred;
1144 curthread->t_cred = (struct AFS_UCRED *)crp;
1146 afs_nfs3_dispatcher(0, NFSPROC3_GETATTR, (char *)args, &exp, rp, crp);
1148 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1150 (*afs_rfs3_disp_tbl[NFSPROC3_GETATTR].orig_proc) (args, xp, exp, rp,
1152 curthread->t_cred = svcred;
1157 afs_nfs3_setattr(char *args, char *xp, char *exp, char *rp, char *crp)
1160 afs_nfs3_resp dummy;
1161 struct AFS_UCRED *svcred = curthread->t_cred;
1162 curthread->t_cred = (struct AFS_UCRED *)crp;
1164 afs_nfs3_dispatcher(0, NFSPROC3_SETATTR, (char *)args, &exp, rp, crp);
1166 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1168 (*afs_rfs3_disp_tbl[NFSPROC3_SETATTR].orig_proc) (args, xp, exp, rp,
1170 curthread->t_cred = svcred;
1175 afs_nfs3_lookup(char *args, char *xp, char *exp, char *rp, char *crp)
1178 afs_nfs3_resp dummy;
1179 struct AFS_UCRED *svcred = curthread->t_cred;
1180 curthread->t_cred = (struct AFS_UCRED *)crp;
1182 afs_nfs3_dispatcher(0, NFSPROC3_LOOKUP, (char *)args, &exp, rp, crp);
1184 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1186 (*afs_rfs3_disp_tbl[NFSPROC3_LOOKUP].orig_proc) (args, xp, exp, rp,
1188 if (afs_NFSRootOnly && call) {
1189 LOOKUP3res *resp = (LOOKUP3res *) xp;
1190 afs_nfs3_smallfidder(&resp->resok.object, resp->status);
1193 curthread->t_cred = svcred;
1198 afs_nfs3_access(char *args, char *xp, char *exp, char *rp, char *crp)
1201 afs_nfs3_resp dummy;
1202 struct AFS_UCRED *svcred = curthread->t_cred;
1203 curthread->t_cred = (struct AFS_UCRED *)crp;
1205 afs_nfs3_dispatcher(0, NFSPROC3_ACCESS, (char *)args, &exp, rp, crp);
1207 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1209 (*afs_rfs3_disp_tbl[NFSPROC3_ACCESS].orig_proc) (args, xp, exp, rp,
1211 curthread->t_cred = svcred;
1216 afs_nfs3_readlink(char *args, char *xp, char *exp, char *rp, char *crp)
1219 afs_nfs3_resp dummy;
1220 struct AFS_UCRED *svcred = curthread->t_cred;
1221 curthread->t_cred = (struct AFS_UCRED *)crp;
1223 afs_nfs3_dispatcher(0, NFSPROC3_READLINK, (char *)args, &exp, rp,
1226 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1228 (*afs_rfs3_disp_tbl[NFSPROC3_READLINK].orig_proc) (args, xp, exp, rp,
1230 curthread->t_cred = svcred;
1235 afs_nfs3_read(char *args, char *xp, char *exp, char *rp, char *crp)
1238 afs_nfs3_resp dummy;
1239 struct AFS_UCRED *svcred = curthread->t_cred;
1240 curthread->t_cred = (struct AFS_UCRED *)crp;
1241 call = afs_nfs3_dispatcher(0, NFSPROC3_READ, (char *)args, &exp, rp, crp);
1243 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1245 (*afs_rfs3_disp_tbl[NFSPROC3_READ].orig_proc) (args, xp, exp, rp,
1247 curthread->t_cred = svcred;
1252 afs_nfs3_write(char *args, char *xp, char *exp, char *rp, char *crp)
1255 afs_nfs3_resp dummy;
1256 struct AFS_UCRED *svcred = curthread->t_cred;
1257 curthread->t_cred = (struct AFS_UCRED *)crp;
1259 afs_nfs3_dispatcher(0, NFSPROC3_WRITE, (char *)args, &exp, rp, crp);
1261 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1263 (*afs_rfs3_disp_tbl[NFSPROC3_WRITE].orig_proc) (args, xp, exp, rp,
1265 curthread->t_cred = svcred;
1270 afs_nfs3_create(char *args, char *xp, char *exp, char *rp, char *crp)
1273 afs_nfs3_resp dummy;
1274 struct AFS_UCRED *svcred = curthread->t_cred;
1275 curthread->t_cred = (struct AFS_UCRED *)crp;
1277 afs_nfs3_dispatcher(0, NFSPROC3_CREATE, (char *)args, &exp, rp, crp);
1279 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1281 (*afs_rfs3_disp_tbl[NFSPROC3_CREATE].orig_proc) (args, xp, exp, rp,
1283 if (afs_NFSRootOnly && call) {
1284 CREATE3res *resp = (CREATE3res *) xp;
1285 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1288 curthread->t_cred = svcred;
1293 afs_nfs3_mkdir(char *args, char *xp, char *exp, char *rp, char *crp)
1296 afs_nfs3_resp dummy;
1297 struct AFS_UCRED *svcred = curthread->t_cred;
1298 curthread->t_cred = (struct AFS_UCRED *)crp;
1300 afs_nfs3_dispatcher(0, NFSPROC3_MKDIR, (char *)args, &exp, rp, crp);
1302 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1304 (*afs_rfs3_disp_tbl[NFSPROC3_MKDIR].orig_proc) (args, xp, exp, rp,
1306 if (afs_NFSRootOnly && call) {
1307 MKDIR3res *resp = (MKDIR3res *) xp;
1308 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1311 curthread->t_cred = svcred;
1316 afs_nfs3_symlink(char *args, char *xp, char *exp, char *rp, char *crp)
1319 afs_nfs3_resp dummy;
1320 struct AFS_UCRED *svcred = curthread->t_cred;
1321 curthread->t_cred = (struct AFS_UCRED *)crp;
1323 afs_nfs3_dispatcher(0, NFSPROC3_SYMLINK, (char *)args, &exp, rp, crp);
1325 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1327 (*afs_rfs3_disp_tbl[NFSPROC3_SYMLINK].orig_proc) (args, xp, exp, rp,
1329 if (afs_NFSRootOnly && call) {
1330 SYMLINK3res *resp = (SYMLINK3res *) xp;
1331 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1334 curthread->t_cred = svcred;
1339 afs_nfs3_mknod(char *args, char *xp, char *exp, char *rp, char *crp)
1342 afs_nfs3_resp dummy;
1343 struct AFS_UCRED *svcred = curthread->t_cred;
1344 curthread->t_cred = (struct AFS_UCRED *)crp;
1346 afs_nfs3_dispatcher(0, NFSPROC3_MKNOD, (char *)args, &exp, rp, crp);
1348 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1350 (*afs_rfs3_disp_tbl[NFSPROC3_MKNOD].orig_proc) (args, xp, exp, rp,
1352 if (afs_NFSRootOnly && call) {
1353 MKNOD3res *resp = (MKNOD3res *) xp;
1354 afs_nfs3_smallfidder(&resp->resok.obj.handle, resp->status);
1357 curthread->t_cred = svcred;
1362 afs_nfs3_remove(char *args, char *xp, char *exp, char *rp, char *crp)
1365 afs_nfs3_resp dummy;
1366 struct AFS_UCRED *svcred = curthread->t_cred;
1367 curthread->t_cred = (struct AFS_UCRED *)crp;
1369 afs_nfs3_dispatcher(0, NFSPROC3_REMOVE, (char *)args, &exp, rp, crp);
1371 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1373 (*afs_rfs3_disp_tbl[NFSPROC3_REMOVE].orig_proc) (args, xp, exp, rp,
1375 curthread->t_cred = svcred;
1380 afs_nfs3_rmdir(char *args, char *xp, char *exp, char *rp, char *crp)
1383 afs_nfs3_resp dummy;
1384 struct AFS_UCRED *svcred = curthread->t_cred;
1385 curthread->t_cred = (struct AFS_UCRED *)crp;
1387 afs_nfs3_dispatcher(0, NFSPROC3_RMDIR, (char *)args, &exp, rp, crp);
1389 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1391 (*afs_rfs3_disp_tbl[NFSPROC3_RMDIR].orig_proc) (args, xp, exp, rp,
1393 curthread->t_cred = svcred;
1398 afs_nfs3_rename(char *args, char *xp, char *exp, char *rp, char *crp)
1401 afs_nfs3_resp dummy;
1402 struct AFS_UCRED *svcred = curthread->t_cred;
1403 curthread->t_cred = (struct AFS_UCRED *)crp;
1405 afs_nfs3_dispatcher(0, NFSPROC3_RENAME, (char *)args, &exp, rp, crp);
1407 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1409 (*afs_rfs3_disp_tbl[NFSPROC3_RENAME].orig_proc) (args, xp, exp, rp,
1411 curthread->t_cred = svcred;
1416 afs_nfs3_link(char *args, char *xp, char *exp, char *rp, char *crp)
1419 afs_nfs3_resp dummy;
1420 struct AFS_UCRED *svcred = curthread->t_cred;
1421 curthread->t_cred = (struct AFS_UCRED *)crp;
1422 call = afs_nfs3_dispatcher(0, NFSPROC3_LINK, (char *)args, &exp, rp, crp);
1424 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1426 (*afs_rfs3_disp_tbl[NFSPROC3_LINK].orig_proc) (args, xp, exp, rp,
1428 curthread->t_cred = svcred;
1433 afs_nfs3_readdir(char *args, char *xp, char *exp, char *rp, char *crp)
1436 afs_nfs3_resp dummy;
1437 struct AFS_UCRED *svcred = curthread->t_cred;
1438 curthread->t_cred = (struct AFS_UCRED *)crp;
1440 afs_nfs3_dispatcher(0, NFSPROC3_READDIR, (char *)args, &exp, rp, crp);
1442 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1444 (*afs_rfs3_disp_tbl[NFSPROC3_READDIR].orig_proc) (args, xp, exp, rp,
1446 curthread->t_cred = svcred;
1451 afs_nfs3_readdirplus(char *args, char *xp, char *exp, char *rp, char *crp)
1454 afs_nfs3_resp dummy;
1455 struct AFS_UCRED *svcred = curthread->t_cred;
1456 curthread->t_cred = (struct AFS_UCRED *)crp;
1458 afs_nfs3_dispatcher(0, NFSPROC3_READDIRPLUS, (char *)args, &exp, rp,
1461 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1463 afs_nfs3_notsupp((struct afs_nfs3_resp *)xp);
1465 (*afs_rfs3_disp_tbl[NFSPROC3_READDIRPLUS].orig_proc) (args, xp, exp,
1467 curthread->t_cred = svcred;
1472 afs_nfs3_fsstat(char *args, char *xp, char *exp, char *rp, char *crp)
1475 afs_nfs3_resp dummy;
1476 struct AFS_UCRED *svcred = curthread->t_cred;
1477 curthread->t_cred = (struct AFS_UCRED *)crp;
1479 afs_nfs3_dispatcher(0, NFSPROC3_FSSTAT, (char *)args, &exp, rp, crp);
1481 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1483 (*afs_rfs3_disp_tbl[NFSPROC3_FSSTAT].orig_proc) (args, xp, exp, rp,
1485 curthread->t_cred = svcred;
1490 afs_nfs3_fsinfo(char *args, char *xp, char *exp, char *rp, char *crp)
1493 afs_nfs3_resp dummy;
1494 struct AFS_UCRED *svcred = curthread->t_cred;
1495 curthread->t_cred = (struct AFS_UCRED *)crp;
1497 afs_nfs3_dispatcher(0, NFSPROC3_FSINFO, (char *)args, &exp, rp, crp);
1499 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1501 (*afs_rfs3_disp_tbl[NFSPROC3_FSINFO].orig_proc) (args, xp, exp, rp,
1503 curthread->t_cred = svcred;
1508 afs_nfs3_pathconf(char *args, char *xp, char *exp, char *rp, char *crp)
1511 afs_nfs3_resp dummy;
1512 struct AFS_UCRED *svcred = curthread->t_cred;
1513 curthread->t_cred = (struct AFS_UCRED *)crp;
1515 afs_nfs3_dispatcher(0, NFSPROC3_PATHCONF, (char *)args, &exp, rp,
1518 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1520 (*afs_rfs3_disp_tbl[NFSPROC3_PATHCONF].orig_proc) (args, xp, exp, rp,
1522 curthread->t_cred = svcred;
1527 afs_nfs3_commit(char *args, char *xp, char *exp, char *rp, char *crp)
1530 afs_nfs3_resp dummy;
1531 struct AFS_UCRED *svcred = curthread->t_cred;
1532 curthread->t_cred = (struct AFS_UCRED *)crp;
1534 afs_nfs3_dispatcher(0, NFSPROC3_COMMIT, (char *)args, &exp, rp, crp);
1536 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1538 (*afs_rfs3_disp_tbl[NFSPROC3_COMMIT].orig_proc) (args, xp, exp, rp,
1540 curthread->t_cred = svcred;
1544 struct afs_nfs_disp_tbl afs_rfs3_disp_tbl[22] = {
1550 {afs_nfs3_readlink},
1562 {afs_nfs3_readdirplus},
1565 {afs_nfs3_pathconf},
1570 afs_acl3_getacl(char *args, char *xp, char *exp, char *rp, char *crp)
1573 struct AFS_UCRED *svcred = curthread->t_cred;
1574 curthread->t_cred = (struct AFS_UCRED *)crp;
1576 afs_nfs3_dispatcher(1, ACLPROC3_GETACL, (char *)args, &exp, rp, crp);
1578 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1580 (*afs_acl3_disp_tbl[ACLPROC3_GETACL].orig_proc) (args, xp, exp, rp,
1582 curthread->t_cred = svcred;
1587 afs_acl3_setacl(char *args, char *xp, char *exp, char *rp, char *crp)
1590 struct AFS_UCRED *svcred = curthread->t_cred;
1591 curthread->t_cred = (struct AFS_UCRED *)crp;
1593 afs_nfs3_dispatcher(1, ACLPROC3_SETACL, (char *)args, &exp, rp, crp);
1595 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1597 (*afs_acl3_disp_tbl[ACLPROC3_SETACL].orig_proc) (args, xp, exp, rp,
1599 curthread->t_cred = svcred;
1603 #if defined(AFS_SUN510_ENV)
1605 afs_acl3_getxattrdir(char *args, char *xp, char *exp, char *rp, char *crp)
1608 struct AFS_UCRED *svcred = curthread->t_cred;
1609 curthread->t_cred = (struct AFS_UCRED *)crp;
1611 afs_nfs3_dispatcher(1, ACLPROC3_GETXATTRDIR, (char *)args, &exp, rp, crp);
1613 afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1615 (*afs_acl3_disp_tbl[ACLPROC3_GETXATTRDIR].orig_proc) (args, xp, exp, rp,
1617 curthread->t_cred = svcred;
1622 struct afs_nfs_disp_tbl afs_acl3_disp_tbl[ACL3_NPROC] = {
1626 #if defined(AFS_SUN510_ENV)
1627 {afs_acl3_getxattrdir},
1631 /* Munge the dispatch tables to link us in first */
1633 afs_xlatorinit_v3(struct rfs_disp_tbl *_rfs_tbl,
1634 struct rfs_disp_tbl *_acl_tbl)
1638 if (xlatorinit_v3_done++)
1641 for (i = 0; i < 22; i++) {
1642 afs_rfs3_disp_tbl[i].orig_proc = _rfs_tbl[i].dis_proc;
1643 _rfs_tbl[i].dis_proc = afs_rfs3_disp_tbl[i].afs_proc;
1646 for (i = 0; i < 3; i++) {
1647 afs_acl3_disp_tbl[i].orig_proc = _acl_tbl[i].dis_proc;
1648 _acl_tbl[i].dis_proc = afs_acl3_disp_tbl[i].afs_proc;
1651 #endif /* !defined(AFS_NONFSTRANS) */