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.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); |
226 if ((nmp->nm_state & NFSSTA_MNTD) && |
227 (uap->flag & NFSSVC_GOTAUTH) == 0) 228 return (0); |
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, |
517 &slp->ns_solock, |
518 (struct nfsreq *)0); 519 nfsrv_rcv(slp->ns_so, (caddr_t)slp, 520 M_WAIT); |
521 nfs_sndunlock(&slp->ns_solock, 522 &slp->ns_solock); |
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) |
682 (void) nfs_sndlock(solockp, solockp, 683 (struct nfsreq *)0); |
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) |
699 nfs_sndunlock(solockp, solockp); |
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 |
905 while ((nmp->nm_state & NFSSTA_WAITAUTH) == 0) { 906 nmp->nm_state |= NFSSTA_WANTAUTH; |
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) { |
911 nmp->nm_state &= ~NFSSTA_WANTAUTH; |
912 return (error); 913 } 914 } |
915 nmp->nm_state &= ~(NFSSTA_WAITAUTH | NFSSTA_WANTAUTH); |
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 */ |
926 while ((nmp->nm_state & NFSSTA_HASAUTH) == 0 && error == 0) { |
927 (void) tsleep((caddr_t)&nmp->nm_authlen, PSOCK, 928 "nfsauth2", 2 * hz); 929 error = nfs_sigintr(nmp, rep, rep->r_procp); 930 } |
931 if (nmp->nm_state & NFSSTA_AUTHERR) { 932 nmp->nm_state &= ~NFSSTA_AUTHERR; |
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 } |
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; |
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 --- |