/*
 * conf.c - convert data between slurm config and perl HVs
 */

#include <EXTERN.h>
#include <perl.h>
#include <XSUB.h>

#include <slurm/slurm.h>
#include "slurm-perl.h"


/*
 * convert slurm_conf_t into perl HV
 */
int slurm_ctl_conf_to_hv(slurm_conf_t *conf, HV *hv)
{
	AV *av;
	int i;

	STORE_FIELD(hv, conf, last_update, time_t);

	if (conf->acct_gather_conf)
		STORE_FIELD(hv, conf, acct_gather_conf, charp);
	if (conf->acct_gather_energy_type)
		STORE_FIELD(hv, conf, acct_gather_energy_type, charp);
	if (conf->acct_gather_filesystem_type)
		STORE_FIELD(hv, conf, acct_gather_filesystem_type, charp);
	if (conf->acct_gather_interconnect_type)
		STORE_FIELD(hv, conf, acct_gather_interconnect_type, charp);
	STORE_FIELD(hv, conf, acct_gather_node_freq, uint16_t);
	if (conf->acct_gather_profile_type)
		STORE_FIELD(hv, conf, acct_gather_profile_type, charp);

	if (conf->accounting_storage_backup_host)
		STORE_FIELD(hv, conf, accounting_storage_backup_host, charp);
	STORE_FIELD(hv, conf, accounting_storage_enforce, uint16_t);
	if (conf->accounting_storage_host)
		STORE_FIELD(hv, conf, accounting_storage_host, charp);
	if (conf->accounting_storage_params)
		STORE_FIELD(hv, conf, accounting_storage_params, charp);
	if (conf->accounting_storage_pass)
		STORE_FIELD(hv, conf, accounting_storage_pass, charp);
	STORE_FIELD(hv, conf, accounting_storage_port, uint16_t);
	if (conf->accounting_storage_type)
		STORE_FIELD(hv, conf, accounting_storage_type, charp);

	if (conf->authinfo)
		STORE_FIELD(hv, conf, authinfo, charp);
	if (conf->authtype)
		STORE_FIELD(hv, conf, authtype, charp);

	STORE_FIELD(hv, conf, batch_start_timeout, uint16_t);

	if (conf->bb_type)
		STORE_FIELD(hv, conf, bb_type, charp);

	STORE_FIELD(hv, conf, boot_time, time_t);

	if (conf->cli_filter_plugins)
		STORE_FIELD(hv, conf, cli_filter_plugins, charp);

	if (conf->cluster_name)
		STORE_FIELD(hv, conf, cluster_name, charp);

	STORE_FIELD(hv, conf, complete_wait, uint16_t);

	STORE_FIELD(hv, conf, control_cnt, uint32_t);
	av = newAV();
	for (i = 0; i < conf->control_cnt; i++)
		av_store(av, i, newSVpv(conf->control_addr[i], 0));
	hv_store_sv(hv, "control_addr", newRV_noinc((SV*)av));
	av = newAV();
	for (i = 0; i < conf->control_cnt; i++)
		av_store(av, i, newSVpv(conf->control_machine[i], 0));
	hv_store_sv(hv, "control_machine", newRV_noinc((SV*)av));

	STORE_FIELD(hv, conf, cpu_freq_def, uint32_t);

	if (conf->cred_type)
		STORE_FIELD(hv, conf, cred_type, charp);

	STORE_FIELD(hv, conf, debug_flags, uint64_t);

	STORE_FIELD(hv, conf, def_mem_per_cpu, uint64_t);

	STORE_FIELD(hv, conf, eio_timeout, uint16_t);

	STORE_FIELD(hv, conf, enforce_part_limits, uint16_t);

	STORE_FIELD(hv, conf, epilog_msg_time, uint32_t);

	STORE_FIELD(hv, conf, conf_flags, uint32_t);

	STORE_FIELD(hv, conf, first_job_id, uint32_t);
	STORE_FIELD(hv, conf, fs_dampening_factor, uint16_t);

	if (conf->gres_plugins)
		STORE_FIELD(hv, conf, gres_plugins, charp);

	STORE_FIELD(hv, conf, group_time, uint16_t);
	STORE_FIELD(hv, conf, group_force, uint16_t);

	STORE_FIELD(hv, conf, hash_val, uint32_t);

	STORE_FIELD(hv, conf, health_check_interval, uint16_t);

	STORE_FIELD(hv, conf, health_check_node_state, uint16_t);

	if (conf->health_check_program)
		STORE_FIELD(hv, conf, health_check_program, charp);

	STORE_FIELD(hv, conf, inactive_limit, uint16_t);

	if (conf->job_acct_gather_freq)
		STORE_FIELD(hv, conf, job_acct_gather_freq, charp);
	if (conf->job_acct_gather_params)
		STORE_FIELD(hv, conf, job_acct_gather_params, charp);
	if (conf->job_acct_gather_type)
		STORE_FIELD(hv, conf, job_acct_gather_type, charp);

	if (conf->job_comp_host)
		STORE_FIELD(hv, conf, job_comp_host, charp);
	if (conf->job_comp_loc)
		STORE_FIELD(hv, conf, job_comp_loc, charp);
	if (conf->job_comp_pass)
		STORE_FIELD(hv, conf, job_comp_pass, charp);
	STORE_FIELD(hv, conf, job_comp_port, uint32_t);
	if (conf->job_comp_type)
		STORE_FIELD(hv, conf, job_comp_type, charp);
	if (conf->job_comp_user)
		STORE_FIELD(hv, conf, job_comp_user, charp);

	if (conf->job_container_plugin)
		STORE_FIELD(hv, conf, job_container_plugin, charp);

	STORE_FIELD(hv, conf, job_file_append, uint16_t);

	STORE_FIELD(hv, conf, job_requeue, uint16_t);

	if (conf->job_submit_plugins)
		STORE_FIELD(hv, conf, job_submit_plugins, charp);

	STORE_FIELD(hv, conf, keepalive_time, uint16_t);

	STORE_FIELD(hv, conf, kill_on_bad_exit, uint16_t);

	STORE_FIELD(hv, conf, kill_wait, uint16_t);

	if (conf->licenses)
		STORE_FIELD(hv, conf, licenses, charp);

	STORE_FIELD(hv, conf, log_fmt, uint16_t);

	if (conf->mail_prog)
		STORE_FIELD(hv, conf, mail_prog, charp);

	STORE_FIELD(hv, conf, max_array_sz, uint32_t);
	STORE_FIELD(hv, conf, max_batch_requeue, uint32_t);
	STORE_FIELD(hv, conf, max_dbd_msgs, uint32_t);

	STORE_FIELD(hv, conf, max_job_cnt, uint32_t);
	STORE_FIELD(hv, conf, max_job_id, uint32_t);

	STORE_FIELD(hv, conf, max_mem_per_cpu, uint64_t);

	if (conf->max_step_cnt)
		STORE_FIELD(hv, conf, max_step_cnt, uint32_t);

	STORE_FIELD(hv, conf, max_tasks_per_node, uint16_t);

	STORE_FIELD(hv, conf, min_job_age, uint32_t);

	if (conf->mpi_default)
		STORE_FIELD(hv, conf, mpi_default, charp);
	if (conf->mpi_params)
		STORE_FIELD(hv, conf, mpi_params, charp);

	STORE_FIELD(hv, conf, msg_timeout, uint16_t);

	STORE_FIELD(hv, conf, next_job_id, uint32_t);

	STORE_FIELD(hv, conf, over_time_limit, uint16_t);

	if (conf->plugindir)
		STORE_FIELD(hv, conf, plugindir, charp);

	if (conf->plugstack)
		STORE_FIELD(hv, conf, plugstack, charp);

	STORE_FIELD(hv, conf, preempt_mode, uint16_t);

	if (conf->preempt_params)
		STORE_FIELD(hv, conf, preempt_params, charp);

	if (conf->preempt_type)
		STORE_FIELD(hv, conf, preempt_type, charp);

	STORE_FIELD(hv, conf, priority_calc_period, uint32_t);
	STORE_FIELD(hv, conf, priority_decay_hl, uint32_t);
	STORE_FIELD(hv, conf, priority_favor_small, uint16_t);
	STORE_FIELD(hv, conf, priority_flags, uint16_t);
	STORE_FIELD(hv, conf, priority_max_age, uint32_t);
	if (conf->priority_params)
		STORE_FIELD(hv, conf, priority_params, charp);
	STORE_FIELD(hv, conf, priority_reset_period, uint16_t);
	if (conf->priority_type)
		STORE_FIELD(hv, conf, priority_type, charp);
	STORE_FIELD(hv, conf, priority_weight_age, uint32_t);
	STORE_FIELD(hv, conf, priority_weight_fs, uint32_t);
	STORE_FIELD(hv, conf, priority_weight_js, uint32_t);
	STORE_FIELD(hv, conf, priority_weight_part, uint32_t);
	STORE_FIELD(hv, conf, priority_weight_qos, uint32_t);
	STORE_FIELD(hv, conf, priority_weight_tres, charp);
	STORE_FIELD(hv, conf, private_data, uint16_t);

	if (conf->proctrack_type)
		STORE_FIELD(hv, conf, proctrack_type, charp);

	STORE_FIELD(hv, conf, prolog_flags, uint16_t);

	STORE_FIELD(hv, conf, propagate_prio_process, uint16_t);
	if (conf->propagate_rlimits)
		STORE_FIELD(hv, conf, propagate_rlimits, charp);
	if (conf->propagate_rlimits_except)
		STORE_FIELD(hv, conf, propagate_rlimits_except, charp);

	if (conf->reboot_program)
		STORE_FIELD(hv, conf, reboot_program, charp);

	STORE_FIELD(hv, conf, reconfig_flags, uint16_t);

	if (conf->requeue_exit)
		STORE_FIELD(hv, conf, requeue_exit, charp);
	if (conf->requeue_exit_hold)
		STORE_FIELD(hv, conf, requeue_exit_hold, charp);

	if (conf->resume_fail_program)
		STORE_FIELD(hv, conf, resume_fail_program, charp);
	if (conf->resume_program)
		STORE_FIELD(hv, conf, resume_program, charp);
	STORE_FIELD(hv, conf, resume_rate, uint16_t);
	STORE_FIELD(hv, conf, resume_timeout, uint16_t);

	if (conf->resv_epilog)
		STORE_FIELD(hv, conf, resv_epilog, charp);

	STORE_FIELD(hv, conf, resv_over_run, uint16_t);

	if (conf->resv_prolog)
		STORE_FIELD(hv, conf, resv_prolog, charp);

	STORE_FIELD(hv, conf, ret2service, uint16_t);

	if (conf->sched_logfile)
		STORE_FIELD(hv, conf, sched_logfile, charp);
	STORE_FIELD(hv, conf, sched_log_level, uint16_t);
	if (conf->sched_params)
		STORE_FIELD(hv, conf, sched_params, charp);
	STORE_FIELD(hv, conf, sched_time_slice, uint16_t);
	if (conf->schedtype)
		STORE_FIELD(hv, conf, schedtype, charp);

	STORE_PTR_FIELD(hv, conf, select_conf_key_pairs, "Slurm::List"); /* TODO: Think about memory management */
	if (conf->select_type)
		STORE_FIELD(hv, conf, select_type, charp);
	STORE_FIELD(hv, conf, select_type_param, uint16_t);

	if (conf->site_factor_params)
		STORE_FIELD(hv, conf, site_factor_params, charp);
	if (conf->site_factor_plugin)
		STORE_FIELD(hv, conf, site_factor_plugin, charp);

	if (conf->slurm_conf)
		STORE_FIELD(hv, conf, slurm_conf, charp);

	STORE_FIELD(hv, conf, slurm_user_id, uint32_t);

	if (conf->slurm_user_name)
		STORE_FIELD(hv, conf, slurm_user_name, charp);

	STORE_FIELD(hv, conf, slurmctld_debug, uint16_t);
	if (conf->slurmctld_logfile)
		STORE_FIELD(hv, conf, slurmctld_logfile, charp);
	if (conf->slurmctld_pidfile)
		STORE_FIELD(hv, conf, slurmctld_pidfile, charp);
	STORE_FIELD(hv, conf, slurmctld_port, uint32_t);
	STORE_FIELD(hv, conf, slurmctld_port_count, uint16_t);
	STORE_FIELD(hv, conf, slurmctld_timeout, uint16_t);

	STORE_FIELD(hv, conf, slurmd_debug, uint16_t);
	if (conf->slurmd_logfile)
		STORE_FIELD(hv, conf, slurmd_logfile, charp);
	if (conf->slurmd_pidfile)
		STORE_FIELD(hv, conf, slurmd_pidfile, charp);
	STORE_FIELD(hv, conf, slurmd_port, uint32_t);
	if (conf->slurmd_spooldir)
		STORE_FIELD(hv, conf, slurmd_spooldir, charp);
	STORE_FIELD(hv, conf, slurmd_timeout, uint16_t);
	STORE_FIELD(hv, conf, slurmd_user_id, uint32_t);
	if (conf->slurmd_user_name)
		STORE_FIELD(hv, conf, slurmd_user_name, charp);

	if (conf->srun_epilog)
		STORE_FIELD(hv, conf, srun_epilog, charp);
	if (conf->srun_port_range)
		STORE_PTR_FIELD(hv, conf, srun_port_range, "SLURM::port_range");
	if (conf->srun_prolog)
		STORE_FIELD(hv, conf, srun_prolog, charp);

	if (conf->state_save_location)
		STORE_FIELD(hv, conf, state_save_location, charp);

	if (conf->suspend_exc_nodes)
		STORE_FIELD(hv, conf, suspend_exc_nodes, charp);
	if (conf->suspend_exc_parts)
		STORE_FIELD(hv, conf, suspend_exc_parts, charp);
	if (conf->suspend_program)
		STORE_FIELD(hv, conf, suspend_program, charp);
	STORE_FIELD(hv, conf, suspend_rate, uint16_t);
	STORE_FIELD(hv, conf, suspend_time, uint32_t);
	STORE_FIELD(hv, conf, suspend_timeout, uint16_t);

	if (conf->switch_type)
		STORE_FIELD(hv, conf, switch_type, charp);
	if (conf->task_epilog)
		STORE_FIELD(hv, conf, task_epilog, charp);
	if (conf->task_plugin)
		STORE_FIELD(hv, conf, task_plugin, charp);
	STORE_FIELD(hv, conf, task_plugin_param, uint32_t);
	if (conf->task_prolog)
		STORE_FIELD(hv, conf, task_prolog, charp);
	if (conf->tmp_fs)
		STORE_FIELD(hv, conf, tmp_fs, charp);
	if (conf->topology_plugin)
		STORE_FIELD(hv, conf, topology_plugin, charp);
	STORE_FIELD(hv, conf, tree_width, uint16_t);
	if (conf->unkillable_program)
		STORE_FIELD(hv, conf, unkillable_program, charp);
	STORE_FIELD(hv, conf, unkillable_timeout, uint16_t);
	if (conf->version)
		STORE_FIELD(hv, conf, version, charp);
	STORE_FIELD(hv, conf, vsize_factor, uint16_t);
	STORE_FIELD(hv, conf, wait_time, uint16_t);

	return 0;
}

