📄 net.cc
字号:
done: syscall_printf ("%d = socket (%d, %d, %d)", res, af, type, protocol); return res;}/* exported as sendto: standards? */extern "C" intcygwin_sendto (int fd, const void *buf, int len, int flags, const struct sockaddr *to, int tolen){ int res; sig_dispatch_pending (0); sigframe thisframe (mainthread); fhandler_socket *fh = get (fd); if ((len && __check_invalid_read_ptr_errno (buf, (unsigned) len)) || (to && __check_invalid_read_ptr_errno (to, tolen)) || !fh) res = -1; else if ((res = len) != 0) res = fh->sendto (buf, len, flags, to, tolen); syscall_printf ("%d = sendto (%d, %p, %d, %x, %p, %d)", res, fd, buf, len, flags, to, tolen); return res;}/* exported as recvfrom: standards? */extern "C" intcygwin_recvfrom (int fd, void *buf, int len, int flags, struct sockaddr *from, int *fromlen){ int res; sig_dispatch_pending (0); sigframe thisframe (mainthread); fhandler_socket *fh = get (fd); if ((len && __check_null_invalid_struct_errno (buf, (unsigned) len)) || (from && (check_null_invalid_struct_errno (fromlen) || __check_null_invalid_struct_errno (from, (unsigned) *fromlen))) || !fh) res = -1; else if ((res = len) != 0) res = fh->recvfrom (buf, len, flags, from, fromlen); syscall_printf ("%d = recvfrom (%d, %p, %d, %x, %p, %p)", res, fd, buf, len, flags, from, fromlen); return res;}/* exported as setsockopt: standards? */extern "C" intcygwin_setsockopt (int fd, int level, int optname, const void *optval, int optlen){ int res; fhandler_socket *fh = get (fd); const char *name = "error"; /* For the following debug_printf */ switch (optname) { case SO_DEBUG: name = "SO_DEBUG"; break; case SO_ACCEPTCONN: name = "SO_ACCEPTCONN"; break; case SO_REUSEADDR: name = "SO_REUSEADDR"; break; case SO_KEEPALIVE: name = "SO_KEEPALIVE"; break; case SO_DONTROUTE: name = "SO_DONTROUTE"; break; case SO_BROADCAST: name = "SO_BROADCAST"; break; case SO_USELOOPBACK: name = "SO_USELOOPBACK"; break; case SO_LINGER: name = "SO_LINGER"; break; case SO_OOBINLINE: name = "SO_OOBINLINE"; break; case SO_ERROR: name = "SO_ERROR"; break; } if ((optval && __check_invalid_read_ptr_errno (optval, optlen)) || !fh) res = -1; else { res = setsockopt (fh->get_socket (), level, optname, (const char *) optval, optlen); if (optlen == 4) syscall_printf ("setsockopt optval=%x", *(long *) optval); if (res) set_winsock_errno (); } syscall_printf ("%d = setsockopt (%d, %d, %x (%s), %p, %d)", res, fd, level, optname, name, optval, optlen); return res;}/* exported as getsockopt: standards? */extern "C" intcygwin_getsockopt (int fd, int level, int optname, void *optval, int *optlen){ int res; fhandler_socket *fh = get (fd); const char *name = "error"; /* For the following debug_printf */ switch (optname) { case SO_DEBUG: name = "SO_DEBUG"; break; case SO_ACCEPTCONN: name = "SO_ACCEPTCONN"; break; case SO_REUSEADDR: name = "SO_REUSEADDR"; break; case SO_KEEPALIVE: name = "SO_KEEPALIVE"; break; case SO_DONTROUTE: name = "SO_DONTROUTE"; break; case SO_BROADCAST: name = "SO_BROADCAST"; break; case SO_USELOOPBACK: name = "SO_USELOOPBACK"; break; case SO_LINGER: name = "SO_LINGER"; break; case SO_OOBINLINE: name = "SO_OOBINLINE"; break; case SO_ERROR: name = "SO_ERROR"; break; } if ((optval && (check_null_invalid_struct_errno (optlen) || __check_null_invalid_struct_errno (optval, (unsigned) *optlen))) || !fh) res = -1; else { res = getsockopt (fh->get_socket (), level, optname, (char *) optval, (int *) optlen); if (optname == SO_ERROR) { int *e = (int *) optval; *e = find_winsock_errno (*e); } if (res) set_winsock_errno (); } syscall_printf ("%d = getsockopt (%d, %d, %x (%s), %p, %p)", res, fd, level, optname, name, optval, optlen); return res;}/* exported as connect: standards? */extern "C" intcygwin_connect (int fd, const struct sockaddr *name, int namelen){ int res; sig_dispatch_pending (0); sigframe thisframe (mainthread); fhandler_socket *fh = get (fd); if (__check_invalid_read_ptr_errno (name, namelen) || !fh) res = -1; else res = fh->connect (name, namelen); syscall_printf ("%d = connect (%d, %p, %d)", res, fd, name, namelen); return res;}static voidfree_servent_ptr (struct servent *&p){ if (p) { debug_printf ("servent: %s", p->s_name); if (p->s_name) free (p->s_name); if (p->s_proto) free (p->s_proto); free_char_list (p->s_aliases); p = NULL; }}#pragma pack(push,2)struct pservent{ char *s_name; char **s_aliases; short s_port; char *s_proto;};#pragma pack(pop)static struct servent *dup_servent_ptr (struct servent *src){ if (!src) return NULL; struct servent *dst = (struct servent *) calloc (1, sizeof *dst); if (!dst) return NULL; debug_printf ("servent: %s", src->s_name); dst->s_port = src->s_port; if (src->s_name && !(dst->s_name = strdup (src->s_name))) goto out; if (src->s_aliases && !(dst->s_aliases = dup_char_list (src->s_aliases))) goto out; char *s_proto; if (IsBadReadPtr (src->s_proto, sizeof (src->s_proto)) && !IsBadReadPtr (((pservent *) src)->s_proto, sizeof (src->s_proto))) s_proto = ((pservent *) src)->s_proto; else s_proto = src->s_proto; if (s_proto && !(dst->s_proto = strdup (s_proto))) goto out; debug_printf ("servent: copied %s", dst->s_name); return dst;out: free_servent_ptr (dst); return NULL;}#ifdef _MT_SAFE#define servent_buf _reent_winsup ()->_servent_buf#elsestatic struct servent *servent_buf = NULL;#endif/* exported as getservbyname: standards? */extern "C" struct servent *cygwin_getservbyname (const char *name, const char *proto){ sig_dispatch_pending (0); sigframe thisframe (mainthread); if (check_null_str_errno (name) || (proto != NULL && check_null_str_errno (proto))) return NULL; free_servent_ptr (servent_buf); servent_buf = dup_servent_ptr (getservbyname (name, proto)); if (!servent_buf) set_winsock_errno (); syscall_printf ("%x = getservbyname (%s, %s)", servent_buf, name, proto); return servent_buf;}/* exported as getservbyport: standards? */extern "C" struct servent *cygwin_getservbyport (int port, const char *proto){ sig_dispatch_pending (0); sigframe thisframe (mainthread); if (proto != NULL && check_null_str_errno (proto)) return NULL; free_servent_ptr (servent_buf); servent_buf = dup_servent_ptr (getservbyport (port, proto)); if (!servent_buf) set_winsock_errno (); syscall_printf ("%x = getservbyport (%d, %s)", servent_buf, port, proto); return servent_buf;}extern "C" intcygwin_gethostname (char *name, size_t len){ int PASCAL win32_gethostname (char *, int); sig_dispatch_pending (0); sigframe thisframe (mainthread); if (__check_null_invalid_struct_errno (name, len)) return -1; if (wsock32_handle == NULL || win32_gethostname (name, len) == SOCKET_ERROR) { DWORD local_len = len; if (!GetComputerNameA (name, &local_len)) { set_winsock_errno (); return -1; } } debug_printf ("name %s", name); h_errno = 0; return 0;}static voidfree_hostent_ptr (struct hostent *&p){ if (p) { debug_printf ("hostent: %s", p->h_name); if (p->h_name) free ((void *) p->h_name); free_char_list (p->h_aliases); free_addr_list (p->h_addr_list); p = NULL; }}static struct hostent *dup_hostent_ptr (struct hostent *src){ if (!src) return NULL; struct hostent *dst = (struct hostent *) calloc (1, sizeof *dst); if (!dst) return NULL; debug_printf ("hostent: %s", src->h_name); dst->h_addrtype = src->h_addrtype; dst->h_length = src->h_length; if (src->h_name && !(dst->h_name = strdup (src->h_name))) goto out; if (src->h_aliases && !(dst->h_aliases = dup_char_list (src->h_aliases))) goto out; if (src->h_addr_list && !(dst->h_addr_list = dup_addr_list (src->h_addr_list, src->h_length))) goto out; debug_printf ("hostent: copied %s", dst->h_name); return dst;out: free_hostent_ptr (dst); return NULL;}#ifdef _MT_SAFE#define hostent_buf _reent_winsup ()->_hostent_buf#elsestatic struct hostent *hostent_buf = NULL;#endif/* exported as gethostbyname: standards? */extern "C" struct hostent *cygwin_gethostbyname (const char *name){ static unsigned char tmp_addr[4]; static struct hostent tmp; static char *tmp_aliases[1]; static char *tmp_addr_list[2]; static int a, b, c, d; sig_dispatch_pending (0); sigframe thisframe (mainthread); if (check_null_str_errno (name)) return NULL; if (sscanf (name, "%d.%d.%d.%d", &a, &b, &c, &d) == 4) { /* In case you don't have DNS, at least x.x.x.x still works */ memset (&tmp, 0, sizeof (tmp)); tmp_addr[0] = a; tmp_addr[1] = b; tmp_addr[2] = c; tmp_addr[3] = d; tmp_addr_list[0] = (char *) tmp_addr; tmp.h_name = name; tmp.h_aliases = tmp_aliases; tmp.h_addrtype = 2; tmp.h_length = 4; tmp.h_addr_list = tmp_addr_list; return &tmp; } free_hostent_ptr (hostent_buf); hostent_buf = dup_hostent_ptr (gethostbyname (name)); if (!hostent_buf) { set_winsock_errno (); set_host_errno (); } else { debug_printf ("h_name %s", hostent_buf->h_name); h_errno = 0; } return hostent_buf;}/* exported as gethostbyaddr: standards? */extern "C" struct hostent *cygwin_gethostbyaddr (const char *addr, int len, int type){ sig_dispatch_pending (0); sigframe thisframe (mainthread); if (__check_invalid_read_ptr_errno (addr, len)) return NULL; free_hostent_ptr (hostent_buf); hostent_buf = dup_hostent_ptr (gethostbyaddr (addr, len, type)); if (!hostent_buf) { set_winsock_errno (); set_host_errno (); } else { debug_printf ("h_name %s", hostent_buf->h_name); h_errno = 0; } return hostent_buf;}/* exported as accept: standards? */extern "C" intcygwin_accept (int fd, struct sockaddr *peer, int *len){ int res; sig_dispatch_pending (0); sigframe thisframe (mainthread); fhandler_socket *fh = get (fd); if ((peer && (check_null_invalid_struct_errno (len) || __check_null_invalid_struct_errno (peer, (unsigned) *len))) || !fh) res = -1; else res = fh->accept (peer, len); syscall_printf ("%d = accept (%d, %p, %p)", res, fd, peer, len); return res;}/* exported as bind: standards? */extern "C" intcygwin_bind (int fd, const struct sockaddr *my_addr, int addrlen){ int res; sig_dispatch_pending (0); sigframe thisframe (mainthread); fhandler_socket *fh = get (fd); if (__check_invalid_read_ptr_errno (my_addr, addrlen) || !fh) res = -1; else res = fh->bind (my_addr, addrlen); syscall_printf ("%d = bind (%d, %p, %d)", res, fd, my_addr, addrlen); return res;}/* exported as getsockname: standards? */extern "C" intcygwin_getsockname (int fd, struct sockaddr *addr, int *namelen){ int res; sig_dispatch_pending (0); sigframe thisframe (mainthread); fhandler_socket *fh = get (fd); if (check_null_invalid_struct_errno (namelen) || __check_null_invalid_struct_errno (addr, (unsigned) *namelen) || !fh) res = -1; else res = fh->getsockname (addr, namelen); syscall_printf ("%d = getsockname (%d, %p, %p)", res, fd, addr, namelen); return res;}/* exported as listen: standards? */extern "C" intcygwin_listen (int fd, int backlog){ int res; sig_dispatch_pending (0); sigframe thisframe (mainthread); fhandler_socket *fh = get (fd); if (!fh) res = -1; else res = fh->listen (backlog); syscall_printf ("%d = listen (%d, %d)", res, fd, backlog); return res;}/* exported as shutdown: standards? */extern "C" intcygwin_shutdown (int fd, int how){ int res; sig_dispatch_pending (0); sigframe thisframe (mainthread); fhandler_socket *fh = get (fd); if (!fh) res = -1; else res = fh->shutdown (how); syscall_printf ("%d = shutdown (%d, %d)", res, fd, how); return res;}/* exported as hstrerror: BSD 4.3 */extern "C" const char *cygwin_hstrerror (int err){ int i; for (i = 0; host_errmap[i].e != 0; ++i)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -