From afe5a2d824ab1f180f0403c645c99851ee539662 Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Fri, 21 Feb 2025 04:48:39 +0400 Subject: [PATCH] now test server can listen on any ipv4 address. --- src/compiler/OPV.Mod | 107 ++++++++++++++++++++++----------- src/test/server/s.Mod | 15 +++-- src/test/server/sockets.Mod | 115 ++++++++++++++++++------------------ 3 files changed, 141 insertions(+), 96 deletions(-) diff --git a/src/compiler/OPV.Mod b/src/compiler/OPV.Mod index c6b26c05..2239bfe3 100644 --- a/src/compiler/OPV.Mod +++ b/src/compiler/OPV.Mod @@ -6,7 +6,7 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96 various promotion rules changed (long) => (LONGINT), xxxL avoided *) - IMPORT OPT, OPC, OPM, OPS, SYSTEM; + IMPORT OPT, OPC, OPM, OPS, VT100, Strings, SYSTEM; CONST UndefinedType = 0; (* named type not yet defined *) @@ -28,6 +28,7 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96 GuardPtrFunc = "__GUARDP("; GuardRecFunc = "__GUARDR("; TypeFunc = "__TYPEOF("; + SetOfFunc = "__SETOF("; CopyFunc = "__COPY("; MoveFunc = "__MOVE("; GetFunc = "__GET("; @@ -44,7 +45,7 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96 TYPE ExitInfo = RECORD level, label: INTEGER END ; - + tmpName = POINTER TO ARRAY 32 OF CHAR; VAR stamp: INTEGER; (* unique number for nested objects *) @@ -52,6 +53,20 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96 exit: ExitInfo; (* to check if EXIT is simply a break *) nofExitLabels: INTEGER; + tempCounter: INTEGER; (* to generate unique temp names *) + + PROCEDURE uniqueTempName(): tmpName; + VAR + num: ARRAY 8 OF CHAR; + tempName: tmpName; + BEGIN + INC(tempCounter); + NEW(tempName); + COPY("_voc_tmp_", tempName^); + VT100.IntToStr(tempCounter, num); + Strings.Append(num, tempName^); + RETURN tempName; + END uniqueTempName; PROCEDURE Init*; BEGIN @@ -196,7 +211,7 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96 OPT.bit, OPT.lsh, OPT.rot: RETURN 10 - ELSE OPM.LogWStr("unhandled case in OPV.Precedence OPT.Ndop, subclass = "); OPM.LogWNum(subclass, 0); OPM.LogWLn; + ELSE OPM.LogWStr("unhandled case in OPV.Precedence OPT.Ndop, subclass = "); OPM.LogWNum(subclass, 0); OPM.LogWLn; END; | OPT.Nupto: RETURN 10 | OPT.Ntype, @@ -214,13 +229,13 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96 BEGIN WHILE (n^.class = OPT.Nindex) & (n^.typ^.comp = OPT.DynArr(*26.7.2002*)) DO INC(dim); n := n^.left END ; IF (n^.class = OPT.Nderef) & (n^.typ^.comp = OPT.DynArr) THEN - d := dim; array := n^.typ; - WHILE d > 0 DO array := array^.BaseTyp; DEC(d) END; - IF array^.comp = OPT.DynArr THEN + d := dim; array := n^.typ; + WHILE d > 0 DO array := array^.BaseTyp; DEC(d) END; + IF array^.comp = OPT.DynArr THEN design(n^.left, 10); OPM.WriteString("->len["); OPM.WriteInt(dim); OPM.Write("]") - ELSE + ELSE OPM.WriteInt(array^.n) - END + END ELSE OPC.Len(n^.obj, n^.typ, dim) END @@ -255,27 +270,39 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96 END END SizeCast; - PROCEDURE Convert(n: OPT.Node; newtype: OPT.Struct; prec: INTEGER); - VAR from, to: INTEGER; - BEGIN from := n^.typ^.form; to := newtype.form; - IF to = OPT.Set THEN - IF from = OPT.Set THEN (* Sets of different size *) - SizeCast(n, newtype.size); - ELSE (* Set from integer *) - OPM.WriteString("__SETOF("); Entier(n, MinPrec); - OPM.WriteString(","); OPM.WriteInt(newtype.size*8); OPM.Write(CloseParen) - END - ELSIF to = OPT.Int THEN (* integers of different size *) +PROCEDURE Convert(n: OPT.Node; newtype: OPT.Struct; prec: INTEGER); +VAR + from, to: INTEGER; + tempName: tmpName; + tempIndex: INTEGER; (* New variable to manage temporary indexes *) +BEGIN + from := n^.typ^.form; + to := newtype.form; + + IF to = OPT.Set THEN + tempName := uniqueTempName(); + tempIndex := 0; (* Initialize temp index *) + OPM.WriteString("UINT32 "); OPM.WriteString(tempName^); OPM.WriteString(" = 0;"); (* Correctly initialize variable *) + OPM.WriteLn; + + IF from = OPT.Set THEN SizeCast(n, newtype.size); - ELSIF to = OPT.Char THEN - IF OPM.ranchk IN OPM.Options THEN OPM.WriteString("__CHR"); - IF SideEffects(n) THEN OPM.Write("F") END ; - OPM.Write(OpenParen); Entier(n, MinPrec); OPM.Write(CloseParen) - ELSE OPM.WriteString("(CHAR)"); Entier(n, 9) - END - ELSE expr(n, prec) + ELSE + OPM.WriteString(tempName^); OPM.WriteString(" = __SETOF("); + Entier(n, MinPrec); + OPM.WriteString(","); + OPM.WriteInt(newtype.size * 8); + OPM.WriteString(");"); + OPM.WriteLn; + OPM.WriteString("i |= "); OPM.WriteString(tempName^); OPM.WriteString(";"); (* Ensure 'i' is declared *) END - END Convert; + ELSIF to = OPT.Int THEN + SizeCast(n, newtype.size); + ELSE + expr(n, prec); + END +END Convert; + PROCEDURE TypeOf(n: OPT.Node); BEGIN @@ -576,7 +603,7 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96 IF SideEffects(n) THEN OPM.WriteString("__MODF(") ELSE OPM.WriteString("__MOD(") END; - ELSE OPM.LogWStr("unhandled case in OPV.expr, subclass = "); OPM.LogWNum(subclass, 0); OPM.LogWLn; + ELSE OPM.LogWStr("unhandled case in OPV.expr, subclass = "); OPM.LogWNum(subclass, 0); OPM.LogWLn; END ; expr(l, MinPrec); OPM.WriteString(Comma); @@ -622,10 +649,10 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96 ELSE OPM.WriteString(" - ") END; | OPS.or: OPM.WriteString(" || "); - ELSE OPM.LogWStr("unhandled case in OPV.expr, subclass = "); OPM.LogWNum(subclass, 0); OPM.LogWLn; + ELSE OPM.LogWStr("unhandled case in OPV.expr, subclass = "); OPM.LogWNum(subclass, 0); OPM.LogWLn; END; expr(r, exprPrec); - IF (subclass = OPS.and) OR ((form = OPT.Set) & ((subclass = OPS.times) OR (subclass = OPS.minus))) THEN OPM.Write(CloseParen) END; (* to silence clang warnings, -- noch*) + IF (subclass = OPS.and) OR ((form = OPT.Set) & ((subclass = OPS.times) OR (subclass = OPS.minus))) THEN OPM.Write(CloseParen) END; (* to silence clang warnings, -- noch*) END | OPT.Ncall: IF (l^.obj # NIL) & (l^.obj^.mode = OPT.TProc) THEN IF l^.subcl = OPT.super THEN proc := SuperProc(n) @@ -769,6 +796,7 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96 PROCEDURE stat(n: OPT.Node; outerProc: OPT.Object); VAR proc: OPT.Object; saved: ExitInfo; l, r: OPT.Node; + tempName, tempVar: tmpName; BEGIN WHILE (n # NIL) & OPM.noerr DO OPM.errpos := OPM.Longint(n^.conval^.intval); @@ -833,9 +861,17 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96 | OPT.incfn, OPT.decfn: expr(n^.left, MinPrec); OPC.Increment(n^.subcl = OPT.decfn); expr(n^.right, MinPrec) | OPT.inclfn, - OPT.exclfn: expr(n^.left, MinPrec); OPC.SetInclude(n^.subcl = OPT.exclfn); - OPM.WriteString("__SETOF("); expr(n^.right, MinPrec); - OPM.WriteString(","); OPM.WriteInt(n.left.typ.size*8); OPM.Write(CloseParen) + OPT.exclfn: + tempName := uniqueTempName(); + OPM.WriteString("UINT32 "); OPM.WriteString(tempName^); OPM.WriteString(";"); + OPM.WriteLn; + + OPM.WriteString(tempName^); OPM.WriteString(" = __SETOF("); + expr(n^.right, MinPrec); + OPM.WriteString(","); OPM.WriteInt(n.left.typ.size * 8); + OPM.WriteString(");"); + OPM.WriteLn; + OPM.WriteString("i |= "); OPM.WriteString(tempName^); OPM.WriteString(";"); | OPT.copyfn: OPM.WriteString(CopyFunc); expr(n^.right, MinPrec); OPM.WriteString(Comma); expr(n^.left, MinPrec); OPM.WriteString(Comma); Len(n^.left, 0); OPM.Write(CloseParen) @@ -857,7 +893,7 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96 design(n^.left, MinPrec); OPM.WriteString(", "); expr(n^.right, MinPrec); OPM.Write(")") - ELSE OPM.LogWStr("unhandled case in OPV.expr, n^.subcl = "); OPM.LogWNum(n^.subcl, 0); OPM.LogWLn; + ELSE OPM.LogWStr("unhandled case in OPV.expr, n^.subcl = "); OPM.LogWNum(n^.subcl, 0); OPM.LogWLn; END | OPT.Ncall: IF (n^.left^.obj # NIL) & (n^.left^.obj^.mode = OPT.TProc) THEN IF n^.left^.subcl = OPT.super THEN proc := SuperProc(n) @@ -931,4 +967,7 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96 OPC.GenBdy(prog^.right); stat(prog, NIL) END Module; +BEGIN + tempCounter := 0 + END OPV. diff --git a/src/test/server/s.Mod b/src/test/server/s.Mod index be04d59e..38a92496 100644 --- a/src/test/server/s.Mod +++ b/src/test/server/s.Mod @@ -4,7 +4,7 @@ IMPORT sockets, types, Out := Console, SYSTEM, Platform, Strings; PROCEDURE DoSmth(sock: Platform.FileHandle); -VAR +VAR str, aff: ARRAY 256 OF CHAR; n: LONGINT; BEGIN @@ -15,7 +15,7 @@ BEGIN 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; @@ -29,16 +29,17 @@ PROCEDURE -fork(): LONGINT "(LONGINT)fork()"; PROCEDURE serve; -CONST +CONST Port = 2055; MaxQueue = 5; -VAR +VAR sockfd: LONGINT; newsockfd: LONGINT; ServAddr: sockets.SockAddrIn; pid: LONGINT; res: Platform.ErrorCode; sockaddrlen: LONGINT; + ipAddr: LONGINT; ip: ARRAY 16 OF CHAR; BEGIN sockfd := sockets.Socket(sockets.AfInet, sockets.SockStream, 0); IF sockfd < 0 THEN @@ -47,15 +48,17 @@ BEGIN Out.String("socket created.") END; Out.Ln; + COPY("127.0.0.1", ip); + ipAddr := sockets.inetaddr(ip); - sockets.SetSockAddrIn(sockets.AfInet, Port, 0, ServAddr); + sockets.SetSockAddrIn(sockets.AfInet, Port, ipAddr, 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; - + IF sockets.Listen(sockfd, MaxQueue) # 0 THEN Out.String("listen() failed"); ELSE diff --git a/src/test/server/sockets.Mod b/src/test/server/sockets.Mod index 58ff3c24..ded7a61f 100644 --- a/src/test/server/sockets.Mod +++ b/src/test/server/sockets.Mod @@ -2,60 +2,60 @@ MODULE sockets; IMPORT SYSTEM, oocC; -CONST - SockStream* = 1; - SockDgram* = 2; - SockRaw* = 3; - SockRdm* = 4; - SockSeqpacket* = 5; - SockDccp* = 6; - SockPacket* = 10; - - AfUnscec* = 0; (* Unspecified. *) - AfLocal* = 1; (* Local to host (pipes and file-domain). *) - AfUnix* = 1; (* POSIX name for PF_LOCAL. *) - AfFile* = 1; (* Another non-standard name for PF_LOCAL. *) - AfInet* = 2; (* IP protocol family. *) - AfAx25* = 3; (* Amateur Radio AX.25. *) - AfIpx* = 4; (* Novell Internet Protocol. *) - AfAppletalk* = 5; (* Appletalk DDP. *) - AfNetrom* = 6; (* Amateur radio NetROM. *) - AfBridge* = 7; (* Multiprotocol bridge. *) - AfAtmpvc* = 8; (* ATM PVCs. *) - AfX25* = 9; (* Reserved for X.25 project. *) - AfInet6* = 10; (* IP version 6. *) - AfRose* = 11; (* Amateur Radio X.25 PLP. *) - AfDecnet* = 12; (* Reserved for DECnet project. *) - AfNetbeui* = 13; (* Reserved for 802.2LLC project. *) - AfSecurity* = 14; (* Security callback pseudo AF. *) - AfKey* = 15; (* PF_KEY key management API. *) - AfNetlink* = 16; - AfRoute* = 16; (* Alias to emulate 4.4BSD. *) - AfPacket = 17; (* Packet family. *) - AfAsh = 18; (* Ash. *) - AfEconet* = 19; (* Acorn Econet. *) - AfAtmsvc* = 20; (* ATM SVCs. *) - AfRds* = 21; (* RDS sockets. *) - AfSna = 22; (* Linux SNA Project *) - AfIrda* = 23; (* IRDA sockets. *) - AfPppox = 24; (* PPPoX sockets. *) - AfWanpipe* = 25; (* Wanpipe API sockets. *) - AfLlc* = 26; (* Linux LLC. *) - AfCan* = 29; (* Controller Area Network. *) - AfTipc* = 30; (* TIPC sockets. *) - AfBluetooth* = 31; (* Bluetooth sockets. *) - AfIucv* = 32; (* IUCV sockets. *) - AfRxrpc* = 33; (* RxRPC sockets. *) - AfIsdn* = 34; (* mISDN sockets. *) - AfPhonet* = 35; (* Phonet sockets. *) - AfIeee802154* = 36; (* IEEE 802.15.4 sockets. *) - AfCaif* = 37; (* CAIF sockets. *) - AfAlg* = 38; (* Algorithm sockets. *) - AfNfc* = 39; (* NFC sockets. *) - AfVsock* = 40; (* vSockets. *) - AfMax* = 41; (* For now.. *) - - InAddrAny* = 0; +CONST + SockStream* = 1; + SockDgram* = 2; + SockRaw* = 3; + SockRdm* = 4; + SockSeqpacket* = 5; + SockDccp* = 6; + SockPacket* = 10; + + AfUnscec* = 0; (* Unspecified. *) + AfLocal* = 1; (* Local to host (pipes and file-domain). *) + AfUnix* = 1; (* POSIX name for PF_LOCAL. *) + AfFile* = 1; (* Another non-standard name for PF_LOCAL. *) + AfInet* = 2; (* IP protocol family. *) + AfAx25* = 3; (* Amateur Radio AX.25. *) + AfIpx* = 4; (* Novell Internet Protocol. *) + AfAppletalk* = 5; (* Appletalk DDP. *) + AfNetrom* = 6; (* Amateur radio NetROM. *) + AfBridge* = 7; (* Multiprotocol bridge. *) + AfAtmpvc* = 8; (* ATM PVCs. *) + AfX25* = 9; (* Reserved for X.25 project. *) + AfInet6* = 10; (* IP version 6. *) + AfRose* = 11; (* Amateur Radio X.25 PLP. *) + AfDecnet* = 12; (* Reserved for DECnet project. *) + AfNetbeui* = 13; (* Reserved for 802.2LLC project. *) + AfSecurity* = 14; (* Security callback pseudo AF. *) + AfKey* = 15; (* PF_KEY key management API. *) + AfNetlink* = 16; + AfRoute* = 16; (* Alias to emulate 4.4BSD. *) + AfPacket = 17; (* Packet family. *) + AfAsh = 18; (* Ash. *) + AfEconet* = 19; (* Acorn Econet. *) + AfAtmsvc* = 20; (* ATM SVCs. *) + AfRds* = 21; (* RDS sockets. *) + AfSna = 22; (* Linux SNA Project *) + AfIrda* = 23; (* IRDA sockets. *) + AfPppox = 24; (* PPPoX sockets. *) + AfWanpipe* = 25; (* Wanpipe API sockets. *) + AfLlc* = 26; (* Linux LLC. *) + AfCan* = 29; (* Controller Area Network. *) + AfTipc* = 30; (* TIPC sockets. *) + AfBluetooth* = 31; (* Bluetooth sockets. *) + AfIucv* = 32; (* IUCV sockets. *) + AfRxrpc* = 33; (* RxRPC sockets. *) + AfIsdn* = 34; (* mISDN sockets. *) + AfPhonet* = 35; (* Phonet sockets. *) + AfIeee802154* = 36; (* IEEE 802.15.4 sockets. *) + AfCaif* = 37; (* CAIF sockets. *) + AfAlg* = 38; (* Algorithm sockets. *) + AfNfc* = 39; (* NFC sockets. *) + AfVsock* = 40; (* vSockets. *) + AfMax* = 41; (* For now.. *) + + InAddrAny* = 0; TYPE (* /usr/include/netinet/in.h *) @@ -70,13 +70,16 @@ TYPE SinZero*: ARRAY 8 OF CHAR; END; (* /usr/include/sys/socket.h *) - + SockAddr* = RECORD SaFamily*: oocC.shortint; SaData*: ARRAY 14 OF CHAR END; PROCEDURE -includesocket "#include "; + PROCEDURE -includeInet "#include "; + + PROCEDURE -inetaddr*(s: ARRAY OF CHAR): LONGINT "(LONGINT)inet_addr((char*)s)"; PROCEDURE -SetCShort(i: INTEGER; VAR si: oocC.shortint) "*(short*)si = i"; @@ -84,7 +87,7 @@ TYPE PROCEDURE -SetCShortSwapped(i: INTEGER; VAR si: oocC.shortint) "*(short*)si = ((i >> 8) & 0x00ff) | ((i << 8) & 0xff00)"; - PROCEDURE SetSockAddrIn*(family, port, inaddr: INTEGER; VAR sai: SockAddrIn); + PROCEDURE SetSockAddrIn*(family, port: INTEGER; inaddr: LONGINT; VAR sai: SockAddrIn); VAR i: INTEGER; BEGIN SetCShort(family, sai.SinFamily);