/*
 * convert perl HV to slurm_conf_t
 */
int hv_to_slurm_ctl_conf(HV *hv, slurm_conf_t *conf)
{
	SV **svp;
	AV *av;
	STRLEN len;
	int i, n;

	memset(conf, 0, sizeof(*conf));

	FETCH_FIELD(hv, conf, last_update, time_t, FALSE);
	FETCH_FIELD(hv, conf, acct_gather_conf, charp, FALSE);
	FETCH_FIELD(hv, conf, acct_gather_energy_type, charp, FALSE);
	FETCH_FIELD(hv, conf, acct_gather_filesystem_type, charp, FALSE);
	FETCH_FIELD(hv, conf, acct_gather_interconnect_type, charp, FALSE);
	FETCH_FIELD(hv, conf, acct_gather_node_freq, uint16_t, FALSE);
	FETCH_FIELD(hv, conf, acct_gather_profile_type, charp, FALSE);
	FETCH_FIELD(hv, conf, accounting_storage_enforce, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, accounting_storage_backup_host, charp, FALSE);
	FETCH_FIELD(hv, conf, accounting_storage_host, charp, FALSE);
	FETCH_FIELD(hv, conf, accounting_storage_params, charp, FALSE);
	FETCH_FIELD(hv, conf, accounting_storage_pass, charp, FALSE);
	FETCH_FIELD(hv, conf, accounting_storage_port, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, accounting_storage_type, charp, FALSE);

	FETCH_FIELD(hv, conf, authinfo, charp, FALSE);
	FETCH_FIELD(hv, conf, authtype, charp, FALSE);
	FETCH_FIELD(hv, conf, batch_start_timeout, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, bb_type, charp, FALSE);
	FETCH_FIELD(hv, conf, boot_time, time_t, TRUE);
	FETCH_FIELD(hv, conf, cli_filter_plugins, charp, FALSE);
	FETCH_FIELD(hv, conf, cluster_name, charp, FALSE);
	FETCH_FIELD(hv, conf, complete_wait, uint16_t, TRUE);

	FETCH_FIELD(hv, conf, control_cnt, uint32_t, TRUE);
	svp = hv_fetch(hv, "control_addr", 12, FALSE);
	if (svp && SvROK(*svp) && SvTYPE(SvRV(*svp)) == SVt_PVAV) {
		av = (AV*)SvRV(*svp);
		n = av_len(av) + 1;
		conf->control_addr = xmalloc(n * sizeof(char *));
		for (i = 0; i < n; i++) {
			conf->control_addr[i] =
				(char *)SvPV(*(av_fetch(av, i, FALSE)), len);
		}
	} else {
		/* nothing to do */
	}
	svp = hv_fetch(hv, "control_machine", 15, FALSE);
	if (svp && SvROK(*svp) && SvTYPE(SvRV(*svp)) == SVt_PVAV) {
		av = (AV*)SvRV(*svp);
		n = av_len(av) + 1;
		conf->control_machine = xmalloc(n * sizeof(char *));
		for (i = 0; i < n; i++) {
			conf->control_machine[i] =
				(char *)SvPV(*(av_fetch(av, i, FALSE)), len);
		}
	} else {
		/* nothing to do */
	}

	FETCH_FIELD(hv, conf, control_addr[0], charp, FALSE);
	FETCH_FIELD(hv, conf, control_machine[0], charp, FALSE);
	FETCH_FIELD(hv, conf, control_addr[1], charp, FALSE);
	FETCH_FIELD(hv, conf, control_machine[1], charp, FALSE);

	FETCH_FIELD(hv, conf, cpu_freq_def, uint32_t, FALSE);
	FETCH_FIELD(hv, conf, cred_type, charp, FALSE);
	FETCH_FIELD(hv, conf, debug_flags, uint64_t, TRUE);
	FETCH_FIELD(hv, conf, def_mem_per_cpu, uint64_t, TRUE);
	FETCH_FIELD(hv, conf, eio_timeout, uint16_t, FALSE);
	FETCH_FIELD(hv, conf, enforce_part_limits, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, epilog_msg_time, uint32_t, TRUE);

	FETCH_FIELD(hv, conf, conf_flags, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, first_job_id, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, fs_dampening_factor, uint16_t, FALSE);
	FETCH_FIELD(hv, conf, gres_plugins, charp, FALSE);
	FETCH_FIELD(hv, conf, group_time, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, group_force, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, hash_val, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, health_check_interval, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, health_check_node_state, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, health_check_program, charp, FALSE);
	FETCH_FIELD(hv, conf, inactive_limit, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, job_acct_gather_freq, charp, TRUE);
	FETCH_FIELD(hv, conf, job_acct_gather_params, charp, FALSE);
	FETCH_FIELD(hv, conf, job_acct_gather_type, charp, FALSE);

	FETCH_FIELD(hv, conf, job_comp_host, charp, FALSE);
	FETCH_FIELD(hv, conf, job_comp_loc, charp, FALSE);
	FETCH_FIELD(hv, conf, job_comp_pass, charp, FALSE);
	FETCH_FIELD(hv, conf, job_comp_port, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, job_comp_type, charp, FALSE);
	FETCH_FIELD(hv, conf, job_comp_user, charp, FALSE);
	FETCH_FIELD(hv, conf, job_container_plugin, charp, FALSE);
	FETCH_FIELD(hv, conf, job_file_append, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, job_requeue, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, job_submit_plugins, charp, FALSE);

	FETCH_FIELD(hv, conf, keepalive_time, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, kill_on_bad_exit, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, kill_wait, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, licenses, charp, FALSE);
	FETCH_FIELD(hv, conf, log_fmt, uint16_t, FALSE);
	FETCH_FIELD(hv, conf, mail_prog, charp, FALSE);
	FETCH_FIELD(hv, conf, max_array_sz, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, max_batch_requeue, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, max_dbd_msgs, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, max_job_cnt, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, max_job_id, uint32_t, FALSE);
	FETCH_FIELD(hv, conf, max_mem_per_cpu, uint64_t, TRUE);
	FETCH_FIELD(hv, conf, max_step_cnt, uint32_t, FALSE);
	FETCH_FIELD(hv, conf, max_tasks_per_node, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, min_job_age, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, mpi_default, charp, FALSE);
	FETCH_FIELD(hv, conf, mpi_params, charp, FALSE);
	FETCH_FIELD(hv, conf, msg_timeout, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, next_job_id, uint32_t, TRUE);

	FETCH_FIELD(hv, conf, over_time_limit, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, plugindir, charp, FALSE);
	FETCH_FIELD(hv, conf, plugstack, charp, FALSE);
	FETCH_FIELD(hv, conf, preempt_mode, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, preempt_type, charp, FALSE);
	FETCH_FIELD(hv, conf, priority_calc_period, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, priority_decay_hl, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, priority_favor_small, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, priority_flags, uint16_t, FALSE);
	FETCH_FIELD(hv, conf, priority_max_age, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, priority_params, charp, FALSE);
	FETCH_FIELD(hv, conf, priority_reset_period, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, priority_type, charp, FALSE);

	FETCH_FIELD(hv, conf, priority_weight_age, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, priority_weight_fs, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, priority_weight_js, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, priority_weight_part, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, priority_weight_qos, uint32_t, FALSE);
	FETCH_FIELD(hv, conf, priority_weight_tres, charp, FALSE);
	FETCH_FIELD(hv, conf, private_data, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, proctrack_type, charp, FALSE);
	FETCH_FIELD(hv, conf, prolog_flags, uint16_t, TRUE);

	FETCH_FIELD(hv, conf, propagate_prio_process, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, propagate_rlimits, charp, FALSE);
	FETCH_FIELD(hv, conf, propagate_rlimits_except, charp, FALSE);
	FETCH_FIELD(hv, conf, reboot_program, charp, FALSE);
	FETCH_FIELD(hv, conf, reconfig_flags, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, requeue_exit, charp, FALSE);
	FETCH_FIELD(hv, conf, requeue_exit_hold, charp, FALSE);
	FETCH_FIELD(hv, conf, resume_fail_program, charp, FALSE);
	FETCH_FIELD(hv, conf, resume_program, charp, FALSE);
	FETCH_FIELD(hv, conf, resume_rate, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, resume_timeout, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, resv_epilog, charp, FALSE);
	FETCH_FIELD(hv, conf, resv_over_run, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, resv_prolog, charp, FALSE);
	FETCH_FIELD(hv, conf, ret2service, uint16_t, TRUE);

	FETCH_FIELD(hv, conf, sched_logfile, charp, FALSE);
	FETCH_FIELD(hv, conf, sched_log_level, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, sched_params, charp, FALSE);
	FETCH_FIELD(hv, conf, sched_time_slice, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, schedtype, charp, FALSE);
	FETCH_FIELD(hv, conf, select_conf_key_pairs, charp, FALSE);
	FETCH_FIELD(hv, conf, select_type, charp, FALSE);
	FETCH_FIELD(hv, conf, select_type_param, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, slurm_conf, charp, FALSE);

	FETCH_FIELD(hv, conf, slurm_user_id, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, slurm_user_name, charp, FALSE);
	FETCH_FIELD(hv, conf, slurmd_user_id, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, slurmd_user_name, charp, FALSE);
	FETCH_FIELD(hv, conf, slurmctld_debug, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, slurmctld_logfile, charp, FALSE);
	FETCH_FIELD(hv, conf, slurmctld_pidfile, charp, FALSE);
	FETCH_FIELD(hv, conf, slurmctld_port, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, slurmctld_port_count, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, slurmctld_timeout, uint16_t, TRUE);

	FETCH_FIELD(hv, conf, slurmd_debug, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, slurmd_logfile, charp, FALSE);
	FETCH_FIELD(hv, conf, slurmd_pidfile, charp, FALSE);
	FETCH_FIELD(hv, conf, slurmd_port, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, slurmd_spooldir, charp, FALSE);
	FETCH_FIELD(hv, conf, slurmd_timeout, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, srun_epilog, charp, FALSE);
	FETCH_PTR_FIELD(hv, conf, srun_port_range, "SLURM::port_range", FALSE);
	FETCH_FIELD(hv, conf, srun_prolog, charp, FALSE);
	FETCH_FIELD(hv, conf, state_save_location, charp, FALSE);
	FETCH_FIELD(hv, conf, suspend_exc_nodes, charp, FALSE);
	FETCH_FIELD(hv, conf, suspend_exc_parts, charp, FALSE);
	FETCH_FIELD(hv, conf, suspend_program, charp, FALSE);
	FETCH_FIELD(hv, conf, suspend_rate, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, suspend_time, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, suspend_timeout, uint16_t, TRUE);

	FETCH_FIELD(hv, conf, switch_type, charp, FALSE);
	FETCH_FIELD(hv, conf, task_epilog, charp, FALSE);
	FETCH_FIELD(hv, conf, task_plugin, charp, FALSE);
	FETCH_FIELD(hv, conf, task_plugin_param, uint32_t, TRUE);
	FETCH_FIELD(hv, conf, task_prolog, charp, FALSE);
	FETCH_FIELD(hv, conf, tmp_fs, charp, FALSE);
	FETCH_FIELD(hv, conf, topology_plugin, charp, FALSE);
	FETCH_FIELD(hv, conf, tree_width, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, unkillable_program, charp, FALSE);
	FETCH_FIELD(hv, conf, unkillable_timeout, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, version, charp, FALSE);
	FETCH_FIELD(hv, conf, vsize_factor, uint16_t, TRUE);
	FETCH_FIELD(hv, conf, wait_time, uint16_t, TRUE);

	return 0;
}

