/*
 * This file is part of sched_xetaffinity strace test.
 *
 * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "tests.h"
#include <asm/unistd.h>
#include <sched.h>

#if defined __NR_sched_getaffinity && defined __NR_sched_setaffinity \
 && defined CPU_ISSET_S && defined CPU_ZERO_S && defined CPU_SET_S

# include <assert.h>
# include <errno.h>
# include <stdio.h>
# include <unistd.h>

static int
getaffinity(unsigned long pid, unsigned long size, void *set)
{
	return syscall(__NR_sched_getaffinity, pid, size, set);
}

static int
setaffinity(unsigned long pid, unsigned long size, void *set)
{
	return syscall(__NR_sched_setaffinity, pid, size, set);
}

int
main(void)
{
	unsigned int cpuset_size = 1;
	const pid_t pid = getpid();

	while (cpuset_size) {
		assert(getaffinity(pid, cpuset_size, NULL) == -1);
		if (EFAULT == errno)
			break;
		if (EINVAL != errno)
			perror_msg_and_skip("sched_getaffinity");
		printf("sched_getaffinity(%d, %u, NULL) = -1 EINVAL (%m)\n",
		       pid, cpuset_size);
		cpuset_size <<= 1;
	}
	assert(cpuset_size);
	printf("sched_getaffinity(%d, %u, NULL) = -1 EFAULT (%m)\n",
	       pid, cpuset_size);

	cpu_set_t *cpuset = tail_alloc(cpuset_size);
	assert(getaffinity(pid, cpuset_size, cpuset + 1) == -1);
	printf("sched_getaffinity(%d, %u, %p) = -1 EFAULT (%m)\n",
		pid, cpuset_size, cpuset + 1);

	assert(getaffinity(pid, cpuset_size, cpuset) == (int) cpuset_size);
	printf("sched_getaffinity(%d, %u, [", pid, cpuset_size);
	const char *sep;
	unsigned int i, cpu;
	for (i = 0, cpu = 0, sep = ""; i < cpuset_size * 8; ++i) {
		if (CPU_ISSET_S(i, cpuset_size, cpuset)) {
			printf("%s%u", sep, i);
			sep = " ";
			cpu = i;
		}
	}
	printf("]) = %u\n", cpuset_size);

	CPU_ZERO_S(cpuset_size, cpuset);
	CPU_SET_S(cpu, cpuset_size, cpuset);
	if (setaffinity(pid, cpuset_size, cpuset))
		perror_msg_and_skip("sched_setaffinity");
	printf("sched_setaffinity(%d, %u, [%u]) = 0\n",
	       pid, cpuset_size, cpu);

	const unsigned int big_size = cpuset_size < 128 ? 128 : cpuset_size * 2;
	cpuset = tail_alloc(big_size);
	const int ret_size = getaffinity(pid, big_size, cpuset);
	assert(ret_size >= (int) cpuset_size && ret_size <= (int) big_size);
	printf("sched_getaffinity(%d, %u, [", pid, big_size);
	for (i = 0, sep = ""; i < (unsigned) ret_size * 8; ++i) {
		if (CPU_ISSET_S(i, (unsigned) ret_size, cpuset)) {
			printf("%s%u", sep, i);
			sep = " ";
		}
	}
	printf("]) = %d\n", ret_size);

	puts("+++ exited with 0 +++");
	return 0;
}

#else

SKIP_MAIN_UNDEFINED("__NR_sched_getaffinity && __NR_sched_setaffinity"
		    " && CPU_ISSET_S && CPU_ZERO_S && CPU_SET_S")

#endif
