// Internal service routine. static CCS _prop_modify_env_val(char *const *envp, CCS name, CCS nval) { #if defined(_WIN32) return SetEnvironmentVariable(name, nval) ? name : NULL; #else /*!_WIN32 */ char *const *ep; CS oval = NULL, result = NULL; size_t nlen, ovlen, nvlen; nlen = strlen(name); if (!envp) { envp = environ; } for (ep = envp; *ep; ep++) { if (!strncmp(*ep, name, nlen) && *(*ep + nlen) == '=') { oval = *ep + nlen + 1; if (strcmp(oval, nval)) { ovlen = strlen(oval); nvlen = strlen(nval); if (nvlen > ovlen) { putil_int("EV %s has no room for value %s", name, nval); break; } else { snprintf(oval, ovlen + 1, "%*s", (int)ovlen, nval); result = putil_getenv(name); break; } } else { result = putil_getenv(name); break; } } } if (oval) { if (result) { ovlen = strlen(oval); nvlen = strlen(result); if (nvlen != ovlen) { putil_int("EV %s failed to update ('%d' != '%d'", name, (int)nvlen, (int)ovlen); } } } else { putil_int("EV %s not found in specified env", name); } return (CCS)result; #endif /*_WIN32*/ }
/// Initializes git-related data structures. void git_init(CCS exe) { CCS perl; CCS str; CS p; CCS t; UNUSED(exe); if (!(perl = prop_get_str(P_PERL_CMD)) && !(perl = putil_getenv("PERL"))) { perl = "perl"; } asprintf(&GitCmd, "%s -S ao2git", perl); if ((str = prop_get_str(P_WFLAG))) { CS s2; s2 = putil_strdup(str); while ((t = util_strsep(&s2, "\n"))) { if (*t == 'g') { t += 2; if ((p = strchr(t, ','))) { *p = ' '; } p = GitCmd; asprintf(&GitCmd, "%s %s", p, t); putil_free(p); } } putil_free(s2); } p = GitCmd; asprintf(&GitCmd, "%s -branch=%s_", p, util_get_logname()); putil_free(p); t = moment_format_id(NULL); p = GitCmd; asprintf(&GitCmd, "%s %s", p, t); putil_free(p); putil_free(t); p = GitCmd; asprintf(&GitCmd, "%s -", p); putil_free(p); if (vb_bitmatch(VB_STD)) { fprintf(stderr, "+ %s\n", GitCmd); } if (!(GitFP = popen(GitCmd, "w"))) { exit(2); } return; }
// Export the specified property to the environment, uppercased, // with the appname prefixed, and all dots replaced with underscores. static void _prop_export(prop_e prop) { char namebuf[PROP_NAME_MAX]; char *name; CS str; CCS val; if (!(val = prop_get_str(prop))) { _prop_report_missing(prop, 1); } _prop_to_ev(prop, namebuf, charlen(namebuf)); name = namebuf; /* These properties are public so leave off the underscore */ if (prop == P_BASE_DIR || prop == P_PROJECT_NAME) { name++; } #if defined(_WIN32) str = (CS)alloca(PROP_STR_MAX); if (GetEnvironmentVariable(name, str, PROP_STR_MAX) && !strcmp(str, val)) { return; } if (!SetEnvironmentVariable(name, val)) { putil_syserr(0, name); } if (GetEnvironmentVariable(name, str, PROP_STR_MAX)) { assert(!strcmp(str, val)); } #else /*_WIN32*/ if ((str = putil_getenv(name)) && !strcmp(str, val)) { return; } str = (CS)putil_calloc(strlen(name) + strlen(val) + 2, CHARSIZE); strcpy(str, name); strcat(str, "="); strcat(str, val); putil_putenv(str); // Despite the confusing putenv man page we must NOT free this str. // Unfortunately Sun's bcheck will show it as a memory leak. // Sadly, so does valgrind 3.4.1 on Linux ... //putil_free(str); #endif /*_WIN32*/ return; }