From 13a660d2e0cdb43ec46df38e53687a77f76581e6 Mon Sep 17 00:00:00 2001 From: Andrew Borodin Date: Fri, 16 Mar 2012 13:53:34 +0300 Subject: [PATCH] Allow setup mc home directory using MC_HOME environment variable. Signed-off-by: Andrew Borodin --- doc/man/es/mc.1.in | 11 +++++++-- doc/man/hu/mc.1.in | 13 ++++++++--- doc/man/it/mc.1.in | 11 +++++++-- doc/man/mc.1.in | 12 ++++++++-- doc/man/pl/mc.1.in | 8 ++++++- doc/man/ru/mc.1.in | 7 ++++++ doc/man/sr/mc.1.in | 5 ++-- lib/mcconfig/Makefile.am | 4 +--- lib/mcconfig/paths.c | 61 +++++++++++++++++------------------------------- lib/vfs/interface.c | 2 +- src/Makefile.am | 6 +++-- src/main.c | 32 +++++++++++++++++++++---- src/textconf.c | 3 +++ 13 files changed, 112 insertions(+), 63 deletions(-) diff --git a/doc/man/es/mc.1.in b/doc/man/es/mc.1.in index d360c9f4e..c83af5eb4 100644 --- a/doc/man/es/mc.1.in +++ b/doc/man/es/mc.1.in @@ -3664,8 +3664,9 @@ o infrautilizadas). .SH "ARCHIVOS AUXILIARES" Los directorios indicados a continuación pueden variar de una instalación a otra. También se pueden modificar con la variable de -entorno MC_DATADIR, que de estar definida se emplearía en vez de -@prefix@/share/mc. +entorno +.BR MC_DATADIR , +que de estar definida se emplearía en vez de @prefix@/share/mc. .PP .I @prefix@/share/mc.hlp .IP @@ -3722,6 +3723,12 @@ La lista de directorios para el árbol de directorios y la vista en árbol. Menú local definido por el usuario. Si este archivo está presente será usado en lugar del menú de aplicaciones personal o de sistema. +.PP +To change default home directory of MC, you can use +.BR MC_HOME +environment variable. The value of MC_HOME must be an absolute path. If MC_HOME +variable is unset or empty, HOME variable is used. If HOME variable is unset +or empty, MC home directory is get from GLib library. .\"SKIP_SECTION" .SH "LICENCIA" Este programa se distribuye en los términos que recoge la Licencia Pública diff --git a/doc/man/hu/mc.1.in b/doc/man/hu/mc.1.in index 0ec73b1da..c36f943d4 100644 --- a/doc/man/hu/mc.1.in +++ b/doc/man/hu/mc.1.in @@ -3172,9 +3172,10 @@ valamelyik gomb nem használható). .SH "" .\"NODE "FILES" .SH "Fájlok" -A progam minden ezzel kapcsolatos infomációt az MCHOME környezeti -változóban tárol. Ha ezt a változót nem állítottuk be, akkor ez vissza -fog állítódni a /usr könyvtárra. +A progam minden ezzel kapcsolatos infomációt az +.BR MC_DATADIR +környezeti változóban tárol. Ha ezt a változót nem állítottuk be, akkor +ez vissza fog állítódni a /usr könyvtárra. .PP .I @prefix@/share/mc/mc.hlp .IP @@ -3237,6 +3238,12 @@ frissíti ezt. .IP Helyi felhasználó által definiált menü. Ha ez a fájl létezik, ezt használja a home, vagy rendszerszintű alkalmazás menü helyett. +.PP +To change default home directory of MC, you can use +.BR MC_HOME +environment variable. The value of MC_HOME must be an absolute path. If MC_HOME +variable is unset or empty, HOME variable is used. If HOME variable is unset +or empty, MC home directory is get from GLib library. .\"NODE "AVAILABILITY" .SH "A Midnight Commander frissítése" A program legutolsó verzióját az ftp.nuclecu.unam.mx címen a diff --git a/doc/man/it/mc.1.in b/doc/man/it/mc.1.in index 258676739..455c7dce7 100644 --- a/doc/man/it/mc.1.in +++ b/doc/man/it/mc.1.in @@ -3168,8 +3168,9 @@ simpatici tasti dappertutto). .\"NODE "FILES" .SH "FILE" Il programma recupera tutte le informazioni relative al proprio funzionamento -dalla variabile ambiente MC_DATADIR, e se la variabile non è impostata, -passerà alla directory @prefix@/share/mc . +dalla variabile ambiente +.BR MC_DATADIR , +e se la variabile non è impostata, passerà alla directory @prefix@/share/mc . .PP .I @prefix@/share/mc/mc.hlp .IP @@ -3226,6 +3227,12 @@ L'elenco di directory per l'albero directory e per la vista ad albero. .IP Menu locale definito dall'utente. Se questo file è presente viene usato al posto del menu delle applicazioni utente o di sistema. +.PP +To change default home directory of MC, you can use +.BR MC_HOME +environment variable. The value of MC_HOME must be an absolute path. If MC_HOME +variable is unset or empty, HOME variable is used. If HOME variable is unset +or empty, MC home directory is get from GLib library. .\"SKIP_SECTION" .SH "LICENZA" Questo programma è distribuito sotto i termini della Licenza Generale diff --git a/doc/man/mc.1.in b/doc/man/mc.1.in index a161a3e6f..66514da61 100644 --- a/doc/man/mc.1.in +++ b/doc/man/mc.1.in @@ -4098,8 +4098,10 @@ everywhere). .\"NODE "FILES" .SH "FILES" Full paths below may vary between installations. They are also affected -by the MC_DATADIR environment variable. If it's set, its value is used -instead of @prefix@/share/mc in the paths below. +by the +.BR MC_DATADIR +environment variable. If it's set, its value is used instead of +@prefix@/share/mc in the paths below. .PP .I @prefix@/share/mc/mc.hlp .IP @@ -4154,6 +4156,12 @@ The directory list for the directory tree and tree view features. .IP Local user\-defined menu. If this file is present, it is used instead of the home or system\-wide applications menu. +.PP +To change default home directory of MC, you can use +.BR MC_HOME +environment variable. The value of MC_HOME must be an absolute path. If MC_HOME +variable is unset or empty, HOME variable is used. If HOME variable is unset +or empty, MC home directory is get from GLib library. .\"SKIP_SECTION" .SH "LICENSE" This program is distributed under the terms of the GNU General Public diff --git a/doc/man/pl/mc.1.in b/doc/man/pl/mc.1.in index 2f58e7978..1a9f1a272 100644 --- a/doc/man/pl/mc.1.in +++ b/doc/man/pl/mc.1.in @@ -2874,7 +2874,8 @@ zupełnie bezużytecznych klawiszy). .\"NODE "FILES" .SH PLIKI .PP -Program będzie pobierał wszystkie swoje informacje ze zmiennej MCHOME, +Program będzie pobierał wszystkie swoje informacje ze zmiennej +.BR MC_DATADIR , jeśli jest ona nie ustawiona to znowu przetwarzany jest katalog /usr. .PP @prefix@/share/mc.hlp @@ -2933,6 +2934,11 @@ Midnight Commander robi to sam za ciebie. Lokalny plik zdefiniowany przez użytkownika. Jeśli ten plik jest dostępny, jest używany zamiast pliku w katalogu domowym i ogólnosystemowego. .PP +To change default home directory of MC, you can use +.BR MC_HOME +environment variable. The value of MC_HOME must be an absolute path. If MC_HOME +variable is unset or empty, HOME variable is used. If HOME variable is unset +or empty, MC home directory is get from GLib library. .\"SKIP_SECTION" .SH LICENCJA Program jest dystrybuowany na zasadach licencji GNU General Public License diff --git a/doc/man/ru/mc.1.in b/doc/man/ru/mc.1.in index 073b65ada..0d32b4eed 100644 --- a/doc/man/ru/mc.1.in +++ b/doc/man/ru/mc.1.in @@ -4546,6 +4546,13 @@ Commander; используется только в тех случаях, ко локальное меню, задаваемое пользователем. Если этот файл существует, он используется вместо файла меню из домашнего каталога пользователя и общесистемного меню. +.PP +Для того, чтобы изменить домашний каталог MC, установленный по умолчанию, +можно использовать переменную окружения +.BR MC_HOME . +Значением этой переменный должен быть абсолютный путь. Если переменная MC_HOME +не определена или пуста, используется переменная окружения HOME. Если и HOME +не определена или пуста, домашний каталог MC определяется средствами библиотеки GLib. .\"SKIP_SECTION" .\" "LICENSE" .SH Лицензия diff --git a/doc/man/sr/mc.1.in b/doc/man/sr/mc.1.in index 3f9e3f4c9..aaaca0e2c 100644 --- a/doc/man/sr/mc.1.in +++ b/doc/man/sr/mc.1.in @@ -3180,8 +3180,9 @@ insert=\\e[Op .\"NODE "FILES" .SH "ДАТОТЕКЕ" Програм ће добавити све своје податке у односу на променљиву окружења -MC_DATADIR. Ако ова променљива није постављена, биће употребљен -директоријум @prefix@/share/mc. +.BR MC_DATADIR . +Ако ова променљива није постављена, биће употребљен директоријум +@prefix@/share/mc. .PP .I @prefix@/share/mc/mc.hlp .IP diff --git a/lib/mcconfig/Makefile.am b/lib/mcconfig/Makefile.am index 296047fd2..e13334c92 100644 --- a/lib/mcconfig/Makefile.am +++ b/lib/mcconfig/Makefile.am @@ -9,6 +9,4 @@ libmcconfig_la_SOURCES = \ libmcconfig_la_CFLAGS = -I$(top_srcdir) \ $(GLIB_CFLAGS) \ - -DDATADIR=\""$(pkgdatadir)/"\" \ - -DLOCALEDIR=\""$(localedir)"\" \ - -DSYSCONFDIR=\""$(sysconfdir)/@PACKAGE@/"\" + -DLOCALEDIR=\""$(localedir)"\" diff --git a/lib/mcconfig/paths.c b/lib/mcconfig/paths.c index 44b3a18db..918c11bc0 100644 --- a/lib/mcconfig/paths.c +++ b/lib/mcconfig/paths.c @@ -271,64 +271,43 @@ mc_config_fix_migrated_rules (void) void mc_config_init_config_paths (GError ** error) { - const char *mc_datadir; - -#ifdef MC_HOMEDIR_XDG - char *u_config_dir = (char *) g_get_user_config_dir (); - char *u_data_dir = (char *) g_get_user_data_dir (); - char *u_cache_dir = (char *) g_get_user_cache_dir (); + char *dir; if (xdg_vars_initialized) return; - u_config_dir = (u_config_dir == NULL) - ? g_build_filename (mc_config_get_home_dir (), ".config", NULL) : g_strdup (u_config_dir); - - u_cache_dir = (u_cache_dir == NULL) - ? g_build_filename (mc_config_get_home_dir (), ".cache", NULL) : g_strdup (u_cache_dir); - - u_data_dir = (u_data_dir == NULL) - ? g_build_filename (mc_config_get_home_dir (), ".local", "share", NULL) - : g_strdup (u_data_dir); +#ifdef MC_HOMEDIR_XDG + dir = g_build_filename (mc_config_get_home_dir (), ".config", (char *) NULL); + mc_config_str = mc_config_init_one_config_path (dir, MC_USERCONF_DIR, error); + g_free (dir); - mc_config_str = mc_config_init_one_config_path (u_config_dir, MC_USERCONF_DIR, error); - mc_cache_str = mc_config_init_one_config_path (u_cache_dir, MC_USERCONF_DIR, error); - mc_data_str = mc_config_init_one_config_path (u_data_dir, MC_USERCONF_DIR, error); + dir = g_build_filename (mc_config_get_home_dir (), ".cache", (char *) NULL); + mc_cache_str = mc_config_init_one_config_path (dir, MC_USERCONF_DIR, error); + g_free (dir); - g_free (u_data_dir); - g_free (u_cache_dir); - g_free (u_config_dir); + dir = g_build_filename (mc_config_get_home_dir (), ".local", "share", (char *) NULL); + mc_data_str = mc_config_init_one_config_path (dir, MC_USERCONF_DIR, error); + g_free (dir); mc_config_fix_migrated_rules (); #else /* MC_HOMEDIR_XDG */ char *defined_userconf_dir; - char *u_config_dir; defined_userconf_dir = tilde_expand (MC_USERCONF_DIR); - if (!g_path_is_absolute (defined_userconf_dir)) + if (g_path_is_absolute (defined_userconf_dir)) + dir = defined_userconf_dir; + else { - u_config_dir = g_build_filename (mc_config_get_home_dir (), MC_USERCONF_DIR, NULL); g_free (defined_userconf_dir); + dir = g_build_filename (mc_config_get_home_dir (), MC_USERCONF_DIR, (char *) NULL); } - else - u_config_dir = defined_userconf_dir; mc_data_str = mc_cache_str = mc_config_str = - mc_config_init_one_config_path (u_config_dir, "", error); + mc_config_init_one_config_path (dir, "", error); - g_free (u_config_dir); + g_free (dir); #endif /* MC_HOMEDIR_XDG */ - /* This is the directory, where MC was installed, on Unix this is DATADIR */ - /* and can be overriden by the MC_DATADIR environment variable */ - mc_datadir = g_getenv ("MC_DATADIR"); - if (mc_datadir != NULL) - mc_global.sysconfig_dir = g_strdup (mc_datadir); - else - mc_global.sysconfig_dir = g_strdup (SYSCONFDIR); - - mc_global.share_data_dir = g_strdup (DATADIR); - xdg_vars_initialized = TRUE; } @@ -381,8 +360,10 @@ mc_config_get_home_dir (void) { if (homedir == NULL) { - homedir = g_getenv ("HOME"); - if (homedir == NULL) + homedir = g_getenv ("MC_HOME"); + if (homedir == NULL || *homedir == '\0') + homedir = g_getenv ("HOME"); + if (homedir == NULL || *homedir == '\0') homedir = g_get_home_dir (); } return homedir; diff --git a/lib/vfs/interface.c b/lib/vfs/interface.c index 2f583495c..b316d4e46 100644 --- a/lib/vfs/interface.c +++ b/lib/vfs/interface.c @@ -823,7 +823,7 @@ const char * mc_tmpdir (void) { static char buffer[64]; - static const char *tmpdir; + static const char *tmpdir = NULL; const char *sys_tmp; struct passwd *pwd; struct stat st; diff --git a/src/Makefile.am b/src/Makefile.am index 8ad6c817b..c87ac8f3d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -9,8 +9,10 @@ SUBDIRS += diffviewer endif AM_CPPFLAGS = \ - -DLOCALEDIR=\""$(localedir)"\" \ - -DLIBEXECDIR=\""$(libexecdir)/@PACKAGE@/"\" + -DSYSCONFDIR=\""$(sysconfdir)/@PACKAGE@/"\" \ + -DLIBEXECDIR=\""$(libexecdir)/@PACKAGE@/"\" \ + -DDATADIR=\""$(pkgdatadir)/"\" \ + -DLOCALEDIR=\""$(localedir)"\" if CONS_SAVER SUBDIRS += consaver diff --git a/src/main.c b/src/main.c index 3c01795c4..a2fc40ce7 100644 --- a/src/main.c +++ b/src/main.c @@ -161,8 +161,10 @@ check_codeset (void) static void OS_Setup (void) { - const char *shell_env = getenv ("SHELL"); + const char *shell_env; + const char *datadir_env; + shell_env = getenv ("SHELL"); if ((shell_env == NULL) || (shell_env[0] == '\0')) { struct passwd *pwd; @@ -178,6 +180,19 @@ OS_Setup (void) g_free (shell); shell = g_strdup ("/bin/sh"); } + + /* This is the directory, where MC was installed, on Unix this is DATADIR */ + /* and can be overriden by the MC_DATADIR environment variable */ + datadir_env = g_getenv ("MC_DATADIR"); + if (datadir_env != NULL) + mc_global.sysconfig_dir = g_strdup (datadir_env); + else + mc_global.sysconfig_dir = g_strdup (SYSCONFDIR); + + mc_global.share_data_dir = g_strdup (DATADIR); + + /* Set up temporary directory */ + mc_tmpdir (); } /* --------------------------------------------------------------------------------------------- */ @@ -419,6 +434,17 @@ main (int argc, char *argv[]) return exit_code; } + /* do this before mc_args_show_info () to view paths in the --datadir-info output */ + OS_Setup (); + + if (!g_path_is_absolute (mc_config_get_home_dir ())) + { + error = g_error_new (MC_ERROR, 0, "%s: %s", _("Home directory path is not absolute"), + mc_config_get_home_dir ()); + mc_event_deinit (NULL); + goto startup_exit_falure; + } + if (!mc_args_show_info ()) { exit_code = EXIT_SUCCESS; @@ -428,10 +454,6 @@ main (int argc, char *argv[]) if (!events_init (&error)) goto startup_exit_falure; - /* Set up temporary directory */ - (void) mc_tmpdir (); - OS_Setup (); - /* Initialize and create home directories */ mc_config_init_config_paths (&error); if (error == NULL && mc_config_deprecated_dir_present ()) mc_config_migrate_from_old_place (&error); diff --git a/src/textconf.c b/src/textconf.c index b8d868b11..8d37186dc 100644 --- a/src/textconf.c +++ b/src/textconf.c @@ -177,6 +177,9 @@ show_version (void) void show_datadirs_extended (void) { + (void) printf ("%s %s\n", _("Home directory:"), mc_config_get_home_dir ()); + (void) puts (""); + PRINTF_GROUP (_("System data")); PRINTF_SECTION (_("Config directory:"), mc_global.sysconfig_dir); -- 2.11.4.GIT