/*
 * convert slurmd_status_t to perl HV
 */
int
slurmd_status_to_hv(slurmd_status_t *status, HV *hv)
{
	STORE_FIELD(hv, status, booted, time_t);
	STORE_FIELD(hv, status, last_slurmctld_msg, time_t);
	STORE_FIELD(hv, status, slurmd_debug, uint16_t);
	STORE_FIELD(hv, status, actual_cpus, uint16_t);
	STORE_FIELD(hv, status, actual_sockets, uint16_t);
	STORE_FIELD(hv, status, actual_cores, uint16_t);
	STORE_FIELD(hv, status, actual_threads, uint16_t);
	STORE_FIELD(hv, status, actual_real_mem, uint64_t);
	STORE_FIELD(hv, status, actual_tmp_disk, uint32_t);
	STORE_FIELD(hv, status, pid, uint32_t);
	if (status->hostname)
		STORE_FIELD(hv, status, hostname, charp);
	if (status->slurmd_logfile)
		STORE_FIELD(hv, status, slurmd_logfile, charp);
	if (status->step_list)
		STORE_FIELD(hv, status, step_list, charp);
	if (status->version)
		STORE_FIELD(hv, status, version, charp);

	return 0;
}

/*
 * convert perl HV to slurmd_status_t
 */
