/*****************************************************************************\
 * src/slurmd/common/slurmstepd_init.c - slurmstepd initialization code
 *****************************************************************************
 *  Copyright (C) 2005 The Regents of the University of California.
 *  Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
 *  Written by Danny Auble <da@llnl.gov>
 *  CODE-OCEC-09-009. All rights reserved.
 *
 *  This file is part of Slurm, a resource management program.
 *  For details, see <https://slurm.schedmd.com/>.
 *  Please also read the included file: DISCLAIMER.
 *
 *  Slurm is free software; you can redistribute it and/or modify it under
 *  the terms of the GNU General Public License as published by the Free
 *  Software Foundation; either version 2 of the License, or (at your option)
 *  any later version.
 *
 *  In addition, as a special exception, the copyright holders give permission
 *  to link the code of portions of this program with the OpenSSL library under
 *  certain conditions as described in each individual source file, and
 *  distribute linked combinations including the two. You must obey the GNU
 *  General Public License in all respects for all of the code used other than
 *  OpenSSL. If you modify file(s) with this exception, you may extend this
 *  exception to your version of the file(s), but you are not obligated to do
 *  so. If you do not wish to do so, delete this exception statement from your
 *  version.  If you delete this exception statement from all source files in
 *  the program, then also delete it here.
 *
 *  Slurm is distributed in the hope that it will be useful, but WITHOUT ANY
 *  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 *  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 *  details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with Slurm; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA.
\*****************************************************************************/

#include "src/slurmd/common/slurmstepd_init.h"
#include "src/common/read_config.h"
#include "src/common/xmalloc.h"
#include "src/common/xstring.h"

/* Assume that the slurmd and slurmstepd are the same version level when slurmd
 * starts slurmstepd, so we do not need to support different protocol versions
 * for the different message formats. */
extern void pack_slurmd_conf_lite(slurmd_conf_t *conf, buf_t *buffer)
{
	xassert(conf != NULL);
	pack16(SLURM_PROTOCOL_VERSION, buffer);

	packstr(conf->hostname, buffer);
	pack16(conf->cpus, buffer);
	pack16(conf->boards, buffer);
	pack16(conf->sockets, buffer);
	pack16(conf->cores, buffer);
	pack16(conf->threads, buffer);
	pack16(conf->actual_threads, buffer);
	packstr(conf->cpu_spec_list, buffer);
	pack16(conf->core_spec_cnt, buffer);
	pack64(conf->mem_spec_limit, buffer);
	pack64(conf->conf_memory_size, buffer);
	pack16(conf->block_map_size, buffer);
	pack16_array(conf->block_map, conf->block_map_size, buffer);
	pack16_array(conf->block_map_inv, conf->block_map_size, buffer);
	packstr(conf->conffile, buffer);
	packstr(conf->spooldir, buffer);
	packstr(conf->node_name, buffer);
	packstr(conf->logfile, buffer);
	pack32(conf->debug_level, buffer);
	pack32(conf->syslog_debug, buffer);
	packstr(conf->stepd_loc, buffer);
	packbool(conf->daemonize, buffer);
	packstr(conf->node_topo_addr, buffer);
	packstr(conf->node_topo_pattern, buffer);
	pack16(conf->port, buffer);
}

