X-Git-Url: http://git.cascardo.info/?a=blobdiff_plain;f=hcconn.c;h=0ba378ae61eb2f73f8d9482cedda6b39dd3f40b7;hb=268611d2bf7a824189cd6a8f3f492847a55ec785;hp=3e3f52fe27ac05566dc230d2d919ab5ba6206cea;hpb=d7294c8c99ac01d5871973ad8d5bfa7c92fe9889;p=cascardo%2Frnetproxy.git diff --git a/hcconn.c b/hcconn.c index 3e3f52f..0ba378a 100644 --- a/hcconn.c +++ b/hcconn.c @@ -97,7 +97,7 @@ hc_conn_channel_close (gpointer data) struct channel_layer *layer = data; int fd = g_io_channel_unix_get_fd (layer->channel); g_source_remove (layer->watch); - shutdown (fd, SHUT_RDWR); + close (fd); g_io_channel_unref (layer->channel); g_slice_free (struct channel_layer, layer); } @@ -132,7 +132,7 @@ hc_conn_watch (GIOChannel *channel, GIOCondition cond, gpointer data) return TRUE; } -void +int hc_conn_set_driver_channel (HCConn *conn, int fd) { struct channel_layer *layer = g_slice_new (struct channel_layer); @@ -148,6 +148,7 @@ hc_conn_set_driver_channel (HCConn *conn, int fd) if (conn->func) conn->func (conn, HC_EVENT_CONNECT, conn->data); fcntl (fd, F_SETFL, fcntl (fd, F_GETFL, 0) | O_NONBLOCK); + return 0; } @@ -173,7 +174,9 @@ hc_conn_set_callback (HCConn *conn, HCClientFunc func, gpointer data) ssize_t hc_conn_read (HCConn *conn, char *buffer, size_t len) { - return conn->read (conn->layer, buffer, len); + if (conn->read) + return conn->read (conn->layer, buffer, len); + return 0; } void @@ -182,12 +185,18 @@ hc_conn_write (HCConn *conn, char *buffer, size_t len) /* TODO: Do buffering or something like that */ /* Do we really need to? */ /* In case of error, we should do something */ - conn->write (conn->layer, buffer, len); + if (conn->write) + conn->write (conn->layer, buffer, len); } void hc_conn_close (HCConn *conn) { - conn->close (conn->layer); + if (conn->close) + conn->close (conn->layer); + conn->read = NULL; + conn->write = NULL; + conn->close = NULL; + conn->func = NULL; g_slice_free (HCConn, conn); }