Mercurial > repos > tabletprog
diff modules/socket.tp @ 145:7db37f040a6f
Basic socket support
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 09 Aug 2013 04:15:53 -0700 |
parents | 9bce890a7ff2 |
children | 4c96a393103e |
line wrap: on
line diff
--- 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 { }