X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=ircd%2Fos_generic.c;h=9ddb3c40bd686bb83124e62485cc4a2f3581271a;hb=1570a04e15bec6b2945e4351b1e05211aecdcacc;hp=72fba12f21ba657320e01d6ff4d841526bc2731d;hpb=dcecf316a0813ae009af5aaa2ca938a53c1a3835;p=ircu2.10.12-pk.git diff --git a/ircd/os_generic.c b/ircd/os_generic.c index 72fba12..9ddb3c4 100644 --- a/ircd/os_generic.c +++ b/ircd/os_generic.c @@ -178,13 +178,12 @@ int sockaddr_from_irc(struct sockaddr_in6 *v6, const struct irc_sockaddr *irc, i int sockaddr_from_irc(struct sockaddr_in *v4, const struct irc_sockaddr *irc, int compat_fd, int family) { assert(irc != 0); + memset(v4, 0, sizeof(*v4)); v4->sin_family = AF_INET; if (irc) { assert(!irc->addr.in6_16[0] && !irc->addr.in6_16[1] && !irc->addr.in6_16[2] && !irc->addr.in6_16[3] && !irc->addr.in6_16[4] && (!irc->addr.in6_16[5] || irc->addr.in6_16[5] == 0xffff)); memcpy(&v4->sin_addr, &irc->addr.in6_16[6], sizeof(v4->sin_addr)); v4->sin_port = htons(irc->port); - } else{ - memset(&v4, 0, sizeof(v4)); } (void)compat_fd; (void)family; return sizeof(*v4); @@ -450,9 +449,13 @@ IOResult os_recv_nonb(int fd, char* buf, unsigned int length, if (0 < (res = recv(fd, buf, length, 0))) { *count_out = (unsigned) res; return IO_SUCCESS; + } else if (res == 0) { + *count_out = 0; + errno = 0; /* or ECONNRESET? */ + return IO_FAILURE; } else { *count_out = 0; - return (res < 0) && is_blocked(errno) ? IO_BLOCKED : IO_FAILURE; + return is_blocked(errno) ? IO_BLOCKED : IO_FAILURE; } }