From: Ben Pfaff Date: Mon, 29 Nov 2010 20:28:26 +0000 (-0800) Subject: Make installation directories overridable at runtime. X-Git-Tag: v1.1.0~806 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=b43c6fe279a5630dfbc0273e06bd1e8ca530ba35;p=sliver-openvswitch.git Make installation directories overridable at runtime. This makes it possible to run tests that need access to installation directories, such as the rundir, without having access to the actual installation directories (/var/run is generally not world-writable), by setting environment variables. This is not a good way to do things in general--usually it would be better to choose the correct directories at configure time--so for now this is undocumented. --- diff --git a/lib/automake.mk b/lib/automake.mk index 5cd4722e5..075091073 100644 --- a/lib/automake.mk +++ b/lib/automake.mk @@ -208,7 +208,8 @@ endif EXTRA_DIST += \ lib/dh1024.pem \ lib/dh2048.pem \ - lib/dh4096.pem + lib/dh4096.pem \ + lib/dirs.c.in EXTRA_DIST += \ lib/common.man \ @@ -230,12 +231,14 @@ EXTRA_DIST += \ lib/vlog-syn.man \ lib/vlog.man -lib/dirs.c: Makefile - ($(ro_c) && \ - echo 'const char ovs_pkgdatadir[] = "$(pkgdatadir)";' && \ - echo 'const char ovs_rundir[] = "@RUNDIR@";' && \ - echo 'const char ovs_logdir[] = "@LOGDIR@";' && \ - echo 'const char ovs_bindir[] = "$(bindir)";') > lib/dirs.c.tmp +lib/dirs.c: lib/dirs.c.in Makefile + ($(ro_c) && sed < $(srcdir)/lib/dirs.c.in \ + -e 's,[@]srcdir[@],$(srcdir),g' \ + -e 's,[@]LOGDIR[@],"$(LOGDIR)",g' \ + -e 's,[@]RUNDIR[@],"$(RUNDIR)",g' \ + -e 's,[@]bindir[@],"$(bindir)",g' \ + -e 's,[@]pkgdatadir[@],"$(pkgdatadir)",g') \ + > lib/dirs.c.tmp mv lib/dirs.c.tmp lib/dirs.c install-data-local: lib-install-data-local diff --git a/lib/daemon.c b/lib/daemon.c index c6489cd5b..c0f168291 100644 --- a/lib/daemon.c +++ b/lib/daemon.c @@ -67,8 +67,8 @@ char * make_pidfile_name(const char *name) { return (!name - ? xasprintf("%s/%s.pid", ovs_rundir, program_name) - : abs_file_name(ovs_rundir, name)); + ? xasprintf("%s/%s.pid", ovs_rundir(), program_name) + : abs_file_name(ovs_rundir(), name)); } /* Sets up a following call to daemonize() to create a pidfile named 'name'. @@ -500,7 +500,7 @@ daemon_usage(void) " --pidfile[=FILE] create pidfile (default: %s/%s.pid)\n" " --overwrite-pidfile with --pidfile, start even if already " "running\n", - ovs_rundir, program_name); + ovs_rundir(), program_name); } /* Opens and reads a PID from 'pidfile'. Returns the nonnegative PID if diff --git a/lib/dirs.c.in b/lib/dirs.c.in new file mode 100644 index 000000000..a174ab386 --- /dev/null +++ b/lib/dirs.c.in @@ -0,0 +1,66 @@ +#line 2 "@srcdir@/lib/dirs.c.in" +/* + * Copyright (c) 2008, 2009, 2010 Nicira Networks. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "dirs.h" +#include + +struct directory { + const char *value; /* Actual value; NULL if not yet determined. */ + const char *default_value; /* Default value. */ + const char *var_name; /* Environment variable to override default. */ +}; + +static const char * +get_dir(struct directory *d) +{ + if (!d->value) { + d->value = getenv(d->var_name); + if (!d->value || !d->value[0]) { + d->value = d->default_value; + } + } + return d->value; +} + +const char * +ovs_pkgdatadir(void) +{ + static struct directory d = { NULL, @pkgdatadir@, "OVS_PKGDATADIR" }; + return get_dir(&d); +} + +const char * +ovs_rundir(void) +{ + static struct directory d = { NULL, @RUNDIR@, "OVS_RUNDIR" }; + return get_dir(&d); +} + +const char * +ovs_logdir(void) +{ + static struct directory d = { NULL, @LOGDIR@, "OVS_LOGDIR" }; + return get_dir(&d); +} + +const char * +ovs_bindir(void) +{ + static struct directory d = { NULL, @bindir@, "OVS_BINDIR" }; + return get_dir(&d); +} diff --git a/lib/dirs.h b/lib/dirs.h index ea5e3b5da..303530598 100644 --- a/lib/dirs.h +++ b/lib/dirs.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009 Nicira Networks. + * Copyright (c) 2008, 2009, 2010 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,9 +17,9 @@ #ifndef DIRS_H #define DIRS_H 1 -extern const char ovs_pkgdatadir[]; /* /usr/local/share/openvswitch */ -extern const char ovs_rundir[]; /* /usr/local/var/run/openvswitch */ -extern const char ovs_logdir[]; /* /usr/local/var/log/openvswitch */ -extern const char ovs_bindir[]; /* /usr/local/bin */ +const char *ovs_pkgdatadir(void); /* /usr/local/share/openvswitch */ +const char *ovs_rundir(void); /* /usr/local/var/run/openvswitch */ +const char *ovs_logdir(void); /* /usr/local/var/log/openvswitch */ +const char *ovs_bindir(void); /* /usr/local/bin */ #endif /* dirs.h */ diff --git a/lib/unixctl.c b/lib/unixctl.c index e10de4915..161374e0f 100644 --- a/lib/unixctl.c +++ b/lib/unixctl.c @@ -208,9 +208,9 @@ unixctl_server_create(const char *path, struct unixctl_server **serverp) list_init(&server->conns); if (path) { - server->path = abs_file_name(ovs_rundir, path); + server->path = abs_file_name(ovs_rundir(), path); } else { - server->path = xasprintf("%s/%s.%ld.ctl", ovs_rundir, + server->path = xasprintf("%s/%s.%ld.ctl", ovs_rundir(), program_name, (long int) getpid()); } @@ -471,7 +471,7 @@ unixctl_server_destroy(struct unixctl_server *server) /* Connects to a Vlog server socket. 'path' should be the name of a Vlog * server socket. If it does not start with '/', it will be prefixed with - * ovs_rundir (e.g. /var/run/openvswitch). + * the rundir (e.g. /usr/local/var/run/openvswitch). * * Returns 0 if successful, otherwise a positive errno value. If successful, * sets '*clientp' to the new unixctl_client, otherwise to NULL. */ @@ -485,7 +485,7 @@ unixctl_client_create(const char *path, struct unixctl_client **clientp) /* Determine location. */ client = xmalloc(sizeof *client); - client->connect_path = abs_file_name(ovs_rundir, path); + client->connect_path = abs_file_name(ovs_rundir(), path); client->bind_path = xasprintf("/tmp/vlog.%ld.%d", (long int) getpid(), counter++); diff --git a/lib/vlog.c b/lib/vlog.c index 377aaa65a..2598111a4 100644 --- a/lib/vlog.c +++ b/lib/vlog.c @@ -291,7 +291,7 @@ vlog_set_log_file(const char *file_name) old_log_file_name = log_file_name; log_file_name = (file_name ? xstrdup(file_name) - : xasprintf("%s/%s.log", ovs_logdir, program_name)); + : xasprintf("%s/%s.log", ovs_logdir(), program_name)); free(old_log_file_name); file_name = NULL; /* Might have been freed. */ @@ -741,5 +741,5 @@ vlog_usage(void) " -v, --verbose set maximum verbosity level\n" " --log-file[=FILE] enable logging to specified FILE\n" " (default: %s/%s.log)\n", - ovs_logdir, program_name); + ovs_logdir(), program_name); } diff --git a/python/ovs/automake.mk b/python/ovs/automake.mk index 5c10c2a91..4a1e7c16f 100644 --- a/python/ovs/automake.mk +++ b/python/ovs/automake.mk @@ -27,10 +27,12 @@ if HAVE_PYTHON nobase_pkgdata_DATA = $(ovs_pyfiles) ovs-install-data-local: $(MKDIR_P) python/ovs - (echo 'PKGDATADIR = """$(pkgdatadir)"""' && \ - echo 'RUNDIR = """@RUNDIR@"""' && \ - echo 'LOGDIR = """@LOGDIR@"""' && \ - echo 'BINDIR = """$(bindir)"""') > python/ovs/dirs.py.tmp + (echo "import os" && \ + echo 'PKGDATADIR = os.environ.get("OVS_PKGDATADIR", """$(pkgdatadir)""")' && \ + echo 'RUNDIR = os.environ.get("OVS_RUNDIR", """@RUNDIR@""")' && \ + echo 'LOGDIR = os.environ.get("OVS_LOGDIR", """@LOGDIR@""")' && \ + echo 'BINDIR = os.environ.get("OVS_BINDIR", """$(bindir)""")') \ + > python/ovs/dirs.py.tmp $(MKDIR_P) $(DESTDIR)$(pkgdatadir)/python/ovs $(INSTALL_DATA) python/ovs/dirs.py.tmp $(DESTDIR)$(pkgdatadir)/python/ovs/dirs.py rm python/ovs/dirs.py.tmp diff --git a/python/ovs/dirs.py b/python/ovs/dirs.py index f8e73087f..5b006cc3e 100644 --- a/python/ovs/dirs.py +++ b/python/ovs/dirs.py @@ -1,7 +1,8 @@ # These are the default directories. They will be replaced by the # configured directories at install time. -PKGDATADIR = "/usr/local/share/openvswitch" -RUNDIR = "/var/run" -LOGDIR = "/usr/local/var/log" -BINDIR = "/usr/local/bin" +import os +PKGDATADIR = os.environ.get("OVS_PKGDATADIR", "/usr/local/share/openvswitch") +RUNDIR = os.environ.get("OVS_RUNDIR", "/var/run") +LOGDIR = os.environ.get("OVS_LOGDIR", "/usr/local/var/log") +BINDIR = os.environ.get("OVS_BINDIR", "/usr/local/bin") diff --git a/utilities/ovs-appctl.c b/utilities/ovs-appctl.c index 021ac84ef..dc4574267 100644 --- a/utilities/ovs-appctl.c +++ b/utilities/ovs-appctl.c @@ -175,14 +175,14 @@ connect_to_target(const char *target) char *pidfile_name; pid_t pid; - pidfile_name = xasprintf("%s/%s.pid", ovs_rundir, target); + pidfile_name = xasprintf("%s/%s.pid", ovs_rundir(), target); pid = read_pidfile(pidfile_name); if (pid < 0) { ovs_fatal(-pid, "cannot read pidfile \"%s\"", pidfile_name); } free(pidfile_name); socket_name = xasprintf("%s/%s.%ld.ctl", - ovs_rundir, target, (long int) pid); + ovs_rundir(), target, (long int) pid); } else { socket_name = xstrdup(target); } diff --git a/utilities/ovs-discover.c b/utilities/ovs-discover.c index 0feaa0f5c..a89ebc58e 100644 --- a/utilities/ovs-discover.c +++ b/utilities/ovs-discover.c @@ -397,6 +397,6 @@ usage(void) "running\n" " -h, --help display this help message\n" " -V, --version display version information\n", - ovs_rundir, program_name); + ovs_rundir(), program_name); exit(EXIT_SUCCESS); } diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index 7ed159a39..65e2a9fc6 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -217,7 +217,7 @@ open_vconn__(const char *name, const char *default_suffix, struct stat s; char *bridge_path, *datapath_name, *datapath_type; - bridge_path = xasprintf("%s/%s.%s", ovs_rundir, name, default_suffix); + bridge_path = xasprintf("%s/%s.%s", ovs_rundir(), name, default_suffix); dp_parse_name(name, &datapath_name, &datapath_type); if (strstr(name, ":")) { @@ -239,7 +239,7 @@ open_vconn__(const char *name, const char *default_suffix, } socket_name = xasprintf("%s/%s.%s", - ovs_rundir, dpif_name, default_suffix); + ovs_rundir(), dpif_name, default_suffix); if (stat(socket_name, &s)) { ovs_fatal(errno, "cannot connect to %s: stat failed on %s", name, socket_name); diff --git a/utilities/ovs-openflowd.c b/utilities/ovs-openflowd.c index 75413f388..da3a260f7 100644 --- a/utilities/ovs-openflowd.c +++ b/utilities/ovs-openflowd.c @@ -444,8 +444,8 @@ parse_options(int argc, char *argv[], struct ofsettings *s) /* Figure out controller names. */ if (!controllers.n) { - svec_add_nocopy(&controllers, - xasprintf("punix:%s/%s.mgmt", ovs_rundir, s->dp_name)); + svec_add_nocopy(&controllers, xasprintf("punix:%s/%s.mgmt", + ovs_rundir(), s->dp_name)); } for (i = 1; i < argc; i++) { svec_add(&controllers, argv[i]); diff --git a/utilities/ovs-vsctl.c b/utilities/ovs-vsctl.c index 56cb7450d..477bdb0c1 100644 --- a/utilities/ovs-vsctl.c +++ b/utilities/ovs-vsctl.c @@ -531,7 +531,7 @@ default_db(void) { static char *def; if (!def) { - def = xasprintf("unix:%s/db.sock", ovs_rundir); + def = xasprintf("unix:%s/db.sock", ovs_rundir()); } return def; } diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 7dbd37837..0103eb99b 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -1735,7 +1735,7 @@ bridge_reconfigure_one(struct bridge *br) /* Configure OpenFlow controller connection snooping. */ svec_init(&snoops); svec_add_nocopy(&snoops, xasprintf("punix:%s/%s.snoop", - ovs_rundir, br->name)); + ovs_rundir(), br->name)); svec_init(&old_snoops); ofproto_get_snoops(br->ofproto, &old_snoops); if (!svec_equal(&snoops, &old_snoops)) { @@ -1755,7 +1755,7 @@ static void bridge_ofproto_controller_for_mgmt(const struct bridge *br, struct ofproto_controller *oc) { - oc->target = xasprintf("punix:%s/%s.mgmt", ovs_rundir, br->name); + oc->target = xasprintf("punix:%s/%s.mgmt", ovs_rundir(), br->name); oc->max_backoff = 0; oc->probe_interval = 60; oc->band = OFPROTO_OUT_OF_BAND; diff --git a/vswitchd/ovs-brcompatd.c b/vswitchd/ovs-brcompatd.c index b61dc10a0..ecf00b3d2 100644 --- a/vswitchd/ovs-brcompatd.c +++ b/vswitchd/ovs-brcompatd.c @@ -1413,7 +1413,7 @@ parse_options(int argc, char *argv[]) }; char *short_options = long_options_to_short_options(long_options); - appctl_command = xasprintf("%s/ovs-appctl %%s", ovs_bindir); + appctl_command = xasprintf("%s/ovs-appctl %%s", ovs_bindir()); for (;;) { int c; diff --git a/vswitchd/system-stats.c b/vswitchd/system-stats.c index 45b8cce64..9c5a25c5e 100644 --- a/vswitchd/system-stats.c +++ b/vswitchd/system-stats.c @@ -387,9 +387,9 @@ get_process_stats(struct shash *stats) struct dirent *de; DIR *dir; - dir = opendir(ovs_rundir); + dir = opendir(ovs_rundir()); if (!dir) { - VLOG_ERR_ONCE("%s: open failed (%s)", ovs_rundir, strerror(errno)); + VLOG_ERR_ONCE("%s: open failed (%s)", ovs_rundir(), strerror(errno)); return; } @@ -411,7 +411,7 @@ get_process_stats(struct shash *stats) continue; } - file_name = xasprintf("%s/%s", ovs_rundir, de->d_name); + file_name = xasprintf("%s/%s", ovs_rundir(), de->d_name); pid = read_pidfile(file_name); free(file_name); if (pid < 0 || kill(pid, 0)) {