nfs_nfsiod.c (34961) | nfs_nfsiod.c (36176) |
---|---|
1/* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Rick Macklem at The University of Guelph. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 20 unchanged lines hidden (view full) --- 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * @(#)nfs_syscalls.c 8.5 (Berkeley) 3/30/95 | 1/* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Rick Macklem at The University of Guelph. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 20 unchanged lines hidden (view full) --- 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * @(#)nfs_syscalls.c 8.5 (Berkeley) 3/30/95 |
37 * $Id: nfs_syscalls.c,v 1.36 1998/02/09 06:10:37 eivind Exp $ | 37 * $Id: nfs_syscalls.c,v 1.37 1998/03/30 09:54:17 phk Exp $ |
38 */ 39 40#include <sys/param.h> 41#include <sys/systm.h> 42#include <sys/sysproto.h> 43#include <sys/kernel.h> 44#include <sys/sysctl.h> 45#include <sys/file.h> --- 172 unchanged lines hidden (view full) --- 218 if (error) 219 return (error); 220 if ((nd.ni_vp->v_flag & VROOT) == 0) 221 error = EINVAL; 222 nmp = VFSTONFS(nd.ni_vp->v_mount); 223 vput(nd.ni_vp); 224 if (error) 225 return (error); | 38 */ 39 40#include <sys/param.h> 41#include <sys/systm.h> 42#include <sys/sysproto.h> 43#include <sys/kernel.h> 44#include <sys/sysctl.h> 45#include <sys/file.h> --- 172 unchanged lines hidden (view full) --- 218 if (error) 219 return (error); 220 if ((nd.ni_vp->v_flag & VROOT) == 0) 221 error = EINVAL; 222 nmp = VFSTONFS(nd.ni_vp->v_mount); 223 vput(nd.ni_vp); 224 if (error) 225 return (error); |
226 if ((nmp->nm_flag & NFSMNT_MNTD) && | 226 if ((nmp->nm_state & NFSSTA_MNTD) && |
227 (uap->flag & NFSSVC_GOTAUTH) == 0) 228 return (0); | 227 (uap->flag & NFSSVC_GOTAUTH) == 0) 228 return (0); |
229 nmp->nm_flag |= NFSMNT_MNTD; | 229 nmp->nm_state |= NFSSTA_MNTD; |
230 error = nqnfs_clientd(nmp, p->p_ucred, &ncd, uap->flag, 231 uap->argp, p); 232 } else if (uap->flag & NFSSVC_ADDSOCK) { 233 error = copyin(uap->argp, (caddr_t)&nfsdarg, sizeof(nfsdarg)); 234 if (error) 235 return (error); 236 error = getsock(p->p_fd, nfsdarg.sock, &fp); 237 if (error) --- 271 unchanged lines hidden (view full) --- 509 if ((slp = nfsd->nfsd_slp) == (struct nfssvc_sock *)0) 510 continue; 511 if (slp->ns_flag & SLP_VALID) { 512 if (slp->ns_flag & SLP_DISCONN) 513 nfsrv_zapsock(slp); 514 else if (slp->ns_flag & SLP_NEEDQ) { 515 slp->ns_flag &= ~SLP_NEEDQ; 516 (void) nfs_sndlock(&slp->ns_solock, | 230 error = nqnfs_clientd(nmp, p->p_ucred, &ncd, uap->flag, 231 uap->argp, p); 232 } else if (uap->flag & NFSSVC_ADDSOCK) { 233 error = copyin(uap->argp, (caddr_t)&nfsdarg, sizeof(nfsdarg)); 234 if (error) 235 return (error); 236 error = getsock(p->p_fd, nfsdarg.sock, &fp); 237 if (error) --- 271 unchanged lines hidden (view full) --- 509 if ((slp = nfsd->nfsd_slp) == (struct nfssvc_sock *)0) 510 continue; 511 if (slp->ns_flag & SLP_VALID) { 512 if (slp->ns_flag & SLP_DISCONN) 513 nfsrv_zapsock(slp); 514 else if (slp->ns_flag & SLP_NEEDQ) { 515 slp->ns_flag &= ~SLP_NEEDQ; 516 (void) nfs_sndlock(&slp->ns_solock, |
517 &slp->ns_solock, |
|
517 (struct nfsreq *)0); 518 nfsrv_rcv(slp->ns_so, (caddr_t)slp, 519 M_WAIT); | 518 (struct nfsreq *)0); 519 nfsrv_rcv(slp->ns_so, (caddr_t)slp, 520 M_WAIT); |
520 nfs_sndunlock(&slp->ns_solock); | 521 nfs_sndunlock(&slp->ns_solock, 522 &slp->ns_solock); |
521 } 522 error = nfsrv_dorec(slp, nfsd, &nd); 523 cur_usec = nfs_curusec(); 524 if (error && slp->ns_tq.lh_first && 525 slp->ns_tq.lh_first->nd_time <= cur_usec) { 526 error = 0; 527 cacherep = RC_DOIT; 528 writes_todo = 1; --- 143 unchanged lines hidden (view full) --- 672 * For stream protocols, prepend a Sun RPC 673 * Record Mark. 674 */ 675 if (sotype == SOCK_STREAM) { 676 M_PREPEND(m, NFSX_UNSIGNED, M_WAIT); 677 *mtod(m, u_long *) = htonl(0x80000000 | siz); 678 } 679 if (solockp) | 523 } 524 error = nfsrv_dorec(slp, nfsd, &nd); 525 cur_usec = nfs_curusec(); 526 if (error && slp->ns_tq.lh_first && 527 slp->ns_tq.lh_first->nd_time <= cur_usec) { 528 error = 0; 529 cacherep = RC_DOIT; 530 writes_todo = 1; --- 143 unchanged lines hidden (view full) --- 674 * For stream protocols, prepend a Sun RPC 675 * Record Mark. 676 */ 677 if (sotype == SOCK_STREAM) { 678 M_PREPEND(m, NFSX_UNSIGNED, M_WAIT); 679 *mtod(m, u_long *) = htonl(0x80000000 | siz); 680 } 681 if (solockp) |
680 (void) nfs_sndlock(solockp, (struct nfsreq *)0); | 682 (void) nfs_sndlock(solockp, solockp, 683 (struct nfsreq *)0); |
681 if (slp->ns_flag & SLP_VALID) 682 error = nfs_send(so, nd->nd_nam2, m, NULL); 683 else { 684 error = EPIPE; 685 m_freem(m); 686 } 687 if (nfsrtton) 688 nfsd_rt(sotype, nd, cacherep); 689 if (nd->nd_nam2) 690 FREE(nd->nd_nam2, M_SONAME); 691 if (nd->nd_mrep) 692 m_freem(nd->nd_mrep); 693 if (error == EPIPE) 694 nfsrv_zapsock(slp); 695 if (solockp) | 684 if (slp->ns_flag & SLP_VALID) 685 error = nfs_send(so, nd->nd_nam2, m, NULL); 686 else { 687 error = EPIPE; 688 m_freem(m); 689 } 690 if (nfsrtton) 691 nfsd_rt(sotype, nd, cacherep); 692 if (nd->nd_nam2) 693 FREE(nd->nd_nam2, M_SONAME); 694 if (nd->nd_mrep) 695 m_freem(nd->nd_mrep); 696 if (error == EPIPE) 697 nfsrv_zapsock(slp); 698 if (solockp) |
696 nfs_sndunlock(solockp); | 699 nfs_sndunlock(solockp, solockp); |
697 if (error == EINTR || error == ERESTART) { 698 free((caddr_t)nd, M_NFSRVDESC); 699 nfsrv_slpderef(slp); 700 s = splnet(); 701 goto done; 702 } 703 break; 704 case RC_DROPIT: --- 189 unchanged lines hidden (view full) --- 894 char **auth_str; 895 int *auth_len; 896 char *verf_str; 897 int *verf_len; 898 NFSKERBKEY_T key; /* return session key */ 899{ 900 int error = 0; 901 | 700 if (error == EINTR || error == ERESTART) { 701 free((caddr_t)nd, M_NFSRVDESC); 702 nfsrv_slpderef(slp); 703 s = splnet(); 704 goto done; 705 } 706 break; 707 case RC_DROPIT: --- 189 unchanged lines hidden (view full) --- 897 char **auth_str; 898 int *auth_len; 899 char *verf_str; 900 int *verf_len; 901 NFSKERBKEY_T key; /* return session key */ 902{ 903 int error = 0; 904 |
902 while ((nmp->nm_flag & NFSMNT_WAITAUTH) == 0) { 903 nmp->nm_flag |= NFSMNT_WANTAUTH; | 905 while ((nmp->nm_state & NFSSTA_WAITAUTH) == 0) { 906 nmp->nm_state |= NFSSTA_WANTAUTH; |
904 (void) tsleep((caddr_t)&nmp->nm_authtype, PSOCK, 905 "nfsauth1", 2 * hz); 906 error = nfs_sigintr(nmp, rep, rep->r_procp); 907 if (error) { | 907 (void) tsleep((caddr_t)&nmp->nm_authtype, PSOCK, 908 "nfsauth1", 2 * hz); 909 error = nfs_sigintr(nmp, rep, rep->r_procp); 910 if (error) { |
908 nmp->nm_flag &= ~NFSMNT_WANTAUTH; | 911 nmp->nm_state &= ~NFSSTA_WANTAUTH; |
909 return (error); 910 } 911 } | 912 return (error); 913 } 914 } |
912 nmp->nm_flag &= ~(NFSMNT_WAITAUTH | NFSMNT_WANTAUTH); | 915 nmp->nm_state &= ~(NFSSTA_WAITAUTH | NFSSTA_WANTAUTH); |
913 nmp->nm_authstr = *auth_str = (char *)malloc(RPCAUTH_MAXSIZ, M_TEMP, M_WAITOK); 914 nmp->nm_authlen = RPCAUTH_MAXSIZ; 915 nmp->nm_verfstr = verf_str; 916 nmp->nm_verflen = *verf_len; 917 nmp->nm_authuid = cred->cr_uid; 918 wakeup((caddr_t)&nmp->nm_authstr); 919 920 /* 921 * And wait for mount_nfs to do its stuff. 922 */ | 916 nmp->nm_authstr = *auth_str = (char *)malloc(RPCAUTH_MAXSIZ, M_TEMP, M_WAITOK); 917 nmp->nm_authlen = RPCAUTH_MAXSIZ; 918 nmp->nm_verfstr = verf_str; 919 nmp->nm_verflen = *verf_len; 920 nmp->nm_authuid = cred->cr_uid; 921 wakeup((caddr_t)&nmp->nm_authstr); 922 923 /* 924 * And wait for mount_nfs to do its stuff. 925 */ |
923 while ((nmp->nm_flag & NFSMNT_HASAUTH) == 0 && error == 0) { | 926 while ((nmp->nm_state & NFSSTA_HASAUTH) == 0 && error == 0) { |
924 (void) tsleep((caddr_t)&nmp->nm_authlen, PSOCK, 925 "nfsauth2", 2 * hz); 926 error = nfs_sigintr(nmp, rep, rep->r_procp); 927 } | 927 (void) tsleep((caddr_t)&nmp->nm_authlen, PSOCK, 928 "nfsauth2", 2 * hz); 929 error = nfs_sigintr(nmp, rep, rep->r_procp); 930 } |
928 if (nmp->nm_flag & NFSMNT_AUTHERR) { 929 nmp->nm_flag &= ~NFSMNT_AUTHERR; | 931 if (nmp->nm_state & NFSSTA_AUTHERR) { 932 nmp->nm_state &= ~NFSSTA_AUTHERR; |
930 error = EAUTH; 931 } 932 if (error) 933 free((caddr_t)*auth_str, M_TEMP); 934 else { 935 *auth_len = nmp->nm_authlen; 936 *verf_len = nmp->nm_verflen; 937 bcopy((caddr_t)nmp->nm_key, (caddr_t)key, sizeof (key)); 938 } | 933 error = EAUTH; 934 } 935 if (error) 936 free((caddr_t)*auth_str, M_TEMP); 937 else { 938 *auth_len = nmp->nm_authlen; 939 *verf_len = nmp->nm_verflen; 940 bcopy((caddr_t)nmp->nm_key, (caddr_t)key, sizeof (key)); 941 } |
939 nmp->nm_flag &= ~NFSMNT_HASAUTH; 940 nmp->nm_flag |= NFSMNT_WAITAUTH; 941 if (nmp->nm_flag & NFSMNT_WANTAUTH) { 942 nmp->nm_flag &= ~NFSMNT_WANTAUTH; | 942 nmp->nm_state &= ~NFSSTA_HASAUTH; 943 nmp->nm_state |= NFSSTA_WAITAUTH; 944 if (nmp->nm_state & NFSSTA_WANTAUTH) { 945 nmp->nm_state &= ~NFSSTA_WANTAUTH; |
943 wakeup((caddr_t)&nmp->nm_authtype); 944 } 945 return (error); 946} 947 948/* 949 * Get a nickname authenticator and verifier. 950 */ --- 239 unchanged lines hidden --- | 946 wakeup((caddr_t)&nmp->nm_authtype); 947 } 948 return (error); 949} 950 951/* 952 * Get a nickname authenticator and verifier. 953 */ --- 239 unchanged lines hidden --- |