The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/kern/sys_socket.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: 46c58cfaabeb6d092cf7193f74a6848b


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.