diff options
-rw-r--r-- | src/fe-common/irc/dcc/fe-dcc-get.c | 6 | ||||
-rw-r--r-- | src/fe-common/irc/dcc/module-formats.c | 2 | ||||
-rw-r--r-- | src/irc/dcc/dcc-get.c | 22 |
3 files changed, 18 insertions, 12 deletions
diff --git a/src/fe-common/irc/dcc/fe-dcc-get.c b/src/fe-common/irc/dcc/fe-dcc-get.c index 4c76e7cd..127191ed 100644 --- a/src/fe-common/irc/dcc/fe-dcc-get.c +++ b/src/fe-common/irc/dcc/fe-dcc-get.c @@ -72,9 +72,11 @@ static void dcc_closed(GET_DCC_REC *dcc) } } -static void dcc_error_file_create(GET_DCC_REC *dcc, const char *fname) +static void dcc_error_file_create(GET_DCC_REC *dcc, const char *fname, + const char *error) { - printformat(NULL, NULL, MSGLEVEL_DCC, IRCTXT_DCC_CANT_CREATE, fname); + printformat(NULL, NULL, MSGLEVEL_DCC, IRCTXT_DCC_CANT_CREATE, + fname, error); } diff --git a/src/fe-common/irc/dcc/module-formats.c b/src/fe-common/irc/dcc/module-formats.c index b6d47f55..873344ee 100644 --- a/src/fe-common/irc/dcc/module-formats.c +++ b/src/fe-common/irc/dcc/module-formats.c @@ -60,7 +60,7 @@ FORMAT_REC fecommon_irc_dcc_formats[] = { { "dcc_unknown_type", "{dcc DCC unknown type {hilight $0}}", 1, { 0 } }, { "dcc_invalid_ctcp", "{dcc DCC received CTCP {hilight $0} with invalid parameters from {nick $1}}", 4, { 0, 0, 0, 0 } }, { "dcc_connect_error", "{dcc DCC can't connect to {hilight $0} port {hilight $1}}", 2, { 0, 1 } }, - { "dcc_cant_create", "{dcc DCC can't create file {dccfile $0}}", 1, { 0 } }, + { "dcc_cant_create", "{dcc DCC can't create file {dccfile $0}: $1}", 2, { 0, 0 } }, { "dcc_rejected", "{dcc DCC $0 was rejected by {nick $1} [{hilight $2}]}", 3, { 0, 0, 0 } }, { "dcc_request_send", "{dcc DCC $0 request sent to {nick $1}: $2", 3, { 0, 0, 0 } }, { "dcc_close", "{dcc DCC $0 close for {nick $1} [{hilight $2}]}", 3, { 0, 0, 0 } }, diff --git a/src/irc/dcc/dcc-get.c b/src/irc/dcc/dcc-get.c index d9529553..e8847698 100644 --- a/src/irc/dcc/dcc-get.c +++ b/src/irc/dcc/dcc-get.c @@ -176,7 +176,7 @@ static void sig_dccget_connected(GET_DCC_REC *dcc) { struct stat statbuf; char *fname, *tempfname; - int ret, temphandle, old_umask; + int ret, ret_errno, temphandle, old_umask; if (net_geterror(dcc->handle) != 0) { /* error connecting */ @@ -211,14 +211,18 @@ static void sig_dccget_connected(GET_DCC_REC *dcc) if download_path is in some global temp directory */ tempfname = g_strconcat(dcc->file, ".XXXXXX", NULL); - old_umask = umask(066); + old_umask = umask(0077); temphandle = mkstemp(tempfname); - umask(old_umask); + umask(old_umask); if (temphandle == -1) ret = -1; - else { + else + ret = fchmod(temphandle, dcc_file_create_mode); + + if (ret != -1) { ret = link(tempfname, dcc->file); + if (ret == -1 && errno == EPERM) { /* hard links aren't supported - some people want to download stuff to FAT/NTFS/etc @@ -229,17 +233,17 @@ static void sig_dccget_connected(GET_DCC_REC *dcc) /* if ret = 0, we're the file owner now */ dcc->fhandle = ret == -1 ? -1 : - open(dcc->file, O_WRONLY | O_TRUNC, - dcc_file_create_mode); + open(dcc->file, O_WRONLY | O_TRUNC); - /* close/remove the temp file */ + /* close/remove the temp file */ + ret_errno = errno; close(temphandle); unlink(tempfname); g_free(tempfname); if (dcc->fhandle == -1) { - signal_emit("dcc error file create", 2, - dcc, dcc->file); + signal_emit("dcc error file create", 3, + dcc, dcc->file, g_strerror(ret_errno)); dcc_destroy(DCC(dcc)); return; } |