Add a routine to get the directory in which personal configuration files

reside.  Use it, rather than concatenating the user's home directory and
".ethereal" in a number of files.

Fix up some additional places to use G_DIR_SEPARATOR_S as the pathname
separator.

svn path=/trunk/; revision=4061
This commit is contained in:
Guy Harris 2001-10-22 22:59:26 +00:00
parent f4c0885cbd
commit e4db9c4b64
12 changed files with 154 additions and 108 deletions

View File

@ -1,7 +1,7 @@
/* filesystem.c
* Filesystem utility routines
*
* $Id: filesystem.c,v 1.7 2001/10/21 21:47:58 guy Exp $
* $Id: filesystem.c,v 1.8 2001/10/22 22:59:25 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -363,3 +363,32 @@ get_home_dir(void)
return home;
}
/*
* Name of directory, under the user's home directory, in which
* personal configuration files are stored.
*
* XXX - should this be ".libepan"? For backwards-compatibility, I'll keep
* it ".ethereal" for now.
*/
#define PF_DIR ".ethereal"
/*
* Get the directory in which personal configuration files reside;
* it's PF_DIR, under the user's home directory.
*/
const char *
get_persconffile_dir(void)
{
static char *pf_dir = NULL;
const char *homedir;
/* Return the cached value, if available */
if (pf_dir != NULL)
return pf_dir;
homedir = get_home_dir();
pf_dir = g_malloc(strlen(homedir) + strlen(PF_DIR) + 2);
sprintf(pf_dir, "%s" G_DIR_SEPARATOR_S "%s", homedir, PF_DIR);
return pf_dir;
}

View File

@ -1,7 +1,7 @@
/* filesystem.h
* Filesystem utility definitions
*
* $Id: filesystem.h,v 1.5 2001/10/21 21:47:58 guy Exp $
* $Id: filesystem.h,v 1.6 2001/10/22 22:59:25 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -25,15 +25,6 @@
#ifndef FILESYSTEM_H
#define FILESYSTEM_H
/*
* Name of directory, under the user's home directory, in which
* personal configuration files are stored.
*
* XXX - should this be ".libepan"? For backwards-compatibility, I'll keep
* it ".ethereal" for now.
*/
#define PF_DIR ".ethereal"
/*
* Given a pathname, return a pointer to the last pathname separator
* character in the pathname, or NULL if the pathname contains no
@ -84,4 +75,9 @@ const char *get_systemfile_dir(void);
* variable, or a default directory if HOME is not set */
const char* get_home_dir(void);
/*
* Get the directory in which personal configuration files reside.
*/
const char *get_persconffile_dir(void);
#endif /* FILESYSTEM_H */

View File

@ -1,7 +1,7 @@
/* plugins.c
* plugin routines
*
* $Id: plugins.c,v 1.35 2001/10/21 21:47:58 guy Exp $
* $Id: plugins.c,v 1.36 2001/10/22 22:59:25 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -504,11 +504,10 @@ init_plugins(const char *plugin_dir)
#endif
if (!user_plug_dir)
{
user_plug_dir = (gchar *)g_malloc(strlen(get_home_dir()) +
strlen(PF_DIR) +
strlen(PLUGINS_DIR_NAME) + 3);
sprintf(user_plug_dir, "%s/%s/%s", get_home_dir(),
PF_DIR, PLUGINS_DIR_NAME);
user_plug_dir = (gchar *)g_malloc(strlen(get_persconffile_dir()) +
strlen(PLUGINS_DIR_NAME) + 2);
sprintf(user_plug_dir, "%s" G_DIR_SEPARATOR_S "%s",
get_persconffile_dir(), PLUGINS_DIR_NAME);
}
plugins_scan_dir(user_plug_dir);
}

View File

@ -1,7 +1,7 @@
/* resolv.c
* Routines for network object lookup
*
* $Id: resolv.c,v 1.14 2001/10/21 21:47:58 guy Exp $
* $Id: resolv.c,v 1.15 2001/10/22 22:59:25 guy Exp $
*
* Laurent Deniel <deniel@worldnet.fr>
*
@ -638,10 +638,10 @@ static void initialize_ethers(void)
* with it. It's used in get_ethbyname() and get_ethbyaddr()
*/
if (g_pethers_path == NULL) {
g_pethers_path = g_malloc(strlen(get_home_dir()) +
strlen(PF_DIR) + strlen(ENAME_ETHERS) + 3);
sprintf(g_pethers_path, "%s" G_DIR_SEPARATOR_S "%s" G_DIR_SEPARATOR_S "%s",
get_home_dir(), PF_DIR, ENAME_ETHERS);
g_pethers_path = g_malloc(strlen(get_persconffile_dir()) +
strlen(ENAME_ETHERS) + 2);
sprintf(g_pethers_path, "%s" G_DIR_SEPARATOR_S "%s",
get_persconffile_dir(), ENAME_ETHERS);
}
/* manuf hash table initialization */
@ -950,10 +950,10 @@ static void initialize_ipxnets(void)
* with it. It's used in get_ipxnetbyname() and get_ipxnetbyaddr()
*/
if (g_pipxnets_path == NULL) {
g_pipxnets_path = g_malloc(strlen(get_home_dir()) +
strlen(PF_DIR) + strlen(ENAME_IPXNETS) + 3);
sprintf(g_pipxnets_path, "%s" G_DIR_SEPARATOR_S "%s" G_DIR_SEPARATOR_S "%s",
get_home_dir(), PF_DIR, ENAME_IPXNETS);
g_pipxnets_path = g_malloc(strlen(get_persconffile_dir()) +
strlen(ENAME_IPXNETS) + 2);
sprintf(g_pipxnets_path, "%s" G_DIR_SEPARATOR_S "%s",
get_persconffile_dir(), ENAME_IPXNETS);
}
} /* initialize_ipxnets */

