X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/4c078bb2167de4e744dfa523dc0351a8ca891213..622295328cb9a8c951d4408fbbca7b00d924a05c:/usr/src/sys/kern/uipc_syscalls.c diff --git a/usr/src/sys/kern/uipc_syscalls.c b/usr/src/sys/kern/uipc_syscalls.c index e09c9b6e56..29c2d1dfd7 100644 --- a/usr/src/sys/kern/uipc_syscalls.c +++ b/usr/src/sys/kern/uipc_syscalls.c @@ -1,4 +1,4 @@ -/* uipc_syscalls.c 4.10 81/12/02 */ +/* uipc_syscalls.c 4.18 82/06/12 */ #include "../h/param.h" #include "../h/systm.h" @@ -74,45 +74,6 @@ free: sofree(rso); } -/* - * Splice system call interface. - */ -ssplice() -{ - register struct a { - int fd1; - int fd2; - } *ap = (struct a *)u.u_ap; - struct file *f1, *f2; -COUNT(SSPLICE); - - f1 = getf(ap->fd1); - if (f1 == NULL) - return; - f2 = getf(ap->fd2); - if (f2 == NULL) - return; - if (f1 == f2) { - u.u_error = EINVAL; - return; - } - if ((f1->f_flag & FSOCKET) == 0 || (f2->f_flag & FSOCKET) == 0) { - u.u_error = ENOTSOCK; - return; - } - if (f1->f_count > 1 || f2->f_count > 1) { - u.u_error = ETOOMANYREFS; - return; - } - u.u_error = sosplice(f1->f_socket, f2->f_socket); - if (u.u_error) - return; - u.u_ofile[ap->fd1] = 0; - u.u_ofile[ap->fd2] = 0; - f1->f_count = 0; - f2->f_count = 0; -} - /* * Socket system call interface. Copy sa arguments * set up file descriptor and call internal socket @@ -179,17 +140,31 @@ COUNT(SACCEPT); } s = splnet(); so = fp->f_socket; - if ((so->so_options & SO_NBIO) && + if ((so->so_state & SS_NBIO) && (so->so_state & SS_CONNAWAITING) == 0) { u.u_error = EWOULDBLOCK; splx(s); return; } + while ((so->so_state & SS_CONNAWAITING) == 0 && so->so_error == 0) { + if (so->so_state & SS_CANTRCVMORE) { + so->so_error = ECONNABORTED; + break; + } + sleep((caddr_t)&so->so_timeo, PZERO+1); + } + if (so->so_error) { + u.u_error = so->so_error; + splx(s); + return; + } u.u_error = soaccept(so, &sa); if (u.u_error) { splx(s); return; } + if (uap->asa) + (void) copyout((caddr_t)&sa, (caddr_t)uap->asa, sizeof (sa)); /* deal with new file descriptor case */ /* u.u_r.r_val1 = ... */ splx(s); @@ -227,7 +202,7 @@ COUNT(SCONNECT); if (u.u_error) return; s = splnet(); - if ((so->so_options & SO_NBIO) && + if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) { u.u_error = EINPROGRESS; splx(s); @@ -240,51 +215,6 @@ COUNT(SCONNECT); splx(s); } -/* - * Disconnect socket from foreign peer; system call - * interface. Copy sa arguments and call internal routine. - */ -sdisconnect() -{ - register struct a { - int fdes; - struct sockaddr *asa; - } *uap = (struct a *)u.u_ap; - struct sockaddr sa; - register struct file *fp; - register struct socket *so; - int s; -COUNT(SDISCONNECT); - - if (uap->asa && - copyin((caddr_t)uap->asa, (caddr_t)&sa, sizeof (sa))) { - u.u_error = EFAULT; - return; - } - fp = getf(uap->fdes); - if (fp == 0) - return; - if ((fp->f_flag & FSOCKET) == 0) { - u.u_error = ENOTSOCK; - return; - } - so = fp->f_socket; - u.u_error = sodisconnect(so, uap->asa ? &sa : 0); - if (u.u_error) - return; - s = splnet(); - if ((so->so_options&SO_NBIO) && (so->so_state&SS_ISDISCONNECTING)) { - u.u_error = EINPROGRESS; - splx(s); - return; - } - while ((so->so_state & SS_ISDISCONNECTING) && so->so_error == 0) - sleep((caddr_t)&so->so_timeo, PZERO+1); - u.u_error = so->so_error; - so->so_error = 0; - splx(s); -} - /* * Send data on socket. */ @@ -307,6 +237,7 @@ COUNT(SSEND); u.u_error = ENOTSOCK; return; } + u.u_base = uap->cbuf; u.u_count = uap->count; u.u_segflg = 0; if (useracc(uap->cbuf, uap->count, B_READ) == 0 || @@ -315,6 +246,7 @@ COUNT(SSEND); return; } u.u_error = sosend(fp->f_socket, uap->asa ? &sa : 0); + u.u_r.r_val1 = uap->count - u.u_count; } /* @@ -339,6 +271,7 @@ COUNT(SRECEIVE); u.u_error = ENOTSOCK; return; } + u.u_base = uap->cbuf; u.u_count = uap->count; u.u_segflg = 0; if (useracc(uap->cbuf, uap->count, B_WRITE) == 0 || @@ -351,6 +284,7 @@ COUNT(SRECEIVE); return; if (uap->asa) (void) copyout((caddr_t)&sa, (caddr_t)uap->asa, sizeof (sa)); + u.u_r.r_val1 = uap->count - u.u_count; } /* @@ -363,6 +297,8 @@ ssocketaddr() struct sockaddr *asa; } *uap = (struct a *)u.u_ap; register struct file *fp; + register struct socket *so; + struct sockaddr addr; COUNT(SSOCKETADDR); fp = getf(uap->fdes); @@ -372,9 +308,11 @@ COUNT(SSOCKETADDR); u.u_error = ENOTSOCK; return; } - if (copyout((caddr_t)&fp->f_socket->so_addr, (caddr_t)uap->asa, - sizeof (struct sockaddr))) { - u.u_error = EFAULT; + so = fp->f_socket; + u.u_error = + (*so->so_proto->pr_usrreq)(so, PRU_SOCKADDR, 0, (caddr_t)&addr); + if (u.u_error) return; - } + if (copyout((caddr_t)&addr, (caddr_t)uap->asa, sizeof (addr))) + u.u_error = EFAULT; }