static int _setup_stepd_kvs(const stepd_step_rec_t *job, char ***env) { int rc = SLURM_SUCCESS, i = 0, pp_cnt = 0; char *p, env_key[32], *ppkey, *ppval; kvs_seq = 1; rc = temp_kvs_init(); if (rc != SLURM_SUCCESS) return rc; rc = kvs_init(); if (rc != SLURM_SUCCESS) return rc; /* preput */ p = getenvp(*env, PMI2_PREPUT_CNT_ENV); if (p) { pp_cnt = atoi(p); } for (i = 0; i < pp_cnt; i ++) { snprintf(env_key, 32, PMI2_PPKEY_ENV"%d", i); p = getenvp(*env, env_key); ppkey = p; /* getenvp will not modify p */ snprintf(env_key, 32, PMI2_PPVAL_ENV"%d", i); p = getenvp(*env, env_key); ppval = p; kvs_put(ppkey, ppval); } /* * For PMI11. * A better logic would be to put PMI_process_mapping in KVS only if * the task distribution method is not "arbitrary", because in * "arbitrary" distribution the process mapping varible is not correct. * MPICH2 may deduce the clique info from the hostnames. But that * is rather costly. */ kvs_put("PMI_process_mapping", job_info.proc_mapping); return SLURM_SUCCESS; }
int main(void) { kvs_hnd hnd; char buf[100]; char table[] = "Test"; if (0 != kvs_init(&hnd, "test.db", table)) { return -1; } if (0 != kvs_get_text(&hnd, "DeviceName", buf, 100)) { return -1; } printf("DeviceName = %s\n", buf); return 0; }