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)) {