X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fdirs.c.in;h=85c49ee0bcdf310b10c24a47e1a49a844d7d8cb8;hb=0ef165ecb57943e17a8ee8270df68ffb8d032e29;hp=a5d9f317bca33ab194204a577a0140edaa9eb6b7;hpb=e0edde6fee279cdbbf3c179f5f50adaf0c7c7f1e;p=sliver-openvswitch.git diff --git a/lib/dirs.c.in b/lib/dirs.c.in index a5d9f317b..85c49ee0b 100644 --- a/lib/dirs.c.in +++ b/lib/dirs.c.in @@ -1,6 +1,6 @@ #line 2 "@srcdir@/lib/dirs.c.in" /* - * Copyright (c) 2008, 2009, 2010, 2011 Nicira, Inc. + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,21 +18,25 @@ #include #include "dirs.h" #include +#include "ovs-thread.h" +#include "util.h" 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. */ + struct ovsthread_once once; /* Ensures 'value' gets initialized once. */ }; static const char * get_dir(struct directory *d) { - if (!d->value) { + if (ovsthread_once_start(&d->once)) { d->value = getenv(d->var_name); if (!d->value || !d->value[0]) { d->value = d->default_value; } + ovsthread_once_done(&d->once); } return d->value; } @@ -40,34 +44,69 @@ get_dir(struct directory *d) const char * ovs_sysconfdir(void) { - static struct directory d = { NULL, @sysconfdir@, "OVS_SYSCONFDIR" }; + static struct directory d = { + NULL, @sysconfdir@, "OVS_SYSCONFDIR", OVSTHREAD_ONCE_INITIALIZER + }; + return get_dir(&d); } const char * ovs_pkgdatadir(void) { - static struct directory d = { NULL, @pkgdatadir@, "OVS_PKGDATADIR" }; + static struct directory d = { + NULL, @pkgdatadir@, "OVS_PKGDATADIR", OVSTHREAD_ONCE_INITIALIZER + }; + return get_dir(&d); } const char * ovs_rundir(void) { - static struct directory d = { NULL, @RUNDIR@, "OVS_RUNDIR" }; + static struct directory d = { + NULL, @RUNDIR@, "OVS_RUNDIR", OVSTHREAD_ONCE_INITIALIZER + }; + return get_dir(&d); } const char * ovs_logdir(void) { - static struct directory d = { NULL, @LOGDIR@, "OVS_LOGDIR" }; + static struct directory d = { + NULL, @LOGDIR@, "OVS_LOGDIR", OVSTHREAD_ONCE_INITIALIZER + }; + return get_dir(&d); } +const char * +ovs_dbdir(void) +{ + static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER; + static const char *dbdir; + + if (ovsthread_once_start(&once)) { + dbdir = getenv("OVS_DBDIR"); + if (!dbdir || !dbdir[0]) { + char *sysconfdir = getenv("OVS_SYSCONFDIR"); + + dbdir = (sysconfdir + ? xasprintf("%s/openvswitch", sysconfdir) + : @DBDIR@); + } + ovsthread_once_done(&once); + } + return dbdir; +} + const char * ovs_bindir(void) { - static struct directory d = { NULL, @bindir@, "OVS_BINDIR" }; + static struct directory d = { + NULL, @bindir@, "OVS_BINDIR", OVSTHREAD_ONCE_INITIALIZER + }; + return get_dir(&d); }