summaryrefslogtreecommitdiff
path: root/std/net.zc
diff options
context:
space:
mode:
Diffstat (limited to 'std/net.zc')
-rw-r--r--std/net.zc46
1 files changed, 30 insertions, 16 deletions
diff --git a/std/net.zc b/std/net.zc
index 72c3fcb..d410a4d 100644
--- a/std/net.zc
+++ b/std/net.zc
@@ -8,12 +8,22 @@ include <errno.h>
import "./core.zc"
import "./result.zc"
import "./string.zc"
+import "./mem.zc"
def Z_AF_INET = 2;
def Z_SOCK_STREAM = 1;
+// Direct externs for simple socket functions
+extern fn socket(domain: int, type: int, proto: int) -> int;
+extern fn close(fd: int) -> int;
+extern fn read(fd: int, buf: void*, count: usize) -> isize;
+
+// Minimal raw block: required for struct sockaddr_in usage
+// These functions encapsulate sockaddr_in setup because the struct layout
+// cannot be declared in Zen-C without type conflicts with C headers.
+// Also includes inet_pton, htons, bind, connect, listen, accept wrappers.
raw {
- static int _z_net_bind(int fd, char *host, int port) {
+ static int _z_net_bind(int fd, const char *host, int port) {
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
@@ -27,7 +37,7 @@ raw {
return 0;
}
- static int _z_net_connect(int fd, char *host, int port) {
+ static int _z_net_connect(int fd, const char *host, int port) {
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
@@ -36,28 +46,20 @@ raw {
if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) return -2;
return 0;
}
-
+
static int _z_net_accept(int fd) {
return accept(fd, NULL, NULL);
}
- static ssize_t _z_net_read(int fd, char* buf, size_t n) {
- return read(fd, (void*)buf, n);
- }
-
- static ssize_t _z_net_write(int fd, char* buf, size_t n) {
+ static ssize_t _z_net_write(int fd, const char* buf, size_t n) {
return write(fd, (const void*)buf, n);
}
}
-extern fn socket(domain: int, type: int, proto: int) -> int;
-extern fn close(fd: int) -> int;
-
-extern fn _z_net_bind(fd: int, host: char*, port: int) -> int;
-extern fn _z_net_connect(fd: int, host: char*, port: int) -> int;
+extern fn _z_net_bind(fd: int, host: const char*, port: int) -> int;
+extern fn _z_net_connect(fd: int, host: const char*, port: int) -> int;
extern fn _z_net_accept(fd: int) -> int;
-extern fn _z_net_read(fd: int, buf: char*, n: usize) -> isize;
-extern fn _z_net_write(fd: int, buf: char*, n: usize) -> isize;
+extern fn _z_net_write(fd: int, buf: const char*, n: usize) -> isize;
struct TcpStream {
@@ -66,7 +68,7 @@ struct TcpStream {
impl TcpStream {
fn read(self, buf: char*, len: usize) -> Result<usize> {
- let n = _z_net_read(self.fd, buf, len);
+ let n = read(self.fd, (void*)buf, len);
if (n < 0) return Result<usize>::Err("Read failed");
return Result<usize>::Ok((usize)n);
}
@@ -96,6 +98,12 @@ impl TcpStream {
}
}
+impl Drop for TcpStream {
+ fn drop(self) {
+ self.close();
+ }
+}
+
struct TcpListener {
fd: int;
}
@@ -126,3 +134,9 @@ impl TcpListener {
}
}
}
+
+impl Drop for TcpListener {
+ fn drop(self) {
+ self.close();
+ }
+}