| /*------------------------------------------------------------------------- |
| * |
| * setenv.c |
| * setenv() emulation for machines without it |
| * |
| * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group |
| * Portions Copyright (c) 1994, Regents of the University of California |
| * |
| * |
| * IDENTIFICATION |
| * src/port/setenv.c |
| * |
| *------------------------------------------------------------------------- |
| */ |
| |
| #include "c.h" |
| |
| |
| int |
| setenv(const char *name, const char *value, int overwrite) |
| { |
| char *envstr; |
| |
| /* Error conditions, per POSIX */ |
| if (name == NULL || name[0] == '\0' || strchr(name, '=') != NULL || |
| value == NULL) |
| { |
| errno = EINVAL; |
| return -1; |
| } |
| |
| /* No work if variable exists and we're not to replace it */ |
| if (overwrite == 0 && getenv(name) != NULL) |
| return 0; |
| |
| /* |
| * Add or replace the value using putenv(). This will leak memory if the |
| * same variable is repeatedly redefined, but there's little we can do |
| * about that when sitting atop putenv(). |
| */ |
| envstr = (char *) malloc(strlen(name) + strlen(value) + 2); |
| if (!envstr) /* not much we can do if no memory */ |
| return -1; |
| |
| sprintf(envstr, "%s=%s", name, value); |
| |
| return putenv(envstr); |
| } |