root/kern/sys_socket.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. soo_read
  2. soo_write
  3. soo_ioctl
  4. soo_poll
  5. soo_stat
  6. soo_close

    1 /*      $OpenBSD: sys_socket.c,v 1.11 2007/02/26 23:53:33 kurt Exp $    */
    2 /*      $NetBSD: sys_socket.c,v 1.13 1995/08/12 23:59:09 mycroft Exp $  */
    3 
    4 /*
    5  * Copyright (c) 1982, 1986, 1990, 1993
    6  *      The Regents of the University of California.  All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  * 3. Neither the name of the University nor the names of its contributors
   17  *    may be used to endorse or promote products derived from this software
   18  *    without specific prior written permission.
   19  *
   20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   30  * SUCH DAMAGE.
   31  *
   32  *      @(#)sys_socket.c        8.1 (Berkeley) 6/10/93
   33  */
   34 
   35 #include <sys/param.h>
   36 #include <sys/systm.h>
   37 #include <sys/file.h>
   38 #include <sys/proc.h>
   39 #include <sys/mbuf.h>
   40 #include <sys/protosw.h>
   41 #include <sys/socket.h>
   42 #include <sys/socketvar.h>
   43 #include <sys/ioctl.h>
   44 #include <sys/poll.h>
   45 #include <sys/stat.h>
   46 
   47 #include <net/if.h>
   48 #include <net/route.h>
   49 
   50 struct  fileops socketops = {
   51         soo_read, soo_write, soo_ioctl, soo_poll, soo_kqfilter,
   52         soo_stat, soo_close
   53 };
   54 
   55 /* ARGSUSED */
   56 int
   57 soo_read(struct file *fp, off_t *poff, struct uio *uio, struct ucred *cred)
   58 {
   59 
   60         return (soreceive((struct socket *)fp->f_data, (struct mbuf **)0,
   61                 uio, (struct mbuf **)0, (struct mbuf **)0, (int *)0));
   62 }
   63 
   64 /* ARGSUSED */
   65 int
   66 soo_write(struct file *fp, off_t *poff, struct uio *uio, struct ucred *cred)
   67 {
   68 
   69         return (sosend((struct socket *)fp->f_data, (struct mbuf *)0,
   70                 uio, (struct mbuf *)0, (struct mbuf *)0, 0));
   71 }
   72 
   73 int
   74 soo_ioctl(struct file *fp, u_long cmd, caddr_t data, struct proc *p)
   75 {
   76         struct socket *so = (struct socket *)fp->f_data;
   77 
   78         switch (cmd) {
   79 
   80         case FIONBIO:
   81                 if (*(int *)data)
   82                         so->so_state |= SS_NBIO;
   83                 else
   84                         so->so_state &= ~SS_NBIO;
   85                 return (0);
   86 
   87         case FIOASYNC:
   88                 if (*(int *)data) {
   89                         so->so_state |= SS_ASYNC;
   90                         so->so_rcv.sb_flags |= SB_ASYNC;
   91                         so->so_snd.sb_flags |= SB_ASYNC;
   92                 } else {
   93                         so->so_state &= ~SS_ASYNC;
   94                         so->so_rcv.sb_flags &= ~SB_ASYNC;
   95                         so->so_snd.sb_flags &= ~SB_ASYNC;
   96                 }
   97                 return (0);
   98 
   99         case FIONREAD:
  100                 *(int *)data = so->so_rcv.sb_datacc;
  101                 return (0);
  102 
  103         case SIOCSPGRP:
  104                 so->so_pgid = *(int *)data;
  105                 so->so_siguid = p->p_cred->p_ruid;
  106                 so->so_sigeuid = p->p_ucred->cr_uid;
  107                 return (0);
  108 
  109         case SIOCGPGRP:
  110                 *(int *)data = so->so_pgid;
  111                 return (0);
  112 
  113         case SIOCATMARK:
  114                 *(int *)data = (so->so_state&SS_RCVATMARK) != 0;
  115                 return (0);
  116         }
  117         /*
  118          * Interface/routing/protocol specific ioctls:
  119          * interface and routing ioctls should have a
  120          * different entry since a socket's unnecessary
  121          */
  122         if (IOCGROUP(cmd) == 'i')
  123                 return (ifioctl(so, cmd, data, p));
  124         if (IOCGROUP(cmd) == 'r')
  125                 return (rtioctl(cmd, data, p));
  126         return ((*so->so_proto->pr_usrreq)(so, PRU_CONTROL, 
  127             (struct mbuf *)cmd, (struct mbuf *)data, (struct mbuf *)0));
  128 }
  129 
  130 int
  131 soo_poll(struct file *fp, int events, struct proc *p)
  132 {
  133         struct socket *so = (struct socket *)fp->f_data;
  134         int revents = 0;
  135         int s = splsoftnet();
  136 
  137         if (events & (POLLIN | POLLRDNORM)) {
  138                 if (soreadable(so))
  139                         revents |= events & (POLLIN | POLLRDNORM);
  140         }
  141         if (events & (POLLOUT | POLLWRNORM)) {
  142                 if (sowriteable(so))
  143                         revents |= events & (POLLOUT | POLLWRNORM);
  144         }
  145         if (events & (POLLPRI | POLLRDBAND)) {
  146                 if (so->so_oobmark || (so->so_state & SS_RCVATMARK))
  147                         revents |= events & (POLLPRI | POLLRDBAND);
  148         }
  149         if (revents == 0) {
  150                 if (events & (POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND)) {
  151                         selrecord(p, &so->so_rcv.sb_sel);
  152                         so->so_rcv.sb_flags |= SB_SEL;
  153                 }
  154                 if (events & (POLLOUT | POLLWRNORM)) {
  155                         selrecord(p, &so->so_snd.sb_sel);
  156                         so->so_snd.sb_flags |= SB_SEL;
  157                 }
  158         }
  159         splx(s);
  160         return (revents);
  161 }
  162 
  163 int
  164 soo_stat(struct file *fp, struct stat *ub, struct proc *p)
  165 {
  166         struct socket *so = (struct socket *)fp->f_data;
  167 
  168         bzero((caddr_t)ub, sizeof (*ub));
  169         ub->st_mode = S_IFSOCK;
  170         return ((*so->so_proto->pr_usrreq)(so, PRU_SENSE,
  171             (struct mbuf *)ub, (struct mbuf *)0, 
  172             (struct mbuf *)0));
  173 }
  174 
  175 /* ARGSUSED */
  176 int
  177 soo_close(struct file *fp, struct proc *p)
  178 {
  179         int error = 0;
  180 
  181         if (fp->f_data)
  182                 error = soclose((struct socket *)fp->f_data);
  183         fp->f_data = 0;
  184         return (error);
  185 }

/* [<][>][^][v][top][bottom][index][help] */