mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-11-03 20:53:13 +03:00 
			
		
		
		
	2002-05-11 Jakub Jelinek <jakub@redhat.com> * include/netinet/in.h (bindresvport_internal): Add prototype. * include/rpc/auth.h (authunix_create_internal, authunix_create_default_internal, authnone_create_internal, authdes_pk_create_internal): Add prototypes. * include/rpc/clnt.h (clnt_create_internal, clnttcp_create_internal, clntudp_create_internal, clntudp_bufcreate_internal, clntunix_create_internal): Add prototypes. * include/rpc/svc.h (svc_sendreply_internal, svcerr_decode_internal, svc_getreq_internal, svc_getreq_common_internal, svc_getreqset_internal, svc_getreq_poll_internal, svc_register_internal, svc_unregister_internal, svcudp_create_internal, svcudp_bufcreate_internal): Add prototypes. * include/rpc/svc_auth.h (_authenticate_internal): Add prototype. * include/sys/socket.h (__sendto, __recvfrom, __sendmsg, __recvmsg, __setsockopt, __getsockname, __bind, __listen): Add prototypes. * inet/rexec.c (rexec_af): Use __listen and __getsockname. * inet/rcmd.c (rcmd_af): Use __listen. (rresvport_af): Use __bind. * sunrpc/clnt_udp.c: Use INTUSE calls to bindresvport, authunix_create, authunix_create_default, authnone_create, authdes_pk_create, clnt_create, clnttcp_create, clntudp_create, clntudp_bufcreate, clntunix_create svc_sendreply, svcerr_decode, svc_getreq, svc_getreq_common, svc_getreqset, svc_getreq_poll, svc_register, svc_unregister, svcudp_create, svcudp_bufcreate, _authenticate, add INTDEF after such function definitions. Use __listen, __bind, __sendto, __recvfrom, __sendmsg, __recvmsg, __setsockopt, __getsockname instead of non-__ variants. * sunrpc/pmap_rmt.c: Likewise. * sunrpc/rtime.c: Likewise. * sunrpc/svc_udp.c: Likewise. * sunrpc/clnt_unix.c: Likewise. * sunrpc/svc_unix.c: Likewise. * sunrpc/bindrsvprt.c: Likewise. * sunrpc/svc_tcp.c: Likewise. * sunrpc/auth_none.c: Likewise. * sunrpc/clnt_raw.c: Likewise. * sunrpc/clnt_tcp.c: Likewise. * sunrpc/auth_unix.c: Likewise. * sunrpc/key_call.c: Likewise. * sunrpc/clnt_gen.c: Likewise. * sunrpc/pm_getmaps.c: Likewise. * sunrpc/clnt_simp.c: Likewise. * sunrpc/pmap_clnt.c: Likewise. * sunrpc/svc_run.c: Likewise. * sunrpc/svc.c: Likewise. * sunrpc/svc_simple.c: Likewise. * sunrpc/pm_getport.c: Likewise. * sunrpc/auth_des.c: Likewise. * sunrpc/svc_auth.c: Likewise. * sysdeps/generic/unwind-dw2-fde.c (__register_frame_info_bases, __register_frame_info_table_bases, __deregister_frame_info_bases): Add INTDEF. (__register_frame_info_bases_internal, __register_frame_info_table_bases_internal, __deregister_frame_info_bases_internal): Add prototypes. (__register_frame_info, __register_frame): Use INTUSE in call to __register_frame_info_bases. (__register_frame_info_table): Similarly. (__deregister_frame_info, __deregister_frame): Similarly. * sysdeps/generic/sendto.c (__sendto): Renamed from sendto, add sendto as weak alias. * sysdeps/mach/hurd/sendto.c: Likewise. * sysdeps/generic/recvfrom.c (__recvfrom): Renamed from recvfrom, add recvfrom as weak alias. * sysdeps/mach/hurd/recvfrom.c: Likewise. * sysdeps/unix/sysv/aix/recvfrom.c: Likewise. * sysdeps/generic/recvmsg.c (__recvmsg): Renamed from recvmsg, add recvmsg as weak alias. * sysdeps/unix/sysv/aix/recvmsg.c: Likewise. * sysdeps/generic/sendmsg.c (__sendmsg): Renamed from sendmsg, add sendmsg as weak alias. * sysdeps/unix/sysv/aix/sendmsg.c: Likewise. * sysdeps/generic/setsockopt.c (__setsockopt): Renamed from setsockopt, add setsockopt as weak alias. * sysdeps/mach/hurd/setsockopt.c: Likewise. * sysdeps/generic/bind.c (__bind): Renamed from bind, add bind as weak alias. * sysdeps/mach/hurd/bind.c: Likewise. * sysdeps/generic/listen.c (__listen): Renamed from listen, add listen as weak alias. * sysdeps/mach/hurd/listen.c: Likewise. * sysdeps/generic/getsockname.c (__getsockname): Renamed from getsockname, add getsockname as weak alias. * sysdeps/mach/hurd/getsockname.c: Likewise. * sysdeps/unix/sysv/aix/getsockname.c: Likewise. * sysdeps/mach/hurd/recvmsg.c (__recvmsg): Add weak alias. * sysdeps/mach/hurd/sendmsg.c (__sendmsg): Add weak alias. * sysdeps/unix/inet/syscalls.list (__bind, __listen, __recvmsg, __recvfrom, __sendmsg, __sendto, __setsockopt): Add aliases. * sysdeps/unix/sysv/linux/alpha/syscalls.list (__recvmsg, __sendmsg): Add aliases. * sysdeps/unix/sysv/linux/ia64/syscalls.list: Likewise. * sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list: Likewise. * sysdeps/unix/sysv/linux/hppa/syscalls.list: Likewise. * sysdeps/unix/sysv/linux/x86_64/syscalls.list: Likewise. * sysdeps/unix/sysv/linux/recvfrom.S (__recvfrom): Add weak alias. * sysdeps/unix/sysv/linux/recvmsg.S (__recvmsg): Likewise. * sysdeps/unix/sysv/linux/sendmsg.S (__sendmsg): Likewise. * sysdeps/unix/sysv/linux/sendto.S (__sendto): Likewise. * sysdeps/unix/sysv/linux/setsockopt.S (__setsockopt): Likewise. * sysdeps/unix/sysv/linux/bind.S (__bind): Likewise. * sysdeps/unix/sysv/linux/listen.S (__listen): Likewise. * sysdeps/unix/sysv/linux/getsockname.S (__getsockname): Likewise. 2002-05-10 Jakub Jelinek <jakub@redhat.com> * locale/programs/localedef.h (show_archive_content): Add verbose argument. * locale/programs/localedef.c (main): Adjust caller. * locale/programs/locarchive.c (struct nameent, struct dataent): New. (nameentcmp, dataentcmp): New functions. (xstrcmp): Remove. (show_archive_content): Print verbose listing with --list-archive -v. * locale/programs/locarchive.c (open_archive): Take extra argument readonly. If true open file with O_RDONLY and don't create the archive if it doesn't exist. Adapt all callers. (close_archive): Don't do anything if fd element is -1. * locale/programs/localedef.h (open_archive): Adjust prototype. * locale/programs/locfile.c (write_all_categories): Adjust open_archive call. * malloc/malloc.c (__posix_memalign): Correct check for size of alignment value [PR libc/3444].
		
			
				
	
	
		
			126 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* Copyright (C) 1992,94,95,96,97,98,2001,02 Free Software Foundation, Inc.
 | 
						|
   This file is part of the GNU C Library.
 | 
						|
 | 
						|
   The GNU C Library is free software; you can redistribute it and/or
 | 
						|
   modify it under the terms of the GNU Lesser General Public
 | 
						|
   License as published by the Free Software Foundation; either
 | 
						|
   version 2.1 of the License, or (at your option) any later version.
 | 
						|
 | 
						|
   The GNU C Library is distributed in the hope that it will be useful,
 | 
						|
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						|
   Lesser General Public License for more details.
 | 
						|
 | 
						|
   You should have received a copy of the GNU Lesser General Public
 | 
						|
   License along with the GNU C Library; if not, write to the Free
 | 
						|
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 | 
						|
   02111-1307 USA.  */
 | 
						|
 | 
						|
