/*
* %CopyrightBegin%
*
* Copyright Ericsson AB 1999-2017. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* %CopyrightEnd%
*/
/*
* BIFs belonging to the 'os' module.
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "sys.h"
#include "erl_vm.h"
#include "global.h"
#include "erl_process.h"
#include "error.h"
#include "erl_driver.h"
#include "bif.h"
#include "big.h"
#include "dist.h"
#include "erl_version.h"
#include "erl_osenv.h"
/*
* Return the pid for the Erlang process in the host OS.
*/
/* return a timestamp */
BIF_RETTYPE os_timestamp_0(BIF_ALIST_0)
{
Uint megasec, sec, microsec;
Eterm* hp;
get_sys_now(&megasec, &sec, µsec);
hp = HAlloc(BIF_P, 4);
BIF_RET(TUPLE3(hp, make_small(megasec), make_small(sec),
make_small(microsec)));
}
BIF_RETTYPE os_getpid_0(BIF_ALIST_0)
{
char pid_string[21]; /* enough for a 64 bit number */
int n;
Eterm* hp;
sys_get_pid(pid_string, sizeof(pid_string)); /* In sys.c */
n = sys_strlen(pid_string);
hp = HAlloc(BIF_P, n*2);
BIF_RET(buf_to_intlist(&hp, pid_string, n, NIL));
}
static void os_getenv_foreach(Process *process, Eterm *result, Eterm key, Eterm value)
{
Eterm kvp_term, *hp;
hp = HAlloc(process, 5);
kvp_term = TUPLE2(hp, key, value);
hp += 3;
(*result) = CONS(hp, kvp_term, (*result));
}
BIF_RETTYPE os_list_env_vars_0(BIF_ALIST_0)
{
const erts_osenv_t *global_env;
Eterm result = NIL;
global_env = erts_sys_rlock_global_osenv();
erts_osenv_foreach_term(global_env, BIF_P, &result, (void*)&os_getenv_foreach);
erts_sys_runlock_global_osenv();
return result;
}
BIF_RETTYPE os_get_env_var_1(BIF_ALIST_1)
{
const erts_osenv_t *global_env;
Eterm out_term;
int error;
global_env = erts_sys_rlock_global_osenv();
error = erts_osenv_get_term(global_env, BIF_P, BIF_ARG_1, &out_term);
erts_sys_runlock_global_osenv();
if (error == 0) {
return am_false;
} else if (error < 0) {
BIF_ERROR(BIF_P, BADARG);
}
return out_term;
}
BIF_RETTYPE os_set_env_var_2(BIF_ALIST_2)
{
erts_osenv_t *global_env;
int error;
global_env = erts_sys_rwlock_global_osenv();
error = erts_osenv_put_term(global_env, BIF_ARG_1, BIF_ARG_2);
erts_sys_rwunlock_global_osenv();
if (error < 0) {
BIF_ERROR(BIF_P, BADARG);
}
BIF_RET(am_true);
}
BIF_RETTYPE os_unset_env_var_1(BIF_ALIST_1)
{
erts_osenv_t *global_env;
int error;
global_env = erts_sys_rwlock_global_osenv();
error = erts_osenv_unset_term(global_env, BIF_ARG_1);
erts_sys_rwunlock_global_osenv();
if (error < 0) {
BIF_ERROR(BIF_P, BADARG);
}
BIF_RET(am_true);
}
BIF_RETTYPE os_set_signal_2(BIF_ALIST_2) {
if (is_atom(BIF_ARG_1) && ((BIF_ARG_2 == am_ignore) ||
(BIF_ARG_2 == am_default) ||
(BIF_ARG_2 == am_handle))) {
if (!erts_set_signal(BIF_ARG_1, BIF_ARG_2))
goto error;
BIF_RET(am_ok);
}
error:
BIF_ERROR(BIF_P, BADARG);
}