pavone@139: #{ pavone@145: includeSystemHeader: "sys/types.h" pavone@145: includeSystemHeader: "sys/socket.h" pavone@145: includeSystemHeader: "netdb.h" pavone@145: pavone@139: llMessage: AF_INET withVars: { pavone@139: intret <- obj_int32 ptr pavone@139: } andCode: { pavone@139: intret <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@139: intret num!: AF_INET pavone@139: intret pavone@139: } pavone@139: llMessage: AF_UNIX withVars: { pavone@139: intret <- obj_int32 ptr pavone@139: } andCode: { pavone@139: intret <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@139: intret num!: AF_UNIX pavone@139: intret pavone@139: } pavone@139: llMessage: STREAM withVars: { pavone@139: intret <- obj_int32 ptr pavone@139: } andCode: { pavone@139: intret <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@139: intret num!: SOCK_STREAM pavone@139: intret pavone@139: } pavone@139: llMessage: DGRAM withVars: { pavone@139: intret <- obj_int32 ptr pavone@139: } andCode: { pavone@139: intret <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@139: intret num!: SOCK_DGRAM pavone@139: intret pavone@139: } pavone@139: llMessage: socket withVars: { pavone@139: fd <- obj_int32 ptr pavone@139: domain <- obj_int32 ptr pavone@139: type <- obj_int32 ptr pavone@139: protocol <- obj_int32 ptr pavone@139: } andCode: :domain type protocol { pavone@139: fd <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@139: fd num!: (socket: (domain num) (type num) (protocol num)) pavone@139: fd pavone@139: } pavone@145: pavone@139: new <- :domain type protocol { pavone@139: sfd <- socket: domain type protocol pavone@139: #{ pavone@139: fd <- {sfd} pavone@147: pavone@139: llMessage: close withVars: { pavone@139: sfd <- obj_int32 ptr pavone@139: } andCode: { pavone@139: sfd <- mcall: fd 1 self pavone@139: close: (sfd num) pavone@139: self pavone@139: } pavone@147: pavone@145: llMessage: send:withFlags withVars: { pavone@145: odata <- object ptr pavone@145: flags <- obj_int32 ptr pavone@145: sdata <- string ptr pavone@145: sfd <- obj_int32 ptr pavone@145: res <- obj_int32 ptr pavone@145: } andCode: :odata :flags { pavone@145: sdata <- mcall: string 1 odata pavone@145: sfd <- mcall: fd 1 self pavone@145: res <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@145: res num!: (send: (sfd num) (sdata data) (sdata bytes) (flags num)) pavone@145: res pavone@145: } pavone@145: send <- :data { pavone@145: send: data withFlags: 0 pavone@145: } pavone@147: pavone@147: llMessage: recv:withFlags withVars: { pavone@147: length <- obj_int32 ptr pavone@147: flags <- obj_int32 ptr pavone@147: sfd <- obj_int32 ptr pavone@147: res <- int pavone@147: buf <- char ptr pavone@147: out <- string ptr pavone@147: } andCode: :length :flags { pavone@147: sfd <- mcall: fd 1 self pavone@147: buf <- GC_MALLOC_ATOMIC: (length num) + 1 pavone@147: res <- recv: (sfd num) buf (length num) (flags num) pavone@147: if: res < 0 { pavone@147: length <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@147: length num!: res pavone@147: length pavone@147: } else: { pavone@147: out <- make_object: (addr_of: string_meta) NULL 0 pavone@147: out bytes!: res pavone@147: out len!: res pavone@147: out data!: buf pavone@147: out pavone@147: } pavone@147: } pavone@147: recv <- :length { pavone@147: recv: length withFlags: 0 pavone@147: } pavone@147: recvAll <- :len { pavone@147: received <- "" pavone@147: error <- false pavone@147: while: { (not: error) && (received length) < len} do: { pavone@147: res <- recv: (len - (received length)) pavone@147: if: (res isInteger?) || (res length) = 0 { pavone@147: error <- true pavone@147: } else: { pavone@147: received <- received . res pavone@147: } pavone@147: } pavone@147: received pavone@147: } pavone@139: } pavone@139: } pavone@145: pavone@145: llMessage: _connectTo:onPort withVars: { pavone@145: host <- string ptr pavone@145: port <- string ptr pavone@145: hints <- struct: addrinfo pavone@145: info <- (struct: addrinfo) ptr pavone@145: domain <- obj_int32 ptr pavone@145: type <- obj_int32 ptr pavone@145: protocol <- obj_int32 ptr pavone@145: sock <- object ptr pavone@145: sfd <- obj_int32 ptr pavone@145: } andCode: :host :port { pavone@145: memset: (addr_of: hints) 0 (sizeof: hints) pavone@145: hints ai_family!: AF_UNSPEC pavone@145: hints ai_socktype!: SOCK_STREAM pavone@145: getaddrinfo: (host data) (port data) (addr_of: hints) (addr_of: info) pavone@145: pavone@145: domain <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@145: domain num!: (info ai_family) pavone@145: type <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@145: type num!: (info ai_socktype) pavone@145: protocol <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@145: protocol num!: (info ai_protocol) pavone@145: pavone@145: sock <- mcall: new 4 self domain type protocol pavone@145: sfd <- mcall: fd 1 sock pavone@145: pavone@145: connect: (sfd num) (info ai_addr) (info ai_addrlen) pavone@145: pavone@145: freeaddrinfo: info pavone@145: sock pavone@145: } pavone@145: pavone@139: connectTo:onPort <- :host :port { pavone@145: _connectTo: host onPort: (string: port) pavone@139: } pavone@145: listenOn <- :port { pavone@139: } pavone@139: listenAt:onPort <- :host :port { pavone@139: } pavone@139: }