# HG changeset patch # User Mike Pavone # Date 1376046953 25200 # Node ID 7db37f040a6ff8d34db328da0db7746e11271820 # Parent 547153211389dc14d1ec7df829e8f94ce119ff70 Basic socket support diff -r 547153211389 -r 7db37f040a6f modules/socket.tp --- a/modules/socket.tp Fri Aug 09 03:58:42 2013 -0700 +++ b/modules/socket.tp Fri Aug 09 04:15:53 2013 -0700 @@ -1,4 +1,8 @@ #{ + includeSystemHeader: "sys/types.h" + includeSystemHeader: "sys/socket.h" + includeSystemHeader: "netdb.h" + llMessage: AF_INET withVars: { intret <- obj_int32 ptr } andCode: { @@ -37,12 +41,7 @@ fd num!: (socket: (domain num) (type num) (protocol num)) fd } - - llMessage: getaddrinfo withVars: { - - } andCode: { - } - + new <- :domain type protocol { sfd <- socket: domain type protocol #{ @@ -54,13 +53,61 @@ close: (sfd num) self } + llMessage: send:withFlags withVars: { + odata <- object ptr + flags <- obj_int32 ptr + sdata <- string ptr + sfd <- obj_int32 ptr + res <- obj_int32 ptr + } andCode: :odata :flags { + sdata <- mcall: string 1 odata + sfd <- mcall: fd 1 self + res <- make_object: (addr_of: obj_int32_meta) NULL 0 + res num!: (send: (sfd num) (sdata data) (sdata bytes) (flags num)) + res + } + send <- :data { + send: data withFlags: 0 + } } } - + + llMessage: _connectTo:onPort withVars: { + host <- string ptr + port <- string ptr + hints <- struct: addrinfo + info <- (struct: addrinfo) ptr + domain <- obj_int32 ptr + type <- obj_int32 ptr + protocol <- obj_int32 ptr + sock <- object ptr + sfd <- obj_int32 ptr + } andCode: :host :port { + memset: (addr_of: hints) 0 (sizeof: hints) + hints ai_family!: AF_UNSPEC + hints ai_socktype!: SOCK_STREAM + getaddrinfo: (host data) (port data) (addr_of: hints) (addr_of: info) + + domain <- make_object: (addr_of: obj_int32_meta) NULL 0 + domain num!: (info ai_family) + type <- make_object: (addr_of: obj_int32_meta) NULL 0 + type num!: (info ai_socktype) + protocol <- make_object: (addr_of: obj_int32_meta) NULL 0 + protocol num!: (info ai_protocol) + + sock <- mcall: new 4 self domain type protocol + sfd <- mcall: fd 1 sock + + connect: (sfd num) (info ai_addr) (info ai_addrlen) + + freeaddrinfo: info + sock + } + connectTo:onPort <- :host :port { - + _connectTo: host onPort: (string: port) } - listenOn: <- :port { + listenOn <- :port { } listenAt:onPort <- :host :port { } diff -r 547153211389 -r 7db37f040a6f samples/sock.tp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/sock.tp Fri Aug 09 04:15:53 2013 -0700 @@ -0,0 +1,8 @@ +#{ + main <- { + sock <- socket connectTo: "127.0.0.1" onPort: 12345 + sock send: "Hello, Socket!\n" + sock close + 0 + } +}