# Copyright 2017 syzkaller project authors. All rights reserved.
# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.

# AF_UNIX support.

include <sys/types.h>
include <sys/socket.h>
include <netinet/in.h>
# include <compat/linux/common/linux_socket.h>

resource sock_unix[sock]

socket$unix(domain const[AF_UNIX], type flags[unix_socket_type], proto const[0]) sock_unix
socketpair$unix(domain const[AF_UNIX], type flags[unix_socket_type], proto const[0], fds ptr[out, unix_pair])
bind$unix(fd sock_unix, addr ptr[in, sockaddr_un], addrlen len[addr])
connect$unix(fd sock_unix, addr ptr[in, sockaddr_un], addrlen len[addr])
accept$unix(fd sock_unix, peer ptr[out, sockaddr_un, opt], peerlen ptr[inout, len[peer, int32]]) sock_unix

sendto$unix(fd sock_unix, buf buffer[in], len len[buf], f flags[send_flags], addr ptr[in, sockaddr_un, opt], addrlen len[addr])
sendmsg$unix(fd sock_unix, msg ptr[in, msghdr_un], f flags[send_flags])
recvfrom$unix(fd sock_unix, buf buffer[out], len len[buf], f flags[recv_flags], addr ptr[in, sockaddr_un, opt], addrlen len[addr])
getsockname$unix(fd sock_unix, addr ptr[out, sockaddr_un], addrlen ptr[inout, len[addr, int32]])
getpeername$unix(fd sock_unix, peer ptr[out, sockaddr_un], peerlen ptr[inout, len[peer, int32]])

unix_socket_type = SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET
unix_socket_family = AF_UNIX, AF_UNSPEC

unix_pair {
	fd0	sock_unix
	fd1	sock_unix
}

sockaddr_un [
	file	sockaddr_un_file
	abs	sockaddr_un_abstract
] [varlen]

sockaddr_un_file {
	family	flags[unix_socket_family, int16]
	path	filename
} [packed]

sockaddr_un_abstract {
	family	flags[unix_socket_family, int16]
	ind	const[0, int8]
	id	proc[20000, 4, int32]
}

msghdr_un {
	addr	ptr[in, sockaddr_un]
	addrlen	len[addr, int32]
	vec	ptr[in, array[iovec_in]]
	vlen	len[vec, intptr]
	ctrl	ptr[in, array[cmsghdr_un], opt]
	ctrllen	bytesize[ctrl, intptr]
	f	flags[send_flags, int32]
}

cmsghdr_un [
	rights	cmsghdr_un_rights
	cred	cmsghdr_un_cred
] [varlen]

cmsghdr_un_rights {
	len	len[parent, intptr]
	level	const[SOL_SOCKET, int32]
	type	const[SCM_RIGHTS, int32]
	fds	array[fd]
} [align_ptr]

cmsghdr_un_cred {
	len	len[parent, intptr]
	level	const[SOL_SOCKET, int32]
# XXX type	const[LINUX_SCM_CREDENTIALS, int32]
	type	const[0, int32]
	pid	pid
	uid	uid
	gid	gid
} [align_ptr]
