summaryrefslogtreecommitdiff
path: root/libpurple/protocols/irc/dcc_send.c
diff options
context:
space:
mode:
Diffstat (limited to 'libpurple/protocols/irc/dcc_send.c')
-rw-r--r--libpurple/protocols/irc/dcc_send.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/libpurple/protocols/irc/dcc_send.c b/libpurple/protocols/irc/dcc_send.c
index 5c60abd5e4..61937c8e8e 100644
--- a/libpurple/protocols/irc/dcc_send.c
+++ b/libpurple/protocols/irc/dcc_send.c
@@ -245,7 +245,7 @@ static gssize irc_dccsend_send_write(const guchar *buffer, size_t size, PurpleXf
static void irc_dccsend_send_connected(gpointer data, int source, PurpleInputCondition cond) {
PurpleXfer *xfer = (PurpleXfer *) data;
struct irc_xfer_send_data *xd = xfer->data;
- int conn;
+ int conn, flags;
conn = accept(xd->fd, NULL, 0);
if (conn == -1) {
@@ -262,6 +262,12 @@ static void irc_dccsend_send_connected(gpointer data, int source, PurpleInputCon
close(xd->fd);
xd->fd = -1;
+ flags = fcntl(conn, F_GETFL);
+ fcntl(conn, F_SETFL, flags | O_NONBLOCK);
+#ifndef _WIN32
+ fcntl(conn, F_SETFD, FD_CLOEXEC);
+#endif
+
xd->inpa = purple_input_add(conn, PURPLE_INPUT_READ, irc_dccsend_send_read, xfer);
/* Start the transfer */
purple_xfer_start(xfer, conn, NULL, 0);