extern int unpack_slurmd_conf_lite_no_alloc(slurmd_conf_t *conf, buf_t *buffer)
{
	uint32_t uint32_tmp;
	uint16_t protocol_version;

	safe_unpack16(&protocol_version, buffer);

	/*
	 * No cross-version support is required here. slurmd and slurmstepd
	 * must always be on the same release.
	 */
	if (protocol_version >= SLURM_PROTOCOL_VERSION) {
		safe_unpackstr(&conf->hostname, buffer);
		safe_unpack16(&conf->cpus, buffer);
		safe_unpack16(&conf->boards, buffer);
		safe_unpack16(&conf->sockets, buffer);
		safe_unpack16(&conf->cores, buffer);
		safe_unpack16(&conf->threads, buffer);
		safe_unpack16(&conf->actual_threads, buffer);
		safe_unpackstr(&conf->cpu_spec_list, buffer);
		safe_unpack16(&conf->core_spec_cnt, buffer);
		safe_unpack64(&conf->mem_spec_limit, buffer);
		safe_unpack64(&conf->conf_memory_size, buffer);
		safe_unpack16(&conf->block_map_size, buffer);
		safe_unpack16_array(&conf->block_map, &uint32_tmp, buffer);
		safe_unpack16_array(&conf->block_map_inv,  &uint32_tmp, buffer);
		safe_unpackstr(&conf->conffile, buffer);
		safe_unpackstr(&conf->spooldir, buffer);
		safe_unpackstr(&conf->node_name, buffer);
		safe_unpackstr(&conf->logfile, buffer);
		safe_unpack32(&conf->debug_level, buffer);
		safe_unpack32(&conf->syslog_debug, buffer);
		safe_unpackstr(&conf->stepd_loc, buffer);
		safe_unpackbool(&conf->daemonize, buffer);
		safe_unpackstr(&conf->node_topo_addr, buffer);
		safe_unpackstr(&conf->node_topo_pattern, buffer);
		safe_unpack16(&conf->port, buffer);
	}

	return SLURM_SUCCESS;

unpack_error:
	error("unpack_error in unpack_slurmd_conf_lite_no_alloc: %m");
	xfree(conf->hostname);
	xfree(conf->cpu_spec_list);
	xfree(conf->conffile);
	xfree(conf->spooldir);
	xfree(conf->node_name);
	xfree(conf->logfile);
	xfree(conf->node_topo_addr);
	xfree(conf->node_topo_pattern);
	return SLURM_ERROR;
}

/*
 * Assume that the slurmd and slurmstepd are the same version level when slurmd
 * starts slurmstepd, so we do not need to support different protocol versions
 * for the different message formats.
 */
extern void pack_slurm_conf_lite(buf_t *buffer)
{
	/* last_update */
	/* accounting_storage_tres */
	pack16(slurm_conf.accounting_storage_enforce, buffer);
	/* accounting_storage_backup_host */
	/* accounting_storage_ext_host */
	/* accounting_storage_host */
	packstr(slurm_conf.accounting_storage_params, buffer);
	/* accounting_storage_pass */
	/* accounting_storage_port */
	packstr(slurm_conf.accounting_storage_type, buffer);
	/* acct_gather_conf */
	packstr(slurm_conf.acct_gather_energy_type, buffer);
	packstr(slurm_conf.acct_gather_profile_type, buffer);
	packstr(slurm_conf.acct_gather_interconnect_type, buffer);
	packstr(slurm_conf.acct_gather_filesystem_type, buffer);
	pack16(slurm_conf.acct_gather_node_freq, buffer);
	packstr(slurm_conf.authalttypes, buffer);
	packstr(slurm_conf.authinfo, buffer);
	packstr(slurm_conf.authalt_params, buffer);
	packstr(slurm_conf.authtype, buffer);
	/* batch_start_timeout */
	/* bb_type */
	/* bcast_exclude */
	/* bcast_parameters */
	/* boot_time */
	/* cgroup_conf */
	/* cli_filter_plugins */
	packstr(slurm_conf.cluster_name, buffer);
	packstr(slurm_conf.comm_params, buffer);
	/* complete_wait */
	pack32(slurm_conf.conf_flags, buffer);
	packstr_array(slurm_conf.control_addr, slurm_conf.control_cnt, buffer);
	/* control_cnt */
	/* *control_machine */
	pack32(slurm_conf.cpu_freq_def, buffer);
	pack32(slurm_conf.cpu_freq_govs, buffer);
	packstr(slurm_conf.cred_type, buffer);
	pack64(slurm_conf.debug_flags, buffer);
	/* def_mem_per_cpu */
	/* dependency_params */
	/* eio_timeout */
	/* enforce_part_limits */
	packstr_array(slurm_conf.epilog, slurm_conf.epilog_cnt, buffer);
	/* epilog_msg_time */
	/* epilog_slurmctld */
	/* epilog_timeout */
	/* fed_params */
	/* first_job_id */
	/* fs_dampening_factor */
	/* get_env_timeout */
	packstr(slurm_conf.gres_plugins, buffer);
	/* group_time */
	/* group_force */
	packstr(slurm_conf.gpu_freq_def, buffer);
	packstr(slurm_conf.hash_plugin, buffer);
	/* hash_val */
	/* health_check_interval */
	/* health_check_node_state */
	/* health_check_program */
	/* http_parser_type */
	/* inactive_limit */
	/* interactive_step_opts */
	packstr(slurm_conf.job_acct_gather_freq, buffer);
	packstr(slurm_conf.job_acct_gather_type, buffer);
	packstr(slurm_conf.job_acct_gather_params, buffer);
	pack16(slurm_conf.job_acct_oom_kill, buffer);
	/* job_comp_host */
	/* job_comp_loc */
	/* job_comp_params */
	/* job_comp_pass */
	/* job_comp_port */
	/* job_comp_type */
	/* job_comp_user */
	packstr(slurm_conf.job_container_plugin, buffer);
	/* job_defaults_list */
	pack16(slurm_conf.job_file_append, buffer);
	/* job_requeue */
	/* job_submit_plugins */
	pack32(slurm_conf.keepalive_interval, buffer);
	pack32(slurm_conf.keepalive_probes, buffer);
	pack32(slurm_conf.keepalive_time, buffer);
	/* kill_on_bad_exit */
	pack16(slurm_conf.kill_wait, buffer);
	packstr(slurm_conf.launch_params, buffer);
	/* licenses */
	pack16(slurm_conf.log_fmt, buffer);
	/* mail_domain */
	/* mail_prog */
	/* max_array_sz */
	/* max_batch_requeue */
	/* max_dbd_msgs */
	/* max_job_cnt */
	/* max_job_id */
	/* max_mem_per_cpu */
	/* max_node_cnt */
	pack32(slurm_conf.max_step_cnt, buffer);
	pack16(slurm_conf.max_tasks_per_node, buffer);
	/* mcs_plugin */
	/* mcs_plugin_params */
	/* min_job_age */
	/* mpi_conf */
	packstr(slurm_conf.mpi_default, buffer);
	/* mpi_params */
	pack16(slurm_conf.msg_timeout, buffer);
	/* next_job_id */
	/* node_features_conf */
	/* node_features_plugins */
	/* over_time_limit */
	packstr(slurm_conf.plugindir, buffer);
	packstr(slurm_conf.plugstack, buffer);
	/* preempt_exempt_time */
	/* preempt_mode */
	packstr(slurm_conf.preempt_params, buffer);
	/* preempt_type */
	packstr(slurm_conf.prep_params, buffer);
	packstr(slurm_conf.prep_plugins, buffer);
	/* priority_decay_hl */
	/* priority_calc_period */
	/* priority_favor_small */
	/* priority_flags */
	/* priority_max_age */
	/* priority_params */
	/* priority_reset_period */
	/* priority_type */
	/* priority_weight_age */
	/* priority_weight_assoc */
	/* priority_weight_fs */
	/* priority_weight_js */
	/* priority_weight_part */
	/* priority_weight_qos */
	/* priority_weight_tres */
	/* private_data */
	packstr(slurm_conf.proctrack_type, buffer);
	packstr_array(slurm_conf.prolog, slurm_conf.prolog_cnt, buffer);
	pack16(slurm_conf.prolog_flags, buffer);
	/* prolog_slurmctld */
	/* prolog_timeout */
	pack16(slurm_conf.propagate_prio_process, buffer);
	packstr(slurm_conf.propagate_rlimits, buffer);
	packstr(slurm_conf.propagate_rlimits_except, buffer);
	/* reboot_program */
	/* reconfig_flags */
	/* requeue_exit */
	/* requeue_exit_hold */
	/* resume_fail_program */
	/* resume_program */
	/* resume_rate */
	/* resume_timeout */
	/* resv_epilog */
	/* resv_over_run */
	/* resv_prolog */
	/* ret2service */
	/* sched_logfile */
	/* sched_log_level */
	/* sched_params */
	/* sched_time_slice */
	/* schedtype */
	/* scron_params */
	packstr(slurm_conf.select_type, buffer);
	/* select_conf_key_pairs */
	pack16(slurm_conf.select_type_param, buffer);
	/* site_factor_plugin */
	/* site_factor_params */
	/* slurm_conf */
	pack32(slurm_conf.slurm_user_id, buffer);
	/* slurm_user_name */
	pack32(slurm_conf.slurmd_user_id, buffer);
	/* slurmd_user_name */
	packstr(slurm_conf.slurmctld_addr, buffer);
	/* slurmctld_debug */
	/* slurmctld_logfile */
	/* slurmctld_pidfile */
	/* slurmctld_plugstack */
	/* slurmctld_plugstack_conf */
	pack32(slurm_conf.slurmctld_port, buffer);
	pack16(slurm_conf.slurmctld_port_count, buffer);
	/* slurmctld_primary_off_prog */
	/* slurmctld_primary_on_prog */
	/* slurmctld_syslog_debug */
	pack16(slurm_conf.slurmctld_timeout, buffer);
	/* slurmctld_params */
	/* slurmd_debug */
	/* slurmd_logfile */
	/* slurmd_params */
	/* slurmd_pidfile */
	/* slurmd_port */
	packstr(slurm_conf.slurmd_spooldir, buffer);
	/* slurmd_syslog_debug */
	/* slurmd_timeout */
	/* srun_epilog */
	if (slurm_conf.srun_port_range) {
		pack16(slurm_conf.srun_port_range[0], buffer);
		pack16(slurm_conf.srun_port_range[1], buffer);
	} else {
		pack16(0, buffer);
		pack16(0, buffer);
	}
	/* srun_prolog */
	/* state_save_location */
	/* suspend_exc_nodes */
	/* suspend_exc_parts */
	/* suspend_program */
	/* suspend_rate */
	/* suspend_time */
	/* suspend_timeout */
	packstr(slurm_conf.switch_type, buffer);
	packstr(slurm_conf.switch_param, buffer);
	packstr(slurm_conf.task_epilog, buffer);
	packstr(slurm_conf.task_plugin, buffer);
	pack32(slurm_conf.task_plugin_param, buffer);
	packstr(slurm_conf.task_prolog, buffer);
	pack16(slurm_conf.tcp_timeout, buffer);
	packstr(slurm_conf.tls_type, buffer);
	packstr(slurm_conf.tmp_fs, buffer);
	packstr(slurm_conf.topology_param, buffer);
	packstr(slurm_conf.topology_plugin, buffer);
	pack16(slurm_conf.tree_width, buffer);
	packstr(slurm_conf.unkillable_program, buffer);
	pack16(slurm_conf.unkillable_timeout, buffer);
	/* url_parser_type */
	/* version */
	pack16(slurm_conf.vsize_factor, buffer);
	pack16(slurm_conf.wait_time, buffer);
	packstr(slurm_conf.x11_params, buffer);
}

extern int unpack_slurm_conf_lite_no_alloc(buf_t *buffer)
{
	uint16_t srun_port_min = 0, srun_port_max = 0;

	init_slurm_conf(&slurm_conf);
	/* last_update */
	/* accounting_storage_tres */
	safe_unpack16(&slurm_conf.accounting_storage_enforce, buffer);
	/* accounting_storage_backup_host */
	/* accounting_storage_ext_host */
	/* accounting_storage_host */
	safe_unpackstr(&slurm_conf.accounting_storage_params, buffer);
	/* accounting_storage_pass */
	/* accounting_storage_port */
	safe_unpackstr(&slurm_conf.accounting_storage_type, buffer);
	/* acct_gather_conf */
	safe_unpackstr(&slurm_conf.acct_gather_energy_type, buffer);
	safe_unpackstr(&slurm_conf.acct_gather_profile_type, buffer);
	safe_unpackstr(&slurm_conf.acct_gather_interconnect_type, buffer);
	safe_unpackstr(&slurm_conf.acct_gather_filesystem_type, buffer);
	safe_unpack16(&slurm_conf.acct_gather_node_freq, buffer);
	safe_unpackstr(&slurm_conf.authalttypes, buffer);
	safe_unpackstr(&slurm_conf.authinfo, buffer);
	safe_unpackstr(&slurm_conf.authalt_params, buffer);
	safe_unpackstr(&slurm_conf.authtype, buffer);
	/* batch_start_timeout */
	/* bb_type */
	/* bcast_exclude */
	/* bcast_parameters */
	/* boot_time */
	/* cgroup_conf */
	/* cli_filter_plugins */
	safe_unpackstr(&slurm_conf.cluster_name, buffer);
	safe_unpackstr(&slurm_conf.comm_params, buffer);
	/* complete_wait */
	safe_unpack32(&slurm_conf.conf_flags, buffer);
	safe_unpackstr_array(&slurm_conf.control_addr,
			     &slurm_conf.control_cnt, buffer);
	/* *control_addr */
	/* control_cnt */
	/* *control_machine */
	safe_unpack32(&slurm_conf.cpu_freq_def, buffer);
	safe_unpack32(&slurm_conf.cpu_freq_govs, buffer);
	safe_unpackstr(&slurm_conf.cred_type, buffer);
	safe_unpack64(&slurm_conf.debug_flags, buffer);
	/* def_mem_per_cpu */
	/* dependency_params */
	/* eio_timeout */
	/* enforce_part_limits */
	safe_unpackstr_array(&slurm_conf.epilog, &slurm_conf.epilog_cnt,
			     buffer);
	/* epilog_msg_time */
	/* epilog_slurmctld */
	/* epilog_timeout */
	/* fed_params */
	/* first_job_id */
	/* fs_dampening_factor */
	/* get_env_timeout */
	safe_unpackstr(&slurm_conf.gres_plugins, buffer);
	/* group_time */
	/* group_force */
	safe_unpackstr(&slurm_conf.gpu_freq_def, buffer);
	safe_unpackstr(&slurm_conf.hash_plugin, buffer);
	/* hash_val */
	/* health_check_interval */
	/* health_check_node_state */
	/* health_check_program */
	/* inactive_limit */
	/* interactive_step_opts */
	safe_unpackstr(&slurm_conf.job_acct_gather_freq, buffer);
	safe_unpackstr(&slurm_conf.job_acct_gather_type, buffer);
	safe_unpackstr(&slurm_conf.job_acct_gather_params, buffer);
	safe_unpack16(&slurm_conf.job_acct_oom_kill, buffer);
	/* job_comp_host */
	/* job_comp_loc */
	/* job_comp_params */
	/* job_comp_pass */
	/* job_comp_port */
	/* job_comp_type */
	/* job_comp_user */
	safe_unpackstr(&slurm_conf.job_container_plugin, buffer);
	/* job_defaults_list */
	safe_unpack16(&slurm_conf.job_file_append, buffer);
	/* job_requeue */
	/* job_submit_plugins */
	safe_unpack32(&slurm_conf.keepalive_interval, buffer);
	safe_unpack32(&slurm_conf.keepalive_probes, buffer);
	safe_unpack32(&slurm_conf.keepalive_time, buffer);
	/* kill_on_bad_exit */
	safe_unpack16(&slurm_conf.kill_wait, buffer);
	safe_unpackstr(&slurm_conf.launch_params, buffer);
	/* licenses */
	safe_unpack16(&slurm_conf.log_fmt, buffer);
	/* mail_domain */
	/* mail_prog */
	/* max_array_sz */
	/* max_batch_requeue */
	/* max_dbd_msgs */
	/* max_job_cnt */
	/* max_job_id */
	/* max_mem_per_cpu */
	/* max_node_cnt */
	safe_unpack32(&slurm_conf.max_step_cnt, buffer);
	safe_unpack16(&slurm_conf.max_tasks_per_node, buffer);
	/* mcs_plugin */
	/* mcs_plugin_params */
	/* min_job_age */
	/* mpi_conf */
	safe_unpackstr(&slurm_conf.mpi_default, buffer);
	/* mpi_params */
	safe_unpack16(&slurm_conf.msg_timeout, buffer);
	/* next_job_id */
	/* node_features_conf */
	/* node_features_plugins */
	/* over_time_limit */
	safe_unpackstr(&slurm_conf.plugindir, buffer);
	safe_unpackstr(&slurm_conf.plugstack, buffer);
	/* preempt_exempt_time */
	/* preempt_mode */
	safe_unpackstr(&slurm_conf.preempt_params, buffer);
	/* preempt_type */
	safe_unpackstr(&slurm_conf.prep_params, buffer);
	safe_unpackstr(&slurm_conf.prep_plugins, buffer);
	/* priority_decay_hl */
	/* priority_calc_period */
	/* priority_favor_small */
	/* priority_flags */
	/* priority_max_age */
	/* priority_params */
	/* priority_reset_period */
	/* priority_type */
	/* priority_weight_age */
	/* priority_weight_assoc */
	/* priority_weight_fs */
	/* priority_weight_js */
	/* priority_weight_part */
	/* priority_weight_qos */
	/* priority_weight_tres */
	/* private_data */
	safe_unpackstr(&slurm_conf.proctrack_type, buffer);
	safe_unpackstr_array(&slurm_conf.prolog, &slurm_conf.prolog_cnt,
			     buffer);
	safe_unpack16(&slurm_conf.prolog_flags, buffer);
	/* prolog_slurmctld */
	/* prolog_timeout */
	safe_unpack16(&slurm_conf.propagate_prio_process, buffer);
	safe_unpackstr(&slurm_conf.propagate_rlimits, buffer);
	safe_unpackstr(&slurm_conf.propagate_rlimits_except, buffer);
	/* reboot_program */
	/* reconfig_flags */
	/* requeue_exit */
	/* requeue_exit_hold */
	/* resume_fail_program */
	/* resume_program */
	/* resume_rate */
	/* resume_timeout */
	/* resv_epilog */
	/* resv_over_run */
	/* resv_prolog */
	/* ret2service */
	/* sched_logfile */
	/* sched_log_level */
	/* sched_params */
	/* sched_time_slice */
	/* schedtype */
	/* scron_params */
	safe_unpackstr(&slurm_conf.select_type, buffer);
	/* select_conf_key_pairs */
	safe_unpack16(&slurm_conf.select_type_param, buffer);
	/* site_factor_plugin */
	/* site_factor_params */
	/* &slurm_conf */
	safe_unpack32(&slurm_conf.slurm_user_id, buffer);
	/* slurm_user_name */
	safe_unpack32(&slurm_conf.slurmd_user_id, buffer);
	/* slurmd_user_name */
	safe_unpackstr(&slurm_conf.slurmctld_addr, buffer);
	/* slurmctld_debug */
	/* slurmctld_logfile */
	/* slurmctld_pidfile */
	/* slurmctld_plugstack */
	/* slurmctld_plugstack_conf */
	safe_unpack32(&slurm_conf.slurmctld_port, buffer);
	safe_unpack16(&slurm_conf.slurmctld_port_count, buffer);
	/* slurmctld_primary_off_prog */
	/* slurmctld_primary_on_prog */
	/* slurmctld_syslog_debug */
	safe_unpack16(&slurm_conf.slurmctld_timeout, buffer);
	/* slurmctld_params */
	/* slurmd_debug */
	/* slurmd_logfile */
	/* slurmd_params */
	/* slurmd_pidfile */
	/* slurmd_port */
	safe_unpackstr(&slurm_conf.slurmd_spooldir, buffer);
	/* slurmd_syslog_debug */
	/* slurmd_timeout */
	/* srun_epilog */
	safe_unpack16(&srun_port_min, buffer);
	safe_unpack16(&srun_port_max, buffer);
	if (srun_port_max) {
		slurm_conf.srun_port_range = xcalloc(2, sizeof(uint16_t));
		slurm_conf.srun_port_range[0] = srun_port_min;
		slurm_conf.srun_port_range[1] = srun_port_max;
	}
	/* srun_prolog */
	/* state_save_location */
	/* suspend_exc_nodes */
	/* suspend_exc_parts */
	/* suspend_program */
	/* suspend_rate */
	/* suspend_time */
	/* suspend_timeout */
	safe_unpackstr(&slurm_conf.switch_type, buffer);
	safe_unpackstr(&slurm_conf.switch_param, buffer);
	safe_unpackstr(&slurm_conf.task_epilog, buffer);
	safe_unpackstr(&slurm_conf.task_plugin, buffer);
	safe_unpack32(&slurm_conf.task_plugin_param, buffer);
	safe_unpackstr(&slurm_conf.task_prolog, buffer);
	safe_unpack16(&slurm_conf.tcp_timeout, buffer);
	safe_unpackstr(&slurm_conf.tls_type, buffer);
	safe_unpackstr(&slurm_conf.tmp_fs, buffer);
	safe_unpackstr(&slurm_conf.topology_param, buffer);
	safe_unpackstr(&slurm_conf.topology_plugin, buffer);
	safe_unpack16(&slurm_conf.tree_width, buffer);
	safe_unpackstr(&slurm_conf.unkillable_program, buffer);
	safe_unpack16(&slurm_conf.unkillable_timeout, buffer);
	/* version */
	safe_unpack16(&slurm_conf.vsize_factor, buffer);
	safe_unpack16(&slurm_conf.wait_time, buffer);
	safe_unpackstr(&slurm_conf.x11_params, buffer);

	return SLURM_SUCCESS;
unpack_error:
	error("unpack_error in %s: %m", __func__);

	free_slurm_conf(&slurm_conf, false);

	return SLURM_ERROR;
}

