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"
15 /* Ugly Ugly Ugly but precludes conflicting XDR macros; We want kernel xdr */
16 #define __XDR_INCLUDE__
18 #include "afs/sysincludes.h" /* Standard vendor system headers */
19 #if defined(AFS_SUN55_ENV) && !defined(AFS_NONFSTRANS)
20 #include "rpc/types.h"
22 #include "rpc/auth_unix.h"
23 #include "rpc/auth_des.h"
24 #if !defined(AFS_SUN58_ENV)
25 #include "rpc/auth_kerb.h"
27 #include "sys/tiuser.h"
31 #include "nfs/export.h"
32 #include "nfs/nfs_clnt.h"
33 #include "nfs/nfs_acl.h"
34 #include "afs/afsincludes.h"
35 #include "afs/afs_stats.h"
36 #include "afs/exporter.h"
38 static int xlatorinit_v2_done=0;
39 static int xlatorinit_v3_done=0;
40 extern int afs_nobody;
41 extern int afs_NFSRootOnly;
45 xdrproc_t dis_xdrargs;
46 xdrproc_t dis_fastxdrargs;
49 xdrproc_t dis_fastxdrres;
51 void (*dis_resfree)();
53 fhandle_t (*dis_getfh)();
56 struct afs_nfs_disp_tbl {
60 struct afs_nfs2_resp {
67 struct afs_nfs_disp_tbl afs_rfs_disp_tbl[RFS_NPROC];
68 struct afs_nfs_disp_tbl afs_acl_disp_tbl[ACL2_NPROC];
71 is_afs_fh(fhandle_t *fhp) {
72 if ((fhp->fh_fsid.val[0] == AFS_VFSMAGIC) &&
73 (fhp->fh_fsid.val[1] == AFS_VFSFSID))
79 nfs2_to_afs_call(int which, caddr_t *args, fhandle_t **fhpp, fhandle_t **fh2pp)
86 afs_Trace1(afs_iclSetp, CM_TRACE_NFSIN, ICL_TYPE_INT32, which);
87 *fh2pp = (fhandle_t *)0;
92 fhp1 = (fhandle_t *)args;
96 struct nfssaargs *sargs = (struct nfssaargs *)args;
97 fhp1 = (fhandle_t *)&sargs->saa_fh;
102 struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
103 fhp1 = sargs->da_fhandle;
108 struct nfsreadargs *sargs = (struct nfsreadargs *)args;
109 fhp1 = (fhandle_t *)&sargs->ra_fhandle;
114 struct nfswriteargs *sargs = (struct nfswriteargs *)args;
115 fhp1 = (fhandle_t *)&sargs->wa_fhandle;
120 struct nfscreatargs *sargs = (struct nfscreatargs *)args;
121 fhp1 = sargs->ca_da.da_fhandle;
126 struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
127 fhp1 = sargs->da_fhandle;
132 struct nfsrnmargs *sargs = (struct nfsrnmargs *)args;
133 fhp1 = sargs->rna_from.da_fhandle;
134 fhp2 = sargs->rna_to.da_fhandle;
139 struct nfslinkargs *sargs = (struct nfslinkargs *)args;
140 fhp1 = sargs->la_from;
141 fhp2 = sargs->la_to.da_fhandle;
146 struct nfsslargs *sargs = (struct nfsslargs *)args;
147 fhp1 = sargs->sla_from.da_fhandle;
152 struct nfscreatargs *sargs = (struct nfscreatargs *)args;
153 fhp1 = sargs->ca_da.da_fhandle;
158 struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
159 fhp1 = sargs->da_fhandle;
164 struct nfsrddirargs *sargs = (struct nfsrddirargs *)args;
165 fhp1 = (fhandle_t *)&sargs->rda_fh;
172 /* Ok if arg 1 is in AFS or if 2 args and arg 2 is in AFS */
173 if (is_afs_fh(fhp1)) {
179 if (fhp2 && is_afs_fh(fhp2)) {
188 acl2_to_afs_call(int which, caddr_t *args, fhandle_t **fhpp)
197 case ACLPROC2_GETACL:
199 struct GETACL2args *sargs = (struct GETACL2args *) args;
203 case ACLPROC2_SETACL:
205 struct SETACL2args *sargs = (struct SETACL2args *) args;
209 case ACLPROC2_GETATTR:
211 struct GETATTR2args *sargs = (struct GETATTR2args *) args;
215 case ACLPROC2_ACCESS:
217 struct ACCESS2args *sargs = (struct ACCESS2args *) args;
225 if (is_afs_fh(fhp)) {
234 afs_nfs2_dispatcher(int type, afs_int32 which, char *argp,
235 struct exportinfo **expp,
236 struct svc_req *rp, struct AFS_UCRED *crp)
240 afs_int32 client = 0;
242 fhandle_t *fh = (fhandle_t *)argp;
243 fhandle_t *fh2 = (fhandle_t *)0;
245 if (!xlatorinit_v2_done)
248 sa = (struct sockaddr *)svc_getrpccaller(rp->rq_xprt)->buf;
249 if (sa->sa_family == AF_INET)
250 client = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
256 code = (client && nfs2_to_afs_call(which, argp, &fh, &fh2));
259 code = (client && acl2_to_afs_call(which, argp, &fh));
266 struct afs_exporter *out = 0;
269 struct SmallFid Sfid;
271 memcpy((char *)&Sfid, fh->fh_data, SIZEOF_SMALLFID);
273 afs_Trace2(afs_iclSetp, CM_TRACE_NFSIN1,
274 ICL_TYPE_POINTER, client,
275 ICL_TYPE_FID, &Sfid);
279 if (!once && *expp) {
280 afs_nobody = (*expp)->exi_export.ex_anon;
283 code = afs_nfsclient_reqhandler((struct afs_exporter *)0, &crp,
284 client, &dummy, &out);
298 afs_nfs2_smallfidder(struct nfsdiropres *dr)
300 register fhandle_t *fhp = (fhandle_t *)&dr->dr_fhandle;
304 #if defined(AFS_SUN57_64BIT_ENV)
305 /* See also afs_fid() */
306 memcpy((char *)addr, fhp->fh_data, SIZEOF_SMALLFID);
307 addr[1] = (addr[1] >> 48) & 0xffff;
309 memcpy((char *)addr, fhp->fh_data, 2 * sizeof(long));
313 vcp = VTOAFS((struct vnode*)addr[0]);
315 if (addr[1] == AFS_XLATOR_MAGIC)
317 if (dr->dr_status == NFS_OK) {
318 struct SmallFid Sfid;
321 /* Make up and copy out a SmallFid */
322 tcell = afs_GetCell(vcp->fid.Cell, READ_LOCK);
323 Sfid.Volume = vcp->fid.Fid.Volume;
324 Sfid.CellAndUnique = ((tcell->cellIndex << 24) |
325 (vcp->fid.Fid.Unique & 0xffffff));
326 afs_PutCell(tcell, READ_LOCK);
327 Sfid.Vnode = (u_short)(vcp->fid.Fid.Vnode & 0xffff);
328 fhp->fh_len = SIZEOF_SMALLFID;
329 memcpy(dr->dr_fhandle.fh_data, (char*)&Sfid, fhp->fh_len);
331 afs_Trace3(afs_iclSetp, CM_TRACE_NFSOUT, ICL_TYPE_INT32, 0,
332 ICL_TYPE_POINTER, vcp, ICL_TYPE_FID, &Sfid);
335 /* If we have a ref, release it */
336 if (vcp->vrefCount >= 1)
337 AFS_RELE(AFSTOV(vcp));
343 afs_nfs2_noaccess(struct afs_nfs2_resp *resp)
345 resp->status = NFSERR_ACCES;
348 void afs_nfs2_null(char *args, char *xp, char *exp, char *rp, char *crp)
353 afs_nfs2_root(char *args, char *xp, char *exp, char *rp, char *crp)
358 afs_nfs2_writecache(char *args, char *xp, char *exp, char *rp, char *crp)
362 void afs_nfs2_getattr(char *args, char *xp, char *exp, char *rp, char *crp) {
364 struct cred *svcred = curthread->t_cred;
365 curthread->t_cred = (struct cred*)crp;
366 call=afs_nfs2_dispatcher(0, RFS_GETATTR, (char *)args, &exp, rp, crp);
367 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
368 else (*afs_rfs_disp_tbl[RFS_GETATTR].orig_proc)(args, xp, exp, rp, crp);
369 curthread->t_cred = svcred;
373 void afs_nfs2_setattr(char *args, char *xp, char *exp, char *rp, char *crp) {
375 struct cred *svcred = curthread->t_cred;
376 curthread->t_cred = (struct cred*)crp;
377 call=afs_nfs2_dispatcher(0, RFS_SETATTR, (char *)args, &exp, rp, crp);
378 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
379 else (*afs_rfs_disp_tbl[RFS_SETATTR].orig_proc)(args, xp, exp, rp, crp);
380 curthread->t_cred = svcred;
384 void afs_nfs2_lookup(char *args, char *xp, char *exp, char *rp, char *crp) {
386 struct cred *svcred = curthread->t_cred;
387 curthread->t_cred = (struct cred*)crp;
388 call=afs_nfs2_dispatcher(0, RFS_LOOKUP, (char *)args, &exp, rp, crp);
389 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
390 else { (*afs_rfs_disp_tbl[RFS_LOOKUP].orig_proc)(args, xp, exp, rp, crp);
391 if (afs_NFSRootOnly && call) afs_nfs2_smallfidder(xp); }
392 curthread->t_cred = svcred;
396 void afs_nfs2_readlink(char *args, char *xp, char *exp, char *rp, char *crp) {
398 struct cred *svcred = curthread->t_cred;
399 curthread->t_cred = (struct cred*)crp;
400 call=afs_nfs2_dispatcher(0, RFS_READLINK, (char *)args, &exp, rp, crp);
401 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
402 else (*afs_rfs_disp_tbl[RFS_READLINK].orig_proc)(args, xp, exp, rp, crp);
403 curthread->t_cred = svcred;
407 void afs_nfs2_read(char *args, char *xp, char *exp, char *rp, char *crp) {
409 struct cred *svcred = curthread->t_cred;
410 curthread->t_cred = (struct cred*)crp;
411 call=afs_nfs2_dispatcher(0, RFS_READ, (char *)args, &exp, rp, crp);
412 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
413 else (*afs_rfs_disp_tbl[RFS_READ].orig_proc)(args, xp, exp, rp, crp);
414 curthread->t_cred = svcred;
418 void afs_nfs2_write(char *args, char *xp, char *exp, char *rp, char *crp) {
420 struct cred *svcred = curthread->t_cred;
421 curthread->t_cred = (struct cred*)crp;
422 call=afs_nfs2_dispatcher(0, RFS_WRITE, (char *)args, &exp, rp, crp);
423 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
424 else (*afs_rfs_disp_tbl[RFS_WRITE].orig_proc)(args, xp, exp, rp, crp);
425 curthread->t_cred = svcred;
429 void afs_nfs2_create(char *args, char *xp, char *exp, char *rp, char *crp) {
431 struct cred *svcred = curthread->t_cred;
432 curthread->t_cred = (struct cred*)crp;
433 call=afs_nfs2_dispatcher(0, RFS_CREATE, (char *)args, &exp, rp, crp);
434 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
435 else { (*afs_rfs_disp_tbl[RFS_CREATE].orig_proc)(args, xp, exp, rp, crp);
436 if (afs_NFSRootOnly && call) afs_nfs2_smallfidder(xp); }
437 curthread->t_cred = svcred;
441 void afs_nfs2_remove(char *args, char *xp, char *exp, char *rp, char *crp) {
443 struct cred *svcred = curthread->t_cred;
444 curthread->t_cred = (struct cred*)crp;
445 call=afs_nfs2_dispatcher(0, RFS_REMOVE, (char *)args, &exp, rp, crp);
446 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
447 else (*afs_rfs_disp_tbl[RFS_REMOVE].orig_proc)(args, xp, exp, rp, crp);
448 curthread->t_cred = svcred;
452 void afs_nfs2_rename(char *args, char *xp, char *exp, char *rp, char *crp) {
454 struct cred *svcred = curthread->t_cred;
455 curthread->t_cred = (struct cred*)crp;
456 call=afs_nfs2_dispatcher(0, RFS_RENAME, (char *)args, &exp, rp, crp);
457 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
458 else (*afs_rfs_disp_tbl[RFS_RENAME].orig_proc)(args, xp, exp, rp, crp);
459 curthread->t_cred = svcred;
463 void afs_nfs2_link(char *args, char *xp, char *exp, char *rp, char *crp) {
465 struct cred *svcred = curthread->t_cred;
466 curthread->t_cred = (struct cred*)crp;
467 call=afs_nfs2_dispatcher(0, RFS_LINK, (char *)args, &exp, rp, crp);
468 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
469 else (*afs_rfs_disp_tbl[RFS_LINK].orig_proc)(args, xp, exp, rp, crp);
470 curthread->t_cred = svcred;
474 void afs_nfs2_symlink(char *args, char *xp, char *exp, char *rp, char *crp) {
476 struct cred *svcred = curthread->t_cred;
477 curthread->t_cred = (struct cred*)crp;
478 call=afs_nfs2_dispatcher(0, RFS_SYMLINK, (char *)args, &exp, rp, crp);
479 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
480 else (*afs_rfs_disp_tbl[RFS_SYMLINK].orig_proc)(args, xp, exp, rp, crp);
481 curthread->t_cred = svcred;
485 void afs_nfs2_mkdir(char *args, char *xp, char *exp, char *rp, char *crp) {
487 struct cred *svcred = curthread->t_cred;
488 curthread->t_cred = (struct cred*)crp;
489 call=afs_nfs2_dispatcher(0, RFS_MKDIR, (char *)args, &exp, rp, crp);
490 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
491 else { (*afs_rfs_disp_tbl[RFS_MKDIR].orig_proc)(args, xp, exp, rp, crp);
492 if (afs_NFSRootOnly && call) afs_nfs2_smallfidder(xp); }
493 curthread->t_cred = svcred;
497 void afs_nfs2_rmdir(char *args, char *xp, char *exp, char *rp, char *crp) {
499 struct cred *svcred = curthread->t_cred;
500 curthread->t_cred = (struct cred*)crp;
501 call=afs_nfs2_dispatcher(0, RFS_RMDIR, (char *)args, &exp, rp, crp);
502 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
503 else (*afs_rfs_disp_tbl[RFS_RMDIR].orig_proc)(args, xp, exp, rp, crp);
504 curthread->t_cred = svcred;
508 void afs_nfs2_readdir(char *args, char *xp, char *exp, char *rp, char *crp) {
510 struct cred *svcred = curthread->t_cred;
511 curthread->t_cred = (struct cred*)crp;
512 call=afs_nfs2_dispatcher(0, RFS_READDIR, (char *)args, &exp, rp, crp);
513 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
514 else (*afs_rfs_disp_tbl[RFS_READDIR].orig_proc)(args, xp, exp, rp, crp);
515 curthread->t_cred = svcred;
519 void afs_nfs2_statfs(char *args, char *xp, char *exp, char *rp, char *crp) {
521 struct cred *svcred = curthread->t_cred;
522 curthread->t_cred = (struct cred*)crp;
523 call=afs_nfs2_dispatcher(0, RFS_STATFS, (char *)args, &exp, rp, crp);
524 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
525 else (*afs_rfs_disp_tbl[RFS_STATFS].orig_proc)(args, xp, exp, rp, crp);
526 curthread->t_cred = svcred;
530 struct afs_nfs_disp_tbl afs_rfs_disp_tbl[RFS_NPROC] = {
532 { afs_nfs2_getattr },
533 { afs_nfs2_setattr },
536 { afs_nfs2_readlink },
538 { afs_nfs2_writecache },
544 { afs_nfs2_symlink },
547 { afs_nfs2_readdir },
551 void afs_acl2_getacl(char *args, char *xp, char *exp, char *rp, char *crp) {
553 struct cred *svcred = curthread->t_cred;
554 curthread->t_cred = (struct cred*)crp;
555 call=afs_nfs2_dispatcher(1, ACLPROC2_GETACL, (char *)args, &exp, rp, crp);
556 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
557 else (*afs_acl_disp_tbl[ACLPROC2_GETACL].orig_proc)(args, xp, exp, rp, crp);
558 curthread->t_cred = svcred;
562 void afs_acl2_setacl(char *args, char *xp, char *exp, char *rp, char *crp) {
564 struct cred *svcred = curthread->t_cred;
565 curthread->t_cred = (struct cred*)crp;
566 call=afs_nfs2_dispatcher(1, ACLPROC2_SETACL, (char *)args, &exp, rp, crp);
567 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
568 else (*afs_acl_disp_tbl[ACLPROC2_SETACL].orig_proc)(args, xp, exp, rp, crp);
569 curthread->t_cred = svcred;
573 void afs_acl2_getattr(char *args, char *xp, char *exp, char *rp, char *crp) {
575 struct cred *svcred = curthread->t_cred;
576 curthread->t_cred = (struct cred*)crp;
577 call=afs_nfs2_dispatcher(1, ACLPROC2_GETATTR, (char *)args, &exp, rp, crp);
578 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
579 else (*afs_acl_disp_tbl[ACLPROC2_GETATTR].orig_proc)(args, xp, exp, rp, crp);
580 curthread->t_cred = svcred;
584 void afs_acl2_access(char *args, char *xp, char *exp, char *rp, char *crp) {
586 struct cred *svcred = curthread->t_cred;
587 curthread->t_cred = (struct cred*)crp;
588 call=afs_nfs2_dispatcher(1, ACLPROC2_ACCESS, (char *)args, &exp, rp, crp);
589 if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp);
590 else (*afs_acl_disp_tbl[ACLPROC2_ACCESS].orig_proc)(args, xp, exp, rp, crp);
591 curthread->t_cred = svcred;
595 struct afs_nfs_disp_tbl afs_acl_disp_tbl[5] = {
599 { afs_acl2_getattr },
603 /* Munge the dispatch tables to link us in first */
605 afs_xlatorinit_v2(struct rfs_disp_tbl *_rfs_tbl,
606 struct rfs_disp_tbl *_acl_tbl)
610 if (xlatorinit_v2_done++) return;
612 for (i=0; i < RFS_NPROC; i++) {
613 afs_rfs_disp_tbl[i].orig_proc = _rfs_tbl[i].dis_proc;
614 _rfs_tbl[i].dis_proc = afs_rfs_disp_tbl[i].afs_proc;
617 for (i=0; i < 5; i++) {
618 afs_acl_disp_tbl[i].orig_proc = _acl_tbl[i].dis_proc;
619 _acl_tbl[i].dis_proc = afs_acl_disp_tbl[i].afs_proc;
624 #define RFS3_NPROC 22
631 struct afs_nfs_disp_tbl afs_rfs3_disp_tbl[RFS3_NPROC];
632 struct afs_nfs_disp_tbl afs_acl3_disp_tbl[ACL3_NPROC];
634 struct afs_nfs3_resp {
638 typedef struct afs_nfs3_resp afs_nfs3_resp;
641 is_afs_fh3(nfs_fh3 *fhp) {
642 if ((fhp->fh3_fsid.val[0] == AFS_VFSMAGIC) &&
643 (fhp->fh3_fsid.val[1] == AFS_VFSFSID))
649 afs_nfs3_noaccess(struct afs_nfs3_resp *resp)
651 resp->status = NFS3ERR_ACCES;
656 nfs3_to_afs_call(int which, caddr_t *args, nfs_fh3 **fhpp, nfs_fh3 **fh2pp)
663 afs_Trace1(afs_iclSetp, CM_TRACE_NFS3IN, ICL_TYPE_INT32, which);
664 *fh2pp = (nfs_fh3 *)0;
666 case NFSPROC3_GETATTR:
668 GETATTR3args *arg = (GETATTR3args *)args;
669 fhp1 = (nfs_fh3 *) &arg->object;
672 case NFSPROC3_SETATTR:
674 SETATTR3args *arg = (SETATTR3args *)args;
675 fhp1 = (nfs_fh3 *) &arg->object;
678 case NFSPROC3_LOOKUP:
680 LOOKUP3args *arg = (LOOKUP3args *)args;
682 fhp1 = (nfs_fh3 *) arg->what.dirp;
684 fhp1 = (nfs_fh3 *) &arg->what.dir;
688 case NFSPROC3_ACCESS:
690 ACCESS3args *arg = (ACCESS3args *)args;
691 fhp1 = (nfs_fh3 *) &arg->object;
694 case NFSPROC3_READLINK:
696 READLINK3args *arg = (READLINK3args *)args;
697 fhp1 = (nfs_fh3 *) &arg->symlink;
702 READ3args *arg = (READ3args *)args;
703 fhp1 = (nfs_fh3 *) &arg->file;
708 WRITE3args *arg = (WRITE3args *)args;
709 fhp1 = (nfs_fh3 *) &arg->file;
712 case NFSPROC3_CREATE:
714 CREATE3args *arg = (CREATE3args *)args;
715 fhp1 = (nfs_fh3 *) &arg->where.dir;
720 MKDIR3args *arg = (MKDIR3args *)args;
721 fhp1 = (nfs_fh3 *) &arg->where.dir;
724 case NFSPROC3_SYMLINK:
726 SYMLINK3args *arg = (SYMLINK3args *)args;
727 fhp1 = (nfs_fh3 *) &arg->where.dir;
732 MKNOD3args *arg = (MKNOD3args *)args;
733 fhp1 = (nfs_fh3 *) &arg->where.dir;
736 case NFSPROC3_REMOVE:
738 REMOVE3args *arg = (REMOVE3args *)args;
739 fhp1 = (nfs_fh3 *) &arg->object.dir;
744 RMDIR3args *arg = (RMDIR3args *)args;
745 fhp1 = (nfs_fh3 *) &arg->object.dir;
748 case NFSPROC3_RENAME:
750 RENAME3args *arg = (RENAME3args *)args;
751 fhp1 = (nfs_fh3 *) &arg->from.dir;
752 fhp2 = (nfs_fh3 *) &arg->to.dir;
757 LINK3args *arg = (LINK3args *)args;
758 fhp1 = (nfs_fh3 *) &arg->file;
759 fhp2 = (nfs_fh3 *) &arg->link.dir;
762 case NFSPROC3_READDIR:
764 READDIR3args *arg = (READDIR3args *)args;
765 fhp1 = (nfs_fh3 *) &arg->dir;
768 case NFSPROC3_READDIRPLUS:
770 READDIRPLUS3args *arg = (READDIRPLUS3args *)args;
771 fhp1 = (nfs_fh3 *) &arg->dir;
774 case NFSPROC3_FSSTAT:
776 FSSTAT3args *arg = (FSSTAT3args *)args;
777 fhp1 = (nfs_fh3 *) &arg->fsroot;
780 case NFSPROC3_FSINFO:
782 FSINFO3args *arg = (FSINFO3args *)args;
783 fhp1 = (nfs_fh3 *) &arg->fsroot;
786 case NFSPROC3_PATHCONF:
788 PATHCONF3args *arg = (PATHCONF3args *)args;
789 fhp1 = (nfs_fh3 *) &arg->object;
792 case NFSPROC3_COMMIT:
794 COMMIT3args *arg = (COMMIT3args *)args;
795 fhp1 = (nfs_fh3 *) &arg->file;
802 if (is_afs_fh3(fhp1)) {
808 if (fhp2 && is_afs_fh3(fhp2)) {
817 acl3_to_afs_call(int which, caddr_t *args, nfs_fh3 **fhpp)
822 case ACLPROC3_GETACL:
824 struct GETACL3args *sargs = (struct GETACL3args *) args;
828 case ACLPROC3_SETACL:
830 struct SETACL3args *sargs = (struct SETACL3args *) args;
838 if (is_afs_fh3(fhp)) {
847 afs_nfs3_dispatcher(int type, afs_int32 which, char *argp,
848 struct exportinfo **expp,
849 struct svc_req *rp, struct AFS_UCRED *crp)
853 afs_int32 client = 0;
855 nfs_fh3 *fh = (nfs_fh3 *)argp;
856 nfs_fh3 *fh2 = (nfs_fh3 *)0;
858 if (!xlatorinit_v3_done)
861 sa = (struct sockaddr *)svc_getrpccaller(rp->rq_xprt)->buf;
862 if (sa->sa_family == AF_INET)
863 client = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
869 code = (client && nfs3_to_afs_call(which, argp, &fh, &fh2));
872 code = (client && acl3_to_afs_call(which, argp, &fh));
879 struct afs_exporter *out = 0;
882 struct SmallFid Sfid;
884 memcpy((char *)&Sfid, fh->fh3_data, SIZEOF_SMALLFID);
886 afs_Trace2(afs_iclSetp, CM_TRACE_NFS3IN1,
887 ICL_TYPE_INT32, client,
888 ICL_TYPE_FID, &Sfid);
891 if (!once && *expp) {
892 afs_nobody = (*expp)->exi_export.ex_anon;
895 code = afs_nfsclient_reqhandler((struct afs_exporter *)0, &crp,
896 client, &dummy, &out);
911 afs_nfs3_smallfidder(struct nfs_fh3 *fhp, int status)
916 #if defined(AFS_SUN57_64BIT_ENV)
917 /* See also afs_fid() */
918 memcpy((char *)addr, fhp->fh3_data, 10);
919 addr[1] = (addr[1] >> 48) & 0xffff;
921 memcpy((char *)addr, fhp->fh3_data, 2 * sizeof(long));
925 vcp = VTOAFS((struct vnode*)addr[0]);
927 /* See also afs_osi_vget */
928 if (addr[1] == AFS_XLATOR_MAGIC)
930 if (status == NFS_OK) {
931 struct SmallFid Sfid;
934 /* Make up and copy out a SmallFid */
935 tcell = afs_GetCell(vcp->fid.Cell, READ_LOCK);
936 Sfid.Volume = vcp->fid.Fid.Volume;
937 Sfid.CellAndUnique = ((tcell->cellIndex << 24) |
938 (vcp->fid.Fid.Unique & 0xffffff));
939 afs_PutCell(tcell, READ_LOCK);
940 Sfid.Vnode = (u_short)(vcp->fid.Fid.Vnode & 0xffff);
941 fhp->fh3_len = SIZEOF_SMALLFID;
942 memcpy(fhp->fh3_data, (char*)&Sfid, fhp->fh3_len);
944 afs_Trace3(afs_iclSetp, CM_TRACE_NFS3OUT, ICL_TYPE_INT32, status,
945 ICL_TYPE_POINTER, vcp, ICL_TYPE_FID, &Sfid);
948 /* If we have a ref, release it */
949 if (vcp->vrefCount >= 1)
950 AFS_RELE(AFSTOV(vcp));
955 void afs_nfs3_getattr(char *args, char *xp, char *exp, char *rp, char *crp) {
958 struct cred *svcred = curthread->t_cred;
959 curthread->t_cred = (struct cred*)crp;
960 call=afs_nfs3_dispatcher(0, NFSPROC3_GETATTR, (char *)args, &exp, rp, crp);
961 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
962 else (*afs_rfs3_disp_tbl[NFSPROC3_GETATTR].orig_proc)(args, xp, exp, rp, crp);
963 curthread->t_cred = svcred;
967 void afs_nfs3_setattr(char *args, char *xp, char *exp, char *rp, char *crp) {
970 struct cred *svcred = curthread->t_cred;
971 curthread->t_cred = (struct cred*)crp;
972 call=afs_nfs3_dispatcher(0, NFSPROC3_SETATTR, (char *)args, &exp, rp, crp);
973 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
974 else (*afs_rfs3_disp_tbl[NFSPROC3_SETATTR].orig_proc)(args, xp, exp, rp, crp);
975 curthread->t_cred = svcred;
979 void afs_nfs3_lookup(char *args, char *xp, char *exp, char *rp, char *crp) {
982 struct cred *svcred = curthread->t_cred;
983 curthread->t_cred = (struct cred*)crp;
984 call=afs_nfs3_dispatcher(0, NFSPROC3_LOOKUP, (char *)args, &exp, rp, crp);
985 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
986 else { (*afs_rfs3_disp_tbl[NFSPROC3_LOOKUP].orig_proc)(args, xp, exp, rp, crp);
987 if (afs_NFSRootOnly && call) {
988 LOOKUP3res *resp = ( LOOKUP3res *)xp;
989 afs_nfs3_smallfidder( &resp->resok.object , resp->status); } }
990 curthread->t_cred = svcred;
994 void afs_nfs3_access(char *args, char *xp, char *exp, char *rp, char *crp) {
997 struct cred *svcred = curthread->t_cred;
998 curthread->t_cred = (struct cred*)crp;
999 call=afs_nfs3_dispatcher(0, NFSPROC3_ACCESS, (char *)args, &exp, rp, crp);
1000 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1001 else (*afs_rfs3_disp_tbl[NFSPROC3_ACCESS].orig_proc)(args, xp, exp, rp, crp);
1002 curthread->t_cred = svcred;
1006 void afs_nfs3_readlink(char *args, char *xp, char *exp, char *rp, char *crp) {
1008 afs_nfs3_resp dummy;
1009 struct cred *svcred = curthread->t_cred;
1010 curthread->t_cred = (struct cred*)crp;
1011 call=afs_nfs3_dispatcher(0, NFSPROC3_READLINK, (char *)args, &exp, rp, crp);
1012 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1013 else (*afs_rfs3_disp_tbl[NFSPROC3_READLINK].orig_proc)(args, xp, exp, rp, crp);
1014 curthread->t_cred = svcred;
1018 void afs_nfs3_read(char *args, char *xp, char *exp, char *rp, char *crp) {
1020 afs_nfs3_resp dummy;
1021 struct cred *svcred = curthread->t_cred;
1022 curthread->t_cred = (struct cred*)crp;
1023 call=afs_nfs3_dispatcher(0, NFSPROC3_READ, (char *)args, &exp, rp, crp);
1024 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1025 else (*afs_rfs3_disp_tbl[NFSPROC3_READ].orig_proc)(args, xp, exp, rp, crp);
1026 curthread->t_cred = svcred;
1030 void afs_nfs3_write(char *args, char *xp, char *exp, char *rp, char *crp) {
1032 afs_nfs3_resp dummy;
1033 struct cred *svcred = curthread->t_cred;
1034 curthread->t_cred = (struct cred*)crp;
1035 call=afs_nfs3_dispatcher(0, NFSPROC3_WRITE, (char *)args, &exp, rp, crp);
1036 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1037 else (*afs_rfs3_disp_tbl[NFSPROC3_WRITE].orig_proc)(args, xp, exp, rp, crp);
1038 curthread->t_cred = svcred;
1041 void afs_nfs3_create(char *args, char *xp, char *exp, char *rp, char *crp) {
1043 afs_nfs3_resp dummy;
1044 struct cred *svcred = curthread->t_cred;
1045 curthread->t_cred = (struct cred*)crp;
1046 call=afs_nfs3_dispatcher(0, NFSPROC3_CREATE, (char *)args, &exp, rp, crp);
1047 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1048 else { (*afs_rfs3_disp_tbl[NFSPROC3_CREATE].orig_proc)(args, xp, exp, rp, crp);
1049 if (afs_NFSRootOnly && call) {
1050 CREATE3res *resp = ( CREATE3res *)xp;
1051 afs_nfs3_smallfidder( &resp->resok.obj.handle , resp->status); } }
1052 curthread->t_cred = svcred;
1056 void afs_nfs3_mkdir(char *args, char *xp, char *exp, char *rp, char *crp) {
1058 afs_nfs3_resp dummy;
1059 struct cred *svcred = curthread->t_cred;
1060 curthread->t_cred = (struct cred*)crp;
1061 call=afs_nfs3_dispatcher(0, NFSPROC3_MKDIR, (char *)args, &exp, rp, crp);
1062 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1063 else { (*afs_rfs3_disp_tbl[NFSPROC3_MKDIR].orig_proc)(args, xp, exp, rp, crp);
1064 if (afs_NFSRootOnly && call) {
1065 MKDIR3res *resp = ( MKDIR3res *)xp;
1066 afs_nfs3_smallfidder( &resp->resok.obj.handle , resp->status); } }
1067 curthread->t_cred = svcred;
1071 void afs_nfs3_symlink(char *args, char *xp, char *exp, char *rp, char *crp) {
1073 afs_nfs3_resp dummy;
1074 struct cred *svcred = curthread->t_cred;
1075 curthread->t_cred = (struct cred*)crp;
1076 call=afs_nfs3_dispatcher(0, NFSPROC3_SYMLINK, (char *)args, &exp, rp, crp);
1077 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1078 else { (*afs_rfs3_disp_tbl[NFSPROC3_SYMLINK].orig_proc)(args, xp, exp, rp, crp);
1079 if (afs_NFSRootOnly && call) {
1080 SYMLINK3res *resp = ( SYMLINK3res *)xp;
1081 afs_nfs3_smallfidder( &resp->resok.obj.handle , resp->status); } }
1082 curthread->t_cred = svcred;
1086 void afs_nfs3_mknod(char *args, char *xp, char *exp, char *rp, char *crp) {
1088 afs_nfs3_resp dummy;
1089 struct cred *svcred = curthread->t_cred;
1090 curthread->t_cred = (struct cred*)crp;
1091 call=afs_nfs3_dispatcher(0, NFSPROC3_MKNOD, (char *)args, &exp, rp, crp);
1092 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1093 else { (*afs_rfs3_disp_tbl[NFSPROC3_MKNOD].orig_proc)(args, xp, exp, rp, crp);
1094 if (afs_NFSRootOnly && call) {
1095 MKNOD3res *resp = ( MKNOD3res *)xp;
1096 afs_nfs3_smallfidder( &resp->resok.obj.handle , resp->status); } }
1097 curthread->t_cred = svcred;
1101 void afs_nfs3_remove(char *args, char *xp, char *exp, char *rp, char *crp) {
1103 afs_nfs3_resp dummy;
1104 struct cred *svcred = curthread->t_cred;
1105 curthread->t_cred = (struct cred*)crp;
1106 call=afs_nfs3_dispatcher(0, NFSPROC3_REMOVE, (char *)args, &exp, rp, crp);
1107 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1108 else (*afs_rfs3_disp_tbl[NFSPROC3_REMOVE].orig_proc)(args, xp, exp, rp, crp);
1109 curthread->t_cred = svcred;
1113 void afs_nfs3_rmdir(char *args, char *xp, char *exp, char *rp, char *crp) {
1115 afs_nfs3_resp dummy;
1116 struct cred *svcred = curthread->t_cred;
1117 curthread->t_cred = (struct cred*)crp;
1118 call=afs_nfs3_dispatcher(0, NFSPROC3_RMDIR, (char *)args, &exp, rp, crp);
1119 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1120 else (*afs_rfs3_disp_tbl[NFSPROC3_RMDIR].orig_proc)(args, xp, exp, rp, crp);
1121 curthread->t_cred = svcred;
1125 void afs_nfs3_rename(char *args, char *xp, char *exp, char *rp, char *crp) {
1127 afs_nfs3_resp dummy;
1128 struct cred *svcred = curthread->t_cred;
1129 curthread->t_cred = (struct cred*)crp;
1130 call=afs_nfs3_dispatcher(0, NFSPROC3_RENAME, (char *)args, &exp, rp, crp);
1131 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1132 else (*afs_rfs3_disp_tbl[NFSPROC3_RENAME].orig_proc)(args, xp, exp, rp, crp);
1133 curthread->t_cred = svcred;
1137 void afs_nfs3_link(char *args, char *xp, char *exp, char *rp, char *crp) {
1139 afs_nfs3_resp dummy;
1140 struct cred *svcred = curthread->t_cred;
1141 curthread->t_cred = (struct cred*)crp;
1142 call=afs_nfs3_dispatcher(0, NFSPROC3_LINK, (char *)args, &exp, rp, crp);
1143 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1144 else (*afs_rfs3_disp_tbl[NFSPROC3_LINK].orig_proc)(args, xp, exp, rp, crp);
1145 curthread->t_cred = svcred;
1149 void afs_nfs3_readdir(char *args, char *xp, char *exp, char *rp, char *crp) {
1151 afs_nfs3_resp dummy;
1152 struct cred *svcred = curthread->t_cred;
1153 curthread->t_cred = (struct cred*)crp;
1154 call=afs_nfs3_dispatcher(0, NFSPROC3_READDIR, (char *)args, &exp, rp, crp);
1155 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1156 else (*afs_rfs3_disp_tbl[NFSPROC3_READDIR].orig_proc)(args, xp, exp, rp, crp);
1157 curthread->t_cred = svcred;
1161 void afs_nfs3_readdirplus(char *args, char *xp, char *exp, char *rp, char *crp) {
1163 afs_nfs3_resp dummy;
1164 struct cred *svcred = curthread->t_cred;
1165 curthread->t_cred = (struct cred*)crp;
1166 call=afs_nfs3_dispatcher(0, NFSPROC3_READDIRPLUS, (char *)args, &exp, rp, crp);
1167 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1168 else (*afs_rfs3_disp_tbl[NFSPROC3_READDIRPLUS].orig_proc)(args, xp, exp, rp, crp);
1169 curthread->t_cred = svcred;
1173 void afs_nfs3_fsstat(char *args, char *xp, char *exp, char *rp, char *crp) {
1175 afs_nfs3_resp dummy;
1176 struct cred *svcred = curthread->t_cred;
1177 curthread->t_cred = (struct cred*)crp;
1178 call=afs_nfs3_dispatcher(0, NFSPROC3_FSSTAT, (char *)args, &exp, rp, crp);
1179 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1180 else (*afs_rfs3_disp_tbl[NFSPROC3_FSSTAT].orig_proc)(args, xp, exp, rp, crp);
1181 curthread->t_cred = svcred;
1185 void afs_nfs3_fsinfo(char *args, char *xp, char *exp, char *rp, char *crp) {
1187 afs_nfs3_resp dummy;
1188 struct cred *svcred = curthread->t_cred;
1189 curthread->t_cred = (struct cred*)crp;
1190 call=afs_nfs3_dispatcher(0, NFSPROC3_FSINFO, (char *)args, &exp, rp, crp);
1191 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1192 else (*afs_rfs3_disp_tbl[NFSPROC3_FSINFO].orig_proc)(args, xp, exp, rp, crp);
1193 curthread->t_cred = svcred;
1197 void afs_nfs3_pathconf(char *args, char *xp, char *exp, char *rp, char *crp) {
1199 afs_nfs3_resp dummy;
1200 struct cred *svcred = curthread->t_cred;
1201 curthread->t_cred = (struct cred*)crp;
1202 call=afs_nfs3_dispatcher(0, NFSPROC3_PATHCONF, (char *)args, &exp, rp, crp);
1203 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1204 else (*afs_rfs3_disp_tbl[NFSPROC3_PATHCONF].orig_proc)(args, xp, exp, rp, crp);
1205 curthread->t_cred = svcred;
1209 void afs_nfs3_commit(char *args, char *xp, char *exp, char *rp, char *crp) {
1211 afs_nfs3_resp dummy;
1212 struct cred *svcred = curthread->t_cred;
1213 curthread->t_cred = (struct cred*)crp;
1214 call=afs_nfs3_dispatcher(0, NFSPROC3_COMMIT, (char *)args, &exp, rp, crp);
1215 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1216 else (*afs_rfs3_disp_tbl[NFSPROC3_COMMIT].orig_proc)(args, xp, exp, rp, crp);
1217 curthread->t_cred = svcred;
1221 struct afs_nfs_disp_tbl afs_rfs3_disp_tbl[22] = {
1223 { afs_nfs3_getattr },
1224 { afs_nfs3_setattr },
1225 { afs_nfs3_lookup },
1226 { afs_nfs3_access },
1227 { afs_nfs3_readlink },
1230 { afs_nfs3_create },
1232 { afs_nfs3_symlink },
1234 { afs_nfs3_remove },
1236 { afs_nfs3_rename },
1238 { afs_nfs3_readdir },
1239 { afs_nfs3_readdirplus },
1240 { afs_nfs3_fsstat },
1241 { afs_nfs3_fsinfo },
1242 { afs_nfs3_pathconf },
1246 void afs_acl3_getacl(char *args, char *xp, char *exp, char *rp, char *crp) {
1248 struct cred *svcred = curthread->t_cred;
1249 curthread->t_cred = (struct cred*)crp;
1250 call=afs_nfs3_dispatcher(1, ACLPROC3_GETACL, (char *)args, &exp, rp, crp);
1251 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1252 else (*afs_acl3_disp_tbl[ACLPROC3_GETACL].orig_proc)(args, xp, exp, rp, crp);
1253 curthread->t_cred = svcred;
1257 void afs_acl3_setacl(char *args, char *xp, char *exp, char *rp, char *crp) {
1259 struct cred *svcred = curthread->t_cred;
1260 curthread->t_cred = (struct cred*)crp;
1261 call=afs_nfs3_dispatcher(1, ACLPROC3_SETACL, (char *)args, &exp, rp, crp);
1262 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1263 else (*afs_acl3_disp_tbl[ACLPROC3_SETACL].orig_proc)(args, xp, exp, rp, crp);
1264 curthread->t_cred = svcred;
1268 struct afs_nfs_disp_tbl afs_acl3_disp_tbl[3] = {
1270 { afs_acl3_getacl },
1271 { afs_acl3_setacl },
1274 /* Munge the dispatch tables to link us in first */
1276 afs_xlatorinit_v3(struct rfs_disp_tbl *_rfs_tbl,
1277 struct rfs_disp_tbl *_acl_tbl)
1281 if (xlatorinit_v3_done++) return;
1283 for (i=0; i < 22; i++) {
1284 afs_rfs3_disp_tbl[i].orig_proc = _rfs_tbl[i].dis_proc;
1285 _rfs_tbl[i].dis_proc = afs_rfs3_disp_tbl[i].afs_proc;
1288 for (i=0; i < 3; i++) {
1289 afs_acl3_disp_tbl[i].orig_proc = _acl_tbl[i].dis_proc;
1290 _acl_tbl[i].dis_proc = afs_acl3_disp_tbl[i].afs_proc;
1293 #endif /* !defined(AFS_NONFSTRANS) */