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;
}