diff --git a/src/bio/bio_xstream.c b/src/bio/bio_xstream.c index 00b9b16b19f..15a6b2270ca 100644 --- a/src/bio/bio_xstream.c +++ b/src/bio/bio_xstream.c @@ -293,11 +293,12 @@ bio_nvme_init(const char *nvme_conf, int numa_node, unsigned int mem_size, nvme_glb.bd_bs_opts.cluster_sz = DAOS_BS_CLUSTER_SZ; nvme_glb.bd_bs_opts.max_channel_ops = BIO_BS_MAX_CHANNEL_OPS; - env = getenv("VOS_BDEV_CLASS"); + d_agetenv_str(&env, "VOS_BDEV_CLASS"); if (env && strcasecmp(env, "AIO") == 0) { D_WARN("AIO device(s) will be used!\n"); nvme_glb.bd_bdev_class = BDEV_CLASS_AIO; } + d_freeenv_str(&env); if (numa_node > 0) { bio_numa_node = (unsigned int)numa_node; diff --git a/src/cart/crt_hg.c b/src/cart/crt_hg.c index 6c3805a78c9..9aca5a578a3 100644 --- a/src/cart/crt_hg.c +++ b/src/cart/crt_hg.c @@ -793,8 +793,7 @@ crt_hg_free_protocol_info(struct na_protocol_info *na_protocol_info) int crt_hg_init(void) { - int rc = 0; - char *env; + int rc = 0; if (crt_initialized()) { D_ERROR("CaRT already initialized.\n"); @@ -803,10 +802,8 @@ crt_hg_init(void) #define EXT_FAC DD_FAC(external) - env = getenv("HG_LOG_SUBSYS"); - if (!env) { - env = getenv("HG_LOG_LEVEL"); - if (!env) + if (!d_isenv_def("HG_LOG_SUBSYS")) { + if (!d_isenv_def("HG_LOG_LEVEL")) HG_Set_log_level("warning"); HG_Set_log_subsys("hg,na"); } diff --git a/src/cart/crt_init.c b/src/cart/crt_init.c index 8359afa4903..aa5716e71b5 100644 --- a/src/cart/crt_init.c +++ b/src/cart/crt_init.c @@ -18,6 +18,44 @@ static volatile int gdata_init_flag; struct crt_plugin_gdata crt_plugin_gdata; static bool g_prov_settings_applied[CRT_PROV_COUNT]; +/* List of the environment variables used in CaRT */ +static const char *crt_env_names[] = {"D_PROVIDER", + "D_INTERFACE", + "D_DOMAIN", + "D_PORT", + "CRT_PHY_ADDR_STR", + "D_LOG_STDERR_IN_LOG", + "D_LOG_SIZE", + "D_LOG_FILE", + "D_LOG_FILE_APPEND_PID", + "D_LOG_MASK", + "DD_MASK", + "DD_STDERR", + "DD_SUBSYS", + "CRT_TIMEOUT", + "CRT_ATTACH_INFO_PATH", + "OFI_PORT", + "OFI_INTERFACE", + "OFI_DOMAIN", + "CRT_CREDIT_EP_CTX", + "CRT_CTX_SHARE_ADDR", + "CRT_CTX_NUM", + "D_FI_CONFIG", + "FI_UNIVERSE_SIZE", + "CRT_ENABLE_MEM_PIN", + "FI_OFI_RXM_USE_SRX", + "D_LOG_FLUSH", + "CRT_MRC_ENABLE", + "CRT_SECONDARY_PROVIDER", + "D_PROVIDER_AUTH_KEY", + "D_PORT_AUTO_ADJUST", + "D_POLL_TIMEOUT", + "D_LOG_FILE_APPEND_RANK", + "D_QUOTA_RPCS", + "D_POST_INIT", + "D_POST_INCR", + "DAOS_SIGNAL_REGISTER"}; + static void crt_lib_init(void) __attribute__((__constructor__)); @@ -62,52 +100,20 @@ crt_lib_fini(void) static void dump_envariables(void) { - int i; - char *val; - char *envars[] = {"D_PROVIDER", - "D_INTERFACE", - "D_DOMAIN", - "D_PORT", - "CRT_PHY_ADDR_STR", - "D_LOG_STDERR_IN_LOG", - "D_LOG_SIZE", - "D_LOG_FILE", - "D_LOG_FILE_APPEND_PID", - "D_LOG_MASK", - "DD_MASK", - "DD_STDERR", - "DD_SUBSYS", - "CRT_TIMEOUT", - "CRT_ATTACH_INFO_PATH", - "OFI_PORT", - "OFI_INTERFACE", - "OFI_DOMAIN", - "CRT_CREDIT_EP_CTX", - "CRT_CTX_SHARE_ADDR", - "CRT_CTX_NUM", - "D_FI_CONFIG", - "FI_UNIVERSE_SIZE", - "CRT_ENABLE_MEM_PIN", - "FI_OFI_RXM_USE_SRX", - "D_LOG_FLUSH", - "CRT_MRC_ENABLE", - "CRT_SECONDARY_PROVIDER", - "D_PROVIDER_AUTH_KEY", - "D_PORT_AUTO_ADJUST", - "D_POLL_TIMEOUT", - "D_LOG_FILE_APPEND_RANK", - "D_QUOTA_RPCS", - "D_POST_INIT", - "D_POST_INCR", - "DAOS_SIGNAL_REGISTER"}; + int i; D_INFO("-- ENVARS: --\n"); - for (i = 0; i < ARRAY_SIZE(envars); i++) { - val = getenv(envars[i]); - if (strcmp(envars[i], "D_PROVIDER_AUTH_KEY") == 0 && val) - D_INFO("%s = %s\n", envars[i], "********"); + for (i = 0; i < ARRAY_SIZE(crt_env_names); i++) { + char *val = NULL; + + d_agetenv_str(&val, crt_env_names[i]); + if (val == NULL) + continue; + if (strcmp(crt_env_names[i], "D_PROVIDER_AUTH_KEY") == 0) + D_INFO("%s = %s\n", crt_env_names[i], "********"); else - D_INFO("%s = %s\n", envars[i], val); + D_INFO("%s = %s\n", crt_env_names[i], val); + d_freeenv_str(&val); } } @@ -596,41 +602,40 @@ crt_protocol_info_free(struct crt_protocol_info *protocol_info) int crt_init_opt(crt_group_id_t grpid, uint32_t flags, crt_init_options_t *opt) { - char *provider_env; - char *interface_env; - char *domain_env; - char *auth_key_env; - char *tmp; - struct timeval now; - unsigned int seed; - const char *path; - bool server; - int rc = 0; - char *provider_str0 = NULL; - char *provider_str1 = NULL; - crt_provider_t primary_provider; - crt_provider_t secondary_provider; - crt_provider_t tmp_prov; - char *port_str, *port0, *port1; - char *iface0, *iface1, *domain0, *domain1; - char *auth_key0, *auth_key1; - int num_secondaries = 0; - bool port_auto_adjust = false; - int i; + char *provider; + char *provider_env = NULL; + char *interface; + char *interface_env = NULL; + char *domain; + char *domain_env = NULL; + char *auth_key; + char *auth_key_env = NULL; + struct timeval now; + unsigned int seed; + char *path; + bool server = flags & CRT_FLAG_BIT_SERVER; + int rc = 0; + char *provider_str0 = NULL; + char *provider_str1 = NULL; + crt_provider_t primary_provider; + crt_provider_t secondary_provider; + crt_provider_t tmp_prov; + char *port; + char *port_env = NULL; + char *port0 = NULL; + char *port1 = NULL; + char *iface0 = NULL; + char *iface1 = NULL; + char *domain0 = NULL; + char *domain1 = NULL; + char *auth_key0 = NULL; + char *auth_key1 = NULL; + int num_secondaries = 0; + bool port_auto_adjust = false; + int i; d_signal_register(); - server = flags & CRT_FLAG_BIT_SERVER; - port_str = NULL; - port0 = NULL; - port1 = NULL; - iface0 = NULL; - iface1 = NULL; - domain0 = NULL; - domain1 = NULL; - auth_key0 = NULL; - auth_key1 = NULL; - /* d_log_init is reference counted */ rc = d_log_init(); if (rc != 0) { @@ -677,7 +682,7 @@ crt_init_opt(crt_group_id_t grpid, uint32_t flags, crt_init_options_t *opt) crt_gdata.cg_auto_swim_disable = (flags & CRT_FLAG_BIT_AUTO_SWIM_DISABLE) ? 1 : 0; - path = getenv("CRT_ATTACH_INFO_PATH"); + d_agetenv_str(&path, "CRT_ATTACH_INFO_PATH"); if (path != NULL && strlen(path) > 0) { rc = crt_group_config_path_set(path); if (rc != 0) @@ -687,55 +692,55 @@ crt_init_opt(crt_group_id_t grpid, uint32_t flags, crt_init_options_t *opt) else D_DEBUG(DB_ALL, "set group_config_path as %s.\n", path); } + d_freeenv_str(&path); if (opt && opt->cio_auth_key) - auth_key_env = opt->cio_auth_key; - else - auth_key_env = getenv("D_PROVIDER_AUTH_KEY"); + auth_key = opt->cio_auth_key; + else { + d_agetenv_str(&auth_key_env, "D_PROVIDER_AUTH_KEY"); + auth_key = auth_key_env; + } if (opt && opt->cio_provider) - provider_env = opt->cio_provider; + provider = opt->cio_provider; else { - provider_env = getenv(CRT_PHY_ADDR_ENV); - - tmp = getenv("D_PROVIDER"); - if (tmp) - provider_env = tmp; + d_agetenv_str(&provider_env, "D_PROVIDER"); + if (provider_env == NULL) + d_agetenv_str(&provider_env, CRT_PHY_ADDR_ENV); + provider = provider_env; } if (opt && opt->cio_interface) - interface_env = opt->cio_interface; + interface = opt->cio_interface; else { - interface_env = getenv("OFI_INTERFACE"); - - tmp = getenv("D_INTERFACE"); - if (tmp) - interface_env = tmp; + d_agetenv_str(&interface_env, "D_INTERFACE"); + if (interface_env == NULL) { + d_agetenv_str(&interface_env, "OFI_INTERFACE"); + } + interface = interface_env; } if (opt && opt->cio_domain) - domain_env = opt->cio_domain; + domain = opt->cio_domain; else { - domain_env = getenv("OFI_DOMAIN"); - - tmp = getenv("D_DOMAIN"); - if (tmp) - domain_env = tmp; + d_agetenv_str(&domain_env, "D_DOMAIN"); + if (domain_env == NULL) + d_agetenv_str(&domain_env, "OFI_DOMAIN"); + domain = domain_env; } if (opt && opt->cio_port) - port_str = opt->cio_port; + port = opt->cio_port; else { - port_str = getenv("OFI_PORT"); - - tmp = getenv("D_PORT"); - if (tmp) - port_str = tmp; + d_agetenv_str(&port_env, "D_PORT"); + if (port_env == NULL) + d_agetenv_str(&port_env, "OFI_PORT"); + port = port_env; } d_getenv_bool("D_PORT_AUTO_ADJUST", &port_auto_adjust); - rc = __split_arg(provider_env, &provider_str0, &provider_str1); + rc = __split_arg(provider, &provider_str0, &provider_str1); if (rc != 0) D_GOTO(unlock, rc); @@ -743,20 +748,20 @@ crt_init_opt(crt_group_id_t grpid, uint32_t flags, crt_init_options_t *opt) secondary_provider = crt_str_to_provider(provider_str1); if (primary_provider == CRT_PROV_UNKNOWN) { - D_ERROR("Requested provider %s not found\n", provider_env); + D_ERROR("Requested provider %s not found\n", provider); D_GOTO(unlock, rc = -DER_NONEXIST); } - rc = __split_arg(interface_env, &iface0, &iface1); + rc = __split_arg(interface, &iface0, &iface1); if (rc != 0) D_GOTO(unlock, rc); - rc = __split_arg(domain_env, &domain0, &domain1); + rc = __split_arg(domain, &domain0, &domain1); if (rc != 0) D_GOTO(unlock, rc); - rc = __split_arg(port_str, &port0, &port1); + rc = __split_arg(port, &port0, &port1); if (rc != 0) D_GOTO(unlock, rc); - rc = __split_arg(auth_key_env, &auth_key0, &auth_key1); + rc = __split_arg(auth_key, &auth_key0, &auth_key1); if (rc != 0) D_GOTO(unlock, rc); @@ -896,6 +901,11 @@ crt_init_opt(crt_group_id_t grpid, uint32_t flags, crt_init_options_t *opt) D_FREE(domain0); D_FREE(provider_str0); D_FREE(auth_key0); + d_freeenv_str(&port_env); + d_freeenv_str(&domain_env); + d_freeenv_str(&interface_env); + d_freeenv_str(&provider_env); + d_freeenv_str(&auth_key_env); if (rc != 0) { D_ERROR("failed, "DF_RC"\n", DP_RC(rc)); diff --git a/src/cart/utils/crt_utils.c b/src/cart/utils/crt_utils.c index 5e1a7582c90..6f7cee03c38 100644 --- a/src/cart/utils/crt_utils.c +++ b/src/cart/utils/crt_utils.c @@ -1,5 +1,5 @@ /* - * (C) Copyright 2019-2023 Intel Corporation. + * (C) Copyright 2019-2024 Intel Corporation. * * SPDX-License-Identifier: BSD-2-Clause-Patent */ @@ -101,11 +101,12 @@ write_completion_file(void) char *dir; char *completion_file = NULL; - dir = getenv("DAOS_TEST_SHARED_DIR"); + d_agetenv_str(&dir, "DAOS_TEST_SHARED_DIR"); D_ASSERTF(dir != NULL, "DAOS_TEST_SHARED_DIR must be set for --write_completion_file " "option.\n"); D_ASPRINTF(completion_file, "%s/test-servers-completed.txt.%d", dir, getpid()); + d_freeenv_str(&dir); D_ASSERTF(completion_file != NULL, "Error allocating completion_file string\n"); unlink(completion_file); @@ -412,12 +413,15 @@ crtu_dc_mgmt_net_cfg_rank_add(const char *name, crt_group_t *group, int crtu_dc_mgmt_net_cfg_setenv(const char *name) { - int rc; - char buf[SYS_INFO_BUF_SIZE]; - char *crt_timeout; - char *ofi_interface; - char *ofi_domain; - char *cli_srx_set; + int rc; + char *crt_phy_addr_str; + char *crt_ctx_share_addr = NULL; + char *cli_srx_set = NULL; + char *crt_timeout = NULL; + char *ofi_interface; + char *ofi_interface_env = NULL; + char *ofi_domain; + char *ofi_domain_env = NULL; struct dc_mgmt_sys_info crt_net_cfg_info = {0}; Mgmt__GetAttachInfoResp *crt_net_cfg_resp = NULL; @@ -433,29 +437,38 @@ crtu_dc_mgmt_net_cfg_setenv(const char *name) } /* These two are always set */ - D_INFO("setenv CRT_PHY_ADDR_STR=%s\n", crt_net_cfg_info.provider); - rc = d_setenv("CRT_PHY_ADDR_STR", crt_net_cfg_info.provider, 1); + crt_phy_addr_str = crt_net_cfg_info.provider; + D_INFO("setenv CRT_PHY_ADDR_STR=%s\n", crt_phy_addr_str); + rc = d_setenv("CRT_PHY_ADDR_STR", crt_phy_addr_str, 1); if (rc != 0) D_GOTO(cleanup, rc = d_errno2der(errno)); - sprintf(buf, "%d", crt_net_cfg_info.crt_ctx_share_addr); - D_INFO("setenv CRT_CTX_SHARE_ADDR=%d\n", crt_net_cfg_info.crt_ctx_share_addr); - rc = d_setenv("CRT_CTX_SHARE_ADDR", buf, 1); + rc = asprintf(&crt_ctx_share_addr, "%d", crt_net_cfg_info.crt_ctx_share_addr); + if (rc < 0) { + crt_ctx_share_addr = NULL; + D_GOTO(cleanup, rc = -DER_NOMEM); + } + D_INFO("setenv CRT_CTX_SHARE_ADDR=%s\n", crt_ctx_share_addr); + rc = d_setenv("CRT_CTX_SHARE_ADDR", crt_ctx_share_addr, 1); if (rc != 0) D_GOTO(cleanup, rc = d_errno2der(errno)); /* If the server has set this, the client must use the same value. */ if (crt_net_cfg_info.srv_srx_set != -1) { - sprintf(buf, "%d", crt_net_cfg_info.srv_srx_set); - rc = d_setenv("FI_OFI_RXM_USE_SRX", buf, 1); - D_INFO("setenv FI_OFI_RXM_USE_SRX=%d\n", crt_net_cfg_info.srv_srx_set); + rc = asprintf(&cli_srx_set, "%d", crt_net_cfg_info.srv_srx_set); + if (rc < 0) { + cli_srx_set = NULL; + D_GOTO(cleanup, rc = -DER_NOMEM); + } + D_INFO("setenv FI_OFI_RXM_USE_SRX=%s\n", cli_srx_set); + rc = d_setenv("FI_OFI_RXM_USE_SRX", cli_srx_set, 1); if (rc != 0) D_GOTO(cleanup, rc = d_errno2der(errno)); - D_DEBUG(DB_MGMT, "Using server's value for FI_OFI_RXM_USE_SRX: %s\n", buf); + D_DEBUG(DB_MGMT, "Using server's value for FI_OFI_RXM_USE_SRX: %s\n", cli_srx_set); } else { /* Client may not set it if the server hasn't. */ - cli_srx_set = getenv("FI_OFI_RXM_USE_SRX"); + d_agetenv_str(&cli_srx_set, "FI_OFI_RXM_USE_SRX"); if (cli_srx_set) { D_ERROR("Client set FI_OFI_RXM_USE_SRX to %s, " "but server is unset!\n", cli_srx_set); @@ -464,47 +477,58 @@ crtu_dc_mgmt_net_cfg_setenv(const char *name) } /* Allow client env overrides for these three */ - crt_timeout = getenv("CRT_TIMEOUT"); + d_agetenv_str(&crt_timeout, "CRT_TIMEOUT"); if (!crt_timeout) { - sprintf(buf, "%d", crt_net_cfg_info.crt_timeout); - rc = d_setenv("CRT_TIMEOUT", buf, 1); - D_INFO("setenv CRT_TIMEOUT=%d\n", crt_net_cfg_info.crt_timeout); + rc = asprintf(&crt_timeout, "%d", crt_net_cfg_info.crt_timeout); + if (rc < 0) { + crt_timeout = NULL; + D_GOTO(cleanup, rc = -DER_NOMEM); + } + D_INFO("setenv CRT_TIMEOUT=%s\n", crt_timeout); + rc = d_setenv("CRT_TIMEOUT", crt_timeout, 1); if (rc != 0) D_GOTO(cleanup, rc = d_errno2der(errno)); } else { D_DEBUG(DB_MGMT, "Using client provided CRT_TIMEOUT: %s\n", crt_timeout); } - ofi_interface = getenv("OFI_INTERFACE"); - if (!ofi_interface) { - rc = d_setenv("OFI_INTERFACE", crt_net_cfg_info.interface, 1); - D_INFO("Setting OFI_INTERFACE=%s\n", crt_net_cfg_info.interface); + d_agetenv_str(&ofi_interface_env, "OFI_INTERFACE"); + if (!ofi_interface_env) { + ofi_interface = crt_net_cfg_info.interface; + D_INFO("Setting OFI_INTERFACE=%s\n", ofi_interface); + rc = d_setenv("OFI_INTERFACE", ofi_interface, 1); if (rc != 0) D_GOTO(cleanup, rc = d_errno2der(errno)); } else { + ofi_interface = ofi_interface_env; D_DEBUG(DB_MGMT, "Using client provided OFI_INTERFACE: %s\n", ofi_interface); } - ofi_domain = getenv("OFI_DOMAIN"); - if (!ofi_domain) { - rc = d_setenv("OFI_DOMAIN", crt_net_cfg_info.domain, 1); - D_INFO("Setting OFI_DOMAIN=%s\n", crt_net_cfg_info.domain); + d_agetenv_str(&ofi_domain_env, "OFI_DOMAIN"); + if (!ofi_domain_env) { + ofi_domain = crt_net_cfg_info.domain; + D_INFO("Setting OFI_DOMAIN=%s\n", ofi_domain); + rc = d_setenv("OFI_DOMAIN", ofi_domain, 1); if (rc != 0) D_GOTO(cleanup, rc = d_errno2der(errno)); } else { + ofi_domain = ofi_domain_env; D_DEBUG(DB_MGMT, "Using client provided OFI_DOMAIN: %s\n", ofi_domain); } D_INFO("CaRT env setup with:\n" - "\tOFI_INTERFACE=%s, OFI_DOMAIN: %s, CRT_PHY_ADDR_STR: %s, " - "CRT_CTX_SHARE_ADDR: %s, CRT_TIMEOUT: %s\n", - getenv("OFI_INTERFACE"), getenv("OFI_DOMAIN"), - getenv("CRT_PHY_ADDR_STR"), - getenv("CRT_CTX_SHARE_ADDR"), getenv("CRT_TIMEOUT")); + "\tOFI_INTERFACE=%s, OFI_DOMAIN: %s, CRT_PHY_ADDR_STR: %s, " + "CRT_CTX_SHARE_ADDR: %s, CRT_TIMEOUT: %s\n", + ofi_interface, ofi_domain, crt_phy_addr_str, crt_ctx_share_addr, crt_timeout); cleanup: + d_freeenv_str(&ofi_domain_env); + d_freeenv_str(&ofi_interface_env); + d_freeenv_str(&crt_timeout); + d_freeenv_str(&cli_srx_set); + d_freeenv_str(&crt_ctx_share_addr); dc_put_attach_info(&crt_net_cfg_info, crt_net_cfg_resp); return rc; @@ -575,7 +599,7 @@ crtu_cli_start_basic(char *local_group_name, char *srv_group_name, if (*grp == NULL) D_GOTO(out, rc = -DER_INVAL); - grp_cfg_file = getenv("CRT_L_GRP_CFG"); + d_agetenv_str(&grp_cfg_file, "CRT_L_GRP_CFG"); /* load group info from a config file and * delete file upon return @@ -583,6 +607,7 @@ crtu_cli_start_basic(char *local_group_name, char *srv_group_name, rc = crtu_load_group_from_file(grp_cfg_file, *crt_ctx, *grp, -1, true); + d_freeenv_str(&grp_cfg_file); if (rc != 0) D_GOTO(out, rc); } @@ -644,7 +669,6 @@ crtu_srv_start_basic(char *srv_group_name, crt_context_t *crt_ctx, pthread_t *progress_thread, crt_group_t **grp, uint32_t *grp_size, crt_init_options_t *init_opt) { - char *env_self_rank; char *grp_cfg_file; char *my_uri; d_rank_t my_rank; @@ -653,8 +677,8 @@ crtu_srv_start_basic(char *srv_group_name, crt_context_t *crt_ctx, if (opts.assert_on_error) D_ASSERTF(opts.is_initialized == true, "crtu_test_init not called.\n"); - env_self_rank = getenv("CRT_L_RANK"); - my_rank = atoi(env_self_rank); + rc = d_getenv_uint32_t("CRT_L_RANK", &my_rank); + D_ASSERTF(rc == DER_SUCCESS, "Rank can not be retrieve: " DF_RC "\n", DP_RC(rc)); rc = d_log_init(); if (rc != 0) @@ -695,19 +719,19 @@ crtu_srv_start_basic(char *srv_group_name, crt_context_t *crt_ctx, D_GOTO(out, rc); } - grp_cfg_file = getenv("CRT_L_GRP_CFG"); - rc = crt_rank_uri_get(*grp, my_rank, 0, &my_uri); if (rc != 0) D_GOTO(out, rc); + D_FREE(my_uri); + + rc = d_agetenv_str(&grp_cfg_file, "CRT_L_GRP_CFG"); /* load group info from a config file and delete file upon return */ rc = crtu_load_group_from_file(grp_cfg_file, crt_ctx[0], *grp, my_rank, true); + d_freeenv_str(&grp_cfg_file); if (rc != 0) D_GOTO(out, rc); - D_FREE(my_uri); - rc = crt_group_size(NULL, grp_size); if (rc != 0) D_GOTO(out, rc); diff --git a/src/client/api/agent.c b/src/client/api/agent.c index 365ba908ef6..ede098eb165 100644 --- a/src/client/api/agent.c +++ b/src/client/api/agent.c @@ -12,14 +12,16 @@ char *dc_agent_sockpath; int dc_agent_init() { - char *path = NULL; - char *envpath = getenv(DAOS_AGENT_DRPC_DIR_ENV); + char *path = NULL; + char *envpath; - if (envpath) + d_agetenv_str(&envpath, DAOS_AGENT_DRPC_DIR_ENV); + if (envpath != NULL) D_ASPRINTF(path, "%s/%s", envpath, DAOS_AGENT_DRPC_SOCK_NAME); else D_STRNDUP_S(path, DEFAULT_DAOS_AGENT_DRPC_SOCK); + d_freeenv_str(&envpath); if (path == NULL) return -DER_NOMEM; diff --git a/src/client/api/job.c b/src/client/api/job.c index e4a330f455c..c184c770840 100644 --- a/src/client/api/job.c +++ b/src/client/api/job.c @@ -37,22 +37,24 @@ int dc_job_init(void) { char *jobid; - char *jobid_env = getenv(JOBID_ENV); + char *jobid_env; int err = 0; + d_agetenv_str(&jobid_env, JOBID_ENV); if (jobid_env == NULL) { D_STRNDUP_S(jobid_env, DEFAULT_JOBID_ENV); } else { char *tmp_env = jobid_env; D_STRNDUP(jobid_env, tmp_env, MAX_ENV_NAME); + d_freeenv_str(&tmp_env); } if (jobid_env == NULL) D_GOTO(out_err, err = -DER_NOMEM); dc_jobid_env = jobid_env; - jobid = getenv(dc_jobid_env); + d_agetenv_str(&jobid, dc_jobid_env); if (jobid == NULL) { err = craft_default_jobid(&jobid); if (err) @@ -61,6 +63,7 @@ dc_job_init(void) char *tmp_jobid = jobid; D_STRNDUP(jobid, tmp_jobid, MAX_JOBID_LEN); + d_freeenv_str(&tmp_jobid); if (jobid == NULL) D_GOTO(out_env, err = -DER_NOMEM); } diff --git a/src/client/dfuse/dfuse_main.c b/src/client/dfuse/dfuse_main.c index 1ef48600a6f..ee67c3f2fe1 100644 --- a/src/client/dfuse/dfuse_main.c +++ b/src/client/dfuse/dfuse_main.c @@ -521,7 +521,7 @@ main(int argc, char **argv) } } - if (!dfuse_info->di_foreground && getenv("PMIX_RANK")) { + if (!dfuse_info->di_foreground && d_isenv_def("PMIX_RANK")) { DFUSE_TRA_WARNING(dfuse_info, "Not running in background under orterun"); dfuse_info->di_foreground = true; diff --git a/src/client/dfuse/pil4dfs/int_dfs.c b/src/client/dfuse/pil4dfs/int_dfs.c index 8a2fc1f0fa2..b50caad76ef 100644 --- a/src/client/dfuse/pil4dfs/int_dfs.c +++ b/src/client/dfuse/pil4dfs/int_dfs.c @@ -612,13 +612,14 @@ query_dfs_mount(const char *path) static int discover_daos_mount_with_env(void) { - int idx, len_fs_root, rc; - char *fs_root = NULL; - char *pool = NULL; - char *container = NULL; + int idx, rc; + char *fs_root = NULL; + char *pool = NULL; + char *container = NULL; + size_t len_fs_root, len_pool, len_container; /* Add the mount if env DAOS_MOUNT_POINT is set. */ - fs_root = getenv("DAOS_MOUNT_POINT"); + rc = d_agetenv_str(&fs_root, "DAOS_MOUNT_POINT"); if (fs_root == NULL) /* env DAOS_MOUNT_POINT is undefined, return success (0) */ D_GOTO(out, rc = 0); @@ -645,31 +646,56 @@ discover_daos_mount_with_env(void) D_GOTO(out, rc = ENAMETOOLONG); } - pool = getenv("DAOS_POOL"); + d_agetenv_str(&pool, "DAOS_POOL"); if (pool == NULL) { D_FATAL("DAOS_POOL is not set.\n"); D_GOTO(out, rc = EINVAL); } - container = getenv("DAOS_CONTAINER"); + len_pool = strnlen(pool, DAOS_PROP_MAX_LABEL_BUF_LEN); + if (len_pool >= DAOS_PROP_MAX_LABEL_BUF_LEN) { + D_FATAL("DAOS_POOL is too long.\n"); + D_GOTO(out, rc = ENAMETOOLONG); + } + + rc = d_agetenv_str(&container, "DAOS_CONTAINER"); if (container == NULL) { D_FATAL("DAOS_CONTAINER is not set.\n"); D_GOTO(out, rc = EINVAL); } + len_container = strnlen(container, DAOS_PROP_MAX_LABEL_BUF_LEN); + if (len_container >= DAOS_PROP_MAX_LABEL_BUF_LEN) { + D_FATAL("DAOS_CONTAINER is too long.\n"); + D_GOTO(out, rc = ENAMETOOLONG); + } + D_STRNDUP(dfs_list[num_dfs].fs_root, fs_root, len_fs_root); if (dfs_list[num_dfs].fs_root == NULL) D_GOTO(out, rc = ENOMEM); - dfs_list[num_dfs].pool = pool; - dfs_list[num_dfs].cont = container; + D_STRNDUP(dfs_list[num_dfs].pool, pool, len_pool); + if (dfs_list[num_dfs].pool == NULL) + D_GOTO(free_fs_root, rc = ENOMEM); + + D_STRNDUP(dfs_list[num_dfs].cont, container, len_container); + if (dfs_list[num_dfs].cont == NULL) + D_GOTO(free_pool, rc = ENOMEM); + dfs_list[num_dfs].dfs_dir_hash = NULL; - dfs_list[num_dfs].len_fs_root = len_fs_root; + dfs_list[num_dfs].len_fs_root = (int)len_fs_root; atomic_init(&dfs_list[num_dfs].inited, 0); num_dfs++; - rc = 0; + D_GOTO(out, rc = 0); +free_pool: + D_FREE(dfs_list[num_dfs].pool); +free_fs_root: + D_FREE(dfs_list[num_dfs].fs_root); out: + d_freeenv_str(&container); + d_freeenv_str(&pool); + d_freeenv_str(&fs_root); return rc; } @@ -5647,11 +5673,12 @@ init_myhook(void) else daos_debug_inited = true; - env_log = getenv("D_IL_REPORT"); + d_agetenv_str(&env_log, "D_IL_REPORT"); if (env_log) { report = true; if (strncmp(env_log, "0", 2) == 0 || strncasecmp(env_log, "false", 6) == 0) report = false; + d_freeenv_str(&env_log); } /* Find dfuse mounts from /proc/mounts */ @@ -5941,6 +5968,8 @@ finalize_dfs(void) for (i = 0; i < num_dfs; i++) { if (dfs_list[i].dfs_dir_hash == NULL) { D_FREE(dfs_list[i].fs_root); + D_FREE(dfs_list[i].pool); + D_FREE(dfs_list[i].cont); continue; } @@ -5972,6 +6001,8 @@ finalize_dfs(void) continue; } D_FREE(dfs_list[i].fs_root); + D_FREE(dfs_list[i].pool); + D_FREE(dfs_list[i].cont); } if (atomic_load_relaxed(&daos_inited)) { diff --git a/src/client/pydaos/pydaos_shim.c b/src/client/pydaos/pydaos_shim.c index 5349b08d03a..1100ec7a368 100644 --- a/src/client/pydaos/pydaos_shim.c +++ b/src/client/pydaos/pydaos_shim.c @@ -106,7 +106,7 @@ __shim_handle__daos_init(PyObject *self, PyObject *args) rc = daos_init(); if ((rc == 0) && (use_glob_eq == 0)) { - override = getenv("PYDAOS_GLOB_EQ"); + d_agetenv_str(&override, "PYDAOS_GLOB_EQ"); if ((override == NULL) || strcmp(override, "0")) { use_glob_eq = 1; ret = daos_eq_create(&glob_eq); @@ -115,6 +115,7 @@ __shim_handle__daos_init(PyObject *self, PyObject *args) use_glob_eq = 0; } } + d_freeenv_str(&override); } return PyInt_FromLong(rc); diff --git a/src/common/debug.c b/src/common/debug.c index 5096e3ec92c..b586f0e50d3 100644 --- a/src/common/debug.c +++ b/src/common/debug.c @@ -104,14 +104,16 @@ unsigned int daos_io_bypass; static void io_bypass_init(void) { - char *str = getenv(DENV_IO_BYPASS); - char *tok; - char *saved_ptr; + char *str; + char *tok; + char *saved_ptr; + char *env; - if (!str) + d_agetenv_str(&env, DENV_IO_BYPASS); + if (env == NULL) return; - tok = strtok_r(str, ",", &saved_ptr); + tok = strtok_r(env, ",", &saved_ptr); while (tok) { struct io_bypass *iob; @@ -129,6 +131,7 @@ io_bypass_init(void) } tok = str; }; + d_freeenv_str(&env); } void @@ -162,17 +165,18 @@ daos_debug_init_ex(char *logfile, d_dbug_t logmask) } /* honor the env variable first */ - logfile = getenv(D_LOG_FILE_ENV); + rc = d_agetenv_str(&logfile, D_LOG_FILE_ENV); if (logfile == NULL || strlen(logfile) == 0) { flags |= DLOG_FLV_STDOUT; - logfile = NULL; + d_freeenv_str(&logfile); } else if (!strncmp(logfile, "/dev/null", 9)) { /* Don't set up logging or log to stdout if the log file is /dev/null */ - logfile = NULL; + d_freeenv_str(&logfile); } rc = d_log_init_adv("DAOS", logfile, flags, logmask, DLOG_CRIT, log_id_cb); + d_freeenv_str(&logfile); if (rc != 0) { D_PRINT_ERR("Failed to init DAOS debug log: "DF_RC"\n", DP_RC(rc)); diff --git a/src/common/misc.c b/src/common/misc.c index f7d6b1ddad0..afd8ed8fa38 100644 --- a/src/common/misc.c +++ b/src/common/misc.c @@ -684,13 +684,15 @@ daos_crt_init_opt_get(bool server, int ctx_nr) * 1) now sockets provider cannot create more than 16 contexts for SEP * 2) some problems if SEP communicates with regular EP. */ - addr_env = (crt_phy_addr_t)getenv(CRT_PHY_ADDR_ENV); + d_agetenv_str(&addr_env, CRT_PHY_ADDR_ENV); if (addr_env != NULL && strncmp(addr_env, CRT_SOCKET_PROV, strlen(CRT_SOCKET_PROV)) == 0) { D_INFO("for sockets provider force it to use regular EP.\n"); daos_crt_init_opt.cio_use_sep = 0; + d_freeenv_str(&addr_env); goto out; } + d_freeenv_str(&addr_env); daos_crt_init_opt.cio_use_sep = 1; diff --git a/src/engine/init.c b/src/engine/init.c index 23379878700..0f705e5366b 100644 --- a/src/engine/init.c +++ b/src/engine/init.c @@ -432,14 +432,15 @@ dss_init_state_set(enum dss_init_state state) static int abt_max_num_xstreams(void) { - char *env; + unsigned num_xstreams = 0; - env = getenv("ABT_MAX_NUM_XSTREAMS"); - if (env == NULL) - env = getenv("ABT_ENV_MAX_NUM_XSTREAMS"); - if (env != NULL) - return atoi(env); - return 0; + if (d_isenv_def("ABT_MAX_NUM_XSTREAMS")) + d_getenv_uint("ABT_MAX_NUM_XSTREAMS", &num_xstreams); + else + d_getenv_uint("ABT_ENV_MAX_NUM_XSTREAMS", &num_xstreams); + D_ASSERT(num_xstreams <= INT_MAX); + + return num_xstreams; } static int diff --git a/src/engine/srv.c b/src/engine/srv.c index df0733ed638..0afc13861d1 100644 --- a/src/engine/srv.c +++ b/src/engine/srv.c @@ -1048,13 +1048,14 @@ dss_xstreams_init(void) sched_relax_intvl); } - env = getenv("DAOS_SCHED_RELAX_MODE"); + d_agetenv_str(&env, "DAOS_SCHED_RELAX_MODE"); if (env) { sched_relax_mode = sched_relax_str2mode(env); if (sched_relax_mode == SCHED_RELAX_MODE_INVALID) { D_WARN("Invalid relax mode [%s]\n", env); sched_relax_mode = SCHED_RELAX_MODE_NET; } + d_freeenv_str(&env); } D_INFO("CPU relax mode is set to [%s]\n", sched_relax_mode2str(sched_relax_mode)); diff --git a/src/gurt/debug.c b/src/gurt/debug.c index 4fb112b7dcc..bc672c03067 100644 --- a/src/gurt/debug.c +++ b/src/gurt/debug.c @@ -380,7 +380,7 @@ debug_prio_err_load_env(void) char *env; int i; - env = getenv(DD_STDERR_ENV); + d_agetenv_str(&env, DD_STDERR_ENV); if (env == NULL) return; @@ -395,6 +395,7 @@ debug_prio_err_load_env(void) /* invalid DD_STDERR option */ if (d_dbglog_data.dd_prio_err == 0) D_PRINT_ERR("DD_STDERR = %s - invalid option\n", env); + d_freeenv_str(&env); } void @@ -415,7 +416,16 @@ d_log_sync_mask_ex(const char *log_mask, const char *dd_mask) void d_log_sync_mask(void) { - d_log_sync_mask_ex(getenv(D_LOG_MASK_ENV), getenv(DD_MASK_ENV)); + char *log_mask; + char *dd_mask; + + d_agetenv_str(&log_mask, D_LOG_MASK_ENV); + d_agetenv_str(&dd_mask, DD_MASK_ENV); + + d_log_sync_mask_ex(log_mask, dd_mask); + + d_freeenv_str(&dd_mask); + d_freeenv_str(&log_mask); } /** @@ -540,14 +550,15 @@ d_log_init(void) int flags = DLOG_FLV_LOGPID | DLOG_FLV_FAC | DLOG_FLV_TAG; int rc; - log_file = getenv(D_LOG_FILE_ENV); + d_agetenv_str(&log_file, D_LOG_FILE_ENV); if (log_file == NULL || strlen(log_file) == 0) { flags |= DLOG_FLV_STDOUT; - log_file = NULL; + d_freeenv_str(&log_file); } rc = d_log_init_adv("CaRT", log_file, flags, DLOG_WARN, DLOG_EMERG, NULL); + d_freeenv_str(&log_file); if (rc != DER_SUCCESS) { D_PRINT_ERR("d_log_init_adv failed, rc: %d.\n", rc); D_GOTO(out, rc); diff --git a/src/gurt/dlog.c b/src/gurt/dlog.c index 7cbce2fa7b6..2f1324463c0 100644 --- a/src/gurt/dlog.c +++ b/src/gurt/dlog.c @@ -847,20 +847,20 @@ d_log_open(char *tag, int maxfac_hint, int default_mask, int stderr_mask, if (pri != -1) mst.flush_pri = pri; - d_free_env_str(&env); + d_freeenv_str(&env); } d_agetenv_str(&env, D_LOG_TRUNCATE_ENV); if (env != NULL && atoi(env) > 0) truncate = 1; - d_free_env_str(&env); + d_freeenv_str(&env); d_agetenv_str(&env, D_LOG_SIZE_ENV); if (env != NULL) { log_size = d_getenv_size(env); if (log_size < LOG_SIZE_MIN) log_size = LOG_SIZE_MIN; - d_free_env_str(&env); + d_freeenv_str(&env); } d_agetenv_str(&env, D_LOG_FILE_APPEND_PID_ENV); @@ -875,12 +875,12 @@ d_log_open(char *tag, int maxfac_hint, int default_mask, int stderr_mask, "continuing.\n"); } } - d_free_env_str(&env); + d_freeenv_str(&env); d_agetenv_str(&env, D_LOG_FILE_APPEND_RANK_ENV); if (env && strcmp(env, "0") != 0) mst.append_rank = true; - d_free_env_str(&env); + d_freeenv_str(&env); /* quick sanity check (mst.tag is non-null if already open) */ if (d_log_xst.tag || !tag || @@ -918,7 +918,7 @@ d_log_open(char *tag, int maxfac_hint, int default_mask, int stderr_mask, d_agetenv_str(&env, D_LOG_STDERR_IN_LOG_ENV); if (env != NULL && atoi(env) > 0) merge_stderr = true; - d_free_env_str(&env); + d_freeenv_str(&env); if (!truncate) log_flags |= O_APPEND; @@ -1107,7 +1107,7 @@ bool d_logfac_is_enabled(const char *fac_name) rc = true; out: - d_free_env_str(&ddsubsys_env); + d_freeenv_str(&ddsubsys_env); return rc; } diff --git a/src/gurt/fault_inject.c b/src/gurt/fault_inject.c index 4ffbd2c40e4..f5225bab3dd 100644 --- a/src/gurt/fault_inject.c +++ b/src/gurt/fault_inject.c @@ -616,7 +616,7 @@ d_fault_inject_init(void) out: if (fp) fclose(fp); - d_free_env_str(&config_file); + d_freeenv_str(&config_file); return rc; } diff --git a/src/gurt/misc.c b/src/gurt/misc.c index 3b287ca73ff..d92055a905d 100644 --- a/src/gurt/misc.c +++ b/src/gurt/misc.c @@ -1120,7 +1120,7 @@ d_agetenv_str(char **str_val, const char *name) * \param[in,out] str_val Copy of an environment string value. */ void -d_free_env_str(char **str_val) +d_freeenv_str(char **str_val) { assert(str_val != NULL); diff --git a/src/gurt/tests/test_gurt.c b/src/gurt/tests/test_gurt.c index ebb9a0ec701..e9f8f435486 100644 --- a/src/gurt/tests/test_gurt.c +++ b/src/gurt/tests/test_gurt.c @@ -2140,7 +2140,7 @@ test_d_agetenv_str(void **state) assert_int_equal(rc, -DER_SUCCESS); assert_non_null(env); assert_string_equal(env, "bar"); - d_free_env_str(&env); + d_freeenv_str(&env); assert_null(env); getenv_return = ""; @@ -2148,7 +2148,7 @@ test_d_agetenv_str(void **state) assert_int_equal(rc, -DER_SUCCESS); assert_non_null(env); assert_string_equal(env, ""); - d_free_env_str(&env); + d_freeenv_str(&env); assert_null(env); getenv_return = NULL; diff --git a/src/include/gurt/common.h b/src/include/gurt/common.h index 1cf40fc3292..164421174a0 100644 --- a/src/include/gurt/common.h +++ b/src/include/gurt/common.h @@ -581,7 +581,7 @@ d_getenv_str(char *str_val, size_t str_size, const char *name); int d_agetenv_str(char **str_val, const char *name); void -d_free_env_str(char **str_val); +d_freeenv_str(char **str_val); int d_getenv_bool(const char *name, bool *bool_val); int diff --git a/src/mgmt/cli_mgmt.c b/src/mgmt/cli_mgmt.c index 57cf0faa723..78db4c699e4 100644 --- a/src/mgmt/cli_mgmt.c +++ b/src/mgmt/cli_mgmt.c @@ -1,5 +1,5 @@ /* - * (C) Copyright 2016-2023 Intel Corporation. + * (C) Copyright 2016-2024 Intel Corporation. * * SPDX-License-Identifier: BSD-2-Clause-Patent */ @@ -449,13 +449,16 @@ _split_env(char *env, char **name, char **value) */ int dc_mgmt_net_cfg(const char *name) { - int rc; - char buf[SYS_INFO_BUF_SIZE]; - char *crt_timeout; - char *ofi_interface; - char *ofi_domain; - char *cli_srx_set; - struct dc_mgmt_sys_info info; + int rc; + char *crt_phy_addr_str; + char *crt_ctx_share_addr = NULL; + char *cli_srx_set = NULL; + char *crt_timeout = NULL; + char *ofi_interface; + char *ofi_interface_env = NULL; + char *ofi_domain = ""; + char *ofi_domain_env = NULL; + struct dc_mgmt_sys_info info; Mgmt__GetAttachInfoResp *resp; /* Query the agent for the CaRT network configuration parameters */ @@ -491,26 +494,34 @@ int dc_mgmt_net_cfg(const char *name) g_num_serv_ranks = resp->n_rank_uris; D_INFO("Setting number of server ranks to %d\n", g_num_serv_ranks); /* These two are always set */ - rc = d_setenv("CRT_PHY_ADDR_STR", info.provider, 1); + crt_phy_addr_str = info.provider; + rc = d_setenv("CRT_PHY_ADDR_STR", crt_phy_addr_str, 1); if (rc != 0) D_GOTO(cleanup, rc = d_errno2der(errno)); - sprintf(buf, "%d", info.crt_ctx_share_addr); - rc = d_setenv("CRT_CTX_SHARE_ADDR", buf, 1); + rc = asprintf(&crt_ctx_share_addr, "%d", info.crt_ctx_share_addr); + if (rc < 0) { + crt_ctx_share_addr = NULL; + D_GOTO(cleanup, rc = -DER_NOMEM); + } + rc = d_setenv("CRT_CTX_SHARE_ADDR", crt_ctx_share_addr, 1); if (rc != 0) D_GOTO(cleanup, rc = d_errno2der(errno)); /* If the server has set this, the client must use the same value. */ if (info.srv_srx_set != -1) { - sprintf(buf, "%d", info.srv_srx_set); - rc = d_setenv("FI_OFI_RXM_USE_SRX", buf, 1); + rc = asprintf(&cli_srx_set, "%d", info.srv_srx_set); + if (rc < 0) { + cli_srx_set = NULL; + D_GOTO(cleanup, rc = -DER_NOMEM); + } + rc = d_setenv("FI_OFI_RXM_USE_SRX", cli_srx_set, 1); if (rc != 0) D_GOTO(cleanup, rc = d_errno2der(errno)); - D_INFO("Using server's value for FI_OFI_RXM_USE_SRX: %s\n", - buf); + D_INFO("Using server's value for FI_OFI_RXM_USE_SRX: %s\n", cli_srx_set); } else { /* Client may not set it if the server hasn't. */ - cli_srx_set = getenv("FI_OFI_RXM_USE_SRX"); + d_agetenv_str(&cli_srx_set, "FI_OFI_RXM_USE_SRX"); if (cli_srx_set) { D_ERROR("Client set FI_OFI_RXM_USE_SRX to %s, " "but server is unset!\n", cli_srx_set); @@ -519,21 +530,26 @@ int dc_mgmt_net_cfg(const char *name) } /* Allow client env overrides for these three */ - crt_timeout = getenv("CRT_TIMEOUT"); + d_agetenv_str(&crt_timeout, "CRT_TIMEOUT"); if (!crt_timeout) { - sprintf(buf, "%d", info.crt_timeout); - rc = d_setenv("CRT_TIMEOUT", buf, 1); + rc = asprintf(&crt_timeout, "%d", info.crt_timeout); + if (rc < 0) { + crt_timeout = NULL; + D_GOTO(cleanup, rc = -DER_NOMEM); + } + D_INFO("setenv CRT_TIMEOUT=%s\n", crt_timeout); + rc = d_setenv("CRT_TIMEOUT", crt_timeout, 1); if (rc != 0) D_GOTO(cleanup, rc = d_errno2der(errno)); } else { - D_INFO("Using client provided CRT_TIMEOUT: %s\n", - crt_timeout); + D_DEBUG(DB_MGMT, "Using client provided CRT_TIMEOUT: %s\n", crt_timeout); } - ofi_interface = getenv("OFI_INTERFACE"); - ofi_domain = getenv("OFI_DOMAIN"); - if (!ofi_interface) { - rc = d_setenv("OFI_INTERFACE", info.interface, 1); + d_agetenv_str(&ofi_interface_env, "OFI_INTERFACE"); + d_agetenv_str(&ofi_domain_env, "OFI_DOMAIN"); + if (!ofi_interface_env) { + ofi_interface = info.interface; + rc = d_setenv("OFI_INTERFACE", ofi_interface, 1); if (rc != 0) D_GOTO(cleanup, rc = d_errno2der(errno)); @@ -541,31 +557,39 @@ int dc_mgmt_net_cfg(const char *name) * If we use the agent as the source, client env shouldn't be allowed to override * the domain. Otherwise we could get a mismatch between interface and domain. */ - if (ofi_domain) + ofi_domain = info.domain; + if (ofi_domain_env) D_WARN("Ignoring OFI_DOMAIN '%s' because OFI_INTERFACE is not set; using " "automatic configuration instead\n", ofi_domain); - rc = d_setenv("OFI_DOMAIN", info.domain, 1); - if (rc != 0) + rc = d_setenv("OFI_DOMAIN", ofi_domain, 1); + if (rc != 0) { D_GOTO(cleanup, rc = d_errno2der(errno)); + } } else { + ofi_interface = ofi_interface_env; D_INFO("Using client provided OFI_INTERFACE: %s\n", ofi_interface); /* If the client env didn't provide a domain, we can assume we don't need one. */ - if (ofi_domain) + if (ofi_domain_env) { + ofi_domain = ofi_domain_env; D_INFO("Using client provided OFI_DOMAIN: %s\n", ofi_domain); + } } - D_INFO("Network interface: %s, Domain: %s\n", getenv("OFI_INTERFACE"), - getenv("OFI_DOMAIN")); + D_INFO("Network interface: %s, Domain: %s\n", ofi_interface, ofi_domain); D_DEBUG(DB_MGMT, "CaRT initialization with:\n" "\tCRT_PHY_ADDR_STR: %s, " "CRT_CTX_SHARE_ADDR: %s, CRT_TIMEOUT: %s\n", - getenv("CRT_PHY_ADDR_STR"), - getenv("CRT_CTX_SHARE_ADDR"), getenv("CRT_TIMEOUT")); + crt_phy_addr_str, crt_ctx_share_addr, crt_timeout); cleanup: + d_freeenv_str(&ofi_domain_env); + d_freeenv_str(&ofi_interface_env); + d_freeenv_str(&crt_timeout); + d_freeenv_str(&cli_srx_set); + d_freeenv_str(&crt_ctx_share_addr); put_attach_info(&info, resp); return rc; @@ -585,14 +609,16 @@ int dc_mgmt_net_cfg_check(const char *name) /* Client may not set it if the server hasn't. */ if (info.srv_srx_set == -1) { - cli_srx_set = getenv("FI_OFI_RXM_USE_SRX"); + d_agetenv_str(&cli_srx_set, "FI_OFI_RXM_USE_SRX"); if (cli_srx_set) { D_ERROR("Client set FI_OFI_RXM_USE_SRX to %s, " "but server is unset!\n", cli_srx_set); + d_freeenv_str(&cli_srx_set); rc = -DER_INVAL; goto out; } } + rc = 0; out: put_attach_info(&info, resp); diff --git a/src/pool/srv_pool.c b/src/pool/srv_pool.c index 1bf8b82ded4..eee51bfc695 100644 --- a/src/pool/srv_pool.c +++ b/src/pool/srv_pool.c @@ -7147,12 +7147,14 @@ pool_svc_update_map(struct pool_svc *svc, crt_opcode_t opc, bool exclude_rank, D_GOTO(out, rc); } - env = getenv(REBUILD_ENV); + d_agetenv_str(&env, REBUILD_ENV); if ((env && !strcasecmp(env, REBUILD_ENV_DISABLED)) || daos_fail_check(DAOS_REBUILD_DISABLE)) { D_DEBUG(DB_TRACE, "Rebuild is disabled\n"); + d_freeenv_str(&env); D_GOTO(out, rc = 0); } + d_freeenv_str(&env); rc = ds_pool_iv_prop_fetch(svc->ps_pool, &prop); if (rc) diff --git a/src/rsvc/srv.c b/src/rsvc/srv.c index 7e90aa64d2d..97a03f1f013 100644 --- a/src/rsvc/srv.c +++ b/src/rsvc/srv.c @@ -1389,10 +1389,11 @@ ds_rsvc_get_md_cap(void) char *v; int n; - v = getenv(DAOS_MD_CAP_ENV); /* in MB */ + d_agetenv_str(&v, DAOS_MD_CAP_ENV); /* in MB */ if (v == NULL) return size_default; n = atoi(v); + d_freeenv_str(&v); if ((n << 20) < MINIMUM_DAOS_MD_CAP_SIZE) { D_ERROR("metadata capacity too low; using %zu MB\n", size_default >> 20); diff --git a/src/tests/ftest/cart/iv_server.c b/src/tests/ftest/cart/iv_server.c index bdc549cee19..1e823972362 100644 --- a/src/tests/ftest/cart/iv_server.c +++ b/src/tests/ftest/cart/iv_server.c @@ -1241,13 +1241,14 @@ int main(int argc, char **argv) return -1; } - env_self_rank = getenv("CRT_L_RANK"); + d_agetenv_str(&env_self_rank, "CRT_L_RANK"); if (env_self_rank == NULL) { printf("CRT_L_RANK was not set\n"); return -1; } my_rank = atoi(env_self_rank); + d_freeenv_str(&env_self_rank); /* rank, num_attach_retries, is_server, assert_on_error */ crtu_test_init(my_rank, 20, true, true); @@ -1274,7 +1275,7 @@ int main(int argc, char **argv) init_work_contexts(); /* Load the group configuration file */ - grp_cfg_file = getenv("CRT_L_GRP_CFG"); + rc = d_agetenv_str(&grp_cfg_file, "CRT_L_GRP_CFG"); if (grp_cfg_file == NULL) { D_ERROR("CRT_L_GRP_CFG was not set\n"); assert(0); @@ -1288,6 +1289,7 @@ int main(int argc, char **argv) D_ERROR("Failed to load group file %s\n", grp_cfg_file); assert(0); } + d_freeenv_str(&grp_cfg_file); /* Start the server for myself */ DBG_PRINT("Server starting, self_rank=%d\n", my_rank); diff --git a/src/tests/ftest/cart/no_pmix_corpc_errors.c b/src/tests/ftest/cart/no_pmix_corpc_errors.c index be8886e6d22..c69e4d900bd 100644 --- a/src/tests/ftest/cart/no_pmix_corpc_errors.c +++ b/src/tests/ftest/cart/no_pmix_corpc_errors.c @@ -271,8 +271,9 @@ int main(int argc, char **argv) crtu_set_shutdown_delay(2); } - env_self_rank = getenv("CRT_L_RANK"); + d_agetenv_str(&env_self_rank, "CRT_L_RANK"); my_rank = atoi(env_self_rank); + d_freeenv_str(&env_self_rank); /* rank, num_attach_retries, is_server, assert_on_error */ crtu_test_init(my_rank, 20, true, true); @@ -326,7 +327,7 @@ int main(int argc, char **argv) } } - grp_cfg_file = getenv("CRT_L_GRP_CFG"); + d_agetenv_str(&grp_cfg_file, "CRT_L_GRP_CFG"); rc = crt_rank_self_set(my_rank, 1 /* group_version_min */); if (rc != 0) { @@ -351,6 +352,7 @@ int main(int argc, char **argv) DBG_PRINT("self_rank=%d uri=%s grp_cfg_file=%s\n", my_rank, my_uri, grp_cfg_file); + d_freeenv_str(&grp_cfg_file); D_FREE(my_uri); rc = crt_group_size(NULL, &grp_size); diff --git a/src/tests/ftest/cart/no_pmix_group_test.c b/src/tests/ftest/cart/no_pmix_group_test.c index ecc6881dc55..7290b478aa5 100644 --- a/src/tests/ftest/cart/no_pmix_group_test.c +++ b/src/tests/ftest/cart/no_pmix_group_test.c @@ -318,8 +318,9 @@ int main(int argc, char **argv) int num_attach_retries = 20; uint32_t primary_grp_version = 1; - env_self_rank = getenv("CRT_L_RANK"); + d_agetenv_str(&env_self_rank, "CRT_L_RANK"); my_rank = atoi(env_self_rank); + d_freeenv_str(&env_self_rank); /* When under valgrind bump expected timeouts to 60 seconds */ if (D_ON_VALGRIND) { @@ -382,7 +383,7 @@ int main(int argc, char **argv) } } - grp_cfg_file = getenv("CRT_L_GRP_CFG"); + d_agetenv_str(&grp_cfg_file, "CRT_L_GRP_CFG"); rc = crt_rank_self_set(my_rank, primary_grp_version); if (rc != 0) { @@ -407,6 +408,7 @@ int main(int argc, char **argv) DBG_PRINT("self_rank=%d uri=%s grp_cfg_file=%s\n", my_rank, my_uri, grp_cfg_file); + d_freeenv_str(&grp_cfg_file); D_FREE(my_uri); rc = crt_group_size(NULL, &grp_size); diff --git a/src/tests/ftest/cart/no_pmix_group_version.c b/src/tests/ftest/cart/no_pmix_group_version.c index 0f6aa9aedcc..f3fab3dce0c 100644 --- a/src/tests/ftest/cart/no_pmix_group_version.c +++ b/src/tests/ftest/cart/no_pmix_group_version.c @@ -268,8 +268,9 @@ int main(int argc, char **argv) int rc; int num_attach_retries = 20; - env_self_rank = getenv("CRT_L_RANK"); + d_agetenv_str(&env_self_rank, "CRT_L_RANK"); my_rank = atoi(env_self_rank); + d_freeenv_str(&env_self_rank); /* When under valgrind bump expected timeouts to 60 seconds */ if (D_ON_VALGRIND) { @@ -326,7 +327,7 @@ int main(int argc, char **argv) } } - grp_cfg_file = getenv("CRT_L_GRP_CFG"); + d_agetenv_str(&grp_cfg_file, "CRT_L_GRP_CFG"); rc = crt_rank_self_set(my_rank, 1 /* group_version_min */); if (rc != 0) { @@ -351,6 +352,7 @@ int main(int argc, char **argv) DBG_PRINT("self_rank=%d uri=%s grp_cfg_file=%s\n", my_rank, my_uri, grp_cfg_file); + d_freeenv_str(&grp_cfg_file); D_FREE(my_uri); rc = crt_group_size(NULL, &grp_size); diff --git a/src/tests/ftest/cart/no_pmix_launcher_client.c b/src/tests/ftest/cart/no_pmix_launcher_client.c index 4c913226f77..24999ee51c3 100644 --- a/src/tests/ftest/cart/no_pmix_launcher_client.c +++ b/src/tests/ftest/cart/no_pmix_launcher_client.c @@ -107,7 +107,7 @@ int main(int argc, char **argv) progress_function, &crt_ctx); assert(rc == 0); - grp_cfg_file = getenv("CRT_L_GRP_CFG"); + d_agetenv_str(&grp_cfg_file, "CRT_L_GRP_CFG"); DBG_PRINT("Client starting with cfg_file=%s\n", grp_cfg_file); /* load group info from a config file and delete file upon return */ @@ -116,6 +116,7 @@ int main(int argc, char **argv) D_ERROR("crtu_load_group_from_file() failed; rc=%d\n", rc); assert(0); } + d_freeenv_str(&grp_cfg_file); rc = crt_group_size(grp, &grp_size); if (rc != 0) { diff --git a/src/tests/ftest/cart/no_pmix_launcher_server.c b/src/tests/ftest/cart/no_pmix_launcher_server.c index eda6ac14a05..e19ce0810cc 100644 --- a/src/tests/ftest/cart/no_pmix_launcher_server.c +++ b/src/tests/ftest/cart/no_pmix_launcher_server.c @@ -33,8 +33,9 @@ int main(int argc, char **argv) uint32_t grp_size; int rc; - env_self_rank = getenv("CRT_L_RANK"); + d_agetenv_str(&env_self_rank, "CRT_L_RANK"); my_rank = atoi(env_self_rank); + d_freeenv_str(&env_self_rank); /* rank, num_attach_retries, is_server, assert_on_error */ crtu_test_init(my_rank, 20, true, true); @@ -83,7 +84,7 @@ int main(int argc, char **argv) } } - grp_cfg_file = getenv("CRT_L_GRP_CFG"); + d_agetenv_str(&grp_cfg_file, "CRT_L_GRP_CFG"); if (grp_cfg_file == NULL) { D_ERROR("CRT_L_GRP_CFG was not set\n"); assert(0); @@ -105,6 +106,7 @@ int main(int argc, char **argv) DBG_PRINT("self_rank=%d uri=%s grp_cfg_file=%s\n", my_rank, my_uri, grp_cfg_file); + d_freeenv_str(&grp_cfg_file); D_FREE(my_uri); rc = crt_group_size(NULL, &grp_size); diff --git a/src/tests/ftest/cart/test_corpc_exclusive.c b/src/tests/ftest/cart/test_corpc_exclusive.c index 5f563d4d4b0..b3d81d857f7 100644 --- a/src/tests/ftest/cart/test_corpc_exclusive.c +++ b/src/tests/ftest/cart/test_corpc_exclusive.c @@ -103,8 +103,9 @@ int main(void) membs.rl_nr = 3; membs.rl_ranks = memb_ranks; - env_self_rank = getenv("CRT_L_RANK"); + d_agetenv_str(&env_self_rank, "CRT_L_RANK"); my_rank = atoi(env_self_rank); + d_freeenv_str(&env_self_rank); /* rank, num_attach_retries, is_server, assert_on_error */ crtu_test_init(my_rank, 20, true, true); @@ -128,7 +129,7 @@ int main(void) assert(0); } - grp_cfg_file = getenv("CRT_L_GRP_CFG"); + d_agetenv_str(&grp_cfg_file, "CRT_L_GRP_CFG"); rc = crt_rank_self_set(my_rank, 1 /* group_version_min */); if (rc != 0) { @@ -146,6 +147,7 @@ int main(void) /* load group info from a config file and delete file upon return */ rc = crtu_load_group_from_file(grp_cfg_file, g_main_ctx, grp, my_rank, true); + d_freeenv_str(&grp_cfg_file); if (rc != 0) { D_ERROR("crtu_load_group_from_file() failed; rc=%d\n", rc); assert(0); diff --git a/src/tests/ftest/cart/test_corpc_prefwd.c b/src/tests/ftest/cart/test_corpc_prefwd.c index 92f43ed5fcd..8aa9480476e 100644 --- a/src/tests/ftest/cart/test_corpc_prefwd.c +++ b/src/tests/ftest/cart/test_corpc_prefwd.c @@ -125,8 +125,9 @@ int main(void) excluded_membs.rl_nr = 1; excluded_membs.rl_ranks = &excluded_ranks; - env_self_rank = getenv("CRT_L_RANK"); + d_agetenv_str(&env_self_rank, "CRT_L_RANK"); my_rank = atoi(env_self_rank); + d_freeenv_str(&env_self_rank); /* rank, num_attach_retries, is_server, assert_on_error */ crtu_test_init(my_rank, 20, true, true); @@ -150,7 +151,7 @@ int main(void) assert(0); } - grp_cfg_file = getenv("CRT_L_GRP_CFG"); + d_agetenv_str(&grp_cfg_file, "CRT_L_GRP_CFG"); rc = crt_rank_self_set(my_rank, 1 /* group_version_min */); if (rc != 0) { @@ -168,6 +169,7 @@ int main(void) /* load group info from a config file and delete file upon return */ rc = crtu_load_group_from_file(grp_cfg_file, g_main_ctx, grp, my_rank, true); + d_freeenv_str(&grp_cfg_file); if (rc != 0) { D_ERROR("crtu_load_group_from_file() failed; rc=%d\n", rc); assert(0); diff --git a/src/tests/ftest/cart/test_ep_cred_server.c b/src/tests/ftest/cart/test_ep_cred_server.c index 9f747aef6c2..29e66ae960d 100644 --- a/src/tests/ftest/cart/test_ep_cred_server.c +++ b/src/tests/ftest/cart/test_ep_cred_server.c @@ -73,8 +73,9 @@ main(int argc, char **argv) return rc; } - env_self_rank = getenv("CRT_L_RANK"); + d_agetenv_str(&env_self_rank, "CRT_L_RANK"); my_rank = atoi(env_self_rank); + d_freeenv_str(&env_self_rank); /* rank, num_attach_retries, is_server, assert_on_error */ crtu_test_init(my_rank, 40, true, true); diff --git a/src/tests/ftest/cart/test_group_np_srv.c b/src/tests/ftest/cart/test_group_np_srv.c index e950b03a998..1353be76983 100644 --- a/src/tests/ftest/cart/test_group_np_srv.c +++ b/src/tests/ftest/cart/test_group_np_srv.c @@ -151,8 +151,9 @@ int main(int argc, char **argv) return rc; } - env_self_rank = getenv("CRT_L_RANK"); + d_agetenv_str(&env_self_rank, "CRT_L_RANK"); my_rank = atoi(env_self_rank); + d_freeenv_str(&env_self_rank); /* rank, num_attach_retries, is_server, assert_on_error */ crtu_test_init(my_rank, 20, true, true); diff --git a/src/tests/ftest/cart/test_multisend_server.c b/src/tests/ftest/cart/test_multisend_server.c index a0b478d63cb..ee770ec9b4e 100644 --- a/src/tests/ftest/cart/test_multisend_server.c +++ b/src/tests/ftest/cart/test_multisend_server.c @@ -167,8 +167,9 @@ main(int argc, char **argv) return rc; } - env_self_rank = getenv("CRT_L_RANK"); + d_agetenv_str(&env_self_rank, "CRT_L_RANK"); my_rank = atoi(env_self_rank); + d_freeenv_str(&env_self_rank); /* rank, num_attach_retries, is_server, assert_on_error */ crtu_test_init(my_rank, 40, true, true); diff --git a/src/tests/ftest/cart/test_proto_server.c b/src/tests/ftest/cart/test_proto_server.c index 5f3470c15d7..5fb587b94df 100644 --- a/src/tests/ftest/cart/test_proto_server.c +++ b/src/tests/ftest/cart/test_proto_server.c @@ -83,8 +83,9 @@ main(int argc, char **argv) return rc; } - env_self_rank = getenv("CRT_L_RANK"); + d_agetenv_str(&env_self_rank, "CRT_L_RANK"); my_rank = atoi(env_self_rank); + d_freeenv_str(&env_self_rank); /* rank, num_attach_retries, is_server, assert_on_error */ crtu_test_init(my_rank, 40, true, true); diff --git a/src/tests/ftest/cart/test_rpc_to_ghost_rank.c b/src/tests/ftest/cart/test_rpc_to_ghost_rank.c index e3a6cf95083..0e7741d364b 100644 --- a/src/tests/ftest/cart/test_rpc_to_ghost_rank.c +++ b/src/tests/ftest/cart/test_rpc_to_ghost_rank.c @@ -507,8 +507,10 @@ int main(int argc, char **argv) return rc; } - env_self_rank = getenv("CRT_L_RANK"); + d_agetenv_str(&env_self_rank, "CRT_L_RANK"); my_rank = atoi(env_self_rank); + d_freeenv_str(&env_self_rank); + /* rank, num_attach_retries, is_server, assert_on_error */ crtu_test_init(my_rank, 20, true, true); diff --git a/src/tests/suite/daos_checksum.c b/src/tests/suite/daos_checksum.c index f574635c306..12757f5ce4d 100644 --- a/src/tests/suite/daos_checksum.c +++ b/src/tests/suite/daos_checksum.c @@ -2885,7 +2885,7 @@ run_daos_checksum_test(int rank, int size, int *sub_tests, int sub_tests_size) } if (sub_tests_size == 0) { - if (getenv("DAOS_CSUM_TEST_ALL_TYPE")) { + if (d_isenv_def("DAOS_CSUM_TEST_ALL_TYPE")) { for (i = DAOS_PROP_CO_CSUM_OFF + 1; i <= DAOS_PROP_CO_CSUM_ADLER32; i++) { dts_csum_prop_type = i; diff --git a/src/tests/suite/daos_nvme_recovery.c b/src/tests/suite/daos_nvme_recovery.c index a9c2f2a0a82..54581412902 100644 --- a/src/tests/suite/daos_nvme_recovery.c +++ b/src/tests/suite/daos_nvme_recovery.c @@ -87,9 +87,10 @@ nvme_fault_reaction(void **state, int mode) daos_size_t nvme_size; /* Use the SCM size if set with environment */ - env = getenv("POOL_SCM_SIZE"); + d_agetenv_str(&env, "POOL_SCM_SIZE"); if (env) { size_gb = atoi(env); + d_freeenv_str(&env); if (size_gb != 0) scm_size = (daos_size_t)size_gb << 30; } diff --git a/src/tests/suite/daos_test_common.c b/src/tests/suite/daos_test_common.c index 7de287713ce..ac7e5c2015a 100644 --- a/src/tests/suite/daos_test_common.c +++ b/src/tests/suite/daos_test_common.c @@ -70,9 +70,10 @@ test_setup_pool_create(void **state, struct test_pool *ipool, daos_size_t nvme_size; d_rank_list_t *rank_list = NULL; - env = getenv("POOL_SCM_SIZE"); + d_agetenv_str(&env, "POOL_SCM_SIZE"); if (env) { size_gb = atoi(env); + d_freeenv_str(&env); if (size_gb != 0) outpool->pool_size = (daos_size_t)size_gb << 30; @@ -85,9 +86,10 @@ test_setup_pool_create(void **state, struct test_pool *ipool, * Set env POOL_NVME_SIZE to overwrite the default NVMe size. */ nvme_size = outpool->pool_size * 4; - env = getenv("POOL_NVME_SIZE"); + d_agetenv_str(&env, "POOL_NVME_SIZE"); if (env) { size_gb = atoi(env); + d_freeenv_str(&env); nvme_size = (daos_size_t)size_gb << 30; } diff --git a/src/tests/suite/dfs_test.c b/src/tests/suite/dfs_test.c index 217f30ad178..29e37a0b759 100644 --- a/src/tests/suite/dfs_test.c +++ b/src/tests/suite/dfs_test.c @@ -168,14 +168,16 @@ main(int argc, char **argv) } /** if writing XML, force all ranks other than rank 0 to use stdout to avoid conflicts */ - cmocka_message_output = getenv("CMOCKA_MESSAGE_OUTPUT"); + d_agetenv_str(&cmocka_message_output, "CMOCKA_MESSAGE_OUTPUT"); if (rank != 0 && cmocka_message_output && strcasecmp(cmocka_message_output, "xml") == 0) { + d_freeenv_str(&cmocka_message_output); rc = d_setenv("CMOCKA_MESSAGE_OUTPUT", "stdout", 1); if (rc) { print_message("d_setenv() failed with %d\n", rc); return -1; } } + d_freeenv_str(&cmocka_message_output); nr_failed = run_specified_tests(tests, rank, size, NULL, 0); diff --git a/src/utils/self_test/self_test.c b/src/utils/self_test/self_test.c index 7c9d6e592d5..a3157dc01f2 100644 --- a/src/utils/self_test/self_test.c +++ b/src/utils/self_test/self_test.c @@ -1,5 +1,5 @@ /* - * (C) Copyright 2016-2022 Intel Corporation. + * (C) Copyright 2016-2024 Intel Corporation. * * SPDX-License-Identifier: BSD-2-Clause-Patent */ @@ -1827,18 +1827,16 @@ int main(int argc, char *argv[]) } if (use_daos_agent_vars == false) { - char *env; char *attach_path; + char *attach_path_env = NULL; - env = getenv("CRT_PHY_ADDR_STR"); - if (env == NULL) { + if (!d_isenv_def("CRT_PHY_ADDR_STR")) { printf("Error: provider (CRT_PHY_ADDR_STR) is not set\n"); printf("Example: export CRT_PHY_ADDR_STR='ofi+tcp'\n"); D_GOTO(cleanup, ret = -DER_INVAL); } - env = getenv("OFI_INTERFACE"); - if (env == NULL) { + if (!d_isenv_def("OFI_INTERFACE")) { printf("Error: interface (OFI_INTERFACE) is not set\n"); printf("Example: export OFI_INTERFACE=eth0\n"); D_GOTO(cleanup, ret = -DER_INVAL); @@ -1847,14 +1845,17 @@ int main(int argc, char *argv[]) if (attach_info_path) attach_path = attach_info_path; else { - attach_path = getenv("CRT_ATTACH_INFO_PATH"); + d_agetenv_str(&attach_path_env, "CRT_ATTACH_INFO_PATH"); + attach_path = attach_path_env; if (!attach_path) attach_path = "/tmp"; } + D_ASSERT(attach_path != NULL); printf("Warning: running without daos_agent connection (-u option); " "Using attachment file %s/%s.attach_info_tmp instead\n", attach_path, dest_name ? dest_name : default_dest_name); + d_freeenv_str(&attach_path_env); } /******************** Parse message sizes argument ********************/ diff --git a/src/vos/vos_common.c b/src/vos/vos_common.c index cf28bf0d573..ea4cdd45c12 100644 --- a/src/vos/vos_common.c +++ b/src/vos/vos_common.c @@ -987,7 +987,7 @@ vos_self_init(const char *db_path, bool use_sys_db, int tgt_id) goto failed; } - evt_mode = getenv("DAOS_EVTREE_MODE"); + rc = d_agetenv_str(&evt_mode, "DAOS_EVTREE_MODE"); if (evt_mode) { if (strcasecmp("soff", evt_mode) == 0) { vos_evt_feats &= ~EVT_FEATS_SUPPORTED; @@ -996,6 +996,7 @@ vos_self_init(const char *db_path, bool use_sys_db, int tgt_id) vos_evt_feats &= ~EVT_FEATS_SUPPORTED; vos_evt_feats |= EVT_FEAT_SORT_DIST_EVEN; } + d_freeenv_str(&evt_mode); } switch (vos_evt_feats & EVT_FEATS_SUPPORTED) { case EVT_FEAT_SORT_SOFF: