]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/kern/sys_socket.c
xnu-1699.32.7.tar.gz
[apple/xnu.git] / bsd / kern / sys_socket.c
index a508b87ac64ee3c69c04922ad106c9af621cfd0b..431e476587f13bc34e3e50dfd793e5bd8c7ac578 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2007 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2011 Apple Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
@@ -178,7 +178,7 @@ soo_write(struct fileproc *fp, struct uio *uio, __unused int flags,
 
        /* Generation of SIGPIPE can be controlled per socket */
        procp = vfs_context_proc(ctx);
-       if (stat == EPIPE && procp && !(so->so_flags & SOF_NOSIGPIPE))
+       if (stat == EPIPE && !(so->so_flags & SOF_NOSIGPIPE))
                psignal(procp, SIGPIPE);
 
        return (stat);
@@ -187,39 +187,14 @@ soo_write(struct fileproc *fp, struct uio *uio, __unused int flags,
 __private_extern__ int
 soioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
 {
-       struct sockopt sopt;
        int error = 0;
        int dropsockref = -1;
-       
-       socket_lock(so, 1);
 
-       sopt.sopt_level = cmd;
-       sopt.sopt_name = (int)data;
-       sopt.sopt_p = p;
+       socket_lock(so, 1);
 
        /* Call the socket filter's ioctl handler for most ioctls */
        if (IOCGROUP(cmd) != 'i' && IOCGROUP(cmd) != 'r') {
-               int filtered = 0;
-               struct socket_filter_entry *filter;
-
-               for (filter = so->so_filt; filter && error == 0;
-                   filter = filter->sfe_next_onsocket) {
-                       if (filter->sfe_filter->sf_filter.sf_ioctl) {
-                               if (filtered == 0) {
-                                       sflt_use(so);
-                                       socket_unlock(so, 0);
-                                       filtered = 1;
-                               }
-                               error = filter->sfe_filter->sf_filter.
-                                   sf_ioctl(filter->sfe_cookie, so, cmd, data);
-                       }
-               }
-
-               if (filtered) {
-                       socket_lock(so, 0);
-                       sflt_unuse(so);
-               }
-
+               error = sflt_ioctl(so, cmd, data);
                if (error != 0)
                        goto out;
        }
@@ -282,7 +257,7 @@ soioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
                /* Always set socket non-blocking for OT */
                so->so_state |= SS_NBIO;
                so->so_options |= SO_DONTTRUNC | SO_WANTMORE;
-               so->so_flags |= SOF_NOSIGPIPE;
+               so->so_flags |= SOF_NOSIGPIPE | SOF_NPX_SETOPTSHUT;
 
                if (cloned_so && so != cloned_so) {
                        /* Flags options */
@@ -467,7 +442,7 @@ soo_stat(struct socket *so, void *ub, int isstat64)
                        sb64->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH;
                sb64->st_size = so->so_rcv.sb_cc - so->so_rcv.sb_ctl;
                sb64->st_uid = so->so_uid;
-               sb64->st_gid = -1;      /* XXX -- what else to do? */
+               sb64->st_gid = so->so_gid;
        } else {
                sb->st_mode = S_IFSOCK;
                if ((so->so_state & SS_CANTRCVMORE) == 0 ||
@@ -477,7 +452,7 @@ soo_stat(struct socket *so, void *ub, int isstat64)
                        sb->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH;
                sb->st_size = so->so_rcv.sb_cc - so->so_rcv.sb_ctl;
                sb->st_uid = so->so_uid;
-               sb->st_gid = -1;        /* XXX -- what else to do? */
+               sb->st_gid = so->so_gid;
        }
 
        ret = (*so->so_proto->pr_usrreqs->pru_sense)(so, ub, isstat64);