sockets: initial impl

This commit is contained in:
Matheus
2022-10-18 00:01:06 -03:00
parent e0953cd1b0
commit 4522b6c2da
14 changed files with 745 additions and 5 deletions
+67
View File
@@ -0,0 +1,67 @@
#ifndef _SOCKET_H_INCLUDE
#define _SOCKET_H_INCLUDE
#include <stdint.h>
#include <stddef.h>
#include <string.h>
#include <sys/types.h>
#include <kernel/event.h>
#include <kernel/unsocket.h>
#include <ringbuffer.h>
#define SOCKET_STATE_UNBOUND 0
#define SOCKET_STATE_BOUND 1
#define SOCKET_STATE_LISTENING 2
#define SOCKET_STATE_CONNECTED 3
#define SOCK_STREAM 1
#define AF_UNIX 1
typedef struct _socket_t{
int lock;
int family;
int type;
int protocol;
struct _socket_t* peer;
size_t backlogsize;
off_t backlogend;
struct _socket_t** backlog;
event_t connectevent; // when the socket is listening and this is fired, someone used connect() on the socket
event_t acceptevent; // when a socket is waiting for a connection to be accepted, it sleeps on this
int state;
union {
sockaddr_un addr_un;
};
size_t addrlen;
ringbuffer_t buffer;
} socket_t;
static inline int socket_addtobacklog(socket_t* listener, socket_t* client){
if(listener->backlogend == listener->backlogsize)
return ECONNREFUSED;
listener->backlog[listener->backlogend++] = client;
return 0;
}
static inline socket_t* socket_popfrombacklog(socket_t* listener){
socket_t* sock = listener->backlog[0];
listener->backlogend--;
memcpy(listener->backlog, listener->backlog+1, sizeof(socket_t*)*listener->backlogend);
listener->backlog[listener->backlogend];
return sock;
}
int socket_connect(struct _socket_t* sock, void* addr, size_t addrlen);
int socket_new(socket_t** returnptr, int family, int type, int protocol);
int socket_bind(struct _socket_t* sock, void* addr, size_t addrlen);
int socket_listen(struct _socket_t* sock, int backlog);
int socket_accept(socket_t** peer, socket_t* sock, void* addr, size_t* addrlen);
#endif
+16
View File
@@ -0,0 +1,16 @@
#ifndef _UNSOCKET_H_INCLUDE
#define _UNSOCKET_H_INCLUDE
#include <kernel/socket.h>
typedef struct {
short sun_family;
char sun_path[108];
} sockaddr_un;
struct _socket_t;
int unsocket_new(struct _socket_t** returnptr, int type, int protocol);
int unsocket_bind(struct _socket_t* sock, sockaddr_un* addr, size_t addrlen);
#endif
+3 -1
View File
@@ -63,9 +63,11 @@ typedef struct _fscalls_t {
int (*getdirent)(dirnode_t* node, dent_t* buff, size_t count, uintmax_t offset, size_t* readcount);
// change file mode
int (*chmod)(vnode_t* node, mode_t mode);
// create socket in address
int (*mksocket)(dirnode_t* ref, char* path, mode_t mode);
} fscalls_t;
int vfs_mksocket(dirnode_t* ref, char* path, mode_t mode);
int vfs_mount(dirnode_t* ref, char* device, char* mountpoint, char* fs, int mountflags, void* fsinfo);
int vfs_umount(dirnode_t* ref, char* mountpoint);
int vfs_open(vnode_t** buf, dirnode_t* ref, char* path);