From 464bc5b3f62c4f58d27cb9b9140d2a0e1478b9ad Mon Sep 17 00:00:00 2001 From: Marcin Cieslak Date: Mon, 17 Sep 2012 12:45:40 +0200 Subject: [PATCH] Improve MANPATH control * Revert changes to programs/dtsearchpath/libCliSrv/UnixEnv.C introduced by c3cb5b8aa6997138dfa06da39142bf793baeae60 that could have produced disappearing Application Manager icons on FreeBSD * Introduce SearchPath:useSystemPath() virtual method to tell dtsearchpath to leave some environment variables alone. It is currently overriden for FreeBSD only if the MANPATH is empty (system default). Other operating systems might want to override it if they prefer to have distribution specific control of a search path in effect. * Symlink /usr/dt/share/man to /usr/dt/man for FreeBSD This allows dtsearchpath to actually include /usr/dt/man in the MANPATH when MANPATH override is in effect. --- cde/databases/CDE-MAN.udb | 4 +++ .../dtsearchpath/dtsp/ManSearchPath.C | 33 ++++++++++++------- cde/programs/dtsearchpath/dtsp/SearchPath.C | 19 +++++++++-- cde/programs/dtsearchpath/dtsp/SearchPath.h | 4 +++ cde/programs/dtsearchpath/libCliSrv/UnixEnv.C | 2 +- 5 files changed, 47 insertions(+), 15 deletions(-) diff --git a/cde/databases/CDE-MAN.udb b/cde/databases/CDE-MAN.udb index fed33d470..69159990a 100644 --- a/cde/databases/CDE-MAN.udb +++ b/cde/databases/CDE-MAN.udb @@ -1288,6 +1288,10 @@ doc/C/man/man4/mwmrc.4 install_target = /usr/dt/man type = sym_link } +{ freebsd + install_target = /usr/dt/man + type = sym_link +} # ./share/catman { uxp diff --git a/cde/programs/dtsearchpath/dtsp/ManSearchPath.C b/cde/programs/dtsearchpath/dtsp/ManSearchPath.C index a1cc948f2..96abf0dd3 100644 --- a/cde/programs/dtsearchpath/dtsp/ManSearchPath.C +++ b/cde/programs/dtsearchpath/dtsp/ManSearchPath.C @@ -42,12 +42,6 @@ ManSearchPath::ManSearchPath const char * sep ) : SearchPath(user, envvar, sep) { -#if defined(__FreeBSD__) - /* Installer on FreeBSD sets up man configuration so that - * setting MANPATH is not necessary - */ - if (!user->OS()->MANPATH().isNull()) { -#endif if (user->DTMANPATH()) search_path = user->FactoryManPath() + "," + *user->DTMANPATH(); else @@ -61,9 +55,6 @@ ManSearchPath::ManSearchPath NormalizePath(); TraversePath(); -#if defined(__FreeBSD__) - } -#endif } @@ -97,6 +88,22 @@ void ManSearchPath::MakePath } } +#if defined(__FreeBSD__) +/***************************************************************** + * useSystemPath() + * + * Check whether to leave MANPATH unmodified (or unset) + * + */ +int ManSearchPath::useSystemPath() +{ + if (user->OS()->getEnvironmentVariable("MANPATH").isNull()) { + return 1; + } else { + return 0; + } +} +#endif /***************************************************************** * ExportPath() @@ -106,9 +113,11 @@ void ManSearchPath::MakePath *****************************************************************/ void ManSearchPath::ExportPath() { - CString env(GetEnvVar()); - user->OS()->shell()->putToEnv(env, + if (!useSystemPath()) { + CString env(GetEnvVar()); + user->OS()->shell()->putToEnv(env, final_search_path.data()); + } } @@ -116,7 +125,7 @@ void ManSearchPath::Print() { printf("%s:\n", GetEnvVar()); CString sp(GetSearchPath()); - if (!sp.isNull()) { + if (!useSystemPath() && !sp.isNull()) { CTokenizedString path (sp,Separator().data()); CString subpath = path.next(); while (!subpath.isNull()) { diff --git a/cde/programs/dtsearchpath/dtsp/SearchPath.C b/cde/programs/dtsearchpath/dtsp/SearchPath.C index f0dd4a0e6..5e9d3f835 100644 --- a/cde/programs/dtsearchpath/dtsp/SearchPath.C +++ b/cde/programs/dtsearchpath/dtsp/SearchPath.C @@ -329,6 +329,19 @@ int SearchPath::validSearchPath return 0; } +/********************************************************************* + * useSystemPath() + * + * This member function verifies whether system environment variable + * should be left unmodified, since some other configuraton mechanism + * is in effect. + * + */ +int SearchPath::useSystemPath() +{ + return 0; +} + /***************************************************************** * ExportPath() * @@ -340,7 +353,9 @@ void SearchPath::ExportPath() CString env(environment_var); env += "SEARCHPATH"; - user->OS()->shell()->putToEnv(env, final_search_path.data()); + if (!useSystemPath()) { + user->OS()->shell()->putToEnv(env, final_search_path.data()); + } } @@ -354,7 +369,7 @@ void SearchPath::Print() { printf("%sSEARCHPATH:\n", GetEnvVar()); CString sp(GetSearchPath()); - if (!sp.isNull()) { + if (!useSystemPath() && !sp.isNull()) { CTokenizedString path (sp,Separator().data()); CString subpath = path.next(); while (!subpath.isNull()) { diff --git a/cde/programs/dtsearchpath/dtsp/SearchPath.h b/cde/programs/dtsearchpath/dtsp/SearchPath.h index 0902590fd..ee0750da6 100644 --- a/cde/programs/dtsearchpath/dtsp/SearchPath.h +++ b/cde/programs/dtsearchpath/dtsp/SearchPath.h @@ -78,6 +78,7 @@ class SearchPath { CString Separator() const { return separator; } virtual int validSearchPath (const CString &) const; + virtual int useSystemPath(); void setSeparator (const char * sep) { separator = sep; } @@ -193,6 +194,9 @@ class ManSearchPath : public SearchPath { protected: virtual void MakePath (const CString &); +#if defined(__FreeBSD__) + virtual int useSystemPath(); +#endif private: }; diff --git a/cde/programs/dtsearchpath/libCliSrv/UnixEnv.C b/cde/programs/dtsearchpath/libCliSrv/UnixEnv.C index 9b34e8582..e00bb2c52 100644 --- a/cde/programs/dtsearchpath/libCliSrv/UnixEnv.C +++ b/cde/programs/dtsearchpath/libCliSrv/UnixEnv.C @@ -83,7 +83,7 @@ UnixEnvironment::UnixEnvironment() #elif defined(__OpenBSD__) manpath = "/usr/share/man:/usr/X11R6/man:/usr/local/man:/usr/ports/infrastructure/man"; #elif defined(__FreeBSD__) - manpath = temp; + manpath = "/usr/share/man:/usr/local/man"; #endif else manpath = temp;