Update test files to v2.

This commit is contained in:
David Brown 2016-06-16 16:25:36 +01:00
parent a9b273e30a
commit ce855c93c8
6 changed files with 212 additions and 241 deletions

View file

@ -1,106 +1,90 @@
MODULE s;
IMPORT sockets, types, Out := Console, Unix, S := SYSTEM;
IMPORT sockets, types, Out := Console, SYSTEM, Platform, Strings;
TYPE Int32 = types.Int32;
Int16 = types.Int16;
String = types.String;
PROCEDURE DoSmth(sock : Int32);
VAR str, aff : String;
n, s : LONGINT;
PROCEDURE DoSmth(sock: Platform.FileHandle);
VAR
str, aff: ARRAY 256 OF CHAR;
n: LONGINT;
BEGIN
s := SIZE(String);
aff := "Affirmative, Dave";
n := Unix.Read(sock, S.ADR(str), s);
IF n < 0 THEN
Out.String("error reading from socket"); Out.Ln;
END;
Out.String("received message is "); Out.String(str); Out.Ln;
s := 17;
n := Unix.Write(sock, S.ADR(aff), s);
IF n < 2 THEN
aff := "Affirmative, Dave";
(* IF Platform.Read(sock, SYSTEM.ADR(str), 256, n) # 0 THEN *)
IF Platform.ReadBuf(sock, str, n) # 0 THEN
Out.String("error reading from socket"); Out.Ln;
ELSE
str[n] := 0X; (* Make sure that received message is zero terminated *)
Out.String("received message is "); Out.String(str); Out.Ln;
IF Platform.Write(sock, SYSTEM.ADR(aff), Strings.Length(aff)) # 0 THEN
Out.String("error writing to socket"); Out.Ln
END;
END;
END;
END DoSmth;
PROCEDURE ZeroByteArr(VAR a : ARRAY OF S.BYTE);
VAR i : LONGINT;
BEGIN
FOR i := 0 TO LEN(a)-1 DO
a[i] := 0
END;
END ZeroByteArr;
PROCEDURE -includeunistd "#include <unistd.h>";
PROCEDURE -fork(): LONGINT "(LONGINT)fork()";
PROCEDURE serve;
VAR sockfd, newsockfd, portno, clilen, pid: sockets.Int32;
ServAddr, CliAddr: sockets.SockAddrIn;
Null : Int32;
Port, maxQueue, res : Int32;
afinet, port, port0: Int16;
CONST
Port = 2055;
MaxQueue = 5;
VAR
sockfd: LONGINT;
newsockfd: LONGINT;
ServAddr: sockets.SockAddrIn;
pid: LONGINT;
res: Platform.ErrorCode;
sockaddrlen: LONGINT;
BEGIN
Port := 2055;
maxQueue := 5;
Null := 0;
sockfd := sockets.Socket(S.VAL(Int32, sockets.AfInet), S.VAL(Int32, sockets.SockStream), Null);
IF sockfd < 0 THEN
Out.String("error opening socket")
ELSE
Out.String("socket created.")
END;
Out.Ln;
types.IntegerToInt16(sockets.AfInet, afinet);
types.IntegerToInt16(Port, port);
types.htons(port, port0); (* only necessary on little endian computers *)
ServAddr.SinFamily := afinet;
ServAddr.SinPort := port0;
ZeroByteArr(ServAddr.SinZero);
(*Out.String("listening on port ");Out.Int(S.VAL(INTEGER, ServAddr.SinPort), 0); Out.Ln;*)
ServAddr.SinAddr.SAddr := 0(*sockets.InAddrAny*);
res := sockets.Bind(sockfd, S.VAL(sockets.SockAddr, ServAddr), (SIZE(sockets.SockAddr)));
IF res < 0 THEN
Out.String("error on binding")
ELSE
Out.String("binding completed.")
END;
Out.Ln;
sockfd := sockets.Socket(sockets.AfInet, sockets.SockStream, 0);
IF sockfd < 0 THEN
Out.String("error opening socket")
ELSE
Out.String("socket created.")
END;
Out.Ln;
sockets.SetSockAddrIn(sockets.AfInet, Port, 0, ServAddr);
IF sockets.Bind(sockfd, SYSTEM.VAL(sockets.SockAddr, ServAddr), SIZE(sockets.SockAddr)) < 0 THEN
Out.String("error on binding")
ELSE
Out.String("binding completed.")
END;
Out.Ln;
res := sockets.Listen(sockfd, maxQueue);
IF res # 0 THEN
Out.String("listen() failed");
ELSE
Out.String("listen okay");
END;
Out.Ln;
clilen := SIZE(sockets.SockAddrIn);
LOOP
newsockfd := sockets.Accept(sockfd, S.VAL(sockets.SockAddr, ServAddr), clilen);
IF newsockfd < 0 THEN
Out.String("error on accept")
ELSE
Out.String("accept okay")
END;
Out.Ln;
pid := Unix.Fork();
IF pid < 0 THEN
Out.String("error on fork")
ELSIF pid = 0 THEN
Out.String("forked okay"); Out.Ln;
res := Unix.Close(sockfd);
DoSmth(newsockfd);
EXIT
ELSE
res := Unix.Close(newsockfd);
END;
END;
IF sockets.Listen(sockfd, MaxQueue) # 0 THEN
Out.String("listen() failed");
ELSE
Out.String("listen okay");
END;
Out.Ln;
LOOP
sockaddrlen := SIZE(sockets.SockAddrIn);
newsockfd := sockets.Accept(sockfd, SYSTEM.VAL(sockets.SockAddr, ServAddr), sockaddrlen);
IF newsockfd < 0 THEN
Out.String("error on accept")
ELSE
Out.String("accept okay")
END;
Out.Ln;
pid := fork();
IF pid < 0 THEN
Out.String("error on fork")
ELSIF pid = 0 THEN
Out.String("forked okay"); Out.Ln;
res := Platform.Close(sockfd);
DoSmth(newsockfd);
EXIT
ELSE
res := Platform.Close(newsockfd)
END
END
END serve;