aboutgitcodelistschat:MatrixIRC
path: root/cooker/calls/io.c
blob: 41dbe715f3922388fb90aaff1f3865622e1901d5 (plain) (tree)



























































































































                                                                               
// SPDX-License-Identifier: GPL-2.0-or-later

/* seitan - Syscall Expressive Interpreter, Transformer and Notifier
 *
 * cooker/calls/io.c - Description of known input/output system calls
 *
 * Copyright 2023 Red Hat GmbH
 * Author: Stefano Brivio <sbrivio@redhat.com>
 */

/*
read
write
open
close

pread
pwrite
readv
writev
preadv
pwritev
copy_file_range
preadv2
pwritev2

openat2
*/

#include <asm-generic/unistd.h>
#include <sys/syscall.h>

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/uio.h>
#include <fcntl.h>
#include <linux/openat2.h>
#include <linux/limits.h>

#include "../cooker.h"
#include "../calls.h"

static struct num open_flags[] = {
	{ "rdonly",	O_RDONLY },
	{ "wronly",	O_WRONLY },
	{ "rdwr",	O_RDWR },
	{ 0 },
};

static struct num open_modes[] = {
	{ "S_ISUID",	S_ISUID },
	{ "S_ISGID",	S_ISGID },
	{ "S_IRWXU",	S_IRWXU },
	{ "S_IRUSR",	S_IRUSR },
	{ "S_IWUSR",	S_IWUSR },
	{ "S_IXUSR",	S_IXUSR },
	{ "S_IRWXG",	S_IRWXG },
	{ "S_IRGRP",	S_IRGRP },
	{ "S_IWGRP",	S_IWGRP },
	{ "S_IXGRP",	S_IXGRP },
	{ "S_IRWXO",	S_IRWXO },
	{ "S_IROTH",	S_IROTH },
	{ "S_IWOTH",	S_IWOTH },
	{ "S_IXOTH",	S_IXOTH },
	{ "S_ISVTX",	S_ISVTX },
	{ 0 },
};

static struct arg read_args[] = {
	{ 0,
		{
			"fd",		INT,		0,	0,	0,
			{ 0 }
		}
	},
	{ 0,
		{
			"path",		FDPATH,		0,	0,	0,
			{ 0 }
		}
	},
	{ 1,
		{
			"buf",		STRING,		RBUF,	0,	BUFSIZ,
			{ 0 }
		}
	},
	{ 2,
		{
			"count",	LONG,		SIZE,	-1,	0,
			{ .d_size = (intptr_t)&read_args[1] }
		}
	},
	{ 0 },
};

static struct arg open_args[] = {
	{ 0,
		{
			"path",		STRING,			0,
			0,	PATH_MAX,
			{ 0 }
		}
	},
	{ 1,
		{
			"flags",	INT,	MASK | FLAGS,	0,	0,
			{ .d_num = open_flags }
		}
	},
	{ 2,
		{
			"mode",		INT,	MASK | FLAGS,	0,	0,
			{ .d_num = open_modes }
		}
	},
	{ 0 },
};

struct call syscalls_io[] = {
	{ __NR_read, "read", read_args },
	{ __NR_open, "open", open_args },
	{ 0 },
};