⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bind.c

📁 一个C源代码分析器
💻 C
字号:
/* Copyright (C) 1992, 1994 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/ormodify it under the terms of the GNU Library General Public License aspublished by the Free Software Foundation; either version 2 of theLicense, 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 ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNULibrary General Public License for more details.You should have received a copy of the GNU Library General PublicLicense along with the GNU C Library; see the file COPYING.LIB.  Ifnot, write to the Free Software Foundation, Inc., 675 Mass Ave,Cambridge, MA 02139, USA.  */#include <ansidecl.h>#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).  */intDEFUN(bind, (fd, addr, len),      int fd AND struct sockaddr *addr AND size_t len){  addr_port_t aport;  error_t err;  if (addr->sa_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.  */      struct sockaddr_un *unaddr = (struct sockaddr_un *) addr;      file_t dir, node;      char name[len - offsetof (struct sockaddr_un, sun_path)], *n;      strncpy (name, unaddr->sun_path, sizeof name);      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)	{	  file_t ifsock;	  /* 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)	    /* Get a port to the ifsock translator.  */	    err = __hurd_invoke_translator (node, 0, &ifsock);	  if (! err)	    /* Get the address port.  */	    err = __ifsock_getsockaddr (ifsock, &aport);	  __mach_port_deallocate (__mach_task_self (), ifsock);	  if (! err)	    /* Link the node, now a socket, into the target directory.  */	    err = __dir_link (node, dir, name);	  __mach_port_deallocate (__mach_task_self (), node);	}      __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->sa_family,							   (char *) addr, len,							   &aport, 1);			  if (! err)			    {			      err = __socket_bind (port, aport);			      __mach_port_deallocate (__mach_task_self (),						      aport);			    }			  err;			}));  return err ? __hurd_dfail (fd, err) : 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -