Deleted Added
sdiff udiff text old ( 34961 ) new ( 36176 )
full compact
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 $
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) &&
227 (uap->flag & NFSSVC_GOTAUTH) == 0)
228 return (0);
229 nmp->nm_flag |= NFSMNT_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 (struct nfsreq *)0);
518 nfsrv_rcv(slp->ns_so, (caddr_t)slp,
519 M_WAIT);
520 nfs_sndunlock(&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)
680 (void) nfs_sndlock(solockp, (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)
696 nfs_sndunlock(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
902 while ((nmp->nm_flag & NFSMNT_WAITAUTH) == 0) {
903 nmp->nm_flag |= NFSMNT_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) {
908 nmp->nm_flag &= ~NFSMNT_WANTAUTH;
909 return (error);
910 }
911 }
912 nmp->nm_flag &= ~(NFSMNT_WAITAUTH | NFSMNT_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 */
923 while ((nmp->nm_flag & NFSMNT_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 }
928 if (nmp->nm_flag & NFSMNT_AUTHERR) {
929 nmp->nm_flag &= ~NFSMNT_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 }
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;
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 ---