Example #1
0
// 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*/
}
Example #2
0
/// 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;
}
Example #3
0
// 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;
}