Fix a compile error on Win32.
[claws.git] / src / common / utils.c
index 64ca25a8aec780837108a6bf1b307d3564d8c02b..1197b356b8dc9e7aa7f106a59d7391bddd956129 100644 (file)
@@ -49,6 +49,9 @@
 #include <ctype.h>
 #include <errno.h>
 #include <sys/param.h>
+#ifndef G_OS_WIN32
+#include <sys/socket.h>
+#endif
 
 #if (HAVE_WCTYPE_H && HAVE_WCHAR_H)
 #  include <wchar.h>
@@ -81,6 +84,7 @@
 #include "utils.h"
 #include "socket.h"
 #include "../codeconv.h"
+#include "tlds.h"
 
 #define BUFFSIZE       8192
 
@@ -1888,7 +1892,7 @@ const gchar *get_template_dir(void)
 }
 
 #ifdef G_OS_WIN32
-const gchar *get_cert_file(void)
+const gchar *w32_get_cert_file(void)
 {
        const gchar *cert_file = NULL;
        if (!cert_file)
@@ -1938,7 +1942,7 @@ const gchar *get_plugin_dir(void)
 
 #ifdef G_OS_WIN32
 /* Return the default directory for Themes. */
-const gchar *get_themes_dir(void)
+const gchar *w32_get_themes_dir(void)
 {
        static gchar *themes_dir = NULL;
 
@@ -1976,21 +1980,28 @@ const gchar *get_domain_name(void)
 {
 #ifdef G_OS_UNIX
        static gchar *domain_name = NULL;
+       struct addrinfo hints, *res;
+       char hostname[256];
+       int s;
 
        if (!domain_name) {
-               struct hostent *hp;
-               char hostname[256];
-
                if (gethostname(hostname, sizeof(hostname)) != 0) {
                        perror("gethostname");
                        domain_name = "localhost";
                } else {
-                       hostname[sizeof(hostname) - 1] = '\0';
-                       if ((hp = my_gethostbyname(hostname)) == NULL) {
-                               perror("gethostbyname");
+                       memset(&hints, 0, sizeof(struct addrinfo));
+                       hints.ai_family = AF_UNSPEC;
+                       hints.ai_socktype = 0;
+                       hints.ai_flags = AI_CANONNAME;
+                       hints.ai_protocol = 0;
+
+                       s = getaddrinfo(hostname, NULL, &hints, &res);
+                       if (s != 0) {
+                               fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
                                domain_name = g_strdup(hostname);
                        } else {
-                               domain_name = g_strdup(hp->h_name);
+                               domain_name = g_strdup(res->ai_canonname);
+                               freeaddrinfo(res);
                        }
                }
                debug_print("domain name = %s\n", domain_name);
@@ -2187,38 +2198,23 @@ gint make_dir_hier(const gchar *dir)
 gint remove_all_files(const gchar *dir)
 {
        GDir *dp;
-       const gchar *dir_name;
-       gchar *prev_dir;
-
-       prev_dir = g_get_current_dir();
-
-       if (g_chdir(dir) < 0) {
-               FILE_OP_ERROR(dir, "chdir");
-               g_free(prev_dir);
-               return -1;
-       }
+       const gchar *file_name;
+       gchar *tmp;
 
-       if ((dp = g_dir_open(".", 0, NULL)) == NULL) {
+       if ((dp = g_dir_open(dir, 0, NULL)) == NULL) {
                g_warning("failed to open directory: %s", dir);
-               g_free(prev_dir);
                return -1;
        }
 
-       while ((dir_name = g_dir_read_name(dp)) != NULL) {
-               if (claws_unlink(dir_name) < 0)
-                       FILE_OP_ERROR(dir_name, "unlink");
+       while ((file_name = g_dir_read_name(dp)) != NULL) {
+               tmp = g_strconcat(dir, G_DIR_SEPARATOR_S, file_name, NULL);
+               if (claws_unlink(tmp) < 0)
+                       FILE_OP_ERROR(tmp, "unlink");
+               g_free(tmp);
        }
 
        g_dir_close(dp);
 
-       if (g_chdir(prev_dir) < 0) {
-               FILE_OP_ERROR(prev_dir, "chdir");
-               g_free(prev_dir);
-               return -1;
-       }
-
-       g_free(prev_dir);
-
        return 0;
 }
 
@@ -3619,19 +3615,15 @@ void subject_table_remove(GHashTable *subject_table, gchar * subject)
        g_hash_table_remove(subject_table, subject);
 }
 
-#ifndef G_OS_WIN32
 static regex_t u_regex;
 static gboolean u_init_;
-#endif
 
 void utils_free_regex(void)
 {
-#ifndef G_OS_WIN32
        if (u_init_) {
                regfree(&u_regex);
                u_init_ = FALSE;
        }
-#endif
 }
 
 /*!
@@ -3647,7 +3639,6 @@ void utils_free_regex(void)
  */
 int subject_get_prefix_length(const gchar *subject)
 {
-#ifndef G_OS_WIN32
        /*!< Array with allowable reply prefixes regexps. */
        static const gchar * const prefixes[] = {
                "Re\\:",                        /* "Re:" */
@@ -3708,44 +3699,8 @@ int subject_get_prefix_length(const gchar *subject)
                return pos.rm_eo;
        else
                return 0;
-#else
-       /*!< Array with allowable reply prefixes regexps. */
-       static const gchar * const prefixes[] = {
-               "re:",                  /* "Re:" */
-               "antw:",                        /* "Antw:" (Dutch / German Outlook) */
-               "aw:",                  /* "Aw:"   (German) */
-               "antwort:",                     /* "Antwort:" (German Lotus Notes) */
-               "res:",                 /* "Res:" (Spanish/Brazilian Outlook) */
-               "fw:",                  /* "Fw:" Forward */
-               "fwd:",                 /* "Fwd:" Forward */
-               "enc:",                 /* "Enc:" Forward (Brazilian Outlook) */
-               "odp:",                 /* "Odp:" Re (Polish Outlook) */
-               "rif:",                 /* "Rif:" (Italian Outlook) */
-               "sv:",                  /* "Sv" (Norwegian) */
-               "vs:",                  /* "Vs" (Norwegian) */
-               "ad:",                  /* "Ad" (Norwegian) */
-               "R\303\251f. :",        /* "R�f. :" (French Lotus Notes) */
-               "Re :",                 /* "Re :" (French Yahoo Mail) */
-               /* add more */
-       };
-       const int PREFIXES = sizeof prefixes / sizeof prefixes[0];
-       int n;
-
-       if (!subject) return 0;
-       if (!*subject) return 0;
-
-       for (n = 0; n < PREFIXES; n++) {
-               int len = strlen(prefixes[n]);
-               if (!strncasecmp(subject, prefixes[n], len)) {
-                       if (subject[len] == ' ')
-                               return len+1;
-                       else
-                               return len;
-               }
-       }
-       return 0;
-#endif
 }
+
 static guint g_stricase_hash(gconstpointer gptr)
 {
        guint hash_result = 0;
@@ -4234,35 +4189,6 @@ gchar *make_uri_string(const gchar *bp, const gchar *ep)
 
 static GHashTable *create_domain_tab(void)
 {
-       static const gchar *toplvl_domains [] = {
-           "museum", "aero",
-           "arpa", "coop", "info", "name", "biz", "com", "edu", "gov",
-           "int", "mil", "net", "org", "ac", "ad", "ae", "af", "ag",
-           "ai", "al", "am", "an", "ao", "aq", "ar", "as", "at", "au",
-           "aw", "az", "ba", "bb", "bd", "be", "bf", "bg", "bh", "bi",
-           "bj", "bm", "bn", "bo", "br", "bs", "bt", "bv", "bw", "by",
-           "bz", "ca", "cc", "cd", "cf", "cg", "ch", "ci", "ck", "cl",
-           "cm", "cn", "co", "cr", "cu", "cv", "cx", "cy", "cz", "de",
-           "dj", "dk", "dm", "do", "dz", "ec", "ee", "eg", "eh", "er",
-           "es", "et", "eu", "fi", "fj", "fk", "fm", "fo", "fr", "ga", "gd",
-           "ge", "gf", "gg", "gh", "gi", "gl", "gm", "gn", "gp", "gq",
-           "gr", "gs", "gt", "gu", "gw", "gy", "hk", "hm", "hn", "hr",
-           "ht", "hu", "id", "ie", "il", "im", "in", "io", "iq", "ir",
-           "is", "it", "je", "jm", "jo", "jp", "ke", "kg", "kh", "ki",
-           "km", "kn", "kp", "kr", "kw", "ky", "kz", "la", "lb", "lc",
-           "li", "lk", "lr", "ls", "lt", "lu", "lv", "ly", "ma", "mc",
-           "md", "mg", "mh", "mk", "ml", "mm", "mn", "mo", "mp", "mq",
-           "mr", "ms", "mt", "mu", "mv", "mw", "mx", "my", "mz", "na",
-           "nc", "ne", "nf", "ng", "ni", "nl", "no", "np", "nr", "nu",
-           "nz", "om", "pa", "pe", "pf", "pg", "ph", "pk", "pl", "pm",
-           "pn", "pr", "ps", "pt", "pw", "py", "qa", "re", "ro", "ru",
-           "rw", "sa", "sb", "sc", "sd", "se", "sg", "sh", "si", "sj",
-           "sk", "sl", "sm", "sn", "so", "sr", "st", "sv", "sy", "sz",
-           "tc", "td", "tf", "tg", "th", "tj", "tk", "tm", "tn", "to",
-           "tp", "tr", "tt", "tv", "tw", "tz", "ua", "ug", "uk", "um",
-           "us", "uy", "uz", "va", "vc", "ve", "vg", "vi", "vn", "vu",
-           "wf", "ws", "ye", "yt", "yu", "za", "zm", "zw"
-       };
        gint n;
        GHashTable *htab = g_hash_table_new(g_stricase_hash, g_stricase_equal);
 
@@ -4532,10 +4458,21 @@ gchar *make_email_string(const gchar *bp, const gchar *ep)
         * uri type later on in the button_pressed signal handler */
        gchar *tmp;
        gchar *result;
+       gchar *colon, *at;
 
        tmp = g_strndup(bp, ep - bp);
-       result = g_strconcat("mailto:", tmp, NULL);
-       g_free(tmp);
+
+       /* If there is a colon in the username part of the address,
+        * we're dealing with an URI for some other protocol - do
+        * not prefix with mailto: in such case. */
+       colon = strchr(tmp, ':');
+       at = strchr(tmp, '@');
+       if (colon != NULL && at != NULL && colon < at) {
+               result = tmp;
+       } else {
+               result = g_strconcat("mailto:", tmp, NULL);
+               g_free(tmp);
+       }
 
        return result;
 }
@@ -5099,7 +5036,7 @@ size_t fast_strftime(gchar *buf, gint buflen, const gchar *format, struct tm *lt
                                *curpos++ = '0'+(lt->tm_min % 10);
                                break;
                        case 's':
-                               snprintf(subbuf, 64, "%ld", mktime(lt));
+                               snprintf(subbuf, 64, "%lld", (long long)mktime(lt));
                                len = strlen(subbuf); CHECK_SIZE();
                                strncpy2(curpos, subbuf, buflen - total_done);
                                break;