View File

@ -1,7 +1,7 @@
/* filters.c
* Code for reading and writing the filters file.
*
* $Id: filters.c,v 1.10 2001/10/21 21:47:57 guy Exp $
* $Id: filters.c,v 1.11 2001/10/22 22:59:23 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -89,7 +89,8 @@ void
read_filter_list(filter_list_type_t list, char **pref_path_return,
int *errno_return)
{
char *ff_path, *ff_dir = PF_DIR, *ff_name;
const char *pf_dir_path;
char *ff_path, *ff_name;
FILE *ff;
GList **flp;
GList *fl_ent;
@ -120,10 +121,9 @@ read_filter_list(filter_list_type_t list, char **pref_path_return,
}
/* To do: generalize this */
ff_path = (gchar *) g_malloc(strlen(get_home_dir()) + strlen(ff_dir) +
strlen(ff_name) + 4);
sprintf(ff_path, "%s" G_DIR_SEPARATOR_S "%s" G_DIR_SEPARATOR_S "%s",
get_home_dir(), ff_dir, ff_name);
pf_dir_path = get_persconffile_dir();
ff_path = (gchar *) g_malloc(strlen(pf_dir_path) + strlen(ff_name) + 2);
sprintf(ff_path, "%s" G_DIR_SEPARATOR_S "%s", pf_dir_path, ff_name);
if ((ff = fopen(ff_path, "r")) == NULL) {
/*
@ -146,8 +146,8 @@ read_filter_list(filter_list_type_t list, char **pref_path_return,
* the filter lists, and delete the ones that don't belong in
* a particular list.
*/
sprintf(ff_path, "%s" G_DIR_SEPARATOR_S "%s" G_DIR_SEPARATOR_S "%s",
get_home_dir(), ff_dir, FILTER_FILE_NAME);
sprintf(ff_path, "%s" G_DIR_SEPARATOR_S "%s", pf_dir_path,
FILTER_FILE_NAME);
if ((ff = fopen(ff_path, "r")) == NULL) {
/*
* Well, that didn't work, either. Just give up.
@ -418,7 +418,8 @@ void
save_filter_list(filter_list_type_t list, char **pref_path_return,
int *errno_return)
{
gchar *ff_path, *ff_path_new, *ff_dir = PF_DIR, *ff_name;
const char *pf_dir_path;
gchar *ff_path, *ff_path_new, *ff_name;
int path_length;
GList *fl;
GList *flp;
@ -446,27 +447,23 @@ save_filter_list(filter_list_type_t list, char **pref_path_return,
return;
}
path_length = strlen(get_home_dir()) + strlen(ff_dir) + strlen(ff_name)
+ 4 + 4;
ff_path = (gchar *) g_malloc(path_length);
sprintf(ff_path, "%s" G_DIR_SEPARATOR_S "%s", get_home_dir(), ff_dir);
if (stat(ff_path, &s_buf) != 0)
pf_dir_path = get_persconffile_dir();
if (stat(pf_dir_path, &s_buf) != 0)
#ifdef WIN32
mkdir(ff_path);
mkdir(pf_dir_path);
#else
mkdir(ff_path, 0755);
mkdir(pf_dir_path, 0755);
#endif
sprintf(ff_path, "%s" G_DIR_SEPARATOR_S "%s" G_DIR_SEPARATOR_S "%s",
get_home_dir(), ff_dir, ff_name);
path_length = strlen(pf_dir_path) + strlen(ff_name) + 2;
ff_path = (gchar *) g_malloc(path_length);
sprintf(ff_path, "%s" G_DIR_SEPARATOR_S "%s", pf_dir_path, ff_name);
/* Write to "XXX.new", and rename if that succeeds.
That means we don't trash the file if we fail to write it out
completely. */
ff_path_new = (gchar *) g_malloc(path_length);
sprintf(ff_path_new, "%s" G_DIR_SEPARATOR_S "%s" G_DIR_SEPARATOR_S "%s.new",
get_home_dir(), ff_dir, ff_name);
ff_path_new = (gchar *) g_malloc(path_length + 4);
sprintf(ff_path_new, "%s.new", ff_path);
if ((ff = fopen(ff_path_new, "w")) == NULL) {
*pref_path_return = ff_path;

View File

@ -1,7 +1,7 @@
/* colors.c
* Definitions for color structures and routines
*
* $Id: colors.c,v 1.11 2001/10/21 21:56:05 guy Exp $
* $Id: colors.c,v 1.12 2001/10/22 22:59:26 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -161,6 +161,24 @@ delete_color_filter(color_filter_t *colorf)
g_free(colorf);
}
/*
* Get the pathname of the preferences file.
*/
static const char *
get_colorfilter_file_path(void)
{
static gchar *cf_path = NULL;
static const char fname[] = "colorfilters";
if (cf_path == NULL) {
cf_path = (gchar *) g_malloc(strlen(get_persconffile_dir()) +
sizeof fname + 1);
sprintf(cf_path, "%s" G_DIR_SEPARATOR_S "%s", get_persconffile_dir(),
fname);
}
return cf_path;
}
static gboolean
read_filters(colfilter *filter)
{
@ -172,9 +190,8 @@ read_filters(colfilter *filter)
GdkColor fg_color, bg_color;
color_filter_t *colorf;
int i;
const gchar *path;
FILE *f;
gchar *path;
gchar *fname = PF_DIR G_DIR_SEPARATOR_S "colorfilters";
dfilter_t *temp_dfilter;
/* decide what file to open (from dfilter code) */
@ -185,19 +202,15 @@ read_filters(colfilter *filter)
return FALSE;
/* we have a clist */
path = (gchar *) g_malloc(strlen(get_home_dir()) + strlen(fname) + 4);
sprintf(path, "%s/%s", get_home_dir(), fname);
path = get_colorfilter_file_path();
if ((f = fopen(path, "r")) == NULL) {
if (errno != ENOENT) {
simple_dialog(ESD_TYPE_CRIT, NULL,
"Could not open filter file\n\"%s\": %s.", path,
strerror(errno));
}
g_free(path);
return FALSE;
}
g_free(path);
i = 0;
@ -274,24 +287,19 @@ write_filter(gpointer filter_arg, gpointer file_arg)
gboolean
write_filters(colfilter *filter)
{
const gchar *path;
FILE *f;
gchar *path;
gchar *name = PF_DIR G_DIR_SEPARATOR_S "colorfilters";
/* decide what file to open (from dfilter code) */
path = (gchar *) g_malloc(strlen(get_home_dir()) + strlen(name) + 4);
sprintf(path, "%s/%s", get_home_dir(), name);
path = get_colorfilter_file_path();
if ((f = fopen(path, "w+")) == NULL) {
simple_dialog(ESD_TYPE_CRIT, NULL,
"Could not open\n%s\nfor writing: %s.",
path, strerror(errno));
g_free(path);
return FALSE;
}
fprintf(f,"# DO NOT EDIT THIS FILE! It was created by Ethereal\n");
g_slist_foreach(filter_list, write_filter, f);
fclose(f);
g_free(path);
return TRUE;
}

View File

@ -1,6 +1,6 @@
/* main.c
*
* $Id: main.c,v 1.206 2001/10/21 16:15:19 gerald Exp $
* $Id: main.c,v 1.207 2001/10/22 22:59:26 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -866,7 +866,8 @@ main(int argc, char *argv[])
WSADATA wsaData;
#endif
char *gpf_path, *pf_path, *cf_path, *df_path;
char *gpf_path, *cf_path, *df_path;
const char *pf_path;
int gpf_open_errno, pf_open_errno, cf_open_errno, df_open_errno;
int err;
#ifdef HAVE_LIBPCAP
@ -1324,8 +1325,10 @@ main(int argc, char *argv[])
else if (cfile.snap < MIN_PACKET_SIZE)
cfile.snap = MIN_PACKET_SIZE;
rc_file = (gchar *) g_malloc(strlen(get_home_dir()) + strlen(RC_FILE) + 4);
sprintf(rc_file, "%s/%s", get_home_dir(), RC_FILE);
rc_file = (gchar *) g_malloc(strlen(get_persconffile_dir()) +
strlen(RC_FILE) + 2);
sprintf(rc_file, "%s" G_DIR_SEPARATOR_S "%s", get_persconffile_dir(),
RC_FILE);
gtk_rc_parse(rc_file);
/* Try to load the regular and boldface fixed-width fonts */

View File

@ -1,12 +1,11 @@
/* main.h
* Global defines, etc.
*
* $Id: main.h,v 1.22 2001/04/09 22:35:23 gram Exp $
* $Id: main.h,v 1.23 2001/10/22 22:59:26 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
* By Gerald Combs <gerald@ethereal.com>
* Copyright 1998 Gerald Combs
*
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -32,7 +31,12 @@
#include "globals.h"
#define RC_FILE PF_DIR "/gtkrc"
/*
* File under personal preferences directory in which GTK settings for
* Ethereal are stored.
*/
#define RC_FILE "gtkrc"
#define DEF_WIDTH 750
#define DEF_HEIGHT 550
#ifdef HAVE_LIBPCAP

View File

@ -1,7 +1,7 @@
/* prefs_dlg.c
* Routines for handling preferences
*
* $Id: prefs_dlg.c,v 1.29 2001/10/13 12:05:32 sharpe Exp $
* $Id: prefs_dlg.c,v 1.30 2001/10/22 22:59:26 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -643,7 +643,7 @@ prefs_main_save_cb(GtkWidget *save_bt, gpointer parent_w)
{
gboolean must_redissect = FALSE;
int err;
char *pf_path;
const char *pf_path;
/* Fetch the preferences (i.e., make sure all the values set in all of
the preferences panes have been copied to "prefs" and the registered

66
prefs.c
View File

@ -1,7 +1,7 @@
/* prefs.c
* Routines for handling preferences
*
* $Id: prefs.c,v 1.65 2001/10/21 21:47:57 guy Exp $
* $Id: prefs.c,v 1.66 2001/10/22 22:59:23 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -70,7 +70,6 @@ static void free_col_info(e_prefs *);
static gboolean init_prefs = TRUE;
static gchar *gpf_path = NULL;
static gchar *pf_path = NULL;
/*
* XXX - variables to allow us to attempt to interpret the first
@ -604,6 +603,23 @@ print.file: /a/very/long/path/
static void read_prefs_file(const char *pf_path, FILE *pf);
/*
* Get the pathname of the preferences file.
*/
static const char *
get_preffile_path(void)
{
static gchar *pf_path = NULL;
if (pf_path == NULL) {
pf_path = (gchar *) g_malloc(strlen(get_persconffile_dir()) +
strlen(PF_NAME) + 2);
sprintf(pf_path, "%s" G_DIR_SEPARATOR_S "%s", get_persconffile_dir(),
PF_NAME);
}
return pf_path;
}
/* Read the preferences file, fill in "prefs", and return a pointer to it.
If we got an error (other than "it doesn't exist") trying to read
@ -617,16 +633,16 @@ static void read_prefs_file(const char *pf_path, FILE *pf);
return NULL. */
e_prefs *
read_prefs(int *gpf_errno_return, char **gpf_path_return,
int *pf_errno_return, char **pf_path_return)
int *pf_errno_return, const char **pf_path_return)
{
int i;
FILE *pf;
fmt_data *cfmt;
gchar *col_fmt[] = {"No.", "%m", "Time", "%t",
"Source", "%s", "Destination", "%d",
"Protocol", "%p", "Info", "%i"};
int i;
const char *pf_path;
FILE *pf;
fmt_data *cfmt;
gchar *col_fmt[] = {"No.", "%m", "Time", "%t",
"Source", "%s", "Destination", "%d",
"Protocol", "%p", "Info", "%i"};
if (init_prefs) {
/* Initialize preferences to wired-in default values.
They may be overridded by the global preferences file or the
@ -757,12 +773,7 @@ read_prefs(int *gpf_errno_return, char **gpf_path_return,
}
/* Construct the pathname of the user's preferences file. */
if (! pf_path) {
pf_path = (gchar *) g_malloc(strlen(get_home_dir()) + strlen(PF_DIR) +
strlen(PF_NAME) + 4);
sprintf(pf_path, "%s" G_DIR_SEPARATOR_S "%s" G_DIR_SEPARATOR_S "%s",
get_home_dir(), PF_DIR, PF_NAME);
}
pf_path = get_preffile_path();
/* Read the user's preferences file, if it exists. */
*pf_path_return = NULL;
@ -1450,8 +1461,10 @@ write_module_prefs(gpointer data, gpointer user_data)
If we got an error, stuff a pointer to the path of the preferences file
into "*pf_path_return", and return the errno. */
int
write_prefs(char **pf_path_return)
write_prefs(const char **pf_path_return)
{
const char *pf_dir_path;
const char *pf_path;
FILE *pf;
struct stat s_buf;
GList *clp, *col_l;
@ -1463,21 +1476,18 @@ write_prefs(char **pf_path_return)
* so that duplication can be avoided with filter.c
*/
if (! pf_path) {
pf_path = (gchar *) g_malloc(strlen(get_home_dir()) + strlen(PF_DIR) +
strlen(PF_NAME) + 4);
}
sprintf(pf_path, "%s" G_DIR_SEPARATOR_S "%s", get_home_dir(), PF_DIR);
if (stat(pf_path, &s_buf) != 0)
/*
* Create the directory that holds personal configuration files.
*/
pf_dir_path = get_persconffile_dir();
if (stat(pf_dir_path, &s_buf) != 0)
#ifdef WIN32
mkdir(pf_path);
mkdir(pf_dir_path);
#else
mkdir(pf_path, 0755);
mkdir(pf_dir_path, 0755);
#endif
sprintf(pf_path, "%s" G_DIR_SEPARATOR_S "%s" G_DIR_SEPARATOR_S "%s",
get_home_dir(), PF_DIR, PF_NAME);
pf_path = get_preffile_path();
if ((pf = fopen(pf_path, "w")) == NULL) {
*pf_path_return = pf_path;
return errno;

View File

@ -1,12 +1,11 @@
/* prefs.h
* Definitions for preference handling routines
*
* $Id: prefs.h,v 1.31 2001/07/22 21:25:11 guy Exp $
* $Id: prefs.h,v 1.32 2001/10/22 22:59:23 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
* By Gerald Combs <gerald@ethereal.com>
* Copyright 1998 Gerald Combs
*
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -186,13 +185,13 @@ void prefs_register_modules(void);
the user's preferences file, stuff the errno into "*pf_errno_return"
and a pointer to the path of the file into "*pf_path_return", and
return NULL. */
e_prefs *read_prefs(int *, char **, int *, char **);
e_prefs *read_prefs(int *, char **, int *, const char **);
/* Write out "prefs" to the user's preferences file, and return 0.
If we got an error, stuff a pointer to the path of the preferences file
into "*pf_path_return", and return the errno. */
int write_prefs(char **);
int write_prefs(const char **);
/* Copy a set of preferences. */
void copy_prefs(e_prefs *dest, e_prefs *src);

View File

@ -1,6 +1,6 @@
/* tethereal.c
*
* $Id: tethereal.c,v 1.92 2001/10/04 08:30:33 guy Exp $
* $Id: tethereal.c,v 1.93 2001/10/22 22:59:23 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -214,7 +214,8 @@ main(int argc, char *argv[])
WSADATA wsaData;
#endif
char *gpf_path, *pf_path;
char *gpf_path;
const char *pf_path;
int gpf_open_errno, pf_open_errno;
int err;
#ifdef HAVE_LIBPCAP