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;
 		}