/*****************************************************************************\
 *  adopt_pid.c - Adopt a process into the extern step of a job.
 *****************************************************************************
 *  Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
 *
 *  This file is part of Slurm, a resource management program.
 *  For details, see <https://slurm.schedmd.com/>.
\*****************************************************************************/

/*
 * Usage: adopt_pid <job_id> <node_name> <pid>
 *
 * Sends the extern step of <job_id> on <node_name> the same
 * REQUEST_ADD_EXTERN_PID that pam_slurm_adopt sends, asking it to adopt
 * <pid>. Must run as root.
 *
 * Prints "RC=<n>" with the reply of slurmstepd and exits 0, or exits 1 if the
 * step could not be reached at all.
 */

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include "slurm/slurm.h"
#include "slurm/slurm_errno.h"

#include "src/common/stepd_api.h"

int main(int argc, char **argv)
{
	slurm_step_id_t step_id = {
		.step_het_comp = NO_VAL,
		.step_id = SLURM_EXTERN_CONT,
	};
	uint16_t protocol_version = 0;
	char *endptr = NULL;
	pid_t pid = 0;
	int fd = -1, rc = SLURM_SUCCESS;

	if (argc != 4) {
		fprintf(stderr, "Usage: %s <job_id> <node_name> <pid>\n",
			argv[0]);
		return 1;
	}

	slurm_init(NULL);

	step_id.job_id = strtoul(argv[1], &endptr, 10);
	if (*endptr || !step_id.job_id) {
		fprintf(stderr, "Invalid job id '%s'\n", argv[1]);
		return 1;
	}
	pid = strtol(argv[3], &endptr, 10);
	if (*endptr || (pid <= 0)) {
		fprintf(stderr, "Invalid pid '%s'\n", argv[3]);
		return 1;
	}

	fd = stepd_connect(NULL, argv[2], &step_id, &protocol_version);
	if (fd < 0) {
		fprintf(stderr,
			"Cannot connect to the extern step of job %s on %s\n",
			argv[1], argv[2]);
		return 1;
	}

	rc = stepd_add_extern_pid(fd, protocol_version, pid);
	close(fd);

	printf("RC=%d\n", rc);
	slurm_fini();
	return 0;
}
