lib/min_net.nim
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
import net, nativesockets import ../core/parser, ../core/value, ../core/interpreter, ../core/utils # Time proc net_module*(i: In)= let def = i.define() def.symbol("socket") do (i: In): let vals = i.expect "dict" var q = vals[0] # (ipv4 stream tcp) if q.qVal.len < 3 or not (q.qVal[0].isSymbol and q.qVal[1].isSymbol and q.qVal[2].isSymbol): raiseInvalid("Quotation must contain three symbols for <domain> <type> <protocol>") let values = q.qVal if not ["ipv4", "ipv6"].contains(values[0].symVal): raiseInvalid("Domain symbol must be 'ipv4' or 'ipv6'") if not ["stream", "dgram"].contains(values[1].symVal): raiseInvalid("Type symbol must be 'stream' or 'dgram'") if not ["tcp", "udp"].contains(values[2].symVal): raiseInvalid("Protocol symbol must be 'tcp' or 'udp'") var domain: Domain sockettype: SockType protocol: Protocol sDomain, sSockType, sProtocol: string # Process domain if values[0].symVal == "ipv4": sDomain = "ipv4" domain = AF_INET else: sDomain = "ipv6" domain = AF_INET6 if values[1].symVal == "stream": sSockType = "stream" sockettype = SOCK_STREAM else: sSockType = "dgram" sockettype = SOCK_DGRAM if values[2].symVal == "tcp": sProtocol = "tcp" protocol = IPPROTO_TCP else: sProtocol = "udp" protocol = IPPROTO_UDP var socket = newSocket(domain, sockettype, protocol) var skt = newSeq[MinValue](0).newVal(i.scope) i.dset(skt, "domain".newSym, sDomain.newVal) i.dset(skt, "type".newSym, sSockType.newVal) i.dset(skt, "protocol".newSym, sProtocol.newVal) skt.objType = "socket" skt.obj = socket[].addr def.finalize("net") |