/*
 * Copyright (c) 2020 Huawei Technologies Co.,Ltd.
 *
 * openGauss is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *
 *          http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 * -------------------------------------------------------------------------
 *
 * gs_env_r.cpp
 *
 * IDENTIFICATION
 *    src/common/port/gs_env_r.cpp
 *
 * -------------------------------------------------------------------------
 */
#include <stdlib.h>
#include "utils/syscall_lock.h"

#ifdef WIN32
extern void pgwin32_unsetenv(const char*);

#define unsetenv(x) pgwin32_unsetenv(x)

int gs_putenv_r(char* envvar);
char* gs_getenv_r(const char* name);
int gs_setenv_r(const char* name, const char* envvar, int overwrite);
int gs_unsetenv_r(const char* name);
#endif

int gs_putenv_r(char* envvar)
{
    int ret;
    (void)syscalllockAcquire(&env_lock);
    ret = putenv(envvar);
    (void)syscalllockRelease(&env_lock);
    return ret;
}

char* gs_getenv_r(const char* name)
{
    (void)syscalllockAcquire(&env_lock);
    char* ret = getenv(name);
    (void)syscalllockRelease(&env_lock);
    return ret;
}

int gs_setenv_r(const char* name, const char* envvar, int overwrite)
{
    int ret;
    (void)syscalllockAcquire(&env_lock);
    ret = setenv(name, envvar, overwrite);
    (void)syscalllockRelease(&env_lock);
    return ret;
}

int gs_unsetenv_r(const char* name)
{
    int ret;
    (void)syscalllockAcquire(&env_lock);
#ifdef WIN32
    unsetenv(name);
    ret = 0;
#else
    ret = unsetenv(name);
#endif

    (void)syscalllockRelease(&env_lock);
    return ret;
}