5 #include <lib/base/eenv.h>
6 #include <lib/base/eerror.h>
8 bool eEnv::initialized = false;
10 void eEnv::initialize()
16 { "prefix", "@prefix@" },
17 { "exec_prefix", "@exec_prefix@" },
18 { "bindir", "@bindir@" },
19 { "sbindir", "@sbindir@" },
20 { "libexecdir", "@libexecdir@" },
21 { "datarootdir", "@datarootdir@" },
22 { "datadir", "@datadir@" },
23 { "sysconfdir", "@sysconfdir@" },
24 { "sharedstatedir", "@sharedstatedir@" },
25 { "localstatedir", "@localstatedir@" },
26 { "libdir", "@libdir@" },
27 { "localedir", "@localedir@" },
31 // 1st pass, as generated by configure.
32 // Variables set by the user will not be overwritten.
33 for (i = 0; i < (sizeof(cfgenv) / sizeof(*cfgenv)); i++) {
34 eDebug("setenv('%s', '%s', 0)", cfgenv[i].name.c_str(), cfgenv[i].value.c_str());
35 setenv(cfgenv[i].name.c_str(), cfgenv[i].value.c_str(), 0);
38 // 2nd pass: Resolve directories.
39 for (i = 0; i < (sizeof(cfgenv) / sizeof(*cfgenv)); i++) {
41 eEnv::resolveVar(dest, "${" + cfgenv[i].name + "}");
42 eDebug("setenv('%s', '%s', 1)", cfgenv[i].name.c_str(), dest.c_str());
43 setenv(cfgenv[i].name.c_str(), dest.c_str(), 1);
47 int eEnv::resolveVar(std::string &dest, const char *src)
53 ret = wordexp(src, &p, WRDE_NOCMD | WRDE_UNDEF);
57 eDebug("%s: bad character", __func__);
60 eDebug("%s: bad value", __func__);
63 eDebug("%s: invalid command substitution", __func__);
66 eDebug("%s: out of memory", __func__);
69 eDebug("%s: syntax error", __func__);
72 eDebug("%s: unknown error", __func__);
79 while (i < p.we_wordc) {
80 if (strchr(p.we_wordv[i], '$')) {
81 ret = eEnv::resolveVar(dest, p.we_wordv[i]);
85 dest.append(p.we_wordv[i]);
96 int eEnv::resolveVar(std::string &dest, const std::string &src)
98 return eEnv::resolveVar(dest, src.c_str());
101 std::string eEnv::resolve(const std::string &src)
110 eDebug("%s: resolve %s", __func__, src.c_str());
112 eEnv::resolveVar(dest, src);
114 eDebug("%s: -> %s", __func__, dest.c_str());