From b1d7006dfc63c1150c2aff3b5b98db1ebd838b3e Mon Sep 17 00:00:00 2001 From: norayr Date: Fri, 14 Apr 2017 14:31:16 +0400 Subject: [PATCH] forgot to add Internet.Mod. --- IRC.Mod | 19 ++++++++---- Internet.Mod | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++ sockets.Mod | 6 ++++ test.Mod | 9 +++--- 4 files changed, 106 insertions(+), 10 deletions(-) create mode 100644 Internet.Mod diff --git a/IRC.Mod b/IRC.Mod index c2f4921..9e8a92b 100644 --- a/IRC.Mod +++ b/IRC.Mod @@ -1,28 +1,35 @@ MODULE IRC; IMPORT Internet, Out, Strings, types; -CONST strLen = 1024; +CONST msgLen = 512; (* message length not more than 512 characters *) VAR connection : Internet.Socket; -PROCEDURE Auth*(user, nick: ARRAY OF CHAR): BOOLEAN; +PROCEDURE Auth*(user, nick, owner: ARRAY OF CHAR): BOOLEAN; VAR str0, str1: ARRAY 255 OF CHAR; b : BOOLEAN; BEGIN -(* "USER test 0 0 :test\r\n" *) +(* "USER test 0 * :test\r\n" *) (* "NICK test\r\n\000\060 :test\r\n"*) - COPY("USER ", str0); + + str1[0] := 0AX; str1[1] := 0DX; str1[2] := 0X; + + COPY("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(owner, str0); + (* by the spec the command is terminated by \r\n *) Strings.Append(str1, str0); Out.String("sending:"); Out.Ln; Out.String(str0); Out.Ln; b := Internet.Write(connection, str0, Strings.Length(str0)); IF b THEN Out.String("wrote!"); Out.Ln ELSE Out.String("write failed"); Out.Ln END; + COPY ("NICK ", str0); + Strings.Append (nick, str0); + Strings.Append(str1, str0); + IF b THEN Out.String("wrote!"); Out.Ln ELSE Out.String("write failed"); Out.Ln END; RETURN b END Auth; diff --git a/Internet.Mod b/Internet.Mod new file mode 100644 index 0000000..529c605 --- /dev/null +++ b/Internet.Mod @@ -0,0 +1,82 @@ +MODULE Internet; +IMPORT sockets, netdb, Platform, types, Out, SYSTEM; + +TYPE + + Socket* = LONGINT; (* INT32 *) + + Int16 = types.Int16; + Int32 = types.Int32; + Int64 = types.Int64; + +PROCEDURE Write*(fd: Socket; VAR buf: ARRAY OF CHAR; len: LONGINT): BOOLEAN; +VAR + l: SYSTEM.ADDRESS; + r: INTEGER; +BEGIN + l := SYSTEM.ADR(buf); + r := Platform.Write(fd, l, len); + IF r = -1 THEN + (*Out.String("write() failed."); Out.Ln;*) + RETURN FALSE + ELSE + (*Out.String("write() success."); Out.Ln;*) + RETURN TRUE + END; +END Write; + + +PROCEDURE Connect*(host, port: ARRAY OF CHAR; VAR conn: Socket): BOOLEAN; +VAR + hints, res : netdb.addrInfo; + pres, pres2, phints: netdb.PaddrInfo; + tmpaddr : SYSTEM.ADDRESS; + tmp32 : netdb.Int32; + (*conn : netdb.Int32;*) +BEGIN + hints.aiFamily := sockets.AfUnspec; + hints.aiSockType := sockets.SockStream; + hints.aiFlags := 0; + hints.aiProtocol := netdb.ipprotoTCP; + hints.aiAddrLen := 0; + hints.aiAddr := 0; hints.aiCanonName := 0; hints.aiNext := 0; + + phints := SYSTEM.VAL(netdb.PaddrInfo, SYSTEM.ADR(hints)); + pres := SYSTEM.VAL(netdb.PaddrInfo, SYSTEM.ADR(res)); + pres2 := SYSTEM.VAL(netdb.PaddrInfo, SYSTEM.ADR(pres)); + + tmp32 := netdb.getAddrInfo(host, port, phints, pres2); + + IF tmp32 # 0 THEN + Out.String("getaddrinfo() failed"); Out.Ln; + HALT(1); + ELSE + Out.String("getaddrinfo() returned 0, success"); Out.Ln; + END; + + conn := sockets.Socket(pres^.aiFamily, pres^.aiSockType, pres^.aiProtocol); + + IF conn = -1 THEN + Out.String("socket() returned -1, error"); Out.Ln; + HALT(1); + ELSE + Out.String("socket() succeeded."); Out.Ln; + END; + + tmpaddr := SYSTEM.ADR(pres^.aiAddr); + + tmp32 := sockets.Connect(conn, pres^.aiAddr, pres^.aiAddrLen); + netdb.freeAddrInfo(pres); + IF tmp32 = 0 THEN + Out.String("connect() succeeded."); Out.Ln; + RETURN TRUE + ELSE + Out.String("connect() failed."); Out.Ln; + RETURN FALSE + END; + + +END Connect; + + +END Internet. diff --git a/sockets.Mod b/sockets.Mod index a352c30..56c8c9f 100644 --- a/sockets.Mod +++ b/sockets.Mod @@ -126,6 +126,12 @@ TYPE BEGIN RETURN connect(sockfd, sockaddr, addrlen) END Connect; + + (* ssize_t recv(int sockfd, void *buf, size_t len, int flags); *) + + PROCEDURE -recv(sockfd: Int32; buf: SYS.ADDRESS; len: Int64; flags: Int32):Int64 + "(HUGEINT)recv(sockfd, buf, len, flags)"; + (* PROCEDURE -SizeofSockaddr(): INTEGER "sizeof(sockaddr)"; diff --git a/test.Mod b/test.Mod index 5165f4c..b1f242a 100644 --- a/test.Mod +++ b/test.Mod @@ -4,21 +4,22 @@ IMPORT IRC, Out; VAR -owner, nick, host, port, channel: ARRAY 32 OF CHAR; +owner, user, nick, host, port, channel: ARRAY 32 OF CHAR; PROCEDURE testBot; VAR b : BOOLEAN; BEGIN IF IRC.Connect(host, port) # FALSE THEN - b := IRC.Auth("norayr", "norayr"); + b := IRC.Auth(user, nick, owner); END; END testBot; BEGIN -owner := "norayr"; -nick := "norayr"; +owner := "norayr_tanakian"; +user := "norayr"; +nick := "arnet"; host := "irc.freenode.net"; port := "6667"; channel := "#oberon";