diff --git a/Makefile b/Makefile index 93eb2b6..0b65e19 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ VOC = /opt/voc/bin/voc all: - $(VOC) -s types.Mod sockets.Mod s.Mod -m + $(VOC) -s types.Mod sockets.Mod netdb.Mod irc.Mod clean: rm *.h diff --git a/irc.Mod b/irc.Mod index 4e358e7..f7e81ef 100644 --- a/irc.Mod +++ b/irc.Mod @@ -1,17 +1,25 @@ MODULE irc; -IMPORT sockets, netdb, Unix, Strings; +IMPORT sockets, netdb, Platform, Strings, types, SYSTEM; CONST strLen = 1024; +TYPE + Int16 = types.Int16; + Int32 = types.Int32; + Int64 = types.Int64; + + VAR nick*, channel*, host*, port*, user*, command*, where*, message*, sep*, target*: ARRAY strLen OF CHAR; -PROCEDURE write(fd: Int32; VAR buf: ARRAY OF CHAR; len: LONGINT); +PROCEDURE rawWrite(fd: Int32; VAR buf: ARRAY OF CHAR; len: LONGINT); VAR - l: LONGINT; + l: SYSTEM.ADDRESS; + r: INTEGER; BEGIN - Unix.Write(fd, buf, len); -END raw; + l := SYSTEM.ADR(buf); + r := Platform.Write(fd, l, len); +END rawWrite; PROCEDURE connect; VAR hints : netdb.addrInfo; @@ -29,15 +37,19 @@ BEGIN tmp32 := netdb.getAddrInfo(host, port, hints, res); conn := sockets.Socket(res^.aiFamily, res^.aiSockType, res^.aiProtocol); - tmp32 := sockets.Connect(conn, res^.aiAddr, res^.aiAddrlen); + tmp32 := sockets.Connect(conn, res^.aiAddr, res^.aiAddrLen); (* "USER test 0 0 :test\r\n" *) (* "NICK test\r\n\000\060 :test\r\n"*) COPY("USER ", str0); - Strings.Append(user, str0) + Strings.Append(user, str0); Strings.Append(" 0 0 :", str0); Strings.Append(nick, str0); str1[0] := 0AX; str1[1] := 0DX; str1[2] := 0X; Strings.Append(str1, str0); - write(conn, str0, Strings.Length(str0)); + rawWrite(conn, str0, Strings.Length(str0)); END connect; + +BEGIN + +END irc. diff --git a/netdb.Mod b/netdb.Mod index 2b18bf5..3ed15e0 100644 --- a/netdb.Mod +++ b/netdb.Mod @@ -3,11 +3,11 @@ MODULE netdb; IMPORT SYSTEM; TYPE - Int32* = INTEGER; - Int64* = LONGINT; + Int32* = LONGINT; + Int64* = HUGEINT; TYPE - PaddrInfo = POINTER [1] TO addrInfo; + PaddrInfo* = POINTER [1] TO addrInfo; addrInfo* = RECORD aiFlags*: Int32; @@ -15,14 +15,14 @@ TYPE aiSockType*: Int32; aiProtocol*: Int32; aiAddrLen*: Int32; - aiAddr*, aiCanonName*, aiNext*: LONGINT; (* pointers *) + aiAddr*, aiCanonName*, aiNext*: SYSTEM.ADDRESS; (* pointers *) END; -PROCEDURE getAddrInfo*(VAR node, service: ARRAY OF CHAR; VAR hints: addrInfo; res: LONGINT): Int32 +PROCEDURE -getAddrInfo*(VAR node, service: ARRAY OF CHAR; VAR hints: addrInfo; res: PaddrInfo): Int32 "getaddrinfo (node, service, hints, res)"; -PROCEDURE freeAddrInfo*(VAR res: addrInfo) +PROCEDURE -freeAddrInfo*(VAR res: addrInfo) "freeaddrinfo(res)"; END netdb. diff --git a/sockets.Mod b/sockets.Mod index b935f6b..beec066 100644 --- a/sockets.Mod +++ b/sockets.Mod @@ -62,7 +62,7 @@ CONST InAddrAny* = 0; TYPE - +(* (* /usr/include/netinet/in.h *) InAddr* = RECORD SAddr* : Int32; @@ -74,13 +74,17 @@ TYPE SinAddr* : InAddr; SinZero* : ARRAY 8 OF CHAR; END; +*) (* /usr/include/sys/socket.h *) SockAddr* = RECORD SaFamily* : Int16; SaData* : ARRAY 14 OF CHAR END; - +(* + PROCEDURE -includeSockets + "#include "; +*) PROCEDURE -socket(domain, type, protocol: Int32): Int32 "(int)socket(domain, type, protocol)"; @@ -114,8 +118,32 @@ TYPE END Accept; (* int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); *) - PROCEDURE Connect*(sockfd: Int32; VAR addr: SockAddr; addrlen: Int32): Int32 "(socklen_t)(connect(sockfd, addr, addrlen))"; + PROCEDURE -connect(sockfd: Int32; VAR addr: SYS.ADDRESS; addrlen: Int32): Int32 + "(INTEGER)(connect(sockfd, addr, addrlen))"; + + PROCEDURE Connect*(sockfd: Int32; sockaddr: SYS.ADDRESS; addrlen: Int32): Int32; + BEGIN + RETURN connect(sockfd, sockaddr, addrlen) + END Connect; +(* + PROCEDURE -SizeofSockaddr(): INTEGER + "sizeof(sockaddr)"; + + PROCEDURE -Error(msg: ARRAY OF CHAR; len: INTEGER) + "write(1/*stdout*/, msg, len); char ch = 0xa; write(1, &ch, 1)"; + + PROCEDURE sockaddrCheck; (* check for inconsistent usage of sigjmp_buf; better avoid Unix_JmpBuf *) + VAR x, y: LONGINT; + BEGIN + x := SizeofSockaddr(); + y := SIZE(SockAddr); + IF x # y THEN + Error("sockets.sockaddrCheck: inconsistent usage of sockaddr", 52); + HALT(1); + END +END sockaddrCheck; +*) BEGIN diff --git a/types.Mod b/types.Mod index 633e6b2..813cfa5 100644 --- a/types.Mod +++ b/types.Mod @@ -6,33 +6,36 @@ TYPE intarr64 = ARRAY 8 OF SYS.BYTE; (* to emulate int16 on x86_64; -- noch *) intarr32 = ARRAY 4 OF SYS.BYTE; intarr16 = ARRAY 2 OF SYS.BYTE; - Int16* = intarr16; (* INTEGER on 32 bit platform *) - Int32* = INTEGER; - Int64* = LONGINT; + Int16* = INTEGER; (* INTEGER on 32 bit platform *) + Int32* = LONGINT; + Int64* = HUGEINT; String* = ARRAY 256 OF CHAR; - PROCEDURE LongintToInt16*(int: LONGINT; VAR int16: Int16); - VAR longintarr : intarr64; + PROCEDURE HugeintToInt16*(in: HUGEINT; VAR out: Int16); + VAR + int64 : intarr64; + int16 : intarr16; BEGIN - (*RETURN SYS.VAL(Int16, int)*) - longintarr := SYS.VAL(intarr64, int); - int16[0] := longintarr[0]; - int16[1] := longintarr[1]; (* this will work for little endian -- noch *) - END LongintToInt16; + int64 := SYS.VAL(intarr64, in); + int16[0] := int64[0]; + int16[1] := int64[1]; + out := SYS.VAL(Int16, int16) + END HugeintToInt16; - PROCEDURE IntegerToInt16*(int: INTEGER; VAR int16: Int16); - VAR intarr : intarr32; + PROCEDURE LongintToInt16*(int: LONGINT; VAR int16: Int16); BEGIN int16 := SYS.VAL(Int16, int) - (*intarr := SYS.VAL(intarr32, int); - int16[0] := intarr[0]; - int16[1] := intarr[1];*) (* this will work for little endian -- noch *) - END IntegerToInt16; + END LongintToInt16; PROCEDURE htons*(in: Int16; VAR out : Int16); + VAR + tmpin, tmpout : intarr16; BEGIN - out[0] := in[1]; - out[1] := in[0]; + tmpin := SYS.VAL(intarr16, in); + tmpout := SYS.VAL(intarr16, out); + tmpout[0] := tmpin[1]; + tmpout[1] := tmpin[0]; + out := SYS.VAL(Int16, tmpout) END htons; END types.