Skip to content
Snippets Groups Projects
slurm_protocol_pack.c 76.7 KiB
Newer Older
	msg = xmalloc(sizeof(*msg));
	*msg_ptr = msg;
	safe_unpack32(&msg->job_id, buffer);
	safe_unpack32(&msg->job_step_id, buffer);
	safe_unpack32(&msg->srun_node_id, buffer);
	safe_unpack16(&msg->resp_port, buffer);
	safe_unpack16(&msg->io_port, buffer);
	safe_unpackstr_xmalloc(&msg->ofname, &uint16_tmp, buffer);
	safe_unpackstr_xmalloc(&msg->efname, &uint16_tmp, buffer);
	safe_unpackstr_xmalloc(&msg->ifname, &uint16_tmp, buffer);

	if (!(msg->cred = slurm_cred_unpack(buffer)))
		goto unpack_error;
	return SLURM_SUCCESS;

      unpack_error:
	slurm_free_reattach_tasks_request_msg(msg);
	*msg_ptr = NULL;
	return SLURM_ERROR;
static void
_pack_reattach_tasks_response_msg(reattach_tasks_response_msg_t * msg,
				  Buf buffer)
tewk's avatar
tewk committed
{
	packstr(msg->node_name,   buffer);
	packstr(msg->executable_name, buffer);
	pack32(msg->return_code,  buffer);
	pack32(msg->srun_node_id, buffer);
	pack32(msg->ntasks,       buffer);
	pack32_array(msg->gids,       msg->ntasks, buffer);
	pack32_array(msg->local_pids, msg->ntasks, buffer);
tewk's avatar
tewk committed
}

static int
_unpack_reattach_tasks_response_msg(reattach_tasks_response_msg_t ** msg_ptr,
				    Buf buffer)
tewk's avatar
tewk committed
{
	uint32_t ntasks;
	uint16_t uint16_tmp;
	reattach_tasks_response_msg_t *msg = xmalloc(sizeof(*msg));
	*msg_ptr = msg;

	safe_unpackstr_xmalloc(&msg->node_name, &uint16_tmp, buffer);
	safe_unpackstr_xmalloc(&msg->executable_name, &uint16_tmp, buffer);
	safe_unpack32(&msg->return_code,  buffer);
	safe_unpack32(&msg->srun_node_id, buffer);
	safe_unpack32(&msg->ntasks,       buffer);
	safe_unpack32_array(&msg->gids,       &ntasks, buffer);
	safe_unpack32_array(&msg->local_pids, &ntasks, buffer);
	if (msg->ntasks != ntasks)
		goto unpack_error;
	return SLURM_SUCCESS;
tewk's avatar
tewk committed

      unpack_error:
	slurm_free_reattach_tasks_response_msg(msg);
	*msg_ptr = NULL;
	return SLURM_ERROR;
}
static void
_pack_task_exit_msg(task_exit_msg_t * msg, Buf buffer)
{
	pack32(msg->return_code, buffer);
	pack32(msg->num_tasks, buffer);
	pack32_array(msg->task_id_list,
		     msg->num_tasks, buffer);
tewk's avatar
tewk committed
}

static int
_unpack_task_exit_msg(task_exit_msg_t ** msg_ptr, Buf buffer)
{
	task_exit_msg_t *msg;

	msg = xmalloc(sizeof(task_exit_msg_t));
	*msg_ptr = msg;

	safe_unpack32(&msg->return_code, buffer);
	safe_unpack32(&msg->num_tasks, buffer);
	safe_unpack32_array(&msg->task_id_list, &uint32_tmp, buffer);
	if (msg->num_tasks != uint32_tmp)
		goto unpack_error;
	return SLURM_SUCCESS;
tewk's avatar
tewk committed

	*msg_ptr = NULL;
	return SLURM_ERROR;
}


static void
_pack_launch_tasks_response_msg(launch_tasks_response_msg_t * msg, Buf buffer)
	pack32(msg->return_code, buffer);
	packstr(msg->node_name, buffer);
	pack32(msg->srun_node_id, buffer);
	pack32(msg->count_of_pids, buffer);
	pack32_array(msg->local_pids,
		     msg->count_of_pids, buffer);
