bunch of work on tcp:
[newos.git] / lib / libsocket / socket.c
blob14828c3846ea091cf2963bee3bbe82d3ecd38969
1 /*
2 ** Copyright 2002, Travis Geiselbrecht. All rights reserved.
3 ** Distributed under the terms of the NewOS License.
4 */
5 #include <socket/socket.h>
6 #include <unistd.h>
7 #include <sys/syscalls.h>
9 int socket_create(int proto, int flags)
11 int fd;
12 int err;
13 _socket_api_args_t args;
15 fd = open("/dev/net/socket", 0);
16 if(fd < 0)
17 return fd;
19 args.u.create.type = proto;
20 args.u.create.flags = flags;
22 err = sys_ioctl(fd, _SOCKET_API_CREATE, &args, sizeof(args));
23 if(err < 0) {
24 close(fd);
25 return err;
28 return fd;
31 int socket_close(int fd)
33 return close(fd);
36 int socket_bind(int fd, sockaddr *addr)
38 _socket_api_args_t args;
40 args.u.bind.saddr = addr;
41 return sys_ioctl(fd, _SOCKET_API_BIND, &args, sizeof(args));
44 int socket_connect(int fd, sockaddr *addr)
46 _socket_api_args_t args;
48 args.u.connect.saddr = addr;
49 return sys_ioctl(fd, _SOCKET_API_CONNECT, &args, sizeof(args));
52 int socket_listen(int fd)
54 return sys_ioctl(fd, _SOCKET_API_LISTEN, NULL, 0);
57 int socket_accept(int fd, sockaddr *addr)
59 _socket_api_args_t args;
61 args.u.accept.saddr = addr;
62 return sys_ioctl(fd, _SOCKET_API_ACCEPT, &args, sizeof(args));
65 ssize_t socket_read(int fd, void *buf, ssize_t len)
67 return read(fd, buf, len);
70 ssize_t socket_write(int fd, const void *buf, ssize_t len)
72 return write(fd, buf, len);
75 ssize_t socket_recvfrom(int fd, void *buf, ssize_t len, sockaddr *addr)
77 _socket_api_args_t args;
79 args.u.transfer.buf = buf;
80 args.u.transfer.len = len;
81 args.u.transfer.flags = 0;
82 args.u.transfer.saddr = addr;
83 args.u.transfer.timeout = 0;
85 return sys_ioctl(fd, _SOCKET_API_RECVFROM, &args, sizeof(args));
88 ssize_t socket_recvfrom_etc(int fd, void *buf, ssize_t len, sockaddr *addr, int flags, bigtime_t timeout)
90 _socket_api_args_t args;
92 args.u.transfer.buf = buf;
93 args.u.transfer.len = len;
94 args.u.transfer.flags = flags;
95 args.u.transfer.saddr = addr;
96 args.u.transfer.timeout = timeout;
98 return sys_ioctl(fd, _SOCKET_API_RECVFROM_ETC, &args, sizeof(args));
101 ssize_t socket_sendto(int fd, const void *buf, ssize_t len, sockaddr *addr)
103 _socket_api_args_t args;
105 args.u.transfer.buf = (void *)buf;
106 args.u.transfer.len = len;
107 args.u.transfer.flags = 0;
108 args.u.transfer.saddr = addr;
109 args.u.transfer.timeout = 0;
111 return sys_ioctl(fd, _SOCKET_API_SENDTO, &args, sizeof(args));