tWriteConfigFile() now writes to a given file handle; functions added to return the paths of the local and global configuration files. - vaccinewars - be a doctor and try to vaccinate the world (HTM) git clone git://src.adamsgaard.dk/vaccinewars (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit ce6614bddab8d6289b9250c15335d75c8c49efad (DIR) parent e88781ee1d688779256d6c478bd434e095f0486a (HTM) Author: Ben Webb <ben@salilab.org> Date: Tue, 26 Feb 2002 13:03:07 +0000 WriteConfigFile() now writes to a given file handle; functions added to return the paths of the local and global configuration files. Diffstat: M src/dopewars.c | 93 +++++++++++++++++++++---------- M src/dopewars.h | 4 +++- M src/gui_client/optdialog.c | 2 +- 3 files changed, 68 insertions(+), 31 deletions(-) --- (DIR) diff --git a/src/dopewars.c b/src/dopewars.c t@@ -2016,9 +2016,9 @@ static void WriteConfigValue(FILE *fp, int GlobalIndex, int StructIndex) /* * Writes all of the configuration file variables that have changed - * (together with their values) to standard output. + * (together with their values) to the given file. */ -void WriteConfigFile(void) +void WriteConfigFile(FILE *fp) { int i, j; t@@ -2026,10 +2026,10 @@ void WriteConfigFile(void) if (Globals[i].Modified) { if (Globals[i].NameStruct[0]) { for (j = 1; j <= *Globals[i].MaxIndex; j++) { - WriteConfigValue(stdout, i, j); + WriteConfigValue(fp, i, j); } } else { - WriteConfigValue(stdout, i, 0); + WriteConfigValue(fp, i, 0); } } } t@@ -2275,6 +2275,50 @@ gchar *GetDocIndex(void) return path; } +/* + * Returns the pathname of the global (all users) configuration file, + * as a dynamically-allocated string that must be later freed. On + * error, NULL is returned. + */ +gchar *GetGlobalConfigFile(void) +{ +#ifdef CYGWIN + gchar *bindir, *conf = NULL; + + /* Global configuration is in the same directory as the dopewars binary */ + bindir = GetBinaryDir(); + if (bindir) { + conf = g_strdup_printf("%s/dopewars-config.txt", conf); + g_free(bindir); + } + return conf; +#else + return g_strdup("/etc/dopewars"); +#endif +} + +/* + * Returns the pathname of the local (per-user) configuration file, + * as a dynamically-allocated string that must be later freed. On + * error, NULL is returned. + */ +gchar *GetLocalConfigFile(void) +{ +#ifdef CYGWIN + return g_strdup("dopewars-config.txt"); +#else + gchar *home, *conf = NULL; + + /* Local config is in the user's home directory */ + home = getenv("HOME"); + if (home) { + conf = g_strdup_printf("%s/.dopewars", home); + g_free(home); + } + return conf; +#endif +} + /* * Sets up data - such as the location of the high score file - to * hard-coded internal values, and then processes the global and t@@ -2282,7 +2326,7 @@ gchar *GetDocIndex(void) */ void SetupParameters(void) { - char *ConfigFile, *pt; + gchar *conf; int i; /* Initialise variables */ t@@ -2359,34 +2403,25 @@ void SetupParameters(void) AssignName(&StoppedTo[i], _(DefaultStoppedTo[i])); } -#ifdef CYGWIN + /* FIXME: this is a bit risky; we haven't dropped privileges yet, + * so 1. we may be able to read files here that the user shouldn't + * have access to and 2. a bug in the configuration parsing code + * could result in a compromise. BUT we don't know where the high + * score file is until the config files have been parsed. */ - /* Read the global configuration from the directory the binary is - * installed in */ - pt = GetBinaryDir(); - if (pt) { - ConfigFile = g_strdup_printf("%s/dopewars-config.txt", pt); - ReadConfigFile(ConfigFile); - g_free(ConfigFile); - g_free(pt); + /* Now read in the global configuration file */ + conf = GetGlobalConfigFile(); + if (conf) { + ReadConfigFile(conf); + g_free(conf); } - /* Now read the local configuration from the current directory */ - ReadConfigFile("dopewars-config.txt"); - -#else /* CYGWIN */ - - /* Now read in the global configuration file */ - ReadConfigFile("/etc/dopewars"); - - /* Next, try to read in the .dopewars file in the user's home directory */ - pt = getenv("HOME"); - if (pt) { - ConfigFile = g_strdup_printf("%s/.dopewars", pt); - ReadConfigFile(ConfigFile); - g_free(ConfigFile); + /* Finally, try the local configuration file */ + conf = GetLocalConfigFile(); + if (conf) { + ReadConfigFile(conf); + g_free(conf); } -#endif /* CYGWIN */ } void HandleHelpTexts() (DIR) diff --git a/src/dopewars.h b/src/dopewars.h t@@ -420,8 +420,10 @@ void OpenLog(void); void CloseLog(void); gboolean IsConnectedPlayer(Player *play); void BackupConfig(void); -void WriteConfigFile(void); +void WriteConfigFile(FILE *fp); gchar *GetDocIndex(void); +gchar *GetGlobalConfigFile(void); +gchar *GetLocalConfigFile(void); #ifndef CURSES_CLIENT void CursesLoop(void); (DIR) diff --git a/src/gui_client/optdialog.c b/src/gui_client/optdialog.c t@@ -464,7 +464,7 @@ static void list_row_unselect(GtkCList *clist, gint row, gint column, static void OKCallback(GtkWidget *widget, GtkWidget *dialog) { SaveConfigWidgets(); - WriteConfigFile(); + WriteConfigFile(stdout); gtk_widget_destroy(dialog); }