#define BUFFSIZE 8192
static gboolean debug_mode = FALSE;
-#ifdef G_OS_WIN32
-static GSList *tempfiles=NULL;
-#endif
-
-#if !GLIB_CHECK_VERSION(2, 26, 0)
-guchar *g_base64_decode_wa(const gchar *text, gsize *out_len)
-{
- guchar *ret;
- gsize input_length;
- gint state = 0;
- guint save = 0;
-
- input_length = strlen(text);
-
- ret = g_malloc0((input_length / 4) * 3 + 1);
-
- *out_len = g_base64_decode_step(text, input_length, ret, &state, &save);
-
- return ret;
-}
-#endif
/* Return true if we are running as root. This function should beused
instead of getuid () == 0. */
#endif
}
-void list_free_strings(GList *list)
-{
- list = g_list_first(list);
-
- while (list != NULL) {
- g_free(list->data);
- list = list->next;
- }
-}
-
-void slist_free_strings(GSList *list)
+void list_free_strings_full(GList *list)
{
- while (list != NULL) {
- g_free(list->data);
- list = list->next;
- }
+ g_list_free_full(list, (GDestroyNotify)g_free);
}
void slist_free_strings_full(GSList *list)
{
-#if GLIB_CHECK_VERSION(2,28,0)
g_slist_free_full(list, (GDestroyNotify)g_free);
-#else
- g_slist_foreach(list, (GFunc)g_free, NULL);
- g_slist_free(list);
-#endif
}
static void hash_free_strings_func(gpointer key, gpointer value, gpointer data)
if (!str)
return;
#ifdef G_OS_WIN32
- subst_chars(str, "\t\r\n\\/*:", '_');
+ subst_chars(str, "\t\r\n\\/*?:", '_');
#else
subst_chars(str, "\t\r\n\\/*", '_');
#endif
gchar * tmp_pos = NULL;
int i;
- if (quote_chars == NULL)
+ if (str == NULL || quote_chars == NULL)
return NULL;
for (i = 0; i < strlen(quote_chars); i++) {
- tmp_pos = strrchr (str, quote_chars[i]);
+ tmp_pos = strrchr (str, quote_chars[i]);
if(position == NULL
- || (tmp_pos != NULL && position <= tmp_pos) )
+ || (tmp_pos != NULL && position <= tmp_pos) )
position = tmp_pos;
}
return position;
gchar * tmp_pos = NULL;
int i;
- if (quote_chars == NULL)
- return FALSE;
+ if (str == NULL || quote_chars == NULL)
+ return NULL;
for (i = 0; i < strlen(quote_chars); i++) {
- tmp_pos = strchr (str, quote_chars[i]);
+ tmp_pos = strchr (str, quote_chars[i]);
if(position == NULL
- || (tmp_pos != NULL && position >= tmp_pos) )
+ || (tmp_pos != NULL && position >= tmp_pos) )
position = tmp_pos;
}
return position;
*file = '\0';
strncpy(escaped_utf8uri, p, q - p + 1);
escaped_utf8uri[q - p + 1] = '\0';
- decode_uri(file, escaped_utf8uri);
+ decode_uri_with_plus(file, escaped_utf8uri, FALSE);
/*
* g_filename_from_uri() rejects escaped/locale encoded uri
* string which come from Nautilus.
g_warning("couldn't set insert file '%s' in body", value);
}
g_free(tmp);
- tmp = NULL;
} else if (attach && !g_ascii_strcasecmp(field, "attach")) {
int i = 0;
gchar *tmp = decode_uri_gdup(value);
g_print("Refusing to attach '%s', potential private data leak\n",
tmp);
g_free(tmp);
- tmp = NULL;
break;
}
}
if (w32_shgetfolderpath
(NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE,
NULL, 0, home_dir_utf16) < 0)
- strcpy (home_dir_utf16, "C:\\Sylpheed");
- home_dir_utf8 = g_utf16_to_utf8 ((const gunichar *)home_dir_utf16, -1, NULL, NULL, NULL);
+ strcpy (home_dir_utf16, "C:\\Claws Mail");
+ home_dir_utf8 = g_utf16_to_utf8 ((const gunichar2 *)home_dir_utf16, -1, NULL, NULL, NULL);
}
return home_dir_utf8;
#else
off_t get_file_size(const gchar *file)
{
+#ifdef G_OS_WIN32
+ GFile *f;
+ GFileInfo *fi;
+ GError *error = NULL;
+ goffset size;
+
+ f = g_file_new_for_path(file);
+ fi = g_file_query_info(f, "standard::size",
+ G_FILE_QUERY_INFO_NONE, NULL, &error);
+ if (error != NULL) {
+ debug_print("get_file_size error: %s\n", error->message);
+ g_error_free(error);
+ g_object_unref(f);
+ return -1;
+ }
+ size = g_file_info_get_size(fi);
+ g_object_unref(fi);
+ g_object_unref(f);
+ return size;
+
+#else
GStatBuf s;
if (g_stat(file, &s) < 0) {
}
return s.st_size;
+#endif
}
time_t get_file_mtime(const gchar *file)
gchar day[4], mon[4];
gint dd, hh, mm, ss, yyyy;
struct tm buf1;
- gchar buf2[BUFFSIZE];
+ gchar buf2[RFC822_DATE_BUFFSIZE];
t = time(NULL);
- lt = localtime_r(&t, &buf1);
+ if (hidetz)
+ lt = gmtime_r(&t, &buf1);
+ else
+ lt = localtime_r(&t, &buf1);
- sscanf(asctime_r(lt, buf2), "%3s %3s %d %d:%d:%d %d\n",
- day, mon, &dd, &hh, &mm, &ss, &yyyy);
+ if (sscanf(asctime_r(lt, buf2), "%3s %3s %d %d:%d:%d %d\n",
+ day, mon, &dd, &hh, &mm, &ss, &yyyy) != 7)
+ g_warning("failed reading date/time");
g_snprintf(buf, len, "%s, %d %s %d %02d:%02d:%02d %s",
day, dd, mon, yyyy, hh, mm, ss, (hidetz? "-0000": tzoffset(&t)));
return GPOINTER_TO_INT(a) - GPOINTER_TO_INT(b);
}
-gchar *generate_msgid(gchar *buf, gint len, gchar *user_addr)
-{
- struct tm *lt;
- time_t t;
- gchar *addr;
- struct tm buft;
-
- t = time(NULL);
- lt = localtime_r(&t, &buft);
-
- if (user_addr != NULL)
- addr = g_strdup_printf(".%s", user_addr);
- else if (strlen(buf) != 0)
- addr = g_strdup_printf("@%s", buf);
- else
- addr = g_strdup_printf("@%s", get_domain_name());
-
- /* Replace all @ but the last one in addr, with underscores.
- * RFC 2822 States that msg-id syntax only allows one @.
- */
- while (strchr(addr, '@') != NULL && strchr(addr, '@') != strrchr(addr, '@'))
- *(strchr(addr, '@')) = '_';
-
- g_snprintf(buf, len, "%04d%02d%02d%02d%02d%02d.%08x%s",
- lt->tm_year + 1900, lt->tm_mon + 1,
- lt->tm_mday, lt->tm_hour,
- lt->tm_min, lt->tm_sec,
- (guint) rand(), addr);
-
- g_free(addr);
- return buf;
-}
-
/*
quote_cmd_argument()
}
/* get_uri_part() - retrieves a URI starting from scanpos.
- Returns TRUE if succesful */
+ Returns TRUE if successful */
gboolean get_uri_part(const gchar *start, const gchar *scanpos,
const gchar **bp, const gchar **ep, gboolean hdr)
{
* should pass some URI type to this function and decide on that whether
* to perform punctuation stripping */
-#define IS_REAL_PUNCT(ch) (g_ascii_ispunct(ch) && !strchr("/?=-_)", ch))
+#define IS_REAL_PUNCT(ch) (g_ascii_ispunct(ch) && !strchr("/?=-_~)", ch))
for (; ep_ - 1 > scanpos + 1 &&
IS_REAL_PUNCT(*(ep_ - 1));
return g_hash_table_lookup(tab, buf) != NULL;
}
-/* get_email_part() - retrieves an email address. Returns TRUE if succesful */
+/* get_email_part() - retrieves an email address. Returns TRUE if successful */
gboolean get_email_part(const gchar *start, const gchar *scanpos,
const gchar **bp, const gchar **ep, gboolean hdr)
{
ep_ += 3;
/* go to matching '>' (or next non-rfc822 char, like \n) */
- for (; *ep_ != '>' && *ep != '\0' && IS_RFC822_CHAR(*ep_); ep_++)
+ for (; *ep_ != '>' && *ep_ != '\0' && IS_RFC822_CHAR(*ep_); ep_++)
;
/* include the bracket */
GSList *canonical_parts = NULL;
GStatBuf st;
int i;
+#ifndef G_OS_WIN32
gboolean follow_symlinks = TRUE;
+#endif
if (depth > 32) {
#ifndef G_OS_WIN32
if(g_stat(tmp_path, &st) < 0) {
if (errno == ENOENT) {
errno = 0;
+#ifndef G_OS_WIN32
follow_symlinks = FALSE;
+#endif
}
if (errno != 0) {
g_free(tmp_path);
rnd = open("/dev/urandom", O_RDONLY);
if (rnd == -1) {
- perror("open on /dev/urandom");
+ FILE_OP_ERROR("/dev/urandom", "open");
debug_print("Could not open /dev/urandom.\n");
return FALSE;
}
/* Read data from the source into buf. */
#if defined G_OS_WIN32
if (!CryptGenRandom(rnd, count, buf)) {
- debug_print("Could not read %d random bytes.\n", count);
+ debug_print("Could not read %zd random bytes.\n", count);
CryptReleaseContext(rnd, 0);
return FALSE;
}
#else
ret = read(rnd, buf, count);
if (ret != count) {
- perror("read from /dev/urandom");
+ FILE_OP_ERROR("/dev/urandom", "read");
debug_print("Could not read enough data from /dev/urandom, read only %ld of %lu bytes.\n", ret, count);
close(rnd);
return FALSE;