Blob Blame History Raw
From 47a7bb8fb64885d46c995a18d2c4601fbf9609f9 Mon Sep 17 00:00:00 2001
From: Brian Bockelman <bbockelm@cse.unl.edu>
Date: Tue, 24 Jul 2012 09:40:06 -0500
Subject: [PATCH] Apply the user's condor_config last, rather than first.

---
 src/condor_utils/condor_config.cpp |   55 +++++++++++++++++++++++++++++------
 1 files changed, 45 insertions(+), 10 deletions(-)

diff --git a/src/condor_utils/condor_config.cpp b/src/condor_utils/condor_config.cpp
index ef35572..455bdfa 100644
--- a/src/condor_utils/condor_config.cpp
+++ b/src/condor_utils/condor_config.cpp
@@ -110,6 +110,7 @@ void check_params();
 // External variables
 extern int	ConfigLineNo;
 }  /* End extern "C" */
+bool find_user_file(std::string &);
 
 // Global variables
 BUCKET	*ConfigTab[TABLESIZE];
@@ -654,6 +655,14 @@ real_config(char* host, int wantsQuiet, bool wantExtraInfo)
 	if(dirlist) { free(dirlist); dirlist = NULL; }
 	if(newdirlist) { free(newdirlist); newdirlist = NULL; }
 
+		// Now, insert overrides from the user config file
+	std::string file_location;
+	if (find_user_file(file_location))
+	{
+		process_config_source( file_location.c_str(), "user local source", host, false );
+		local_config_sources.append(file_location.c_str());
+	}
+	
 		// Now, insert any macros defined in the environment.
 	char **my_environ = GetEnviron();
 	for( int i = 0; my_environ[i]; i++ ) {
@@ -996,6 +1005,38 @@ find_global()
 }
 
 
+// Find user-specific location of a file
+// Returns true if found, and puts the location in the file_location argument.
+// If not found, returns false.  The contents of file_location are undefined.
+bool
+find_user_file(std::string &file_location)
+{
+#ifdef UNIX
+	// $HOME/.condor/condor_config
+	struct passwd *pw = getpwuid( geteuid() );
+	std::stringstream ss;
+	if ( can_switch_ids() || !pw || !pw->pw_dir ) {
+		return false;
+	}
+	ss << pw->pw_dir << "/." << myDistro->Get() << "/" << myDistro->Get() << "_config";
+	file_location = ss.str();
+
+	int fd;
+	if ((fd = safe_open_wrapper_follow(file_location.c_str(), O_RDONLY)) < 0) {
+		return false;
+	} else {
+		close(fd);
+		dprintf(D_FULLDEBUG, "Reading condor configuration from '%s'\n", file_location.c_str());
+	}
+
+	return true;
+#else
+	// To get rid of warnings...
+	file_location = "";
+	return false;
+#endif
+}
+
 // Find location of specified file
 char*
 find_file(const char *env_name, const char *file_name)
@@ -1052,21 +1093,15 @@ find_file(const char *env_name, const char *file_name)
 	if (!config_source) {
 			// List of condor_config file locations we'll try to open.
 			// As soon as we find one, we'll stop looking.
-		const int locations_length = 4;
+		const int locations_length = 3;
 		MyString locations[locations_length];
-			// 1) $HOME/.condor/condor_config
-		struct passwd *pw = getpwuid( geteuid() );
-		if ( !can_switch_ids() && pw && pw->pw_dir ) {
-			formatstr( locations[0], "%s/.%s/%s", pw->pw_dir, myDistro->Get(),
-					 file_name );
-		}
 			// 2) /etc/condor/condor_config
-		locations[1].formatstr( "/etc/%s/%s", myDistro->Get(), file_name );
+		locations[0].formatstr( "/etc/%s/%s", myDistro->Get(), file_name );
 			// 3) /usr/local/etc/condor_config (FreeBSD)
-		locations[2].formatstr( "/usr/local/etc/%s", file_name );
+		locations[1].formatstr( "/usr/local/etc/%s", file_name );
 		if (tilde) {
 				// 4) ~condor/condor_config
-			locations[3].formatstr( "%s/%s", tilde, file_name );
+			locations[2].formatstr( "%s/%s", tilde, file_name );
 		}
 
 		int ctr;	
-- 
1.7.4.1