Back to index

glibc  2.9
opensock.c
Go to the documentation of this file.
00001 /* Copyright (C) 1999 Free Software Foundation, Inc.
00002    This file is part of the GNU C Library.
00003 
00004    The GNU C Library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Lesser General Public
00006    License as published by the Free Software Foundation; either
00007    version 2.1 of the License, or (at your option) any later version.
00008 
00009    The GNU C Library is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012    Lesser General Public License for more details.
00013 
00014    You should have received a copy of the GNU Lesser General Public
00015    License along with the GNU C Library; if not, write to the Free
00016    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
00017    02111-1307 USA.  */
00018 
00019 #include <stdio.h>
00020 #include <sys/socket.h>
00021 #include <bits/libc-lock.h>
00022 
00023 /* Return a socket of any type.  The socket can be used in subsequent
00024    ioctl calls to talk to the kernel.  */
00025 int internal_function
00026 __opensock (void)
00027 {
00028   /* Cache the last AF that worked, to avoid many redundant calls to
00029      socket().  */
00030   static int sock_af = -1;
00031   int fd = -1;
00032   __libc_lock_define_initialized (static, lock);
00033 
00034   if (sock_af != -1)
00035     {
00036       fd = __socket (sock_af, SOCK_DGRAM, 0);
00037       if (fd != -1)
00038         return fd;
00039     }
00040 
00041   __libc_lock_lock (lock);
00042 
00043   if (sock_af != -1)
00044     fd = __socket (sock_af, SOCK_DGRAM, 0);
00045 
00046   if (fd == -1)
00047     {
00048 #ifdef AF_INET
00049       fd = __socket (sock_af = AF_INET, SOCK_DGRAM, 0);
00050 #endif
00051 #ifdef AF_INET6
00052       if (fd < 0)
00053        fd = __socket (sock_af = AF_INET6, SOCK_DGRAM, 0);
00054 #endif
00055 #ifdef AF_IPX
00056       if (fd < 0)
00057        fd = __socket (sock_af = AF_IPX, SOCK_DGRAM, 0);
00058 #endif
00059 #ifdef AF_AX25
00060       if (fd < 0)
00061        fd = __socket (sock_af = AF_AX25, SOCK_DGRAM, 0);
00062 #endif
00063 #ifdef AF_APPLETALK
00064       if (fd < 0)
00065        fd = __socket (sock_af = AF_APPLETALK, SOCK_DGRAM, 0);
00066 #endif
00067     }
00068 
00069   __libc_lock_unlock (lock);
00070   return fd;
00071 }