From 1cc599a0f92eddf65d3bb9b6d874c21b1281d803 Mon Sep 17 00:00:00 2001 From: Arnav Singh Date: Mon, 22 Oct 2012 01:33:32 -0700 Subject: Build DCC file's path using platform's directory separator instead of always using forward slash. --- src/common/dcc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/dcc.c b/src/common/dcc.c index 1b775897..6f0dedcc 100644 --- a/src/common/dcc.c +++ b/src/common/dcc.c @@ -2337,8 +2337,8 @@ dcc_add_file (session *sess, char *file, DCC_SIZE size, int port, char *nick, gu strlen (file) + 4); strcpy (dcc->destfile, prefs.hex_dcc_dir); - if (prefs.hex_dcc_dir[strlen (prefs.hex_dcc_dir) - 1] != '/') - strcat (dcc->destfile, "/"); + if (prefs.hex_dcc_dir[strlen (prefs.hex_dcc_dir) - 1] != G_DIR_SEPARATOR) + strcat (dcc->destfile, G_DIR_SEPARATOR_S); if (prefs.hex_dcc_save_nick) { #ifdef WIN32 -- cgit 1.4.1 From 8c7ec909b899d859af3f20927ab2db6e3b2270fb Mon Sep 17 00:00:00 2001 From: Arnav Singh Date: Mon, 22 Oct 2012 02:00:21 -0700 Subject: Replaced use of OS file I/O functions which expect filenames in system codepage with GLib's, since GLib's functions work with UTF-8 and GLib handles converting the filename to system codepage for us. --- src/common/dcc.c | 14 ++++++++------ src/common/xchat.h | 5 ----- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/common/dcc.c b/src/common/dcc.c index 6f0dedcc..36c0b499 100644 --- a/src/common/dcc.c +++ b/src/common/dcc.c @@ -57,6 +57,8 @@ #include "url.h" #include "xchatc.h" +#include + #ifdef USE_DCC64 #define BIG_STR_TO_INT(x) strtoull(x,NULL,10) #ifdef WIN32 @@ -691,12 +693,12 @@ dcc_read (GIOChannel *source, GIOCondition condition, struct DCC *dcc) if (dcc->resumable) { - dcc->fp = open (dcc->destfile_fs, O_WRONLY | O_APPEND | OFLAGS); + dcc->fp = g_open (dcc->destfile_fs, O_WRONLY | O_APPEND | OFLAGS, 0); dcc->pos = dcc->resumable; dcc->ack = dcc->resumable; } else { - if (access (dcc->destfile_fs, F_OK) == 0) + if (g_access (dcc->destfile_fs, F_OK) == 0) { n = 0; do @@ -717,7 +719,7 @@ dcc_read (GIOChannel *source, GIOCondition condition, struct DCC *dcc) g_free (old); } dcc->fp = - open (dcc->destfile_fs, OFLAGS | O_TRUNC | O_WRONLY | O_CREAT, + g_open (dcc->destfile_fs, OFLAGS | O_TRUNC | O_WRONLY | O_CREAT, prefs.hex_dcc_permissions); } } @@ -1835,7 +1837,7 @@ dcc_send (struct session *sess, char *to, char *file, int maxcps, int passive) dcc->dccstat = STAT_QUEUED; dcc->size = st.st_size; dcc->type = TYPE_SEND; - dcc->fp = open (file_fs, OFLAGS | O_RDONLY); + dcc->fp = g_open (file_fs, OFLAGS | O_RDONLY, 0); if (dcc->fp != -1) { g_free (file_fs); @@ -2015,11 +2017,11 @@ is_resumable (struct DCC *dcc) dcc->resumable = 0; /* Check the file size */ - if (access (dcc->destfile_fs, W_OK) == 0) + if (g_access (dcc->destfile_fs, W_OK) == 0) { struct stat st; - if (stat (dcc->destfile_fs, &st) != -1) + if (g_stat (dcc->destfile_fs, &st) != -1) { if (st.st_size < dcc->size) { diff --git a/src/common/xchat.h b/src/common/xchat.h index a19716f6..2980fc1c 100644 --- a/src/common/xchat.h +++ b/src/common/xchat.h @@ -589,12 +589,7 @@ struct popup /* CL: get a random int in the range [0..n-1]. DON'T use rand() % n, it gives terrible results. */ #define RAND_INT(n) ((int)(rand() / (RAND_MAX + 1.0) * (n))) -#ifdef WIN32 -#define xchat_filename_from_utf8 g_locale_from_utf8 -#define xchat_filename_to_utf8 g_locale_to_utf8 -#else #define xchat_filename_from_utf8 g_filename_from_utf8 #define xchat_filename_to_utf8 g_filename_to_utf8 -#endif #endif -- cgit 1.4.1 From 8902f52eb955b8102912c2de3ae57d962934e52b Mon Sep 17 00:00:00 2001 From: Arnav Singh Date: Mon, 22 Oct 2012 02:30:38 -0700 Subject: Removed DCC::destfile_fs since it was now the same as DCC::destfile. Fixed usage of g_stat to use GStatBuf instead of OS-native struct stat. --- src/common/dcc.c | 37 ++++++++++++------------------------- src/common/dcc.h | 1 - src/common/util.c | 5 +---- 3 files changed, 13 insertions(+), 30 deletions(-) diff --git a/src/common/dcc.c b/src/common/dcc.c index 36c0b499..4e0f5ee9 100644 --- a/src/common/dcc.c +++ b/src/common/dcc.c @@ -390,8 +390,7 @@ dcc_close (struct DCC *dcc, int dccstat, int destroy) /* completed file to the completed directory */ if(dcc->type == TYPE_RECV) { - /* mgl: change this to use destfile_fs for correctness and to */ - /* handle the case where hex_dcc_save_nick is set */ + /* mgl: change this to handle the case where dccwithnick is set */ move_file_utf8 (prefs.hex_dcc_dir, prefs.hex_dcc_completed_dir, file_part (dcc->destfile), prefs.hex_dcc_permissions); } @@ -416,8 +415,6 @@ dcc_close (struct DCC *dcc, int dccstat, int destroy) free (dcc->file); if (dcc->destfile) g_free (dcc->destfile); - if (dcc->destfile_fs) - g_free (dcc->destfile_fs); free (dcc->nick); free (dcc); return; @@ -693,33 +690,30 @@ dcc_read (GIOChannel *source, GIOCondition condition, struct DCC *dcc) if (dcc->resumable) { - dcc->fp = g_open (dcc->destfile_fs, O_WRONLY | O_APPEND | OFLAGS, 0); + dcc->fp = g_open (dcc->destfile, O_WRONLY | O_APPEND | OFLAGS, 0); dcc->pos = dcc->resumable; dcc->ack = dcc->resumable; } else { - if (g_access (dcc->destfile_fs, F_OK) == 0) + if (g_access (dcc->destfile, F_OK) == 0) { n = 0; do { n++; - snprintf (buf, sizeof (buf), "%s.%d", dcc->destfile_fs, n); + snprintf (buf, sizeof (buf), "%s.%d", dcc->destfile, n); } while (access (buf, F_OK) == 0); - g_free (dcc->destfile_fs); - dcc->destfile_fs = g_strdup (buf); - old = dcc->destfile; - dcc->destfile = xchat_filename_to_utf8 (buf, -1, 0, 0, 0); + dcc->destfile = g_strdup (buf); EMIT_SIGNAL (XP_TE_DCCRENAME, dcc->serv->front_session, old, dcc->destfile, NULL, NULL, 0); g_free (old); } dcc->fp = - g_open (dcc->destfile_fs, OFLAGS | O_TRUNC | O_WRONLY | O_CREAT, + g_open (dcc->destfile, OFLAGS | O_TRUNC | O_WRONLY | O_CREAT, prefs.hex_dcc_permissions); } } @@ -1985,7 +1979,7 @@ static int is_same_file (struct DCC *dcc, struct DCC *new_dcc) { #ifndef WIN32 - struct stat st_a, st_b; + GStatBuf st_a, st_b; #endif /* if it's the same filename, must be same */ @@ -1997,9 +1991,9 @@ is_same_file (struct DCC *dcc, struct DCC *new_dcc) /* warning no win32 implementation - behaviour may be unreliable */ #else /* this fstat() shouldn't really fail */ - if ((dcc->fp == -1 ? stat (dcc->destfile_fs, &st_a) : fstat (dcc->fp, &st_a)) == -1) + if ((dcc->fp == -1 ? g_stat (dcc->destfile, &st_a) : fstat (dcc->fp, &st_a)) == -1) return FALSE; - if (stat (new_dcc->destfile_fs, &st_b) == -1) + if (g_stat (new_dcc->destfile, &st_b) == -1) return FALSE; /* same inode, same device, same file! */ @@ -2017,11 +2011,11 @@ is_resumable (struct DCC *dcc) dcc->resumable = 0; /* Check the file size */ - if (g_access (dcc->destfile_fs, W_OK) == 0) + if (g_access (dcc->destfile, W_OK) == 0) { - struct stat st; + GStatBuf st; - if (g_stat (dcc->destfile_fs, &st) != -1) + if (g_stat (dcc->destfile, &st) != -1) { if (st.st_size < dcc->size) { @@ -2104,10 +2098,6 @@ dcc_get_with_destfile (struct DCC *dcc, char *file) g_free (dcc->destfile); dcc->destfile = g_strdup (file); /* utf-8 */ - /* get the local filesystem encoding */ - g_free (dcc->destfile_fs); - dcc->destfile_fs = xchat_filename_from_utf8 (dcc->destfile, -1, 0, 0, 0); - /* since destfile changed, must check resumability again */ is_resumable (dcc); @@ -2359,9 +2349,6 @@ dcc_add_file (session *sess, char *file, DCC_SIZE size, int port, char *nick, gu } strcat (dcc->destfile, file); - /* get the local filesystem encoding */ - dcc->destfile_fs = xchat_filename_from_utf8 (dcc->destfile, -1, 0, 0, 0); - dcc->resumable = 0; dcc->pos = 0; dcc->serv = sess->server; diff --git a/src/common/dcc.h b/src/common/dcc.h index da4ce979..656c8fdc 100644 --- a/src/common/dcc.h +++ b/src/common/dcc.h @@ -62,7 +62,6 @@ struct DCC time_t lasttime; char *file; /* utf8 */ char *destfile; /* utf8 */ - char *destfile_fs; /* local filesystem encoding */ char *nick; unsigned char type; /* 0 = SEND 1 = RECV 2 = CHAT */ unsigned char dccstat; /* 0 = QUEUED 1 = ACTIVE 2 = FAILED 3 = DONE */ diff --git a/src/common/util.c b/src/common/util.c index 54ad4f78..15184250 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -254,10 +254,7 @@ file_part (char *file) { case 0: return (filepart); - case '/': -#ifdef WIN32 - case '\\': -#endif + case G_DIR_SEPARATOR: filepart = file + 1; break; } -- cgit 1.4.1