Advertisement
tomkiewicz

fhs-3

Apr 24th, 2014
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 11.64 KB | None | 0 0
  1. diff --git a/config.h.mingw b/config.h.mingw
  2. --- a/config.h.mingw
  3. +++ b/config.h.mingw
  4. @@ -406,10 +406,10 @@
  5.   */
  6.  #define HAVE_VSNPRINTF 1
  7.  
  8. -#define FINCH_LIBDIR wpurple_lib_dir()
  9. -#define PIDGIN_LIBDIR wpurple_lib_dir()
  10. +#define FINCH_LIBDIR wpurple_lib_dir(NULL)
  11. +#define PIDGIN_LIBDIR wpurple_lib_dir(NULL)
  12.  #define PURPLE_DATADIR wpurple_install_dir()
  13. -#define PURPLE_LIBDIR wpurple_lib_dir()
  14. +#define PURPLE_LIBDIR wpurple_lib_dir(NULL)
  15.  #define PURPLE_LOCALEDIR wpurple_locale_dir()
  16.  #define PURPLE_SYSCONFDIR wpurple_sysconf_dir()
  17.  
  18. diff --git a/configure.ac b/configure.ac
  19. --- a/configure.ac
  20. +++ b/configure.ac
  21. @@ -177,12 +177,46 @@
  22.  
  23.  AC_C_BIGENDIAN
  24.  
  25. +AC_ARG_WITH(win32-dirs, [AS_HELP_STRING([--with-win32-dirs=<classic|fhs>],
  26. +   [use win32 classic (Program Files-like) or FHS (unix-like) directory structure (default: classic)])], [
  27. +       if test "x$withval" != "xclassic" -a "x$withval" != "xfhs" ; then
  28. +           AC_MSG_ERROR([Unsupported win32-dirs option. Please choose "classic" or "fhs".])
  29. +       fi
  30. +       with_win32_dirs="$withval"
  31. +   ], with_win32_dirs="classic")
  32. +if test "x$is_win32" = "xyes" -a "x$with_win32_dirs" = "xfhs" ; then
  33. +   AC_DEFINE(USE_WIN32_FHS, 1, [Define to 1, to use FHS on win32.])
  34. +fi
  35. +
  36.  dnl Check for directories
  37.  if test "x$is_win32" = "xyes" ; then
  38. -   purple_datadir="wpurple_install_dir()"
  39. -   purple_libdir="wpurple_lib_dir()"
  40. -   pidgin_libdir="wpurple_lib_dir()"
  41. -   finch_libdir="wpurple_lib_dir()"
  42. +   if test "x$with_win32_dirs" = "xfhs" ; then
  43. +       AS_AC_EXPAND(win32_fhs_bindir, "$bindir")
  44. +       AC_DEFINE_UNQUOTED([WIN32_FHS_BINDIR], ["$win32_fhs_bindir"],
  45. +           [bindir, as defined by configure])
  46. +       AS_AC_EXPAND(win32_fhs_libdir, "$libdir")
  47. +       AC_DEFINE_UNQUOTED([WIN32_FHS_LIBDIR], ["$win32_fhs_libdir"],
  48. +           [libdir, as defined by configure])
  49. +       AS_AC_EXPAND(win32_fhs_datadir, "$datadir")
  50. +       AC_DEFINE_UNQUOTED([WIN32_FHS_DATADIR], ["$win32_fhs_datadir"],
  51. +           [datadir, as defined by configure])
  52. +       AS_AC_EXPAND(win32_fhs_sysconfdir, "$sysconfdir")
  53. +       AC_DEFINE_UNQUOTED([WIN32_FHS_SYSCONFDIR], ["$win32_fhs_sysconfdir"],
  54. +           [sysconfdir, as defined by configure])
  55. +       AS_AC_EXPAND(win32_fhs_localedir, "$localedir")
  56. +       AC_DEFINE_UNQUOTED([WIN32_FHS_LOCALEDIR], ["$win32_fhs_localedir"],
  57. +           [localedir, as defined by configure])
  58. +
  59. +       purple_libdir="wpurple_lib_dir(\"purple-$PURPLE_MAJOR_VERSION\")"
  60. +       pidgin_libdir="wpurple_lib_dir(\"pidgin-$PURPLE_MAJOR_VERSION\")"
  61. +       finch_libdir="wpurple_lib_dir(\"finch-$PURPLE_MAJOR_VERSION\")"
  62. +   else
  63. +       purple_libdir="wpurple_lib_dir(NULL)"
  64. +       pidgin_libdir="wpurple_lib_dir(NULL)"
  65. +       finch_libdir="wpurple_lib_dir(NULL)"
  66. +   fi
  67. +
  68. +   purple_datadir="wpurple_data_dir()"
  69.     purple_sysconfdir="wpurple_sysconf_dir()"
  70.     purple_localedir="wpurple_locale_dir()"
  71.  else
  72. diff --git a/libpurple/certificate.c b/libpurple/certificate.c
  73. --- a/libpurple/certificate.c
  74. +++ b/libpurple/certificate.c
  75. @@ -922,7 +922,7 @@
  76.         x509_ca_paths = g_list_append(x509_ca_paths,
  77.             g_strdup(SSL_CERTIFICATES_DIR));
  78.  #endif
  79. -#ifdef _WIN32
  80. +#if defined(_WIN32) && !defined(USE_WIN32_FHS)
  81.         x509_ca_paths = g_list_append(x509_ca_paths, g_build_filename(
  82.             PURPLE_DATADIR, "ca-certs", NULL));
  83.  #else
  84. diff --git a/libpurple/protocols/jabber/jabber.c b/libpurple/protocols/jabber/jabber.c
  85. --- a/libpurple/protocols/jabber/jabber.c
  86. +++ b/libpurple/protocols/jabber/jabber.c
  87. @@ -3814,7 +3814,7 @@
  88.     if (!sasl_initialized) {
  89.         sasl_initialized = TRUE;
  90.  #ifdef _WIN32
  91. -       sasldir = g_build_filename(wpurple_install_dir(), "sasl2", NULL);
  92. +       sasldir = g_build_filename(wpurple_bin_dir(), "sasl2", NULL);
  93.         sasl_set_path(SASL_PATH_TYPE_PLUGIN, sasldir);
  94.         g_free(sasldir);
  95.         /* Suppress error popups for failing to load sasl plugins */
  96. diff --git a/libpurple/win32/win32dep.c b/libpurple/win32/win32dep.c
  97. --- a/libpurple/win32/win32dep.c
  98. +++ b/libpurple/win32/win32dep.c
  99. @@ -29,10 +29,12 @@
  100.  #include "glibcompat.h"
  101.  #include "notify.h"
  102.  
  103. +#define MAX_PATH_LEN 2048
  104. +
  105.  /*
  106.   * LOCALS
  107.   */
  108. -static char *app_data_dir = NULL, *install_dir = NULL,
  109. +static char *app_data_dir = NULL, *bin_dir = NULL, *data_dir = NULL,
  110.     *lib_dir = NULL, *locale_dir = NULL, *sysconf_dir = NULL;
  111.  
  112.  static HINSTANCE libpurpledll_hInstance = NULL;
  113. @@ -128,12 +130,17 @@
  114.     return retval;
  115.  }
  116.  
  117. -const char *wpurple_install_dir(void) {
  118. +const char *wpurple_bin_dir(void) {
  119.     static gboolean initialized = FALSE;
  120.  
  121.     if (!initialized) {
  122.         char *tmp = NULL;
  123.         wchar_t winstall_dir[MAXPATHLEN];
  124. +
  125. +       /* We might use g_win32_get_package_installation_directory_of_module
  126. +        * here, but we won't because this routine strips bin or lib
  127. +        * part of the path.
  128. +        */
  129.         if (GetModuleFileNameW(libpurpledll_hInstance, winstall_dir,
  130.                 MAXPATHLEN) > 0) {
  131.             tmp = g_utf16_to_utf8(winstall_dir, -1,
  132. @@ -147,42 +154,138 @@
  133.             g_free(tmp);
  134.             return NULL;
  135.         } else {
  136. -           install_dir = g_path_get_dirname(tmp);
  137. +           bin_dir = g_path_get_dirname(tmp);
  138.             g_free(tmp);
  139.             initialized = TRUE;
  140.         }
  141.     }
  142.  
  143. -   return install_dir;
  144. +   return bin_dir;
  145.  }
  146.  
  147. -const char *wpurple_lib_dir(void) {
  148. +#ifdef USE_WIN32_FHS
  149. +static gchar *
  150. +wpurple_install_relative_path(const gchar *abspath)
  151. +{
  152. +   const gchar *bindir = WIN32_FHS_BINDIR;
  153. +   const gchar *relpath;
  154. +   int i, last_dirsep = -1, bin_esc_cnt;
  155. +   gchar *ret;
  156. +   GString *bin_esc;
  157. +
  158. +   g_return_val_if_fail(bindir != NULL, NULL);
  159. +   g_return_val_if_fail(bindir[0] != '\0', NULL);
  160. +   g_return_val_if_fail(abspath != NULL, NULL);
  161. +   g_return_val_if_fail(abspath[0] != '\0', NULL);
  162. +
  163. +   /* let's find the common prefix of those paths */
  164. +   for (i = 0; bindir[i] == abspath[i]; i++) {
  165. +       if (bindir[i] == '\0')
  166. +           break;
  167. +       if (bindir[i] == '\\' || bindir[i] == '/')
  168. +           last_dirsep = i;
  169. +   }
  170. +   if (bindir[i] == '\0' && (abspath[i] == '\\' || abspath[i] == '/'))
  171. +       last_dirsep = i;
  172. +   if (abspath[i] == '\0' && (bindir[i] == '\\' || bindir[i] == '/'))
  173. +       last_dirsep = i;
  174. +
  175. +   /* there is no common prefix, return absolute path */
  176. +   if (last_dirsep == -1)
  177. +       return g_strdup(abspath);
  178. +
  179. +   /* let's check, how many dirs we need to go up to the common prefix */
  180. +   bin_esc_cnt = 0;
  181. +   for (i = last_dirsep; bindir[i]; i++) {
  182. +       if (bindir[i] != '\\' && bindir[i] != '/')
  183. +           continue;
  184. +       if (bindir[i + 1] == '\0') /* trailing dir separator */
  185. +           break;
  186. +       bin_esc_cnt++;
  187. +   }
  188. +   bin_esc = g_string_new("");
  189. +   for (i = 0; i < bin_esc_cnt; i++)
  190. +       g_string_append(bin_esc, ".." G_DIR_SEPARATOR_S);
  191. +
  192. +   /* now, we need to go back deeper into the directory tree */
  193. +   relpath = &abspath[last_dirsep];
  194. +   if (relpath[0] != '\0')
  195. +       relpath++;
  196. +
  197. +   /* - enter bin dir
  198. +    * - escape it to the common prefix
  199. +    * - dive into the abspath dir
  200. +    */
  201. +   ret = g_build_filename(wpurple_bin_dir(), bin_esc, relpath, NULL);
  202. +   g_string_free(bin_esc, TRUE);
  203. +
  204. +   purple_debug_misc("wpurple", "wpurple_install_relative_path(%s) = %s",
  205. +       abspath, ret);
  206. +
  207. +   return ret;
  208. +}
  209. +#endif
  210. +
  211. +const char *
  212. +wpurple_data_dir(void) {
  213. +#ifdef USE_WIN32_FHS
  214.     static gboolean initialized = FALSE;
  215. +   if (initialized)
  216. +       return data_dir;
  217. +   data_dir = wpurple_install_relative_path(WIN32_FHS_DATADIR);
  218. +   initialized = TRUE;
  219. +
  220. +   return data_dir;
  221. +#else
  222. +   return wpurple_bin_dir();
  223. +#endif
  224. +}
  225. +
  226. +
  227. +const char *wpurple_lib_dir(const char *subdir)
  228. +{
  229. +   static gboolean initialized = FALSE;
  230. +   static gchar subpath[MAX_PATH_LEN];
  231.  
  232.     if (!initialized) {
  233. -       const char *inst_dir = wpurple_install_dir();
  234. +#ifdef USE_WIN32_FHS
  235. +       lib_dir = wpurple_install_relative_path(WIN32_FHS_LIBDIR);
  236. +       initialized = TRUE;
  237. +#else
  238. +       const char *inst_dir = wpurple_bin_dir();
  239.         if (inst_dir != NULL) {
  240.             lib_dir = g_strdup_printf("%s" G_DIR_SEPARATOR_S "plugins", inst_dir);
  241.             initialized = TRUE;
  242.         } else {
  243.             return NULL;
  244.         }
  245. +#endif
  246.     }
  247.  
  248. -   return lib_dir;
  249. +   if (subdir == NULL)
  250. +       return lib_dir;
  251. +
  252. +   g_snprintf(subpath, sizeof(subpath),
  253. +       "%s" G_DIR_SEPARATOR_S "%s", lib_dir, subdir);
  254. +   return subpath;
  255.  }
  256.  
  257.  const char *wpurple_locale_dir(void) {
  258.     static gboolean initialized = FALSE;
  259.  
  260.     if (!initialized) {
  261. -       const char *inst_dir = wpurple_install_dir();
  262. +#ifdef USE_WIN32_FHS
  263. +       locale_dir = wpurple_install_relative_path(WIN32_FHS_LOCALEDIR);
  264. +       initialized = TRUE;
  265. +#else
  266. +       const char *inst_dir = wpurple_bin_dir();
  267.         if (inst_dir != NULL) {
  268.             locale_dir = g_strdup_printf("%s" G_DIR_SEPARATOR_S "locale", inst_dir);
  269.             initialized = TRUE;
  270.         } else {
  271.             return NULL;
  272.         }
  273. +#endif
  274.     }
  275.  
  276.     return locale_dir;
  277. @@ -212,7 +315,11 @@
  278.     static gboolean initialized = FALSE;
  279.  
  280.     if (!initialized) {
  281. +#ifdef USE_WIN32_FHS
  282. +       sysconf_dir = wpurple_install_relative_path(WIN32_FHS_SYSCONFDIR);
  283. +#else
  284.         sysconf_dir = wpurple_get_special_folder(CSIDL_COMMON_APPDATA);
  285. +#endif
  286.         initialized = TRUE;
  287.     }
  288.  
  289. @@ -540,13 +647,15 @@
  290.     WSACleanup();
  291.  
  292.     g_free(app_data_dir);
  293. -   g_free(install_dir);
  294. +   g_free(bin_dir);
  295. +   g_free(data_dir);
  296.     g_free(lib_dir);
  297.     g_free(locale_dir);
  298.     g_free(sysconf_dir);
  299.  
  300.     app_data_dir = NULL;
  301. -   install_dir = NULL;
  302. +   bin_dir = NULL;
  303. +   data_dir = NULL;
  304.     lib_dir = NULL;
  305.     locale_dir = NULL;
  306.     sysconf_dir = NULL;
  307. diff --git a/libpurple/win32/win32dep.h b/libpurple/win32/win32dep.h
  308. --- a/libpurple/win32/win32dep.h
  309. +++ b/libpurple/win32/win32dep.h
  310. @@ -69,8 +69,9 @@
  311.  
  312.  /* Determine Purple paths */
  313.  gchar *wpurple_get_special_folder(int folder_type); /* needs to be g_free'd */
  314. -const char *wpurple_install_dir(void);
  315. -const char *wpurple_lib_dir(void);
  316. +const char *wpurple_bin_dir(void);
  317. +const char *wpurple_data_dir(void);
  318. +const char *wpurple_lib_dir(const char *subdir);
  319.  const char *wpurple_locale_dir(void);
  320.  const char *wpurple_home_dir(void);
  321.  const char *wpurple_sysconf_dir(void);
  322. diff --git a/pidgin/gtkconv-theme.c b/pidgin/gtkconv-theme.c
  323. --- a/pidgin/gtkconv-theme.c
  324. +++ b/pidgin/gtkconv-theme.c
  325. @@ -125,7 +125,7 @@
  326.  
  327.     if (!g_file_test(file, G_FILE_TEST_EXISTS)) {
  328.         g_free(file);
  329. -#ifdef _WIN32
  330. +#if defined(_WIN32) && !defined(USE_WIN32_FHS)
  331.         file = g_build_filename(PURPLE_DATADIR,
  332.             "theme", "Template.html", NULL);
  333.  #else
  334. diff --git a/pidgin/gtkconv.c b/pidgin/gtkconv.c
  335. --- a/pidgin/gtkconv.c
  336. +++ b/pidgin/gtkconv.c
  337. @@ -8940,7 +8940,7 @@
  338.             PURPLE_CALLBACK(wrote_msg_update_unseen_cb), NULL);
  339.  
  340.     purple_theme_manager_register_type(g_object_new(PIDGIN_TYPE_CONV_THEME_LOADER, "type", "conversation", NULL));
  341. -#ifdef _WIN32
  342. +#if defined(_WIN32) && !defined(USE_WIN32_FHS)
  343.     theme_dir = g_build_filename(PURPLE_DATADIR, "theme", NULL);
  344.  #else
  345.     theme_dir = g_build_filename(PURPLE_DATADIR, "pidgin", "theme", NULL);
  346. diff --git a/pidgin/plugins/win32/winprefs/winprefs.c b/pidgin/plugins/win32/winprefs/winprefs.c
  347. --- a/pidgin/plugins/win32/winprefs/winprefs.c
  348. +++ b/pidgin/plugins/win32/winprefs/winprefs.c
  349. @@ -190,7 +190,7 @@
  350.     char *runval = NULL;
  351.  
  352.     if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)))
  353. -       runval = g_strdup_printf("\"%s" G_DIR_SEPARATOR_S "pidgin.exe\"", wpurple_install_dir());
  354. +       runval = g_strdup_printf("\"%s" G_DIR_SEPARATOR_S "pidgin.exe\"", wpurple_bin_dir());
  355.  
  356.     if(!wpurple_write_reg_string(HKEY_CURRENT_USER, RUNKEY, "Pidgin", runval)
  357.         /* For Win98 */
  358. diff --git a/pidgin/win32/gtkwin32dep.c b/pidgin/win32/gtkwin32dep.c
  359. --- a/pidgin/win32/gtkwin32dep.c
  360. +++ b/pidgin/win32/gtkwin32dep.c
  361. @@ -396,7 +396,7 @@
  362.     if (purple_debug_is_verbose())
  363.         purple_debug_misc("winpidgin", "winpidgin_init start\n");
  364.  
  365. -   exchndl_dll_path = g_build_filename(wpurple_install_dir(), "exchndl.dll", NULL);
  366. +   exchndl_dll_path = g_build_filename(wpurple_bin_dir(), "exchndl.dll", NULL);
  367.     MySetLogFile = (LPFNSETLOGFILE) wpurple_find_and_loadproc(exchndl_dll_path, "SetLogFile");
  368.     g_free(exchndl_dll_path);
  369.     exchndl_dll_path = NULL;
  370. diff --git a/pidgin/win32/wspell.c b/pidgin/win32/wspell.c
  371. --- a/pidgin/win32/wspell.c
  372. +++ b/pidgin/win32/wspell.c
  373. @@ -79,7 +79,7 @@
  374.     gchar *tmp, *tmp2;
  375.  
  376.     const char *path = g_getenv("PATH");
  377. -   tmp = g_build_filename(wpurple_install_dir(), "spellcheck", NULL);
  378. +   tmp = g_build_filename(wpurple_bin_dir(), "spellcheck", NULL);
  379.     tmp2 = g_strdup_printf("%s%s%s", tmp,
  380.         (path ? G_SEARCHPATH_SEPARATOR_S : ""),
  381.         (path ? path : ""));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement