X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Firssi%2Fsrc%2Fcore%2Fnetwork.c;fp=apps%2Firssi%2Fsrc%2Fcore%2Fnetwork.c;h=d7c1017c7626c2d9a9ed9c4f330916fa9b6b7c91;hb=18d69a0a1fec438e241bb4f431506ed59a34066b;hp=21235b2af8380470aac142452fa4e56993d81411;hpb=f7be6adec0248118cddde9b04522c13cd90568cd;p=silc.git diff --git a/apps/irssi/src/core/network.c b/apps/irssi/src/core/network.c index 21235b2a..d7c1017c 100644 --- a/apps/irssi/src/core/network.c +++ b/apps/irssi/src/core/network.c @@ -13,9 +13,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "module.h" @@ -42,11 +42,18 @@ union sockaddr_union { # define SIZEOF_SOCKADDR(so) (sizeof(so.sin)) #endif +GIOChannel *g_io_channel_new(int handle) +{ + GIOChannel *chan; #ifdef WIN32 -# define g_io_channel_new(handle) g_io_channel_win32_new_stream_socket(handle) + chan = g_io_channel_win32_new_socket(handle); #else -# define g_io_channel_new(handle) g_io_channel_unix_new(handle) + chan = g_io_channel_unix_new(handle); #endif + g_io_channel_set_encoding(chan, NULL, NULL); + g_io_channel_set_buffered(chan, FALSE); + return chan; +} /* Cygwin need this, don't know others.. */ /*#define BLOCKING_SOCKETS 1*/ @@ -127,11 +134,9 @@ static int sin_get_port(union sockaddr_union *so) GIOChannel *net_connect(const char *addr, int port, IPADDR *my_ip) { IPADDR ip4, ip6, *ip; - int family; g_return_val_if_fail(addr != NULL, NULL); - family = my_ip == NULL ? 0 : my_ip->family; if (net_gethostbyname(addr, &ip4, &ip6) == -1) return NULL; @@ -182,10 +187,8 @@ GIOChannel *net_connect_ip(IPADDR *ip, int port, IPADDR *my_ip) #ifndef WIN32 fcntl(handle, F_SETFL, O_NONBLOCK); #endif - setsockopt(handle, SOL_SOCKET, SO_REUSEADDR, - (char *) &opt, sizeof(opt)); - setsockopt(handle, SOL_SOCKET, SO_KEEPALIVE, - (char *) &opt, sizeof(opt)); + setsockopt(handle, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + setsockopt(handle, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(opt)); /* set our own address */ if (my_ip != NULL) { @@ -293,10 +296,8 @@ GIOChannel *net_listen(IPADDR *my_ip, int *port) #ifndef WIN32 fcntl(handle, F_SETFL, O_NONBLOCK); #endif - setsockopt(handle, SOL_SOCKET, SO_REUSEADDR, - (char *) &opt, sizeof(opt)); - setsockopt(handle, SOL_SOCKET, SO_KEEPALIVE, - (char *) &opt, sizeof(opt)); + setsockopt(handle, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + setsockopt(handle, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(opt)); /* specify the address/port we want to listen in */ ret = bind(handle, &so.sa, SIZEOF_SOCKADDR(so)); @@ -347,36 +348,42 @@ GIOChannel *net_accept(GIOChannel *handle, IPADDR *addr, int *port) int net_receive(GIOChannel *handle, char *buf, int len) { gsize ret; - int err; + GIOStatus status; + GError *err = NULL; g_return_val_if_fail(handle != NULL, -1); g_return_val_if_fail(buf != NULL, -1); - err = g_io_channel_read(handle, buf, len, &ret); - if (err == 0 && ret == 0) + status = g_io_channel_read_chars(handle, buf, len, &ret, &err); + if (err != NULL) { + g_warning(err->message); + g_error_free(err); + } + if (status == G_IO_STATUS_ERROR || status == G_IO_STATUS_EOF) return -1; /* disconnected */ - if (err == G_IO_ERROR_AGAIN || (err != 0 && errno == EINTR)) - return 0; /* no bytes received */ - - return err == 0 ? (int)ret : -1; + return ret; } /* Transmit data, return number of bytes sent, -1 = error */ int net_transmit(GIOChannel *handle, const char *data, int len) { gsize ret; - int err; + GIOStatus status; + GError *err = NULL; g_return_val_if_fail(handle != NULL, -1); g_return_val_if_fail(data != NULL, -1); - err = g_io_channel_write(handle, (char *) data, len, &ret); - if (err == G_IO_ERROR_AGAIN || - (err != 0 && (errno == EINTR || errno == EPIPE))) - return 0; + status = g_io_channel_write_chars(handle, (char *) data, len, &ret, &err); + if (err != NULL) { + g_warning(err->message); + g_error_free(err); + } + if (status == G_IO_STATUS_ERROR) + return -1; - return err == 0 ? (int)ret : -1; + return ret; } /* Get socket address/port */ @@ -590,12 +597,6 @@ const char *net_gethosterror(int error) #ifdef HAVE_IPV6 g_return_val_if_fail(error != 0, NULL); - if (error == 1) { - /* getnameinfo() failed .. - FIXME: does strerror return the right error message? */ - return g_strerror(errno); - } - return gai_strerror(error); #else switch (error) {