fix to previous changes
[unix-history] / usr / src / sys / kern / sys_socket.c
index 6ea839b..ab7a513 100644 (file)
@@ -1,58 +1,55 @@
 /*
 /*
- * Copyright (c) 1982, 1986 Regents of the University of California.
+ * Copyright (c) 1982, 1986, 1990 Regents of the University of California.
  * All rights reserved.
  *
  * All rights reserved.
  *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * %sccs.include.redist.c%
  *
  *
- *     @(#)sys_socket.c        7.3 (Berkeley) %G%
+ *     @(#)sys_socket.c        7.12 (Berkeley) %G%
  */
 
 #include "param.h"
 #include "systm.h"
  */
 
 #include "param.h"
 #include "systm.h"
-#include "dir.h"
-#include "user.h"
 #include "file.h"
 #include "mbuf.h"
 #include "protosw.h"
 #include "socket.h"
 #include "socketvar.h"
 #include "ioctl.h"
 #include "file.h"
 #include "mbuf.h"
 #include "protosw.h"
 #include "socket.h"
 #include "socketvar.h"
 #include "ioctl.h"
-#include "uio.h"
 #include "stat.h"
 
 #include "stat.h"
 
-#include "../net/if.h"
-#include "../net/route.h"
+#include "net/if.h"
+#include "net/route.h"
 
 
-int    soo_rw(), soo_ioctl(), soo_select(), soo_close();
 struct fileops socketops =
 struct fileops socketops =
-    { soo_rw, soo_ioctl, soo_select, soo_close };
+    { soo_read, soo_write, soo_ioctl, soo_select, soo_close };
 
 
-soo_rw(fp, rw, uio)
+/* ARGSUSED */
+soo_read(fp, uio, cred)
        struct file *fp;
        struct file *fp;
-       enum uio_rw rw;
        struct uio *uio;
        struct uio *uio;
+       struct ucred *cred;
 {
 {
-       int soreceive(), sosend();
 
 
-       return (
-           (*(rw==UIO_READ?soreceive:sosend))
-             ((struct socket *)fp->f_data, 0, uio, 0, 0));
+       return (soreceive((struct socket *)fp->f_data, (struct mbuf **)0,
+               uio, (struct mbuf **)0, (struct mbuf **)0, (int *)0));
 }
 
 }
 
-soo_ioctl(fp, cmd, data)
+/* ARGSUSED */
+soo_write(fp, uio, cred)
+       struct file *fp;
+       struct uio *uio;
+       struct ucred *cred;
+{
+
+       return (sosend((struct socket *)fp->f_data, (struct mbuf *)0,
+               uio, (struct mbuf *)0, (struct mbuf *)0, 0));
+}
+
+soo_ioctl(fp, cmd, data, p)
        struct file *fp;
        int cmd;
        register caddr_t data;
        struct file *fp;
        int cmd;
        register caddr_t data;
