From 423861c85d69ae8821882648c38866b0ae96d5ea Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Thu, 22 Sep 2016 18:47:49 -0400 Subject: [PATCH] WIP --- srfi/106.sld | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/srfi/106.sld b/srfi/106.sld index 887d164f..0784df64 100644 --- a/srfi/106.sld +++ b/srfi/106.sld @@ -2,6 +2,8 @@ (define-library (106) ;(srfi 106) (include-c-header "") (include-c-header "") + (include-c-header "") + (include-c-header "") (include-c-header "") (import (scheme base)) (export @@ -25,6 +27,39 @@ *shut-rd* *shut-wr* *shut-rdwr* ) (begin + ;; see: http://gnosis.cx/publish/programming/sockets.html + (define-c %make-client-socket + "(void *data, int argc, closure _, object k, + object node, object service, + object family, object socktype, + object flags, object protocol)" + ;; TODO: how to pack socket objects? + ;; can we put sock fd in a vector, along with an identifier? + " int sock; + struct sockaddr_in addr; + int af = obj_obj2int(family), + type = obj_obj2int(socktype), + proto = obj_obj2int(protocol); + // TODO: put trace statement here + // TODO: type check args to this function + + if ((sock = socket(af, type, proto)) < 0) { + Cyc_rt_raise_msg(data, \"Failed to create socket\"); + } + memset(&addr 0, sizeof(addr)); /* Clear struct */ + // TODO: flags? + addr = af; + addr = inet_addr(string_str(node)); /* IP address */ + addr = htons(obj_obj2int(service)); /* server port */ + /* Establish connection */ + if (connect(sock, + (struct sockaddr *) &addr + sizeof(addr)) < 0) { + Cyc_rt_raise_msg(data, \"Failed to connect with server\"); + } + // TODO: pack socket, and pass that to k: + return_closcall1(data, k, obj_int2obj()); ") + (define-syntax make-const (er-macro-transformer (lambda (expr rename compare)