/*****************************************************************************\
 *  init_msg.c - initialize RPC messages contents
 *****************************************************************************
 *  Copyright (C) 2002-2007 The Regents of the University of California.
 *  Copyright (C) 2008-2010 Lawrence Livermore National Security.
 *  Copyright (C) SchedMD LLC.
 *  Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
 *  Written by Morris Jette <jette1@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 <errno.h>
#include <stdio.h>

#include "slurm/slurm.h"

#include "src/common/slurm_protocol_api.h"
#include "src/common/forward.h"

/*
 * slurm_init_job_desc_msg - initialize job descriptor with
 *	default values
 * IN/OUT job_desc_msg - user defined job descriptor
 */
void slurm_init_job_desc_msg(job_desc_msg_t * job_desc_msg)
{
	memset(job_desc_msg, 0, sizeof(job_desc_msg_t));
	job_desc_msg->alloc_sid		= NO_VAL;
	job_desc_msg->contiguous	= NO_VAL16;
	job_desc_msg->core_spec		= NO_VAL16;
	job_desc_msg->cores_per_socket	= NO_VAL16;
	job_desc_msg->cpu_bind_type	= NO_VAL16;
	job_desc_msg->cpu_freq_min	= NO_VAL;
	job_desc_msg->cpu_freq_max	= NO_VAL;
	job_desc_msg->cpu_freq_gov	= NO_VAL;
	job_desc_msg->cpus_per_task	= NO_VAL16;
	job_desc_msg->delay_boot	= NO_VAL;
	job_desc_msg->group_id = SLURM_AUTH_NOBODY;
	job_desc_msg->kill_on_node_fail = NO_VAL16;
	job_desc_msg->max_cpus		= NO_VAL;
	job_desc_msg->max_nodes		= NO_VAL;
	job_desc_msg->mem_bind_type	= NO_VAL16;
	job_desc_msg->mail_type		= NO_VAL16;
	job_desc_msg->min_cpus		= NO_VAL;
	job_desc_msg->min_nodes		= NO_VAL;
	job_desc_msg->nice		= NO_VAL;
	job_desc_msg->ntasks_per_core	= NO_VAL16;
	job_desc_msg->ntasks_per_tres	= NO_VAL16;
	job_desc_msg->ntasks_per_node	= NO_VAL16;
	job_desc_msg->ntasks_per_socket	= NO_VAL16;
	job_desc_msg->num_tasks		= NO_VAL;
	job_desc_msg->overcommit	= NO_VAL8;
	job_desc_msg->plane_size	= NO_VAL16;
	job_desc_msg->pn_min_cpus	= NO_VAL16;
	job_desc_msg->pn_min_memory	= NO_VAL64;
	job_desc_msg->pn_min_tmp_disk	= NO_VAL;
	job_desc_msg->priority		= NO_VAL;
	job_desc_msg->reboot		= NO_VAL16;
	job_desc_msg->requeue		= NO_VAL16;
	job_desc_msg->req_switch	= NO_VAL;
	job_desc_msg->segment_size = NO_VAL16;
	job_desc_msg->shared		= NO_VAL16;
	job_desc_msg->site_factor	= NO_VAL;
	job_desc_msg->sockets_per_node	= NO_VAL16;
	job_desc_msg->step_id = SLURM_STEP_ID_INITIALIZER;
	job_desc_msg->task_dist		= NO_VAL;
	job_desc_msg->threads_per_core	= NO_VAL16;
	job_desc_msg->time_limit	= NO_VAL;
	job_desc_msg->time_min		= NO_VAL;
	job_desc_msg->user_id = SLURM_AUTH_NOBODY;
	job_desc_msg->wait_all_nodes	= NO_VAL16;
	job_desc_msg->wait4switch	= NO_VAL;
}

/*
 * slurm_init_update_step_msg - initialize step update message with default
 *	values before calling slurm_update_step()
 * OUT step_msg - step update message descriptor
 */
extern void slurm_init_update_step_msg (step_update_request_msg_t * step_msg)
{
	memset(step_msg, 0, sizeof(step_update_request_msg_t));
	step_msg->step_id = SLURM_STEP_ID_INITIALIZER;
	step_msg->time_limit = NO_VAL;
}

/*
 * slurm_init_part_desc_msg - initialize partition descriptor with
 *	default values
 * IN/OUT update_part_msg - user defined partition descriptor
 */
void slurm_init_part_desc_msg(partition_info_t *update_part_msg)
{
	memset(update_part_msg, 0, sizeof(*update_part_msg));
	update_part_msg->default_time   = NO_VAL;
	update_part_msg->def_mem_per_cpu = NO_VAL64;
	update_part_msg->grace_time     = NO_VAL;
	update_part_msg->max_cpus_per_node = NO_VAL;
	update_part_msg->max_cpus_per_socket = NO_VAL;
	update_part_msg->max_mem_per_cpu = NO_VAL64;
	update_part_msg->max_nodes 	= NO_VAL;
	update_part_msg->max_share 	= NO_VAL16;
	update_part_msg->min_nodes 	= NO_VAL;
	update_part_msg->max_time 	= NO_VAL;
	update_part_msg->over_time_limit = NO_VAL16;
	update_part_msg->preempt_mode 	= NO_VAL16;
	update_part_msg->priority_job_factor = NO_VAL16;
	update_part_msg->priority_tier	= NO_VAL16;
	update_part_msg->state_up 	= NO_VAL16;
}

/*
 * slurm_init_resv_desc_msg - initialize reservation descriptor with
 *	default values
 * OUT job_desc_msg - user defined partition descriptor
 */
void slurm_init_resv_desc_msg (resv_desc_msg_t * resv_msg)
{
	memset(resv_msg, 0, sizeof(resv_desc_msg_t));
	resv_msg->core_cnt = NO_VAL;
	resv_msg->duration	= NO_VAL;
	resv_msg->end_time	= (time_t) NO_VAL;
	resv_msg->flags		= NO_VAL64;
	resv_msg->max_start_delay = NO_VAL;
	resv_msg->node_cnt = NO_VAL;
	resv_msg->purge_comp_time = NO_VAL;
	resv_msg->start_time	= (time_t) NO_VAL;
}

/*
 * slurm_init_update_node_msg - initialize node update message
 * OUT update_node_msg - user defined node descriptor
 */
void slurm_init_update_node_msg (update_node_msg_t * update_node_msg)
{
	memset(update_node_msg, 0, sizeof(update_node_msg_t));
	update_node_msg->node_state = NO_VAL;
	update_node_msg->resume_after = NO_VAL;
	update_node_msg->weight = NO_VAL;
}

/*
 * slurm_init_trigger_msg - initialize trigger clear/update message
 * OUT trigger_info_msg - user defined trigger descriptor
 */
void slurm_init_trigger_msg (trigger_info_t *trigger_info_msg)
{
	memset(trigger_info_msg, 0, sizeof(trigger_info_t));
	trigger_info_msg->user_id = NO_VAL;
}