extern void pack_stepd_reconf(buf_t *buffer, uint16_t protocol_version)
{
	/*
	 * Unlike the initialization functions above, this does need to be
	 * able to communicate with an older slurmstepd if the slurmd process
	 * has been upgraded.
	 */
	if (protocol_version >= SLURM_MIN_PROTOCOL_VERSION) {
		packstr_array(slurm_conf.control_addr, slurm_conf.control_cnt,
			      buffer);
		packstr(slurm_conf.slurmctld_addr, buffer);
		pack32(slurm_conf.slurmctld_port, buffer);
		pack16(slurm_conf.slurmctld_port_count, buffer);
	}
}

/*
 * This does not need to be versioned - slurmd will always pack in our
 * native protocol version. Directly unpack into slurm_conf - the buffer
 * was already read in successfully off the socket and we trust slurmd
 * to have structured this correctly.
 */
extern void unpack_stepd_reconf(buf_t *buffer)
{
	xfree(slurm_conf.control_addr);
	safe_unpackstr_array(&slurm_conf.control_addr,
			     &slurm_conf.control_cnt, buffer);
	xfree(slurm_conf.slurmctld_addr);
	safe_unpackstr(&slurm_conf.slurmctld_addr, buffer);

	safe_unpack32(&slurm_conf.slurmctld_port, buffer);
	safe_unpack16(&slurm_conf.slurmctld_port_count, buffer);

	for (int i = 0; i < slurm_conf.control_cnt; i++)
		debug("%s: control_addr[%d]=%s",
		      __func__, i, slurm_conf.control_addr[i]);
	debug("%s: slurmctld_port=%d, slurmctld_port_count=%d, slurmctld_addr=%s",
	      __func__, slurm_conf.slurmctld_port,
	      slurm_conf.slurmctld_port_count, slurm_conf.slurmctld_addr);

	return;

unpack_error:
	error("%s: unpack_error: %m", __func__);
}
