fix bug, wasn't setting timezone
[unix-history] / usr / src / sys / kern / sys_socket.c
index ea38075..2b5afe2 100644 (file)
@@ -1,4 +1,4 @@
-/*     sys_socket.c    4.2     83/06/11        */
+/*     sys_socket.c    6.1     83/07/29        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -16,9 +16,9 @@
 #include "../net/if.h"
 #include "../net/route.h"
 
 #include "../net/if.h"
 #include "../net/route.h"
 
-int    soo_rw(), soo_ioctl(), soo_select(), soo_stat(), soo_close();
+int    soo_rw(), soo_ioctl(), soo_select(), soo_close();
 struct fileops socketops =
 struct fileops socketops =
-    { soo_rw, soo_ioctl, soo_select, soo_stat, soo_close };
+    { soo_rw, soo_ioctl, soo_select, soo_close };
 
 soo_rw(fp, rw, uio)
        struct file *fp;
 
 soo_rw(fp, rw, uio)
        struct file *fp;
@@ -46,59 +46,43 @@ soo_ioctl(fp, cmd, data)
                        so->so_state |= SS_NBIO;
                else
                        so->so_state &= ~SS_NBIO;
                        so->so_state |= SS_NBIO;
                else
                        so->so_state &= ~SS_NBIO;
-               break;
+               return (0);
 
        case FIOASYNC:
                if (*(int *)data)
                        so->so_state |= SS_ASYNC;
                else
                        so->so_state &= ~SS_ASYNC;
 
        case FIOASYNC:
                if (*(int *)data)
                        so->so_state |= SS_ASYNC;
                else
                        so->so_state &= ~SS_ASYNC;
-               break;
+               return (0);
 
        case FIONREAD:
                *(int *)data = so->so_rcv.sb_cc;
 
        case FIONREAD:
                *(int *)data = so->so_rcv.sb_cc;
-               break;
+               return (0);
 
        case SIOCSPGRP:
                so->so_pgrp = *(int *)data;
 
        case SIOCSPGRP:
                so->so_pgrp = *(int *)data;
-               break;
+               return (0);
 
        case SIOCGPGRP:
                *(int *)data = so->so_pgrp;
 
        case SIOCGPGRP:
                *(int *)data = so->so_pgrp;
-               break;
+               return (0);
 
        case SIOCATMARK:
                *(int *)data = (so->so_state&SS_RCVATMARK) != 0;
 
        case SIOCATMARK:
                *(int *)data = (so->so_state&SS_RCVATMARK) != 0;
-               break;
-
-       /* routing table update calls */
-       case SIOCADDRT:
-       case SIOCDELRT:
-               if (!suser())
-                       return (u.u_error);
-               return (rtrequest(cmd, (struct rtentry *)data));
-
-       /* interface parameter requests */
-       case SIOCSIFADDR:
-       case SIOCSIFFLAGS:
-       case SIOCSIFDSTADDR:
-               if (!suser())
-                       return (u.u_error);
-               return (ifrequest(cmd, data));
-
-       case SIOCGIFADDR:
-       case SIOCGIFFLAGS:
-       case SIOCGIFDSTADDR:
-               return (ifrequest(cmd, data));
-
-       case SIOCGIFCONF:
-               return (ifconf(cmd, data));
-
-       /* type/protocol specific ioctls */
-       default:
-               return (ENOTTY);                /* XXX */
+               return (0);
        }
        }
-       return (0);
+       /*
+        * Interface/routing/protocol specific ioctls:
+        * 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(cmd, data));
+       if (cmdbyte(cmd) == 'r')
+               return (rtioctl(cmd, data));
+       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)
@@ -130,12 +114,15 @@ soo_select(fp, which)
        return (0);
 }
 
        return (0);
 }
 
-soo_stat(fp, ub)
-       struct file *fp;
+/*ARGSUSED*/
+soo_stat(so, ub)
+       register struct socket *so;
        register struct stat *ub;
 {
        register struct stat *ub;
 {
-       register struct socket *so = (struct socket *)fp->f_data;
 
 
+#ifdef lint
+       so = so;
+#endif
        bzero((caddr_t)ub, sizeof (*ub));
 #ifdef notdef
        return ((*so->so_proto->pr_usrreq)(so, PRU_SENSE,
        bzero((caddr_t)ub, sizeof (*ub));
 #ifdef notdef
        return ((*so->so_proto->pr_usrreq)(so, PRU_SENSE,
@@ -148,8 +135,10 @@ soo_stat(fp, ub)
 soo_close(fp)
        struct file *fp;
 {
 soo_close(fp)
        struct file *fp;
 {
-       int error = soclose((struct socket *)fp->f_data);
-
+       int error = 0;
+       
+       if (fp->f_data)
+               error = soclose((struct socket *)fp->f_data);
        fp->f_data = 0;
        return (error);
 }
        fp->f_data = 0;
        return (error);
 }