+       struct proc *p;
 {
        register struct socket *so = (struct socket *)fp->f_data;
 
 {
        register struct socket *so = (struct socket *)fp->f_data;
 
@@ -66,10 +63,15 @@ soo_ioctl(fp, cmd, data)
                return (0);
 
        case FIOASYNC:
                return (0);
 
        case FIOASYNC:
-               if (*(int *)data)
+               if (*(int *)data) {
                        so->so_state |= SS_ASYNC;
                        so->so_state |= SS_ASYNC;
-               else
+                       so->so_rcv.sb_flags |= SB_ASYNC;
+                       so->so_snd.sb_flags |= SB_ASYNC;
+               } else {
                        so->so_state &= ~SS_ASYNC;
                        so->so_state &= ~SS_ASYNC;
+                       so->so_rcv.sb_flags &= ~SB_ASYNC;
+                       so->so_snd.sb_flags &= ~SB_ASYNC;
+               }
                return (0);
 
        case FIONREAD:
                return (0);
 
        case FIONREAD:
@@ -77,11 +79,11 @@ soo_ioctl(fp, cmd, data)
                return (0);
 
        case SIOCSPGRP:
                return (0);
 
        case SIOCSPGRP:
-               so->so_pgrp = *(int *)data;
+               so->so_pgid = *(int *)data;
                return (0);
 
        case SIOCGPGRP:
                return (0);
 
        case SIOCGPGRP:
-               *(int *)data = so->so_pgrp;
+               *(int *)data = so->so_pgid;
                return (0);
 
        case SIOCATMARK:
                return (0);
 
        case SIOCATMARK:
@@ -93,18 +95,18 @@ soo_ioctl(fp, cmd, data)
         * interface and routing ioctls should have a
         * different entry since a socket's unnecessary
         */
         * interface and routing ioctls should have a
         * different entry since a socket's unnecessary
         */
-#define        cmdbyte(x)      (((x) >> 8) & 0xff)
-       if (cmdbyte(cmd) == 'i')
-               return (ifioctl(so, cmd, data));
-       if (cmdbyte(cmd) == 'r')
-               return (rtioctl(cmd, data));
+       if (IOCGROUP(cmd) == 'i')
+               return (ifioctl(so, cmd, data, p));
+       if (IOCGROUP(cmd) == 'r')
+               return (rtioctl(cmd, data, p));
        return ((*so->so_proto->pr_usrreq)(so, PRU_CONTROL, 
            (struct mbuf *)cmd, (struct mbuf *)data, (struct mbuf *)0));
 }
 
        return ((*so->so_proto->pr_usrreq)(so, PRU_CONTROL, 
            (struct mbuf *)cmd, (struct mbuf *)data, (struct mbuf *)0));
 }
 
-soo_select(fp, which)
+soo_select(fp, which, p)
        struct file *fp;
        int which;
        struct file *fp;
        int which;
+       struct proc *p;
 {
        register struct socket *so = (struct socket *)fp->f_data;
        register int s = splnet();
 {
        register struct socket *so = (struct socket *)fp->f_data;
        register int s = splnet();
@@ -116,7 +118,7 @@ soo_select(fp, which)
                        splx(s);
                        return (1);
                }
                        splx(s);
                        return (1);
                }
-               sbselqueue(&so->so_rcv);
+               sbselqueue(&so->so_rcv, p);
                break;
 
        case FWRITE:
                break;
 
        case FWRITE:
@@ -124,7 +126,7 @@ soo_select(fp, which)
                        splx(s);
                        return (1);
                }
                        splx(s);
                        return (1);
                }
-               sbselqueue(&so->so_snd);
+               sbselqueue(&so->so_snd, p);
                break;
 
        case 0:
                break;
 
        case 0:
@@ -133,27 +135,29 @@ soo_select(fp, which)
                        splx(s);
                        return (1);
                }
                        splx(s);
                        return (1);
                }
-               sbselqueue(&so->so_rcv);
+               sbselqueue(&so->so_rcv, p);
                break;
        }
        splx(s);
        return (0);
 }
 
                break;
        }
        splx(s);
        return (0);
 }
 
-/*ARGSUSED*/
 soo_stat(so, ub)
        register struct socket *so;
        register struct stat *ub;
 {
 
        bzero((caddr_t)ub, sizeof (*ub));
 soo_stat(so, ub)
        register struct socket *so;
        register struct stat *ub;
 {
 
        bzero((caddr_t)ub, sizeof (*ub));
+       ub->st_mode = S_IFSOCK;
        return ((*so->so_proto->pr_usrreq)(so, PRU_SENSE,
            (struct mbuf *)ub, (struct mbuf *)0, 
            (struct mbuf *)0));
 }
 
        return ((*so->so_proto->pr_usrreq)(so, PRU_SENSE,
            (struct mbuf *)ub, (struct mbuf *)0, 
            (struct mbuf *)0));
 }
 
-soo_close(fp)
+/* ARGSUSED */
+soo_close(fp, p)
        struct file *fp;
        struct file *fp;
+       struct proc *p;
 {
        int error = 0;
 
 {
        int error = 0;