📄 net.cc
字号:
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 + -