syscalls: accept connect listen

This commit is contained in:
Matheus
2024-04-13 20:58:03 -03:00
parent 3e0926cba8
commit 5197cdba2a
12 changed files with 240 additions and 10 deletions
+21
View File
@@ -21,11 +21,21 @@ typedef struct {
int type;
} socket_t;
typedef struct {
union {
ipv4addr_t ipv4addr;
char path[256];
};
} sockaddr_t;
typedef struct socketops_t {
int (*bind)(socket_t *socket, sockaddr_t *addr);
int (*send)(socket_t *socket, sockaddr_t *addr, void *buffer, size_t count, uintmax_t flags, size_t *sendcount);
int (*recv)(socket_t *socket, sockaddr_t *addr, void *buffer, size_t count, uintmax_t flags, size_t *recvcount);
int (*poll)(socket_t *socket, polldata_t *data, int events);
int (*connect)(socket_t *socket, sockaddr_t *addr, uintmax_t data);
int (*listen)(socket_t *socket, int backlog);
int (*accept)(socket_t *server, socket_t *client, sockaddr_t *addr, uintmax_t flags);
void (*destroy)(socket_t *socket);
} socketops_t;
@@ -36,6 +46,7 @@ typedef struct {
} socketnode_t;
#define SOCKET_TYPE_UDP 0
#define SOCKET_TYPE_LOCAL 1
#define SOCKFS_SOCKET_FROM_NODE(nodep) (((socketnode_t *)(nodep))->socket)
static inline int sock_convertaddress(sockaddr_t *sockaddr, abisockaddr_t *abisockaddr) {
@@ -45,6 +56,10 @@ static inline int sock_convertaddress(sockaddr_t *sockaddr, abisockaddr_t *abiso
sockaddr->ipv4addr.addr = be_to_cpu_d(inaddr->sin_addr);
sockaddr->ipv4addr.port = be_to_cpu_w(inaddr->sin_port);
break;
case AF_LOCAL:
unaddr_t *unaddr = (unaddr_t *)abisockaddr;
strcpy(sockaddr->path, unaddr->sun_path);
break;
default:
return EINVAL;
}
@@ -59,6 +74,10 @@ static inline int sock_addrtoabiaddr(int socktype, sockaddr_t *sockaddr, abisock
inaddr->sin_addr = cpu_to_be_d(sockaddr->ipv4addr.addr);
inaddr->sin_port = cpu_to_be_w(sockaddr->ipv4addr.port);
break;
case SOCKET_TYPE_LOCAL:
unaddr_t *unaddr = (unaddr_t *)abisockaddr;
strcpy(unaddr->sun_path, sockaddr->path);
break;
default:
return EINVAL;
}
@@ -93,6 +112,8 @@ static inline void sock_freemsghdr(msghdr_t *hdr) {
free(hdr->addr);
}
void localsock_leavebinding(vnode_t *vnode);
socket_t *localsock_createsocket();
socket_t *udp_createsocket();
socket_t *socket_create(int type);
int sockfs_newsocket(vnode_t **vnodep, socket_t *socket);