21 syscall_log(
LOG_DEBUG,
"socket(domain=%d, type=%d, protocol=%d)\n",
22 domain, type, protocol);
37 return file ? err : -ENOMEM;
53 struct sockaddr_un
un;
63 return copyin(k, uaddr, len);
70 if (copyin(klen, ulen,
sizeof(*klen)))
81 if (copyout(uaddr, k,
MIN(klen, room)) || copyout(ulen, &klen,
sizeof(klen)))
97long sys_accept(
int fd,
const struct sockaddr *addr, socklen_t *len)
99 syscall_log(
LOG_DEBUG,
"accept(fd=%d, addr=%p, len=%p)\n",
123 socklen_t room = 0, klen = 0;
144 if (addr &&
sockaddr_copyout((
struct sockaddr *) addr, len, &k, klen, room)) {
161long sys_bind(
int fd,
const struct sockaddr *addr, socklen_t len)
163 syscall_log(
LOG_DEBUG,
"bind(fd=%d, addr=%p, len=%d)\n",
194 syscall_log(
LOG_DEBUG,
"connect(fd=%d, addr=%p, len=%d)\n",
223 syscall_log(
LOG_DEBUG,
"listen(fd=%d, backlog=%d)\n",
fd, backlog);
251 struct aquila_socket_io_args _s, *s = &_s;
253 if (copyin(s, us,
sizeof(*s))) {
260 int flags = s->
flags;
262 syscall_log(
LOG_DEBUG,
"send(fd=%d, buf=%p, len=%d, flags=%x)\n",
263 fd, buf, len, flags);
279 memset(&to, 0,
sizeof(to));
283 if (copyin(&tolen, s->addrlen,
sizeof(tolen))) {
299 if (ret == -EPIPE && !(flags & MSG_NOSIGNAL))
315 struct aquila_socket_io_args _s, *s = &_s;
317 if (copyin(s, us,
sizeof(*s))) {
324 int flags = s->
flags;
326 syscall_log(
LOG_DEBUG,
"recv(fd=%d, buf=%p, len=%d, flags=%x)\n",
327 fd, buf, len, flags);
343 memset(&from, 0,
sizeof(from));
344 socklen_t room = 0, fromlen = 0;
357 if (ret >= 0 && s->addr &&
sockaddr_copyout(s->addr, s->addrlen, &from, fromlen, room))
365static long socket_name(
int fd,
struct sockaddr *addr, socklen_t *len,
int peer)
375 socklen_t room, klen;
400 syscall_log(
LOG_DEBUG,
"getsockname(fd=%d, addr=%p, len=%p)\n",
fd, addr, len);
414 syscall_log(
LOG_DEBUG,
"getpeername(fd=%d, addr=%p, len=%p)\n",
fd, addr, len);
431 syscall_log(
LOG_DEBUG,
"getsockopt(fd=%d, level=%d, name=%d, val=%p, len=%p)\n",
432 fd, level, name, val, len);
442 memset(kval, 0,
sizeof(kval));
443 socklen_t room, klen;
446 if (copyin(&room, len,
sizeof(room))) {
450 klen = room =
MIN(room,
sizeof(kval));
453 (copyout(val, kval,
MIN(klen, room)) || copyout(len, &klen,
sizeof(klen))))
472 syscall_log(
LOG_DEBUG,
"setsockopt(fd=%d, level=%d, name=%d, val=%p, len=%d)\n",
473 fd, level, name, val, len);
483 len =
MIN(len,
sizeof(kval));
485 if (copyin(kval, val, len)) {
503 syscall_log(
LOG_DEBUG,
"shutdown(fd=%d, how=%d)\n",
fd, how);
struct file * file_new(void)
Makes a new open file, with one reference.
void iobuf_init(struct iobuf *io, void *buf, size_t len, int user)
Sets up an iobuf for one buffer.
void kfree(void *)
Frees an object that kmalloc() gave.
void * memset(void *dst, int c, size_t n)
Sets n bytes to c.
int proc_fd_get(struct proc *proc)
Reserves the lowest free descriptor of a process, while a system call sets it up: no other thread tak...
int proc_fd_close(struct proc *proc, int fd)
Closes a descriptor: it is free again, and its reference to the open file is dropped.
void proc_fd_release(struct proc *proc, int fd)
Frees a reserved descriptor that wasn't set up after all.
void proc_fd_install(struct proc *proc, int fd, struct file *file, int flags)
Makes a reserved descriptor refer to an open file.
int signal_proc_send(struct proc *proc, int signal)
Sends a signal to a process.
int socket_listen(struct file *file, int backlog)
Makes a socket listen for connections, for listen().
int socket_shutdown_dir(struct file *file, int how)
Shuts down reading, writing or both on a socket, for shutdown().
int socket_getsockopt(struct file *file, int level, int name, void *val, socklen_t *len)
Reads a socket option, for getsockopt().
int socket_connect(struct file *file, const struct sockaddr *addr, socklen_t len)
Connects a socket to a peer, for connect().
int socket_setsockopt(struct file *file, int level, int name, const void *val, socklen_t len)
Sets a socket option, for setsockopt().
int socket_create(struct file *file, int domain, int type, int protocol)
Makes a socket of a domain in an open file, for socket().
int socket_accept(struct file *file, struct file *conn, const struct sockaddr *addr, socklen_t *len)
Accepts a connection on a listening socket, for accept().
ssize_t socket_recv(struct file *file, struct iobuf *io, int flags, struct sockaddr *from, socklen_t *fromlen)
Receives data from a socket, for recv(), recvfrom() and read().
int socket_getname(struct file *file, struct sockaddr *addr, socklen_t *len, int peer)
Gets a socket's local address, or its peer's, for getsockname() and getpeername().
ssize_t socket_send(struct file *file, struct iobuf *io, int flags, const struct sockaddr *to, socklen_t tolen)
Sends data on a socket, for send(), sendto() and write().
int socket_bind(struct file *file, const struct sockaddr *addr, socklen_t len)
Gives a socket its local address, for bind().
A file descriptor: the open file it refers to (fs/file.c, shared with the descriptors that dup() and ...
An open file (POSIX's "open file description", fs/file.c).
struct file * fd_file(int fd)
Finds the open file that a descriptor of the current process refers to, and holds it until the system...
long sys_getpeername(int fd, struct sockaddr *addr, socklen_t *len)
Implements getpeername(): the address of a socket's peer.
long sys_getsockname(int fd, struct sockaddr *addr, socklen_t *len)
Implements getsockname(): a socket's local address.
long sys_connect(int fd, const struct sockaddr *addr, socklen_t len)
Implements connect(): connects a socket to a peer.
long sys_socket(int domain, int type, int protocol)
Implements socket(): makes a socket, open on a new descriptor.
static int sockaddr_copyout(struct sockaddr *uaddr, socklen_t *ulen, const union ksockaddr *k, socklen_t klen, socklen_t room)
Copies an address out to user memory, as much of it as fits in room, and sets *ulen to its full size ...
static int sockaddr_copyin(union ksockaddr *k, const struct sockaddr *uaddr, socklen_t len)
Copies an address of len bytes from user memory.
long sys_accept(int fd, const struct sockaddr *addr, socklen_t *len)
Implements accept(): takes a connection from a listening socket, open on a new descriptor.
long sys_getsockopt(int fd, int level, int name, void *val, socklen_t *len)
Implements getsockopt(): reads a socket option.
static int sockaddr_room(socklen_t *ulen, socklen_t *klen)
Reads how much room the user's buffer has for an address going out, into *klen, at most the kernel co...
long sys_recv(struct aquila_socket_io_args *us)
Implements recv() and recvfrom().
long sys_send(struct aquila_socket_io_args *us)
Implements send() and sendto().
long sys_shutdown(int fd, int how)
Implements shutdown(): shuts down reading, writing or both on a socket, which stays open.
long sys_setsockopt(int fd, int level, int name, const void *val, socklen_t len)
Implements setsockopt(): sets a socket option.
static long socket_name(int fd, struct sockaddr *addr, socklen_t *len, int peer)
Gets a socket's local address or its peer's, for getsockname() and getpeername(), and copies it out.
long sys_listen(int fd, int backlog)
Implements listen(): makes a socket accept connections.
long sys_bind(int fd, const struct sockaddr *addr, socklen_t len)
Implements bind(): gives a socket its local address.
static int uaccess_check(const void *ptr, size_t len)
Checks that [ptr, ptr + len) is in user space.