#include <errno.h>
 | 
						|
#include <sys/socket.h>
 | 
						|
#include <hurd.h>
 | 
						|
#include <hurd/fd.h>
 | 
						|
#include <hurd/socket.h>
 | 
						|
#include <hurd/paths.h>
 | 
						|
#include <fcntl.h>
 | 
						|
#include <stddef.h>
 | 
						|
#include <hurd/ifsock.h>
 | 
						|
#include <sys/un.h>
 | 
						|
#include <string.h>
 | 
						|
 | 
						|
/* Give the socket FD the local address ADDR (which is LEN bytes long).  */
 | 
						|
int
 | 
						|
__bind  (int fd, __CONST_SOCKADDR_ARG addrarg, socklen_t len)
 | 
						|
{
 | 
						|
  addr_port_t aport;
 | 
						|
  error_t err;
 | 
						|
  const struct sockaddr_un *addr = addrarg.__sockaddr_un__;
 | 
						|
 | 
						|
  if (addr->sun_family == AF_LOCAL)
 | 
						|
    {
 | 
						|
      /* For the local domain, we must create a node in the filesystem
 | 
						|
	 using the ifsock translator and then fetch the address from it.  */
 | 
						|
      file_t dir, node;
 | 
						|
      char name[len - offsetof (struct sockaddr_un, sun_path) + 1], *n;
 | 
						|
 | 
						|
      strncpy (name, addr->sun_path, sizeof name - 1);
 | 
						|
      name[sizeof name - 1] = '\0'; /* Make sure */
 | 
						|
 | 
						|
      dir = __file_name_split (name, &n);
 | 
						|
      if (dir == MACH_PORT_NULL)
 | 
						|
	return -1;
 | 
						|
 | 
						|
      /* Create a new, unlinked node in the target directory.  */
 | 
						|
      err = __dir_mkfile (dir, O_CREAT, 0666 & ~_hurd_umask, &node);
 | 
						|
 | 
						|
      if (! err)
 | 
						|
	{
 | 
						|
	  /* Set the node's translator to make it a local-domain socket.  */
 | 
						|
	  err = __file_set_translator (node,
 | 
						|
				       FS_TRANS_EXCL | FS_TRANS_SET,
 | 
						|
				       FS_TRANS_EXCL | FS_TRANS_SET, 0,
 | 
						|
				       _HURD_IFSOCK, sizeof _HURD_IFSOCK,
 | 
						|
				       MACH_PORT_NULL,
 | 
						|
				       MACH_MSG_TYPE_COPY_SEND);
 | 
						|
	  if (! err)
 | 
						|
	    {
 | 
						|
	      /* Link the node, now a socket, into the target directory.  */
 | 
						|
	      err = __dir_link (dir, node, n, 1);
 | 
						|
	      if (err == EEXIST)
 | 
						|
		err = EADDRINUSE;
 | 
						|
	    }
 | 
						|
	  __mach_port_deallocate (__mach_task_self (), node);
 | 
						|
	  if (! err)
 | 
						|
	    {
 | 
						|
	      /* Get a port to the ifsock translator.  */
 | 
						|
	      file_t ifsock = __file_name_lookup_under (dir, n, 0, 0);
 | 
						|
	      if (ifsock == MACH_PORT_NULL)
 | 
						|
		{
 | 
						|
		  err = errno;
 | 
						|
		  /* If we failed, get rid of the node we created.  */
 | 
						|
		  __dir_unlink (dir, n);
 | 
						|
		}
 | 
						|
	      else
 | 
						|
		{
 | 
						|
		  /* Get the address port.  */
 | 
						|
		  err = __ifsock_getsockaddr (ifsock, &aport);
 | 
						|
		  if (err == MIG_BAD_ID || err == EOPNOTSUPP)
 | 
						|
		    /* We are not talking to /hurd/ifsock.  Probably
 | 
						|
		       someone came in after we linked our node, unlinked
 | 
						|
		       it, and replaced it with a different node, before we
 | 
						|
		       did our lookup.  Treat it as if our link had failed
 | 
						|
		       with EEXIST.  */
 | 
						|
		    err = EADDRINUSE;
 | 
						|
		}
 | 
						|
	      __mach_port_deallocate (__mach_task_self (), ifsock);
 | 
						|
	    }
 | 
						|
	}
 | 
						|
      __mach_port_deallocate (__mach_task_self (), dir);
 | 
						|
 | 
						|
      if (err)
 | 
						|
	return __hurd_fail (err);
 | 
						|
    }
 | 
						|
  else
 | 
						|
    err = EIEIO;
 | 
						|
 | 
						|
  err = HURD_DPORT_USE (fd,
 | 
						|
			({
 | 
						|
			  if (err)
 | 
						|
			    err = __socket_create_address (port,
 | 
						|
							   addr->sun_family,
 | 
						|
							   (char *) addr, len,
 | 
						|
							   &aport);
 | 
						|
			  if (! err)
 | 
						|
			    {
 | 
						|
			      err = __socket_bind (port, aport);
 | 
						|
			      __mach_port_deallocate (__mach_task_self (),
 | 
						|
						      aport);
 | 
						|
			    }
 | 
						|
			  err;
 | 
						|
			}));
 | 
						|
 | 
						|
  return err ? __hurd_dfail (fd, err) : 0;
 | 
						|
}
 | 
						|
 | 
						|
weak_alias (__bind, bind)
 |