summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/fe-common/irc/dcc/fe-dcc-get.c6
-rw-r--r--src/fe-common/irc/dcc/module-formats.c2
-rw-r--r--src/irc/dcc/dcc-get.c22
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;
}