int
hv_to_slurmd_status(HV *hv, slurmd_status_t *status)
{
	memset(status, 0, sizeof(slurmd_status_t));

	FETCH_FIELD(hv, status, booted, time_t, TRUE);
	FETCH_FIELD(hv, status, last_slurmctld_msg, time_t, TRUE);
	FETCH_FIELD(hv, status, slurmd_debug, uint16_t, TRUE);
	FETCH_FIELD(hv, status, actual_cpus, uint16_t, TRUE);
	FETCH_FIELD(hv, status, actual_sockets, uint16_t, TRUE);
	FETCH_FIELD(hv, status, actual_cores, uint16_t, TRUE);
	FETCH_FIELD(hv, status, actual_threads, uint16_t, TRUE);
	FETCH_FIELD(hv, status, actual_real_mem, uint64_t, TRUE);
	FETCH_FIELD(hv, status, actual_tmp_disk, uint32_t, TRUE);
	FETCH_FIELD(hv, status, pid, uint32_t, TRUE);
	FETCH_FIELD(hv, status, hostname, charp, FALSE);
	FETCH_FIELD(hv, status, slurmd_logfile, charp, FALSE);
	FETCH_FIELD(hv, status, step_list, charp, FALSE);
	FETCH_FIELD(hv, status, version, charp, FALSE);

	return 0;
}

/*
 * convert perl HV to step_update_request_msg_t
 */
int
hv_to_step_update_request_msg(HV *hv, step_update_request_msg_t *update_msg)
{
	slurm_init_update_step_msg(update_msg);

	FETCH_FIELD(hv, update_msg, job_id, uint32_t, TRUE);
	FETCH_FIELD(hv, update_msg, step_id, uint32_t, TRUE);
	FETCH_FIELD(hv, update_msg, time_limit, uint32_t, TRUE);

	return 0;
}
