diff --git a/ChangeLog.asciidoc b/ChangeLog.asciidoc index 09c0f5299..892563db5 100644 --- a/ChangeLog.asciidoc +++ b/ChangeLog.asciidoc @@ -138,6 +138,7 @@ http://weechat.org/files/releasenotes/ReleaseNotes-devel.html[release notes] * scripts: fix crash when a signal is received with type "int" and NULL pointer in signal_data * trigger: add trigger plugin: new command /trigger and file trigger.conf +* xfer: fix freeze/problems when sending empty files with DCC (closes #53) * xfer: fix connection to remote host in DCC receive on Mac OS X (closes #25) * xfer: remove bind on xfer.network.own_ip (closes #5) diff --git a/src/plugins/xfer/xfer-dcc.c b/src/plugins/xfer/xfer-dcc.c index fa26f9f42..015b692be 100644 --- a/src/plugins/xfer/xfer-dcc.c +++ b/src/plugins/xfer/xfer-dcc.c @@ -54,6 +54,14 @@ xfer_dcc_send_file_child (struct t_xfer *xfer) time_t last_sent, new_time, last_second, sent_ok; unsigned long long sent_last_second; + /* empty file? just return immediately */ + if (xfer->pos >= xfer->size) + { + xfer_network_write_pipe (xfer, XFER_STATUS_DONE, + XFER_NO_ERROR); + return; + } + blocksize = xfer->blocksize; if (weechat_config_integer (xfer_config_network_speed_limit) > 0) { @@ -386,9 +394,7 @@ xfer_dcc_recv_file_child (struct t_xfer *xfer) } else { - total_written = 0; - - if (num_read == 0) + if ((num_read == 0) && (xfer->pos < xfer->size)) { xfer_network_write_pipe (xfer, XFER_STATUS_FAILED, XFER_ERROR_RECV_BLOCK); @@ -396,6 +402,7 @@ xfer_dcc_recv_file_child (struct t_xfer *xfer) } /* bytes received, write to disk */ + total_written = 0; while (total_written < num_read) { written = write (xfer->file, diff --git a/src/plugins/xfer/xfer-network.c b/src/plugins/xfer/xfer-network.c index d0ff2dd62..a2f06764f 100644 --- a/src/plugins/xfer/xfer-network.c +++ b/src/plugins/xfer/xfer-network.c @@ -225,16 +225,14 @@ xfer_network_send_file_fork (struct t_xfer *xfer) switch (pid = fork ()) { - /* fork failed */ - case -1: + case -1: /* fork failed */ weechat_printf (NULL, _("%s%s: unable to fork"), weechat_prefix ("error"), XFER_PLUGIN_NAME); xfer_close (xfer, XFER_STATUS_FAILED); xfer_buffer_refresh (WEECHAT_HOTLIST_MESSAGE); return; - /* child process */ - case 0: + case 0: /* child process */ rc = setuid (getuid ()); (void) rc; close (xfer->child_read); @@ -298,16 +296,14 @@ xfer_network_recv_file_fork (struct t_xfer *xfer) switch (pid = fork ()) { - /* fork failed */ - case -1: + case -1: /* fork failed */ weechat_printf (NULL, _("%s%s: unable to fork"), weechat_prefix ("error"), XFER_PLUGIN_NAME); xfer_close (xfer, XFER_STATUS_FAILED); xfer_buffer_refresh (WEECHAT_HOTLIST_MESSAGE); return; - /* child process */ - case 0: + case 0: /* child process */ rc = setuid (getuid ()); (void) rc; close (xfer->child_read);