static int
_unpack_launch_tasks_response_msg(launch_tasks_response_msg_t **
				  msg_ptr, Buf buffer)
	launch_tasks_response_msg_t *msg;
	msg = xmalloc(sizeof(launch_tasks_response_msg_t));
	*msg_ptr = msg;
	safe_unpack32(&msg->return_code, buffer);
	safe_unpackstr_xmalloc(&msg->node_name, &uint16_tmp, buffer);
	safe_unpack32(&msg->srun_node_id, buffer);
	safe_unpack32(&msg->count_of_pids, buffer);
	safe_unpack32_array(&msg->local_pids, &uint32_tmp, buffer);
	if (msg->count_of_pids != uint32_tmp)
		goto unpack_error;
	return SLURM_SUCCESS;
	xfree(msg->node_name);
	xfree(msg);
	*msg_ptr = NULL;
	return SLURM_ERROR;
}

static void
_pack_launch_tasks_request_msg(launch_tasks_request_msg_t * msg, Buf buffer)
{
	pack32(msg->job_id, buffer);
	pack32(msg->job_step_id, buffer);
	pack32(msg->nnodes, buffer);
	pack32(msg->nprocs, buffer);
	pack32(msg->uid, buffer);
	pack32(msg->srun_node_id, buffer);
	slurm_cred_pack(msg->cred, buffer);
	pack32(msg->tasks_to_launch, buffer);
	packstr_array(msg->env, msg->envc, buffer);
	packstr(msg->cwd, buffer);
	packstr_array(msg->argv, msg->argc, buffer);
	pack16(msg->resp_port, buffer);
	pack16(msg->io_port, buffer);
	pack16(msg->task_flags, buffer);
	pack16(msg->cpus_allocated, buffer);
	packstr(msg->ofname, buffer);
	packstr(msg->efname, buffer);
	packstr(msg->ifname, buffer);
	pack32(msg->slurmd_debug, buffer);
	pack32_array(msg->global_task_ids,
		     msg->tasks_to_launch, buffer);
	switch_pack_jobinfo(msg->switch_job, buffer);
static int
_unpack_launch_tasks_request_msg(launch_tasks_request_msg_t **
				 msg_ptr, Buf buffer)
{
	uint16_t uint16_tmp;
	launch_tasks_request_msg_t *msg;

	msg = xmalloc(sizeof(launch_tasks_request_msg_t));
	*msg_ptr = msg;

	safe_unpack32(&msg->job_id, buffer);
	safe_unpack32(&msg->job_step_id, buffer);
	safe_unpack32(&msg->nnodes, buffer);
	safe_unpack32(&msg->nprocs, buffer);
	safe_unpack32(&msg->uid, buffer);
	safe_unpack32(&msg->srun_node_id, buffer);
	if (!(msg->cred = slurm_cred_unpack(buffer)))
	safe_unpack32(&msg->tasks_to_launch, buffer);
	safe_unpackstr_array(&msg->env, &msg->envc, buffer);
	safe_unpackstr_xmalloc(&msg->cwd, &uint16_tmp, buffer);
	safe_unpackstr_array(&msg->argv, &msg->argc, buffer);
	safe_unpack16(&msg->resp_port, buffer);
	safe_unpack16(&msg->io_port, buffer);
	safe_unpack16(&msg->task_flags, buffer);
	safe_unpack16(&msg->cpus_allocated, buffer);
	safe_unpackstr_xmalloc(&msg->ofname, &uint16_tmp, buffer);
	safe_unpackstr_xmalloc(&msg->efname, &uint16_tmp, buffer);
	safe_unpackstr_xmalloc(&msg->ifname, &uint16_tmp, buffer);
	safe_unpack32(&msg->slurmd_debug, buffer);
	safe_unpack32_array(&msg->global_task_ids, &uint32_tmp, buffer);
	if (msg->tasks_to_launch != uint32_tmp)
		goto unpack_error;
	switch_alloc_jobinfo(&msg->switch_job);
	if (switch_unpack_jobinfo(msg->switch_job, buffer) < 0) {
		error("switch_unpack_jobinfo: %m");
		switch_free_jobinfo(msg->switch_job);
	return SLURM_SUCCESS;
	slurm_free_launch_tasks_request_msg(msg);
	*msg_ptr = NULL;
	return SLURM_ERROR;
static void
_pack_cancel_tasks_msg(kill_tasks_msg_t * msg, Buf buffer)
	pack32(msg->job_id, buffer);
	pack32(msg->job_step_id, buffer);
	pack32(msg->signal, buffer);
static int
_unpack_cancel_tasks_msg(kill_tasks_msg_t ** msg_ptr, Buf buffer)
	kill_tasks_msg_t *msg;
	msg = xmalloc(sizeof(kill_tasks_msg_t));
	*msg_ptr = msg;
	safe_unpack32(&msg->job_id, buffer);
	safe_unpack32(&msg->job_step_id, buffer);
	safe_unpack32(&msg->signal, buffer);
	return SLURM_SUCCESS;
	*msg_ptr = NULL;
	return SLURM_ERROR;
static void
_pack_shutdown_msg(shutdown_msg_t * msg, Buf buffer)
	pack16(msg->core, buffer);
static int
_unpack_shutdown_msg(shutdown_msg_t ** msg_ptr, Buf buffer)
	shutdown_msg_t *msg;
	msg = xmalloc(sizeof(shutdown_msg_t));
	*msg_ptr = msg;
	safe_unpack16(&msg->core, buffer);
	return SLURM_SUCCESS;
	*msg_ptr = NULL;
	return SLURM_ERROR;
/* _pack_job_step_kill_msg
 * packs a slurm job step signal message
 * IN msg - pointer to the job step signal message
 * IN/OUT buffer - destination of the pack, contains pointers that are 
 *			automatically updated
 */
static void
_pack_job_step_kill_msg(job_step_kill_msg_t * msg, Buf buffer)
{
	pack32(msg->job_id, buffer);
	pack32(msg->job_step_id, buffer);
	pack16(msg->signal, buffer);
}

/* _unpack_job_step_kill_msg
 * unpacks a slurm job step signal message
 * OUT msg_ptr - pointer to the job step signal message buffer
 * IN/OUT buffer - source of the unpack, contains pointers that are 
 *			automatically updated
 */
static int
_unpack_job_step_kill_msg(job_step_kill_msg_t ** msg_ptr, Buf buffer)
{
	job_step_kill_msg_t *msg;

	msg = xmalloc(sizeof(job_step_kill_msg_t));
	*msg_ptr = msg;

	safe_unpack32(&msg->job_id, buffer);
	safe_unpack32(&msg->job_step_id, buffer);
	safe_unpack16(&msg->signal, buffer);
	safe_unpack16(&msg->batch_flag, buffer);
	return SLURM_SUCCESS;

      unpack_error:
	*msg_ptr = NULL;
	return SLURM_ERROR;
}

static void
_pack_complete_job_step_msg(complete_job_step_msg_t * msg, Buf buffer)
	pack32(msg->job_id, buffer);
	pack32(msg->job_step_id, buffer);
	pack32(msg->job_rc, buffer);
	pack32(msg->slurm_rc, buffer);
	packstr(msg->node_name, buffer);
static int
_unpack_complete_job_step_msg(complete_job_step_msg_t ** msg_ptr, Buf buffer)
	complete_job_step_msg_t *msg;
	msg = xmalloc(sizeof(complete_job_step_msg_t));
	*msg_ptr = msg;
	safe_unpack32(&msg->job_id, buffer);
	safe_unpack32(&msg->job_step_id, buffer);
	safe_unpack32(&msg->job_rc, buffer);
	safe_unpack32(&msg->slurm_rc, buffer);
	safe_unpackstr_xmalloc(&msg->node_name, &uint16_tmp, buffer);
	return SLURM_SUCCESS;
_pack_job_info_request_msg(job_info_request_msg_t * msg,
				Buf buffer)
{
	pack_time(msg->last_update, buffer);
	pack16(msg->show_all, buffer);
}

static int
_unpack_job_info_request_msg(job_info_request_msg_t** msg, 
		Buf buffer)
{
	job_info_request_msg_t*job_info;

	job_info = xmalloc(sizeof(job_step_info_request_msg_t));
	*msg = job_info;

	safe_unpack_time(&job_info->last_update, buffer);
	safe_unpack16(&job_info->show_all, buffer);
	return SLURM_SUCCESS;

      unpack_error:
	xfree(job_info);
	*msg = NULL;
	return SLURM_ERROR;
}

static void
_pack_job_step_info_req_msg(job_step_info_request_msg_t * msg, Buf buffer)
	pack_time(msg->last_update, buffer);
	pack32(msg->job_id, buffer);
	pack32(msg->step_id, buffer);
_unpack_job_step_info_req_msg(job_step_info_request_msg_t ** msg, Buf buffer)
	job_step_info_request_msg_t *job_step_info;
	job_step_info = xmalloc(sizeof(job_step_info_request_msg_t));
	safe_unpack_time(&job_step_info->last_update, buffer);
	safe_unpack32(&job_step_info->job_id, buffer);
	safe_unpack32(&job_step_info->step_id, buffer);
	safe_unpack16(&job_step_info->show_all, buffer);
	return SLURM_SUCCESS;

      unpack_error:
	xfree(job_step_info);
tewk's avatar
tewk committed

static void
_pack_node_info_request_msg(node_info_request_msg_t * msg, Buf buffer)
{
	pack_time(msg->last_update, buffer);
	pack16(msg->show_all, buffer);
}

static int
_unpack_node_info_request_msg(node_info_request_msg_t ** msg, Buf buffer)
{
	node_info_request_msg_t* node_info;

	node_info = xmalloc(sizeof(node_info_request_msg_t));
	*msg = node_info;

	safe_unpack_time(&node_info->last_update, buffer);
	safe_unpack16(&node_info->show_all, buffer);
	return SLURM_SUCCESS;

      unpack_error:
	xfree(node_info);
	*msg = NULL;
	return SLURM_ERROR;
}

static void
_pack_part_info_request_msg(part_info_request_msg_t * msg, Buf buffer)
{
	pack_time(msg->last_update, buffer);
	pack16(msg->show_all, buffer);
}

static int
_unpack_part_info_request_msg(part_info_request_msg_t ** msg, Buf buffer)
{
	part_info_request_msg_t* part_info;

	part_info = xmalloc(sizeof(part_info_request_msg_t));
	*msg = part_info;

	safe_unpack_time(&part_info->last_update, buffer);
	safe_unpack16(&part_info->show_all, buffer);
	return SLURM_SUCCESS;

      unpack_error:
	xfree(part_info);
	*msg = NULL;
	return SLURM_ERROR;
}
tewk's avatar
tewk committed

static void
_pack_slurm_addr_array(slurm_addr * slurm_address,
		       uint16_t size_val, Buf buffer)
	uint16_t nl = htons(size_val);
	pack16(nl, buffer);
	for (i = 0; i < size_val; i++) {
		slurm_pack_slurm_addr(slurm_address + i, buffer);
static int
_unpack_slurm_addr_array(slurm_addr ** slurm_address,
			 uint16_t * size_val, Buf buffer)
	int i = 0;
	uint16_t nl;
	safe_unpack16(&nl, buffer);
	*size_val = ntohs(nl);
	*slurm_address = xmalloc((*size_val) * sizeof(slurm_addr));

	for (i = 0; i < *size_val; i++) {
		if (slurm_unpack_slurm_addr_no_alloc((*slurm_address) + i,
						     buffer))
	xfree(*slurm_address);
	*slurm_address = NULL;
	return SLURM_ERROR;
static void
_pack_batch_job_launch_msg(batch_job_launch_msg_t * msg, Buf buffer)
	assert(msg != NULL);
	pack32(msg->job_id, buffer);
	pack32(msg->uid, buffer);
	pack16(msg->num_cpu_groups, buffer);
	pack32_array(msg->cpus_per_node, msg->num_cpu_groups, buffer);
	pack32_array(msg->cpu_count_reps, msg->num_cpu_groups, buffer);

	packstr(msg->nodes, buffer);
	packstr(msg->script, buffer);
	packstr(msg->work_dir, buffer);
	packstr(msg->err, buffer);
	packstr(msg->in, buffer);
	packstr(msg->out, buffer);
	pack16(msg->argc, buffer);
	packstr_array(msg->argv, msg->argc, buffer);
	pack16(msg->envc, buffer);
	packstr_array(msg->environment, msg->envc, buffer);
static int
_unpack_batch_job_launch_msg(batch_job_launch_msg_t ** msg, Buf buffer)
	batch_job_launch_msg_t *launch_msg_ptr;
	assert(msg != NULL);
	launch_msg_ptr = xmalloc(sizeof(batch_job_launch_msg_t));
	*msg = launch_msg_ptr;

	safe_unpack32(&launch_msg_ptr->job_id, buffer);
	safe_unpack32(&launch_msg_ptr->uid, buffer);

	safe_unpack16(&launch_msg_ptr->num_cpu_groups, buffer);
	if (launch_msg_ptr->num_cpu_groups > 0) {
		safe_unpack32_array((uint32_t **) &
				(launch_msg_ptr->cpus_per_node), &uint32_tmp,
				buffer);
		if (launch_msg_ptr->num_cpu_groups != uint32_tmp)
			goto unpack_error;
		safe_unpack32_array((uint32_t **) &
				(launch_msg_ptr->cpu_count_reps), &uint32_tmp,
				buffer);
		if (launch_msg_ptr->num_cpu_groups != uint32_tmp)
			goto unpack_error;
	} else {
		launch_msg_ptr->cpus_per_node = NULL;
		launch_msg_ptr->cpu_count_reps = NULL;
	}

	safe_unpackstr_xmalloc(&launch_msg_ptr->nodes, &uint16_tmp, buffer);
	safe_unpackstr_xmalloc(&launch_msg_ptr->script, &uint16_tmp, buffer);
	safe_unpackstr_xmalloc(&launch_msg_ptr->work_dir, &uint16_tmp,
			       buffer);

	safe_unpackstr_xmalloc(&launch_msg_ptr->err, &uint16_tmp, buffer);
	safe_unpackstr_xmalloc(&launch_msg_ptr->in, &uint16_tmp, buffer);
	safe_unpackstr_xmalloc(&launch_msg_ptr->out, &uint16_tmp, buffer);

	safe_unpack16(&launch_msg_ptr->argc, buffer);
	safe_unpackstr_array(&launch_msg_ptr->argv,
			     &launch_msg_ptr->argc, buffer);

	safe_unpack16(&launch_msg_ptr->envc, buffer);
	safe_unpackstr_array(&launch_msg_ptr->environment,
			     &launch_msg_ptr->envc, buffer);
	xfree(launch_msg_ptr->nodes);
	xfree(launch_msg_ptr->script);
	xfree(launch_msg_ptr->work_dir);
	xfree(launch_msg_ptr->err);
	xfree(launch_msg_ptr->in);
	xfree(launch_msg_ptr->out);
	xfree(launch_msg_ptr->argv);
	xfree(launch_msg_ptr->environment);
	xfree(launch_msg_ptr);
static void
_pack_job_id_request_msg(job_id_request_msg_t * msg, Buf buffer)
{
	assert(msg != NULL);

	pack32(msg->job_pid, buffer);
}

static int
_unpack_job_id_request_msg(job_id_request_msg_t ** msg, Buf buffer)
{
	job_id_request_msg_t *tmp_ptr;

	/* alloc memory for structure */
	assert(msg != NULL);
	tmp_ptr = xmalloc(sizeof(job_id_request_msg_t));
	*msg = tmp_ptr;

	/* load the data values */
	safe_unpack32(&tmp_ptr->job_pid, buffer);
	return SLURM_SUCCESS;

      unpack_error:
	*msg = NULL;
	return SLURM_ERROR;
}

static void
_pack_job_id_response_msg(job_id_response_msg_t * msg, Buf buffer)
{
	assert(msg != NULL);

	pack32(msg->job_id, buffer);
}

static int
_unpack_job_id_response_msg(job_id_response_msg_t ** msg, Buf buffer)
{
	job_id_response_msg_t *tmp_ptr;

	/* alloc memory for structure */
	assert(msg != NULL);
	tmp_ptr = xmalloc(sizeof(job_id_response_msg_t));
	*msg = tmp_ptr;

	/* load the data values */
	safe_unpack32(&tmp_ptr->job_id, buffer);
	return SLURM_SUCCESS;

      unpack_error:
	*msg = NULL;
	return SLURM_ERROR;
}

static void
_pack_srun_ping_msg(srun_ping_msg_t * msg, Buf buffer)
{
	assert ( msg != NULL );

	pack32 ( msg ->job_id  , buffer ) ;
	pack32 ( msg ->step_id , buffer ) ;
}

static int  
_unpack_srun_ping_msg(srun_ping_msg_t ** msg_ptr, Buf buffer)
{
	srun_ping_msg_t * msg;
	assert ( msg_ptr != NULL );

	msg = xmalloc ( sizeof (srun_ping_msg_t) ) ;
	*msg_ptr = msg;

	safe_unpack32 ( & msg->job_id  , buffer ) ;
	safe_unpack32 ( & msg->step_id , buffer ) ;
	return SLURM_SUCCESS;

    unpack_error:
	*msg_ptr = NULL;
	xfree(msg);
	return SLURM_ERROR;
}

static void 
_pack_srun_node_fail_msg(srun_node_fail_msg_t * msg, Buf buffer)
{
	assert ( msg != NULL );

	pack32 ( msg ->job_id  , buffer ) ;
	pack32 ( msg ->step_id , buffer ) ;
	packstr ( msg ->nodelist, buffer ) ;
}

static int 
_unpack_srun_node_fail_msg(srun_node_fail_msg_t ** msg_ptr, Buf buffer)
{
	uint16_t uint16_tmp;
	srun_node_fail_msg_t * msg;
	assert ( msg_ptr != NULL );

	msg = xmalloc ( sizeof (srun_node_fail_msg_t) ) ;
	*msg_ptr = msg;

	safe_unpack32 ( & msg->job_id  , buffer ) ;
	safe_unpack32 ( & msg->step_id , buffer ) ;
	safe_unpackstr_xmalloc ( & msg->nodelist, &uint16_tmp, buffer);

	return SLURM_SUCCESS;

    unpack_error:
	*msg_ptr = NULL;
	xfree( msg->nodelist );
	xfree( msg );
	return SLURM_ERROR;
}

static void
_pack_srun_timeout_msg(srun_timeout_msg_t * msg, Buf buffer)
{
	assert ( msg != NULL );

	pack32 ( msg -> job_id  , buffer ) ;
	pack32 ( msg -> step_id , buffer ) ;
	pack_time ( msg -> timeout, buffer );
}

static int  
_unpack_srun_timeout_msg(srun_timeout_msg_t ** msg_ptr, Buf buffer)
{
	srun_timeout_msg_t * msg;
	assert ( msg_ptr != NULL );

	msg = xmalloc ( sizeof (srun_timeout_msg_t) ) ;
	*msg_ptr = msg ;

	safe_unpack32 ( & msg -> job_id  , buffer ) ;
	safe_unpack32 ( & msg -> step_id , buffer ) ;
	safe_unpack_time ( & msg -> timeout , buffer );
	return SLURM_SUCCESS;

    unpack_error:
	*msg_ptr = NULL;
	xfree(msg);
	return SLURM_ERROR;
}

void pack_ ( * msg , Buf buffer )
	pack16 ( msg -> , buffer ) ;
	pack32 ( msg -> , buffer ) ;
	packstr ( msg -> , buffer ) ;
int unpack_ ( ** msg_ptr , Buf buffer )
	assert ( msg_ptr != NULL );

	msg = xmalloc ( sizeof ( ) ) ;
	safe_unpack16 ( & msg -> , buffer ) ;
	safe_unpack32 ( & msg -> , buffer ) ;
	safe_unpackstr_xmalloc ( & msg -> x, & uint16_tmp , buffer ) ;
	return SLURM_SUCCESS;

    unpack_error:
	xfree(msg -> x);
	xfree(msg);
	*msg_ptr = NULL;
	return SLURM_ERROR;