mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 12:48:22 +00:00
syscalls: accept connect listen
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user