7Syntax20b.Scn.Fnt ZParcElemsAllocSyntax24b.Scn.Fnt Syntax10.Scn.Fnt ZSyntax10b.Scn.Fnt   "    6      B &FM e$    l K  O  {jd  & b% U( 11 1 1(* AMIGA *) MODULE AmigaNetBase; (** 13.2.96 BD, 1996-07-15 RD *) IMPORT SYSTEM, B:=AmigaBSD, AmigaExec; CONST AddressLength* = 4; INADDRNONE* = 00000000H; (*domain*) AFINET* = 2; PFINET* = AFINET; (*socket()*) (* types of connection*) SOCKSTREAM* = 1; SOCKDGRAM* = 2; (*Protocols *) IPPROTOUDP* = 17; IPPROTOTCP* = 6; (*listen() *) backlog = 5; (* max number of pending connection *) (*setsockopt() *) SOLSOCKET = 0FFFFH; (*socket option level *) SOLINGER = 80H; (* linger (gracefully close the connection)*) (*ioctl() *) FIONREAD = 4004667FH; (* something to read ? *) (* 4000667FH ??? *) (*select() *) FDSETSIZE = 64; (* number of socket file descriptors in struct fd-set for the select system call *) TYPE IPAdr* = ARRAY AddressLength OF CHAR; Data* = ARRAY OF SYSTEM.BYTE; Sockaddrin*= RECORD sinfamily*: INTEGER; sinport*: INTEGER; sinaddr*: IPAdr; sinzero*: ARRAY 8 OF CHAR END; (* struct in_addr { u_long s_addr; }; struct sockaddr_in { u_char sin_len; u_char sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; *) hostent= POINTER TO hostentdesc; hostentdesc= RECORD hname: LONGINT; haliases: LONGINT; haddrtype: LONGINT; hlength: LONGINT; haddrlist: LONGINT END; linger = RECORD (* int ?!?!? *) lonoff: LONGINT; llinger: LONGINT END; (* struct linger { int l_onoff; /* option on/off */ int l_linger; /* linger time */ }; *) Timeval = RECORD tvsec, tvusec: LONGINT END; FdSet = ARRAY (FDSETSIZE DIV SIZE(LONGINT)) OF LONGINT; VAR done*, started*: BOOLEAN; PROCEDURE Accept*(s: LONGINT; VAR newsocket(*out*): LONGINT); BEGIN newsocket:= B.accept(s, 0, 0); IF newsocket > 0 THEN done:= TRUE ELSE done:= FALSE END END Accept; PROCEDURE Bind*(s: LONGINT; VAR sockaddr(*in*): Sockaddrin); VAR err: LONGINT; BEGIN err:= B.bind(s, SYSTEM.ADR(sockaddr), SIZE(Sockaddrin)); IF err = 0 THEN done:= TRUE ELSE done:= FALSE END END Bind; PROCEDURE Close*(s: LONGINT); VAR err: LONGINT; BEGIN err:= B.close(s); IF err = 0 THEN done:= TRUE ELSE done:= FALSE END END Close; PROCEDURE Connect*(s: LONGINT; VAR sockaddr(*in*): Sockaddrin); VAR err: LONGINT; BEGIN err:= B.connect(s, SYSTEM.ADR(sockaddr), SIZE(Sockaddrin)); IF err= 0 THEN done:= TRUE ELSE done:= FALSE END END Connect; PROCEDURE GetHostByAdr* (adr: IPAdr; VAR name(*out*): ARRAY OF CHAR); VAR hostentPtr: hostent; err, namePtr, i: LONGINT; ch: CHAR; BEGIN err:= B.gethostbyaddr(SYSTEM.ADR(adr), AddressLength, PFINET); (* adr : internet adress *) IF err # 0 THEN (* err points to struct hostent *) hostentPtr:= SYSTEM.VAL(hostent, err); SYSTEM.GET(hostentPtr.hname, namePtr); i:= 0; REPEAT (* char * namePtr -> ARRAY OF CHAR *) SYSTEM.GET(namePtr+i, ch); name[i]:= ch UNTIL (ch = 0X) OR (ch = 0DX); done:= TRUE ELSE done:= FALSE END END GetHostByAdr; PROCEDURE GetHostByName* (name: ARRAY OF CHAR; VAR addr(*out*): IPAdr); VAR hostentPtr: hostent; err, adr, haddrlist, firstaddrPtr: LONGINT; BEGIN err:= B.gethostbyname(SYSTEM.ADR(name)); IF err # 0 THEN (* err points to struct hostent *) hostentPtr:= SYSTEM.VAL(hostent, err); SYSTEM.GET(hostentPtr.haddrlist, firstaddrPtr); SYSTEM.GET(firstaddrPtr, adr); SYSTEM.MOVE(SYSTEM.ADR(adr), SYSTEM.ADR(addr), LEN(addr)); done:= TRUE ELSE done:= FALSE END END GetHostByName; PROCEDURE GetHostByIP* (VAR IPadr(*in*): ARRAY OF CHAR; VAR addr(*out*): IPAdr); VAR adr: LONGINT; BEGIN adr:= B.inetaddr(SYSTEM.ADR(IPadr)); (* dotted-decimal number -> internet address *) IF adr # INADDRNONE THEN SYSTEM.MOVE(SYSTEM.ADR(adr), SYSTEM.ADR(addr), LEN(addr)); done:= TRUE ELSE done:= FALSE END END GetHostByIP; PROCEDURE GetHostName* (VAR name(*out*): ARRAY OF CHAR); VAR err: LONGINT; BEGIN err:= B.gethostname(SYSTEM.ADR(name), LEN(name)); IF err=0 THEN done:= TRUE ELSE done:= FALSE END END GetHostName; PROCEDURE GetPeerName*(s: LONGINT; VAR adr(*out*): Sockaddrin); VAR err, len: LONGINT; BEGIN len:= SIZE(Sockaddrin); err:= B.getpeername(s, SYSTEM.ADR(adr), SYSTEM.ADR(len)); IF err = 0 THEN done:= TRUE ELSE done:= FALSE END END GetPeerName; PROCEDURE Listen*(s: LONGINT); VAR err: LONGINT; BEGIN err:= B.listen(s, backlog); IF err = 0 THEN done:= TRUE ELSE done:= FALSE END END Listen; PROCEDURE Recv*(s: LONGINT; VAR buf(*out*): ARRAY OF SYSTEM.BYTE; pos: LONGINT; VAR len(*inout*): LONGINT); VAR err: LONGINT; BEGIN ASSERT((LEN(buf)-pos) >= len); err:= B.recv(s, SYSTEM.ADR(buf[pos]), len, 0); IF err >= 0 THEN len:= err; done:= TRUE ELSE len:= 0; done:= FALSE END END Recv; PROCEDURE RecvFrom*(s: LONGINT; VAR from: Sockaddrin; VAR buf(*out*): Data; pos: LONGINT; VAR len(*inout*): LONGINT); VAR err, size: LONGINT; BEGIN ASSERT((LEN(buf)-pos) >= len); size:= SIZE(Sockaddrin); err:= B.recvfrom(s, SYSTEM.ADR(buf[pos]), len, 0, SYSTEM.ADR(from), SYSTEM.ADR(size)); IF err >= 0 THEN len:= err; done:= TRUE ELSE len:= 0; done:= FALSE END END RecvFrom; PROCEDURE Send*(s: LONGINT; VAR buf(*in*): Data; pos: LONGINT; VAR len(*inout*): LONGINT); VAR err: LONGINT; BEGIN ASSERT((LEN(buf)-pos) >= len); err:= B.send(s, SYSTEM.ADR(buf[pos]), len, 0); IF err >= 0 THEN len:= err; done:= TRUE ELSE len:= 0; done:= FALSE END END Send; PROCEDURE SendTo*(s: LONGINT; to: Sockaddrin; VAR buf(*in*): Data; pos, len: LONGINT); VAR err: LONGINT; BEGIN ASSERT((LEN(buf)-pos) >= len); err:= B.sendto(s, SYSTEM.ADR(buf[pos]), len, 0, SYSTEM.ADR(to), SIZE(Sockaddrin)); IF err >= 0 THEN len:= err; done:= TRUE ELSE len:= 0; done:= FALSE END END SendTo; PROCEDURE Socket* (VAR s(*out*): LONGINT; af, type, protocol: LONGINT); BEGIN s:= B.socket(af, type, protocol); IF s > 0 THEN done:= TRUE ELSE done:= FALSE END END Socket; PROCEDURE Available*(s: LONGINT): LONGINT; VAR available, err: LONGINT; BEGIN err:= B.ioctl(s, FIONREAD, SYSTEM.ADR(available)); IF err = 0 THEN done:= TRUE; RETURN available ELSE done:= FALSE; RETURN -1 END END Available; PROCEDURE Requested*(s: LONGINT): BOOLEAN; VAR err, res, i: LONGINT; readfds: FdSet; timeout: Timeval; BEGIN timeout.tvsec:= 0; timeout.tvusec:= 0; FOR i:= 0 TO 31 DO readfds[i]:=0 END; readfds[s DIV 32]:= SYSTEM.LSH(1, s MOD 32); err:= B.select(s+1, SYSTEM.ADR(readfds), 0, 0, SYSTEM.ADR(timeout)); IF err = -1 THEN done:= FALSE ELSE done:= TRUE END; RETURN err > 0 END Requested; PROCEDURE Connected*(s: LONGINT): BOOLEAN; VAR err, available: LONGINT; BEGIN IF Requested(s) THEN RETURN Available(s) > 0 ELSE RETURN TRUE END END Connected; PROCEDURE SetLinger* (s: LONGINT); VAR l: linger; err, size: LONGINT; BEGIN l.lonoff:= 1; l.llinger:= 1; err:= B.setsockopt(s, SOLSOCKET, SOLINGER, SYSTEM.ADR(l), SIZE(linger)); IF err = 0 THEN done:= TRUE ELSE done:= FALSE END END SetLinger; PROCEDURE NetToInt* (x: INTEGER): INTEGER; BEGIN done:= TRUE; RETURN x END NetToInt; PROCEDURE IntToNet* (x: INTEGER): INTEGER; BEGIN done:= TRUE; RETURN x END IntToNet; PROCEDURE NetToLInt* (x: LONGINT): LONGINT; BEGIN done:= TRUE; RETURN x END NetToLInt; PROCEDURE LIntToNet* (x: LONGINT): LONGINT; BEGIN done:= TRUE; RETURN x END LIntToNet; PROCEDURE Start*; BEGIN IF ~started THEN B.OpenLib(); IF B.bsdBase#0 THEN done:=TRUE; started:=TRUE ELSE done:=FALSE; started:=FALSE END END END Start; PROCEDURE Stop*; BEGIN IF started THEN B.CloseLib(); done:=TRUE; started:=FALSE END END Stop; PROCEDURE Init; BEGIN done:=FALSE; started:=FALSE END Init; BEGIN Init END AmigaNetBase.