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

📄 net.cc

📁 cygwin, 著名的在win32下模拟unix操作系统的东东
💻 CC
📖 第 1 页 / 共 4 页
字号:
      if (RegQueryValueEx (ifkey, "Driver", 0,			   NULL, (unsigned char *) driver,			   (size = sizeof driver, &size)) != ERROR_SUCCESS)	{	  RegCloseKey (ifkey);	  continue;	}      strcpy (classname, "System\\CurrentControlSet\\Services\\Class\\");      strcat (classname, driver);      if ((res = RegOpenKeyEx (HKEY_LOCAL_MACHINE, classname,			       0, KEY_READ, &subkey)) != ERROR_SUCCESS)	{	  RegCloseKey (ifkey);	  continue;	}      if (RegQueryValueEx (subkey, "IPAddress", 0,			   NULL, (unsigned char *) ip,			   (size = sizeof ip, &size)) == ERROR_SUCCESS	  && RegQueryValueEx (subkey, "IPMask", 0,			      NULL, (unsigned char *) np,			      (size = sizeof np, &size)) == ERROR_SUCCESS)	{	  if ((caddr_t)++ ifr > ifc->ifc_buf	      + ifc->ifc_len - sizeof (struct ifreq))	    goto out;	  switch (what)	    {	      case SIOCGIFCONF:	      case SIOCGIFADDR:		sa = (struct sockaddr_in *) &ifr->ifr_addr;		sa->sin_addr.s_addr = cygwin_inet_addr (ip);		sa->sin_family = AF_INET;		sa->sin_port = 0;		break;	      case SIOCGIFBRDADDR:		lip = cygwin_inet_addr (ip);		lnp = cygwin_inet_addr (np);		sa = (struct sockaddr_in *) &ifr->ifr_broadaddr;		sa->sin_addr.s_addr = lip & lnp | ~lnp;		sa->sin_family = AF_INET;		sa->sin_port = 0;		break;	      case SIOCGIFNETMASK:		sa = (struct sockaddr_in *) &ifr->ifr_netmask;		sa->sin_addr.s_addr = cygwin_inet_addr (np);		sa->sin_family = AF_INET;		sa->sin_port = 0;		break;	      case SIOCGIFHWADDR:		so = &ifr->ifr_hwaddr;		memset (so->sa_data, 0, IFHWADDRLEN);		so->sa_family = AF_INET;		break;	      case SIOCGIFMETRIC:		ifr->ifr_metric = 1;		break;	      case SIOCGIFMTU:		ifr->ifr_mtu = 1500;		break;	    }	}      RegCloseKey (subkey);      strcpy (netname, "System\\CurrentControlSet\\Services\\Class\\Net\\");      strcat (netname, ifname);      if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, netname,			0, KEY_READ, &subkey) != ERROR_SUCCESS)	{	  RegCloseKey (ifkey);	  --ifr;	  continue;	}      if (RegQueryValueEx (subkey, "AdapterName", 0,			   NULL, (unsigned char *) adapter,			   (size = sizeof adapter, &size)) == ERROR_SUCCESS	  && strcasematch (adapter, "MS$PPP"))	{	  ++*ppp;	  strcpy (ifr->ifr_name, "ppp");	  strcat (ifr->ifr_name, ppp);	}      else	{	  ++*eth;	  strcpy (ifr->ifr_name, "eth");	  strcat (ifr->ifr_name, eth);	}      RegCloseKey (subkey);      RegCloseKey (ifkey);      ++cnt;    }out:  RegCloseKey (key);  /* Set the correct length */  ifc->ifc_len = cnt * sizeof (struct ifreq);}intget_ifconf (struct ifconf *ifc, int what){  unsigned long lip, lnp;  struct sockaddr_in *sa;  sig_dispatch_pending (0);  sigframe thisframe (mainthread);  if (check_null_invalid_struct_errno (ifc))    return -1;  /* Union maps buffer to correct struct */  struct ifreq *ifr = ifc->ifc_req;  /* Ensure we have space for two struct ifreqs, fail if not. */  if (ifc->ifc_len < (int) (2 * sizeof (struct ifreq)))    {      set_errno (EFAULT);      return -1;    }  /* Set up interface lo0 first */  strcpy (ifr->ifr_name, "lo");  memset (&ifr->ifr_addr, '\0', sizeof (ifr->ifr_addr));  switch (what)    {      case SIOCGIFCONF:      case SIOCGIFADDR:	sa = (struct sockaddr_in *) &ifr->ifr_addr;	sa->sin_addr.s_addr = htonl (INADDR_LOOPBACK);	sa->sin_family = AF_INET;	sa->sin_port = 0;	break;      case SIOCGIFBRDADDR:	lip = htonl (INADDR_LOOPBACK);	lnp = cygwin_inet_addr ("255.0.0.0");	sa = (struct sockaddr_in *) &ifr->ifr_broadaddr;	sa->sin_addr.s_addr = lip & lnp | ~lnp;	sa->sin_family = AF_INET;	sa->sin_port = 0;	break;      case SIOCGIFNETMASK:	sa = (struct sockaddr_in *) &ifr->ifr_netmask;	sa->sin_addr.s_addr = cygwin_inet_addr ("255.0.0.0");	sa->sin_family = AF_INET;	sa->sin_port = 0;	break;      case SIOCGIFHWADDR:	ifr->ifr_hwaddr.sa_family = AF_INET;	memset (ifr->ifr_hwaddr.sa_data, 0, IFHWADDRLEN);	break;      case SIOCGIFMETRIC:	ifr->ifr_metric = 1;	break;      case SIOCGIFMTU:	/* This funny value is returned by `ifconfig lo' on Linux 2.2 kernel. */	ifr->ifr_mtu = 3924;	break;      default:	set_errno (EINVAL);	return -1;    }  OSVERSIONINFO os_version_info;  memset (&os_version_info, 0, sizeof os_version_info);  os_version_info.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);  GetVersionEx (&os_version_info);  if (wincap.has_ip_helper_lib ())    get_2k_ifconf (ifc, what);  else if (wincap.is_winnt ())    get_nt_ifconf (ifc, what);  else    get_95_ifconf (ifc, what);  return 0;}/* exported as rcmd: standards? */extern "C" intcygwin_rcmd (char **ahost, unsigned short inport, char *locuser,	     char *remuser, char *cmd, int *fd2p){  int res = -1;  SOCKET fd2s;  sig_dispatch_pending (0);  sigframe thisframe (mainthread);  if (check_null_invalid_struct_errno (ahost) ||      check_null_empty_str_errno (*ahost) ||      (locuser && check_null_empty_str_errno (locuser)) ||      (remuser && check_null_str_errno (remuser)))    return (int) INVALID_SOCKET;  cygheap_fdnew res_fd;  if (res_fd < 0)    goto done;  if (fd2p)    {      cygheap_fdnew newfd (res_fd, false);      if (*fd2p < 0)	goto done;      *fd2p = newfd;    }  res = rcmd (ahost, inport, locuser, remuser, cmd, fd2p ? &fd2s : NULL);  if (res == (int) INVALID_SOCKET)    goto done;  else    {      fdsock (res_fd, "/dev/tcp", res);      res = res_fd;    }  if (fd2p)    fdsock (*fd2p, "/dev/tcp", fd2s);done:  syscall_printf ("%d = rcmd (...)", res);  return res;}/* exported as rresvport: standards? */extern "C" intcygwin_rresvport (int *port){  int res;  sig_dispatch_pending (0);  sigframe thisframe (mainthread);  if (check_null_invalid_struct_errno (port))    return -1;  cygheap_fdnew res_fd;  if (res_fd < 0)    res = -1;  else    {      res = rresvport (port);      if (res != (int) INVALID_SOCKET)	{	  fdsock (res_fd, "/dev/tcp", res);	  res = res_fd;	}    }  syscall_printf ("%d = rresvport (%d)", res, port ? *port : 0);  return res;}/* exported as rexec: standards? */extern "C" intcygwin_rexec (char **ahost, unsigned short inport, char *locuser,	      char *password, char *cmd, int *fd2p){  int res = -1;  SOCKET fd2s;  sig_dispatch_pending (0);  sigframe thisframe (mainthread);  if (check_null_invalid_struct_errno (ahost) ||      check_null_empty_str_errno (*ahost) ||      (locuser && check_null_empty_str_errno (locuser)) ||      (password && check_null_str_errno (password)))    return (int) INVALID_SOCKET;  cygheap_fdnew res_fd;  if (res_fd < 0)    goto done;  if (fd2p)    {      cygheap_fdnew newfd (res_fd);      if (newfd < 0)	goto done;      *fd2p = newfd;    }  res = rexec (ahost, inport, locuser, password, cmd, fd2p ? &fd2s : NULL);  if (res == (int) INVALID_SOCKET)    goto done;  else    {      fdsock (res_fd, "/dev/tcp", res);      res = res_fd;    }  if (fd2p)    fdsock (*fd2p, "/dev/tcp", fd2s);done:  syscall_printf ("%d = rexec (...)", res);  return res;}/* socketpair: standards? *//* Win32 supports AF_INET only, so ignore domain and protocol arguments */extern "C" intsocketpair (int family, int type, int protocol, int *sb){  int res = -1;  SOCKET insock, outsock, newsock;  struct sockaddr_in sock_in, sock_out;  int len;  cygheap_fdnew sb0;  fhandler_socket *fh;  sig_dispatch_pending (0);  sigframe thisframe (mainthread);  if (__check_null_invalid_struct_errno (sb, 2 * sizeof (int)))    return -1;  if (family != AF_LOCAL && family != AF_INET)    {      set_errno (EAFNOSUPPORT);      goto done;    }  if (type != SOCK_STREAM && type != SOCK_DGRAM)    {      set_errno (EPROTOTYPE);      goto done;    }  if ((family == AF_LOCAL && protocol != PF_UNSPEC && protocol != PF_LOCAL)      || (family == AF_INET && protocol != PF_UNSPEC && protocol != PF_INET))    {      set_errno (EPROTONOSUPPORT);      goto done;    }  if (sb0 < 0)    goto done;  else    {      sb[0] = sb0;      cygheap_fdnew sb1 (sb0, false);      if (sb1 < 0)	goto done;      sb[1] = sb1;    }  /* create the first socket */  newsock = socket (AF_INET, type, 0);  if (newsock == INVALID_SOCKET)    {      debug_printf ("first socket call failed");      set_winsock_errno ();      goto done;    }  /* bind the socket to any unused port */  sock_in.sin_family = AF_INET;  sock_in.sin_port = 0;  sock_in.sin_addr.s_addr = INADDR_ANY;  if (bind (newsock, (struct sockaddr *) &sock_in, sizeof (sock_in)) < 0)    {      debug_printf ("bind failed");      set_winsock_errno ();      closesocket (newsock);      goto done;    }  len = sizeof (sock_in);  if (getsockname (newsock, (struct sockaddr *) &sock_in, &len) < 0)    {      debug_printf ("getsockname error");      set_winsock_errno ();      closesocket (newsock);      goto done;    }  /* For stream sockets, create a listener */  if (type == SOCK_STREAM)    listen (newsock, 2);  /* create a connecting socket */  outsock = socket (AF_INET, type, 0);  if (outsock == INVALID_SOCKET)    {      debug_printf ("second socket call failed");      set_winsock_errno ();      closesocket (newsock);      goto done;    }  /* For datagram sockets, bind the 2nd socket to an unused address, too */  if (type == SOCK_DGRAM)    {      sock_out.sin_family = AF_INET;      sock_out.sin_port = 0;      sock_out.sin_addr.s_addr = INADDR_ANY;      if (bind (outsock, (struct sockaddr *) &sock_out, sizeof (sock_out)) < 0)	{	  debug_printf ("bind failed");	  set_winsock_errno ();	  closesocket (newsock);	  closesocket (outsock);	  goto done;	}      len = sizeof (sock_out);      if (getsockname (outsock, (struct sockaddr *) &sock_out, &len) < 0)	{	  debug_printf ("getsockname error");	  set_winsock_errno ();	  closesocket (newsock);	  closesocket (outsock);	  goto done;	}    }  /* Force IP address to loopback */  sock_in.sin_addr.s_addr = htonl (INADDR_LOOPBACK);  if (type == SOCK_DGRAM)    sock_out.sin_addr.s_addr = htonl (INADDR_LOOPBACK);  /* Do a connect */  if (connect (outsock, (struct sockaddr *) &sock_in, sizeof (sock_in)) < 0)    {      debug_printf ("connect error");      set_winsock_errno ();      closesocket (newsock);      closesocket (outsock);      goto done;    }  if (type == SOCK_STREAM)    {      /* For stream sockets, accept the connection and close the listener */      len = sizeof (sock_in);      insock = accept (newsock, (struct sockaddr *) &sock_in, &len);      if (insock == INVALID_SOCKET)	{	  debug_printf ("accept error");	  set_winsock_errno ();	  closesocket (newsock);	  closesocket (outsock);	  goto done;	}      closesocket (newsock);    }  else    {      /* For datagram sockets, connect the 2nd socket */      if (connect (newsock, (struct sockaddr *) &sock_out,		   sizeof (sock_out)) < 0)	{	  debug_printf ("connect error");	  set_winsock_errno ();	  closesocket (newsock);	  closesocket (outsock);	  goto done;	}      insock = newsock;    }  res = 0;  if (family == AF_LOCAL)    {      fh = fdsock (sb[0],		   type == SOCK_STREAM ? "/dev/streamsocket" : "/dev/dgsocket",		   insock);      fh->set_sun_path ("");      fh->set_addr_family (AF_LOCAL);      fh->set_socket_type (type);      fh = fdsock (sb[1],		   type == SOCK_STREAM ? "/dev/streamsocket" : "/dev/dgsocket",		   outsock);      fh->set_sun_path ("");      fh->set_addr_family (AF_LOCAL);      fh->set_socket_type (type);    }  else    {      fh = fdsock (sb[0], type == SOCK_STREAM ? "/dev/tcp" : "/dev/udp",		   insock);      fh->set_addr_family (AF_INET);      fh->set_socket_type (type);      fh = fdsock (sb[1], type == SOCK_STREAM ? "/dev/tcp" : "/dev/udp",		   outsock);      fh->set_addr_family (AF_INET);      fh->set_socket_type (type);    }done:  syscall_printf ("%d = socketpair (...)", res);  return res;}/* sethostent: standards? */extern "C" voidsethostent (int){}/* endhostent: standards? */extern "C" voidendhostent (void){}/* exported as recvmsg: standards? */extern "C" intcygwin_recvmsg (int fd, struct msghdr *msg, int flags){  int res;  sig_dispatch_pending (0);  sigframe thisframe (mainthread);  fhandler_socket *fh = get (fd);  if (check_null_invalid_struct_errno (msg)      || (msg->msg_name	  && __check_null_invalid_struct_errno (msg->msg_name,						(unsigned) msg->msg_namelen))      || !fh)    res = -1;  else    {      res = check_iovec_for_read (msg->msg_iov, msg->msg_iovlen);      if (res > 0)	res = fh->recvmsg (msg, flags, res); // res == iovec tot    }  syscall_printf ("%d = recvmsg (%d, %p, %x)", res, fd, msg, flags);  return res;}/* exported as sendmsg: standards? */extern "C" intcygwin_sendmsg (int fd, const struct msghdr *msg, int flags){  int res;  sig_dispatch_pending (0);  sigframe thisframe (mainthread);  fhandler_socket *fh = get (fd);  if (__check_invalid_read_ptr_errno (msg, sizeof msg)      || (msg->msg_name	  && __check_invalid_read_ptr_errno (msg->msg_name,					     (unsigned) msg->msg_namelen))      || !fh)    res = -1;  else    {      res = check_iovec_for_write (msg->msg_iov, msg->msg_iovlen);      if (res > 0)	res = fh->sendmsg (msg, flags, res); // res == iovec tot    }  syscall_printf ("%d = sendmsg (%d, %p, %x)", res, fd, msg, flags);  return res;}

⌨️ 快捷键说明

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