2007-07-19 [colin] 2.10.0cvs47
[claws.git] / src / common / utils.c
index 930592f3cb4a836b3980db95441708779d70a2aa..dd1c2e01fae8a3b45f94c72b360c5200b67f9da4 100644 (file)
@@ -4,7 +4,7 @@
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
@@ -13,8 +13,8 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * 
  */
 
 #ifdef HAVE_CONFIG_H
@@ -31,6 +31,7 @@
 #include <string.h>
 #include <ctype.h>
 #include <errno.h>
+#include <sys/param.h>
 
 #if (HAVE_WCTYPE_H && HAVE_WCHAR_H)
 #  include <wchar.h>
@@ -56,6 +57,7 @@
 #  include <direct.h>
 #  include <io.h>
 #  include <fcntl.h>
+#  include <w32lib.h>
 #endif
 
 #ifdef MAEMO
@@ -74,6 +76,18 @@ static gboolean debug_mode = FALSE;
 static GSList *tempfiles=NULL;
 #endif
 
+/* Return true if we are running as root.  This function should beused
+   instead of getuid () == 0.  */
+gboolean superuser_p (void)
+{
+#ifdef G_OS_WIN32
+  return w32_is_administrator ();
+#else
+  return !getuid();
+#endif  
+}
+
+
 
 #if !GLIB_CHECK_VERSION(2, 7, 0) && !defined(G_OS_UNIX)
 gint g_chdir(const gchar *path)
@@ -1920,24 +1934,77 @@ const gchar *get_mail_base_dir(void)
 #endif
 }
 
+#ifdef MAEMO
+const gchar *prefs_common_get_data_root(void);
+gchar *last_data_root = NULL;
+#endif
+
 const gchar *get_news_cache_dir(void)
 {
        static gchar *news_cache_dir = NULL;
-
+#ifdef MAEMO
+       const gchar *data_root = prefs_common_get_data_root();
+       if (strcmp2(data_root, last_data_root)) {
+               g_free(news_cache_dir);
+               news_cache_dir = NULL;
+       }
+#endif
        if (!news_cache_dir)
+#ifndef MAEMO
                news_cache_dir = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
                                             NEWS_CACHE_DIR, NULL);
-
+#else
+       {
+               if (data_root) {
+                       news_cache_dir = g_strconcat(data_root, G_DIR_SEPARATOR_S,
+                                            "Claws", G_DIR_SEPARATOR_S, 
+                                            g_get_user_name(), G_DIR_SEPARATOR_S,
+                                            NEWS_CACHE_DIR, NULL);
+                       g_free(last_data_root);
+                       last_data_root = g_strdup(last_data_root);
+               } else {
+                       news_cache_dir = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
+                                            NEWS_CACHE_DIR, NULL);
+                       g_free(last_data_root);
+                       last_data_root = NULL;
+               }
+       }
+#endif
        return news_cache_dir;
 }
 
 const gchar *get_imap_cache_dir(void)
 {
        static gchar *imap_cache_dir = NULL;
+#ifdef MAEMO
+       const gchar *data_root = prefs_common_get_data_root();
+       if (strcmp2(data_root, last_data_root)) {
+               g_free(imap_cache_dir);
+               imap_cache_dir = NULL;
+       }
+#endif
 
        if (!imap_cache_dir)
+#ifndef MAEMO
                imap_cache_dir = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
                                             IMAP_CACHE_DIR, NULL);
+#else
+       {
+               if (data_root) {
+                       imap_cache_dir = g_strconcat(data_root, G_DIR_SEPARATOR_S,
+                                            "Claws", G_DIR_SEPARATOR_S, 
+                                            g_get_user_name(), G_DIR_SEPARATOR_S,
+                                            IMAP_CACHE_DIR, NULL);
+                       g_free(last_data_root);
+                       last_data_root = g_strdup(last_data_root);
+               } else {
+                       imap_cache_dir = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
+                                            IMAP_CACHE_DIR, NULL);
+                       g_free(last_data_root);
+                       last_data_root = NULL;
+               }
+       }
+#endif
 
        return imap_cache_dir;
 }
@@ -1945,10 +2012,34 @@ const gchar *get_imap_cache_dir(void)
 const gchar *get_mbox_cache_dir(void)
 {
        static gchar *mbox_cache_dir = NULL;
-
+#ifdef MAEMO
+       const gchar *data_root = prefs_common_get_data_root();
+       if (strcmp2(data_root, last_data_root)) {
+               g_free(mbox_cache_dir);
+               mbox_cache_dir = NULL;
+       }
+#endif
        if (!mbox_cache_dir)
+#ifndef MAEMO
                mbox_cache_dir = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
                                             MBOX_CACHE_DIR, NULL);
+#else
+       {
+               if (data_root) {
+                       mbox_cache_dir = g_strconcat(data_root, G_DIR_SEPARATOR_S,
+                                            "Claws", G_DIR_SEPARATOR_S, 
+                                            g_get_user_name(), G_DIR_SEPARATOR_S,
+                                            MBOX_CACHE_DIR, NULL);
+                       g_free(last_data_root);
+                       last_data_root = g_strdup(last_data_root);
+               } else {
+                       mbox_cache_dir = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
+                                            MBOX_CACHE_DIR, NULL);
+                       g_free(last_data_root);
+                       last_data_root = NULL;
+               }
+       }
+#endif
 
        return mbox_cache_dir;
 }
@@ -2040,20 +2131,20 @@ const gchar *get_domain_name(void)
 
        if (!domain_name) {
                struct hostent *hp;
-               struct utsname uts;
+               char hostname[256];
 
-               if (uname(&uts) < 0) {
-                       perror("uname");
+               if (gethostname(hostname, sizeof(hostname)) != 0) {
+                       perror("gethostname");
                        domain_name = "unknown";
                } else {
-                       if ((hp = my_gethostbyname(uts.nodename)) == NULL) {
+                       hostname[sizeof(hostname) - 1] = '\0';
+                       if ((hp = my_gethostbyname(hostname)) == NULL) {
                                perror("gethostbyname");
-                               domain_name = g_strdup(uts.nodename);
+                               domain_name = g_strdup(hostname);
                        } else {
                                domain_name = g_strdup(hp->h_name);
                        }
                }
-
                debug_print("domain name = %s\n", domain_name);
        }
 
@@ -4765,7 +4856,12 @@ gint copy_dir(const gchar *src, const gchar *dst)
                                g_dir_close(dir);
                                return r;
                        }
-               } else if (g_file_test(old_file, G_FILE_TEST_IS_SYMLINK)) {
+                }
+#ifndef G_OS_WIN32
+                /* Windows has no symlinks.  Or well, Vista seems to
+                   have something like this but the semantics might be
+                   different.  Thus we don't use it under Windows. */
+                else if (g_file_test(old_file, G_FILE_TEST_IS_SYMLINK)) {
                        GError *error;
                        gint r = 0;
                        gchar *target = g_file_read_link(old_file, &error);
@@ -4776,7 +4872,9 @@ gint copy_dir(const gchar *src, const gchar *dst)
                                g_dir_close(dir);
                                return r;
                        }
-               } else if (g_file_test(old_file, G_FILE_TEST_IS_DIR)) {
+                 }
+#endif /*G_OS_WIN32*/
+               else if (g_file_test(old_file, G_FILE_TEST_IS_DIR)) {
                        gint r = copy_dir(old_file, new_file);
                        if (r < 0) {
                                g_dir_close(dir);