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;
681 fhp1 = (nfs_fh3 *) arg->what.dirp;
684 case NFSPROC3_ACCESS:
686 ACCESS3args *arg = (ACCESS3args *)args;
687 fhp1 = (nfs_fh3 *) &arg->object;
690 case NFSPROC3_READLINK:
692 READLINK3args *arg = (READLINK3args *)args;
693 fhp1 = (nfs_fh3 *) &arg->symlink;
698 READ3args *arg = (READ3args *)args;
699 fhp1 = (nfs_fh3 *) &arg->file;
704 WRITE3args *arg = (WRITE3args *)args;
705 fhp1 = (nfs_fh3 *) &arg->file;
708 case NFSPROC3_CREATE:
710 CREATE3args *arg = (CREATE3args *)args;
711 fhp1 = (nfs_fh3 *) &arg->where.dir;
716 MKDIR3args *arg = (MKDIR3args *)args;
717 fhp1 = (nfs_fh3 *) &arg->where.dir;
720 case NFSPROC3_SYMLINK:
722 SYMLINK3args *arg = (SYMLINK3args *)args;
723 fhp1 = (nfs_fh3 *) &arg->where.dir;
728 MKNOD3args *arg = (MKNOD3args *)args;
729 fhp1 = (nfs_fh3 *) &arg->where.dir;
732 case NFSPROC3_REMOVE:
734 REMOVE3args *arg = (REMOVE3args *)args;
735 fhp1 = (nfs_fh3 *) &arg->object.dir;
740 RMDIR3args *arg = (RMDIR3args *)args;
741 fhp1 = (nfs_fh3 *) &arg->object.dir;
744 case NFSPROC3_RENAME:
746 RENAME3args *arg = (RENAME3args *)args;
747 fhp1 = (nfs_fh3 *) &arg->from.dir;
748 fhp2 = (nfs_fh3 *) &arg->to.dir;
753 LINK3args *arg = (LINK3args *)args;
754 fhp1 = (nfs_fh3 *) &arg->file;
755 fhp2 = (nfs_fh3 *) &arg->link.dir;
758 case NFSPROC3_READDIR:
760 READDIR3args *arg = (READDIR3args *)args;
761 fhp1 = (nfs_fh3 *) &arg->dir;
764 case NFSPROC3_READDIRPLUS:
766 READDIRPLUS3args *arg = (READDIRPLUS3args *)args;
767 fhp1 = (nfs_fh3 *) &arg->dir;
770 case NFSPROC3_FSSTAT:
772 FSSTAT3args *arg = (FSSTAT3args *)args;
773 fhp1 = (nfs_fh3 *) &arg->fsroot;
776 case NFSPROC3_FSINFO:
778 FSINFO3args *arg = (FSINFO3args *)args;
779 fhp1 = (nfs_fh3 *) &arg->fsroot;
782 case NFSPROC3_PATHCONF:
784 PATHCONF3args *arg = (PATHCONF3args *)args;
785 fhp1 = (nfs_fh3 *) &arg->object;
788 case NFSPROC3_COMMIT:
790 COMMIT3args *arg = (COMMIT3args *)args;
791 fhp1 = (nfs_fh3 *) &arg->file;
798 if (is_afs_fh3(fhp1)) {
804 if (fhp2 && is_afs_fh3(fhp2)) {
813 acl3_to_afs_call(int which, caddr_t *args, nfs_fh3 **fhpp)
818 case ACLPROC3_GETACL:
820 struct GETACL3args *sargs = (struct GETACL3args *) args;
824 case ACLPROC3_SETACL:
826 struct SETACL3args *sargs = (struct SETACL3args *) args;
834 if (is_afs_fh3(fhp)) {
843 afs_nfs3_dispatcher(int type, afs_int32 which, char *argp,
844 struct exportinfo **expp,
845 struct svc_req *rp, struct AFS_UCRED *crp)
849 afs_int32 client = 0;
851 nfs_fh3 *fh = (nfs_fh3 *)argp;
852 nfs_fh3 *fh2 = (nfs_fh3 *)0;
854 if (!xlatorinit_v3_done)
857 sa = (struct sockaddr *)svc_getrpccaller(rp->rq_xprt)->buf;
858 if (sa->sa_family == AF_INET)
859 client = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
865 code = (client && nfs3_to_afs_call(which, argp, &fh, &fh2));
868 code = (client && acl3_to_afs_call(which, argp, &fh));
875 struct afs_exporter *out = 0;
878 struct SmallFid Sfid;
880 memcpy((char *)&Sfid, fh->fh3_data, SIZEOF_SMALLFID);
882 afs_Trace2(afs_iclSetp, CM_TRACE_NFS3IN1,
883 ICL_TYPE_INT32, client,
884 ICL_TYPE_FID, &Sfid);
887 if (!once && *expp) {
888 afs_nobody = (*expp)->exi_export.ex_anon;
891 code = afs_nfsclient_reqhandler((struct afs_exporter *)0, &crp,
892 client, &dummy, &out);
907 afs_nfs3_smallfidder(struct nfs_fh3 *fhp, int status)
912 #if defined(AFS_SUN57_64BIT_ENV)
913 /* See also afs_fid() */
914 memcpy((char *)addr, fhp->fh3_data, 10);
915 addr[1] = (addr[1] >> 48) & 0xffff;
917 memcpy((char *)addr, fhp->fh3_data, 2 * sizeof(long));
921 vcp = VTOAFS((struct vnode*)addr[0]);
923 /* See also afs_osi_vget */
924 if (addr[1] == AFS_XLATOR_MAGIC)
926 if (status == NFS_OK) {
927 struct SmallFid Sfid;
930 /* Make up and copy out a SmallFid */
931 tcell = afs_GetCell(vcp->fid.Cell, READ_LOCK);
932 Sfid.Volume = vcp->fid.Fid.Volume;
933 Sfid.CellAndUnique = ((tcell->cellIndex << 24) |
934 (vcp->fid.Fid.Unique & 0xffffff));
935 afs_PutCell(tcell, READ_LOCK);
936 Sfid.Vnode = (u_short)(vcp->fid.Fid.Vnode & 0xffff);
937 fhp->fh3_len = SIZEOF_SMALLFID;
938 memcpy(fhp->fh3_data, (char*)&Sfid, fhp->fh3_len);
940 afs_Trace3(afs_iclSetp, CM_TRACE_NFS3OUT, ICL_TYPE_INT32, status,
941 ICL_TYPE_POINTER, vcp, ICL_TYPE_FID, &Sfid);
944 /* If we have a ref, release it */
945 if (vcp->vrefCount >= 1)
946 AFS_RELE(AFSTOV(vcp));
951 void afs_nfs3_getattr(char *args, char *xp, char *exp, char *rp, char *crp) {
954 struct cred *svcred = curthread->t_cred;
955 curthread->t_cred = (struct cred*)crp;
956 call=afs_nfs3_dispatcher(0, NFSPROC3_GETATTR, (char *)args, &exp, rp, crp);
957 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
958 else (*afs_rfs3_disp_tbl[NFSPROC3_GETATTR].orig_proc)(args, xp, exp, rp, crp);
959 curthread->t_cred = svcred;
963 void afs_nfs3_setattr(char *args, char *xp, char *exp, char *rp, char *crp) {
966 struct cred *svcred = curthread->t_cred;
967 curthread->t_cred = (struct cred*)crp;
968 call=afs_nfs3_dispatcher(0, NFSPROC3_SETATTR, (char *)args, &exp, rp, crp);
969 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
970 else (*afs_rfs3_disp_tbl[NFSPROC3_SETATTR].orig_proc)(args, xp, exp, rp, crp);
971 curthread->t_cred = svcred;
975 void afs_nfs3_lookup(char *args, char *xp, char *exp, char *rp, char *crp) {
978 struct cred *svcred = curthread->t_cred;
979 curthread->t_cred = (struct cred*)crp;
980 call=afs_nfs3_dispatcher(0, NFSPROC3_LOOKUP, (char *)args, &exp, rp, crp);
981 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
982 else { (*afs_rfs3_disp_tbl[NFSPROC3_LOOKUP].orig_proc)(args, xp, exp, rp, crp);
983 if (afs_NFSRootOnly && call) {
984 LOOKUP3res *resp = ( LOOKUP3res *)xp;
985 afs_nfs3_smallfidder( &resp->resok.object , resp->status); } }
986 curthread->t_cred = svcred;
990 void afs_nfs3_access(char *args, char *xp, char *exp, char *rp, char *crp) {
993 struct cred *svcred = curthread->t_cred;
994 curthread->t_cred = (struct cred*)crp;
995 call=afs_nfs3_dispatcher(0, NFSPROC3_ACCESS, (char *)args, &exp, rp, crp);
996 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
997 else (*afs_rfs3_disp_tbl[NFSPROC3_ACCESS].orig_proc)(args, xp, exp, rp, crp);
998 curthread->t_cred = svcred;
1002 void afs_nfs3_readlink(char *args, char *xp, char *exp, char *rp, char *crp) {
1004 afs_nfs3_resp dummy;
1005 struct cred *svcred = curthread->t_cred;
1006 curthread->t_cred = (struct cred*)crp;
1007 call=afs_nfs3_dispatcher(0, NFSPROC3_READLINK, (char *)args, &exp, rp, crp);
1008 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1009 else (*afs_rfs3_disp_tbl[NFSPROC3_READLINK].orig_proc)(args, xp, exp, rp, crp);
1010 curthread->t_cred = svcred;
1014 void afs_nfs3_read(char *args, char *xp, char *exp, char *rp, char *crp) {
1016 afs_nfs3_resp dummy;
1017 struct cred *svcred = curthread->t_cred;
1018 curthread->t_cred = (struct cred*)crp;
1019 call=afs_nfs3_dispatcher(0, NFSPROC3_READ, (char *)args, &exp, rp, crp);
1020 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1021 else (*afs_rfs3_disp_tbl[NFSPROC3_READ].orig_proc)(args, xp, exp, rp, crp);
1022 curthread->t_cred = svcred;
1026 void afs_nfs3_write(char *args, char *xp, char *exp, char *rp, char *crp) {
1028 afs_nfs3_resp dummy;
1029 struct cred *svcred = curthread->t_cred;
1030 curthread->t_cred = (struct cred*)crp;
1031 call=afs_nfs3_dispatcher(0, NFSPROC3_WRITE, (char *)args, &exp, rp, crp);
1032 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1033 else (*afs_rfs3_disp_tbl[NFSPROC3_WRITE].orig_proc)(args, xp, exp, rp, crp);
1034 curthread->t_cred = svcred;
1037 void afs_nfs3_create(char *args, char *xp, char *exp, char *rp, char *crp) {
1039 afs_nfs3_resp dummy;
1040 struct cred *svcred = curthread->t_cred;
1041 curthread->t_cred = (struct cred*)crp;
1042 call=afs_nfs3_dispatcher(0, NFSPROC3_CREATE, (char *)args, &exp, rp, crp);
1043 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1044 else { (*afs_rfs3_disp_tbl[NFSPROC3_CREATE].orig_proc)(args, xp, exp, rp, crp);
1045 if (afs_NFSRootOnly && call) {
1046 CREATE3res *resp = ( CREATE3res *)xp;
1047 afs_nfs3_smallfidder( &resp->resok.obj.handle , resp->status); } }
1048 curthread->t_cred = svcred;
1052 void afs_nfs3_mkdir(char *args, char *xp, char *exp, char *rp, char *crp) {
1054 afs_nfs3_resp dummy;
1055 struct cred *svcred = curthread->t_cred;
1056 curthread->t_cred = (struct cred*)crp;
1057 call=afs_nfs3_dispatcher(0, NFSPROC3_MKDIR, (char *)args, &exp, rp, crp);
1058 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1059 else { (*afs_rfs3_disp_tbl[NFSPROC3_MKDIR].orig_proc)(args, xp, exp, rp, crp);
1060 if (afs_NFSRootOnly && call) {
1061 MKDIR3res *resp = ( MKDIR3res *)xp;
1062 afs_nfs3_smallfidder( &resp->resok.obj.handle , resp->status); } }
1063 curthread->t_cred = svcred;
1067 void afs_nfs3_symlink(char *args, char *xp, char *exp, char *rp, char *crp) {
1069 afs_nfs3_resp dummy;
1070 struct cred *svcred = curthread->t_cred;
1071 curthread->t_cred = (struct cred*)crp;
1072 call=afs_nfs3_dispatcher(0, NFSPROC3_SYMLINK, (char *)args, &exp, rp, crp);
1073 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1074 else { (*afs_rfs3_disp_tbl[NFSPROC3_SYMLINK].orig_proc)(args, xp, exp, rp, crp);
1075 if (afs_NFSRootOnly && call) {
1076 SYMLINK3res *resp = ( SYMLINK3res *)xp;
1077 afs_nfs3_smallfidder( &resp->resok.obj.handle , resp->status); } }
1078 curthread->t_cred = svcred;
1082 void afs_nfs3_mknod(char *args, char *xp, char *exp, char *rp, char *crp) {
1084 afs_nfs3_resp dummy;
1085 struct cred *svcred = curthread->t_cred;
1086 curthread->t_cred = (struct cred*)crp;
1087 call=afs_nfs3_dispatcher(0, NFSPROC3_MKNOD, (char *)args, &exp, rp, crp);
1088 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1089 else { (*afs_rfs3_disp_tbl[NFSPROC3_MKNOD].orig_proc)(args, xp, exp, rp, crp);
1090 if (afs_NFSRootOnly && call) {
1091 MKNOD3res *resp = ( MKNOD3res *)xp;
1092 afs_nfs3_smallfidder( &resp->resok.obj.handle , resp->status); } }
1093 curthread->t_cred = svcred;
1097 void afs_nfs3_remove(char *args, char *xp, char *exp, char *rp, char *crp) {
1099 afs_nfs3_resp dummy;
1100 struct cred *svcred = curthread->t_cred;
1101 curthread->t_cred = (struct cred*)crp;
1102 call=afs_nfs3_dispatcher(0, NFSPROC3_REMOVE, (char *)args, &exp, rp, crp);
1103 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1104 else (*afs_rfs3_disp_tbl[NFSPROC3_REMOVE].orig_proc)(args, xp, exp, rp, crp);
1105 curthread->t_cred = svcred;
1109 void afs_nfs3_rmdir(char *args, char *xp, char *exp, char *rp, char *crp) {
1111 afs_nfs3_resp dummy;
1112 struct cred *svcred = curthread->t_cred;
1113 curthread->t_cred = (struct cred*)crp;
1114 call=afs_nfs3_dispatcher(0, NFSPROC3_RMDIR, (char *)args, &exp, rp, crp);
1115 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1116 else (*afs_rfs3_disp_tbl[NFSPROC3_RMDIR].orig_proc)(args, xp, exp, rp, crp);
1117 curthread->t_cred = svcred;
1121 void afs_nfs3_rename(char *args, char *xp, char *exp, char *rp, char *crp) {
1123 afs_nfs3_resp dummy;
1124 struct cred *svcred = curthread->t_cred;
1125 curthread->t_cred = (struct cred*)crp;
1126 call=afs_nfs3_dispatcher(0, NFSPROC3_RENAME, (char *)args, &exp, rp, crp);
1127 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1128 else (*afs_rfs3_disp_tbl[NFSPROC3_RENAME].orig_proc)(args, xp, exp, rp, crp);
1129 curthread->t_cred = svcred;
1133 void afs_nfs3_link(char *args, char *xp, char *exp, char *rp, char *crp) {
1135 afs_nfs3_resp dummy;
1136 struct cred *svcred = curthread->t_cred;
1137 curthread->t_cred = (struct cred*)crp;
1138 call=afs_nfs3_dispatcher(0, NFSPROC3_LINK, (char *)args, &exp, rp, crp);
1139 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1140 else (*afs_rfs3_disp_tbl[NFSPROC3_LINK].orig_proc)(args, xp, exp, rp, crp);
1141 curthread->t_cred = svcred;
1145 void afs_nfs3_readdir(char *args, char *xp, char *exp, char *rp, char *crp) {
1147 afs_nfs3_resp dummy;
1148 struct cred *svcred = curthread->t_cred;
1149 curthread->t_cred = (struct cred*)crp;
1150 call=afs_nfs3_dispatcher(0, NFSPROC3_READDIR, (char *)args, &exp, rp, crp);
1151 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1152 else (*afs_rfs3_disp_tbl[NFSPROC3_READDIR].orig_proc)(args, xp, exp, rp, crp);
1153 curthread->t_cred = svcred;
1157 void afs_nfs3_readdirplus(char *args, char *xp, char *exp, char *rp, char *crp) {
1159 afs_nfs3_resp dummy;
1160 struct cred *svcred = curthread->t_cred;
1161 curthread->t_cred = (struct cred*)crp;
1162 call=afs_nfs3_dispatcher(0, NFSPROC3_READDIRPLUS, (char *)args, &exp, rp, crp);
1163 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1164 else (*afs_rfs3_disp_tbl[NFSPROC3_READDIRPLUS].orig_proc)(args, xp, exp, rp, crp);
1165 curthread->t_cred = svcred;
1169 void afs_nfs3_fsstat(char *args, char *xp, char *exp, char *rp, char *crp) {
1171 afs_nfs3_resp dummy;
1172 struct cred *svcred = curthread->t_cred;
1173 curthread->t_cred = (struct cred*)crp;
1174 call=afs_nfs3_dispatcher(0, NFSPROC3_FSSTAT, (char *)args, &exp, rp, crp);
1175 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1176 else (*afs_rfs3_disp_tbl[NFSPROC3_FSSTAT].orig_proc)(args, xp, exp, rp, crp);
1177 curthread->t_cred = svcred;
1181 void afs_nfs3_fsinfo(char *args, char *xp, char *exp, char *rp, char *crp) {
1183 afs_nfs3_resp dummy;
1184 struct cred *svcred = curthread->t_cred;
1185 curthread->t_cred = (struct cred*)crp;
1186 call=afs_nfs3_dispatcher(0, NFSPROC3_FSINFO, (char *)args, &exp, rp, crp);
1187 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1188 else (*afs_rfs3_disp_tbl[NFSPROC3_FSINFO].orig_proc)(args, xp, exp, rp, crp);
1189 curthread->t_cred = svcred;
1193 void afs_nfs3_pathconf(char *args, char *xp, char *exp, char *rp, char *crp) {
1195 afs_nfs3_resp dummy;
1196 struct cred *svcred = curthread->t_cred;
1197 curthread->t_cred = (struct cred*)crp;
1198 call=afs_nfs3_dispatcher(0, NFSPROC3_PATHCONF, (char *)args, &exp, rp, crp);
1199 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1200 else (*afs_rfs3_disp_tbl[NFSPROC3_PATHCONF].orig_proc)(args, xp, exp, rp, crp);
1201 curthread->t_cred = svcred;
1205 void afs_nfs3_commit(char *args, char *xp, char *exp, char *rp, char *crp) {
1207 afs_nfs3_resp dummy;
1208 struct cred *svcred = curthread->t_cred;
1209 curthread->t_cred = (struct cred*)crp;
1210 call=afs_nfs3_dispatcher(0, NFSPROC3_COMMIT, (char *)args, &exp, rp, crp);
1211 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1212 else (*afs_rfs3_disp_tbl[NFSPROC3_COMMIT].orig_proc)(args, xp, exp, rp, crp);
1213 curthread->t_cred = svcred;
1217 struct afs_nfs_disp_tbl afs_rfs3_disp_tbl[22] = {
1219 { afs_nfs3_getattr },
1220 { afs_nfs3_setattr },
1221 { afs_nfs3_lookup },
1222 { afs_nfs3_access },
1223 { afs_nfs3_readlink },
1226 { afs_nfs3_create },
1228 { afs_nfs3_symlink },
1230 { afs_nfs3_remove },
1232 { afs_nfs3_rename },
1234 { afs_nfs3_readdir },
1235 { afs_nfs3_readdirplus },
1236 { afs_nfs3_fsstat },
1237 { afs_nfs3_fsinfo },
1238 { afs_nfs3_pathconf },
1242 void afs_acl3_getacl(char *args, char *xp, char *exp, char *rp, char *crp) {
1244 struct cred *svcred = curthread->t_cred;
1245 curthread->t_cred = (struct cred*)crp;
1246 call=afs_nfs3_dispatcher(1, ACLPROC3_GETACL, (char *)args, &exp, rp, crp);
1247 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1248 else (*afs_acl3_disp_tbl[ACLPROC3_GETACL].orig_proc)(args, xp, exp, rp, crp);
1249 curthread->t_cred = svcred;
1253 void afs_acl3_setacl(char *args, char *xp, char *exp, char *rp, char *crp) {
1255 struct cred *svcred = curthread->t_cred;
1256 curthread->t_cred = (struct cred*)crp;
1257 call=afs_nfs3_dispatcher(1, ACLPROC3_SETACL, (char *)args, &exp, rp, crp);
1258 if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp);
1259 else (*afs_acl3_disp_tbl[ACLPROC3_SETACL].orig_proc)(args, xp, exp, rp, crp);
1260 curthread->t_cred = svcred;
1264 struct afs_nfs_disp_tbl afs_acl3_disp_tbl[3] = {
1266 { afs_acl3_getacl },
1267 { afs_acl3_setacl },
1270 /* Munge the dispatch tables to link us in first */
1272 afs_xlatorinit_v3(struct rfs_disp_tbl *_rfs_tbl,
1273 struct rfs_disp_tbl *_acl_tbl)
1277 if (xlatorinit_v3_done++) return;
1279 for (i=0; i < 22; i++) {
1280 afs_rfs3_disp_tbl[i].orig_proc = _rfs_tbl[i].dis_proc;
1281 _rfs_tbl[i].dis_proc = afs_rfs3_disp_tbl[i].afs_proc;
1284 for (i=0; i < 3; i++) {
1285 afs_acl3_disp_tbl[i].orig_proc = _acl_tbl[i].dis_proc;
1286 _acl_tbl[i].dis_proc = afs_acl3_disp_tbl[i].afs_proc;
1289 #endif /* !defined(AFS_NONFSTRANS) */