115 lines
2.9 KiB
C
115 lines
2.9 KiB
C
#include <string.h>
|
|
#include <stdio.h>
|
|
#include "quinn_net.h"
|
|
|
|
#define SYS_SOCK_LISTEN 39
|
|
#define SYS_SOCK_ACCEPT 40
|
|
|
|
int socket_listen(unsigned int socket, unsigned int addr, unsigned short port) {
|
|
int ret;
|
|
__asm__ volatile ("int $0x30" : "=a" (ret) : "0" (39), "b" (socket), "c" (addr), "d" (port));
|
|
return ret;
|
|
}
|
|
|
|
unsigned int socket_accept(unsigned int socket, struct inet_addr *clientaddr) {
|
|
unsigned int ret;
|
|
__asm__ volatile ("int $0x30" : "=a" (ret) : "0" (40), "b" (socket), "c" (clientaddr));
|
|
while (ret == 0) {
|
|
__asm__ volatile ("int $0x30" : "=a" (ret) : "0" (23)); // yield
|
|
__asm__ volatile ("int $0x30" : "=a" (ret) : "0" (40), "b" (socket), "c" (clientaddr));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
|
|
unsigned int socket_open(unsigned char type) {
|
|
unsigned int ret;
|
|
__asm__ volatile ("int $0x30" : "=a" (ret) : "0" (29), "b" (type));
|
|
return ret;
|
|
}
|
|
|
|
unsigned int socket_connect(unsigned int socket, unsigned int addr, unsigned short port) {
|
|
unsigned int ret;
|
|
__asm__ volatile ("int $0x30" : "=a" (ret) : "0" (30), "b" (socket), "c" (addr), "d" (port));
|
|
|
|
while (ret == 0) {
|
|
__asm__ volatile ("int $0x30" : "=a" (ret) : "0" (23)); // yield
|
|
// try again
|
|
__asm__ volatile ("int $0x30" : "=a" (ret) : "0" (34), "b" (socket));
|
|
}
|
|
|
|
if (ret == 2) {
|
|
ret = 0;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
void socket_close(unsigned int socket) {
|
|
unsigned int ret;
|
|
__asm__ volatile ("int $0x30" : "=a" (ret) : "0" (31), "b" (socket));
|
|
return;
|
|
}
|
|
|
|
int socket_read(unsigned int socket, char *buffer, int len) {
|
|
unsigned int ret;
|
|
__asm__ volatile ("int $0x30" : "=a" (ret) : "0" (32), "b" (socket), "c" (buffer), "d" (len));
|
|
while (ret == -1) {
|
|
__asm__ volatile ("int $0x30" : "=a" (ret) : "0" (23)); // yield
|
|
__asm__ volatile ("int $0x30" : "=a" (ret) : "0" (32), "b" (socket), "c" (buffer), "d" (len));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int socket_write(unsigned int socket, char *buffer, unsigned int len) {
|
|
unsigned int ret;
|
|
__asm__ volatile ("int $0x30" : "=a" (ret) : "0" (33), "b" (socket), "c" (buffer), "d" (len));
|
|
return ret;
|
|
}
|
|
|
|
unsigned int ipv4_aton(char* ipAddress) {
|
|
unsigned char ip[4];
|
|
unsigned int theip;
|
|
int i, j;
|
|
|
|
memset(ip, 0, 4);
|
|
|
|
for (i=0;i<4;i++) {
|
|
if (ipAddress[i] == '.') {
|
|
break;
|
|
}
|
|
ip[0] = ip[0] * 10 + (ipAddress[i] - '0');
|
|
}
|
|
|
|
j = i + 1;
|
|
for (i=j;i<j+4;i++) {
|
|
if (ipAddress[i] == '.') {
|
|
break;
|
|
}
|
|
ip[1] = ip[1] * 10 + (ipAddress[i] - '0');
|
|
}
|
|
j = i + 1;
|
|
for (i=j;i<j+4;i++) {
|
|
if (ipAddress[i] == '.') {
|
|
break;
|
|
}
|
|
ip[2] = ip[2] * 10 + (ipAddress[i] - '0');
|
|
}
|
|
j = i + 1;
|
|
for (i=j;i<j+4;i++) {
|
|
if (ipAddress[i] == '\0') {
|
|
break;
|
|
}
|
|
ip[3] = ip[3] * 10 + (ipAddress[i] - '0');
|
|
}
|
|
|
|
theip = 0;
|
|
theip = (ip[0] << 24) | (ip[1] << 16) | (ip [2] << 8) | ip[3];
|
|
return theip;
|
|
}
|
|
|
|
char *ipv4_ntoa(unsigned int ipAddress, char *buffer) {
|
|
sprintf(buffer, "%d.%d.%d.%d", (ipAddress >> 24) & 0xff, (ipAddress >> 16) & 0xff, (ipAddress >> 8) & 0xff, ipAddress & 0xff);
|
|
return buffer;
|
|
}
|