#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>
#include "utils.h"
#include "socket.h"
#include "../codeconv.h"
+#include "tlds.h"
#define BUFFSIZE 8192
}
#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)
#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;
{
#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);
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;
}
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
}
/*!
*/
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:" */
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;
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);
* 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;
}
gchar *end = g_strdup(strstr(result, "%s")+2);
gchar *tmp;
*strstr(start, "%s") = '\0';
- tmp = g_strconcat(start,"'%s'",end, NULL);
+ tmp = g_strconcat(start,"%s",end, NULL);
g_free(start);
g_free(end);
g_free(result);
*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;