Merge branch 'jb/1.0.1-is-working'

This commit is contained in:
John Bintz 2024-05-02 17:22:14 -04:00
commit 4b4ec33440
15 changed files with 1151 additions and 144 deletions

10
.gitignore vendored
View File

@ -4,12 +4,16 @@ dist/
build/
aminet/
Disk.info
private-test/
stuff/
patches/
.vamosrc
activate
test/report.txt
test/TestSuite.info
src/report.txt
src/BSDSocket_Labels.s
src/BSDSocket_Size.s
src/bsdsocket_lib.fd
src/bsdsocket_lvo.i
src/*.Lib
.vamosrc
activate
test/

117
API.md
View File

@ -3,7 +3,9 @@
Most functions will return -2 if the bsdsocket.library is
not open.
### Setup
---
## Setup
#### ADDR=Socket Library Open
@ -16,11 +18,15 @@ Try to open bsdsocket.library version 4.
* If needed, you'll be able to directly access library functions
using this address.
---
#### Socket Library Close
Close bsdsocket.library. This is safe to call if the library
is not open
---
#### RESULT=Socket Set Nonblocking(Socket, IsNonblocking BOOL)
Make a socket blocking (False, default), or nonblocking (True).
@ -29,6 +35,8 @@ Make a socket blocking (False, default), or nonblocking (True).
* Result of IoctlSocket call.
---
#### RESULT=Socket Reuse Addr(Socket)
Make a listening socket reuse the address it's trying to bind to.
@ -38,9 +46,9 @@ You probably want to call this right before Socket Listen.
* Result of setsockopt call.
---
### Connections
## Connections
#### SOCKET=Socket Create Inet Socket
@ -51,10 +59,23 @@ Create a new Internet socket for reading or writing.
* Socket number on success
* -1 on failure
---
#### RESULT=Socket Connect(Socket to IPAddress$, Port)
Attempt to connect to a remote host. Currently doesn't
support DNS lookups.
Attempt to connect to a remote IP address.
##### Emulation vs. Physical/FPGA Amiga note
On emulated Amigas (FS-UAE) with emulated `bsdsocket.library`, a failure in
`Socket Connect` due to giving the function a bad IP address allows you to reuse
the socket. On real or FPGA-based Amiga running real TCP/IP stacks (MiamiDX,
Roadshow), the socket will be made unusable and you'll need to
`Socket Close Socket` and reopen the socket with whatever parameters necessary.
Closing and opening `bsdsocket.library` has the same effect.
Always close and re-open a socket if you have any `Socket Connect` failure and
any non-blocking polling loops time out!
##### Returns
@ -64,19 +85,24 @@ support DNS lookups.
the socket with Socket Select and Socket Getsockopt Int
to see if the connection succeeded
* -11 port out of range
* -13 IP address has zero length
---
#### RESULT=Socket Reuse Addr(Socket)
Set a server socket to reuse an interface and port that had
been used recently. You likely want this if you're building
something that listens on a port for connections. This calls
setsockopt() for you.
`setsockopt()` for you.
##### Returns
The result of calling setsockopt() while setting your socket
to reuse addresses.
---
#### RESULT=Socket Bind(Socket to IPAddress, Port)
Attempt to bind a socket to a network interface. Use
@ -89,6 +115,8 @@ interfaces.
* -1 on other error
* -11 port out of range
---
#### RESULT=Socket Listen(Socket)
Start listening for connections.
@ -98,6 +126,8 @@ Start listening for connections.
* 0 on success
* -1 on failure
---
#### NEW_SOCKET=Socket Accept(Socket)
Get the socket that connected to this one. Wait for a connect
@ -115,11 +145,13 @@ socket non-blocking and use Fdsets and Select!
* The remote socket number on success
* -1 on failure
#### RESULT=Socket Async Wait Reading(Socket, Wait_ms)
---
#### RESULT=Socket Wait Async Reading(Socket, Wait_ms)
Wait the given number of milliseconds for the nonblocking socket to be ready for reading.
Use this when you're waiting for a client to connect to you, or if you're waiting for
a remote socket to send you data.
Use on a listen socket to await new connections, or on a connected socket to await
incoming data packets.
##### Returns
@ -127,7 +159,9 @@ a remote socket to send you data.
* -1 on error. Use `Socket Errno` for more detail.
* 1 on success.
#### RESULT=Socket Async Wait Writing(Socket, Wait_ms)
---
#### RESULT=Socket Wait Async Writing(Socket, Wait_ms)
Wait the given number of milliseconds for the nonblocking socket to be ready for writing.
Use this when you're connecting to a remote server and want to know if the connection
@ -143,6 +177,8 @@ has been completed.
checks will return 1.
* 1 on success.
---
#### RESULT=Socket Set Timeout(Socket, Wait_ms)
Set a socket to timeout after Wait_ms milliseconds if reading or writing doesn't complete.
@ -152,18 +188,21 @@ Set a socket to timeout after Wait_ms milliseconds if reading or writing doesn't
* 0 on success
* -1 on error
---
#### RESULT=Socket Close Socket(Socket)
Close a socket.
##### Returns
* 0 on success
* -1 on error
---
### Data Transfers
## Data Transfers
#### SENT=Socket Send$(Socket, String$)
@ -194,6 +233,8 @@ End Proc
* Number of characters sent
* -1 on other error
---
#### SENT=Socket Send(Socket, Data Pointer, Length)
Send a block of data to a connected socket.
@ -203,6 +244,8 @@ Send a block of data to a connected socket.
* Number of characters sent
* -1 on other error
---
#### DATA$=Socket Recv$(Socket, MaxLength)
Retrieve at most MaxLength bytes from Socket, and put them into a string.
@ -212,7 +255,9 @@ If Len(DATA$) < MaxLength, you've read the last bit of data from the socket.
* String of data, which is blank if there is no more data.
### LENGTH=Socket Recv(Socket to Dataptr, MaxLength)
---
#### LENGTH=Socket Recv(Socket to Dataptr, MaxLength)
Retrieve at most MaxLength bytes from Socket, and put them into the memory
address at Dataptr.
@ -222,9 +267,9 @@ address at Dataptr.
* Count of bytes read
* -1 on error
---
### Informational
## Informational
#### HOST=Socket Get Host(Socket)
@ -234,6 +279,8 @@ Get the IPv4 (Long) host value the given socket is using.
* Host as a long value
---
#### PORT=Socket Get Port(Socket)
Get the 16-bit port (Word) value the given socket is using.
@ -242,6 +289,8 @@ Get the 16-bit port (Word) value the given socket is using.
* Port as a word value
---
#### RESULT$=Socket Inet Ntoa$(Host)
Turn a long Host address into a string.
@ -250,6 +299,8 @@ Turn a long Host address into a string.
* IP address as string
---
#### RESULT=Socket Errno
Get the error from the last command. Note that this is
@ -260,6 +311,8 @@ not cleared on a successful command!
Error number from last call. Look in <sys/error.h> for more
details.
---
#### RESULT=Socket Herrno
Get the error from the last DNS resolver command.
@ -268,6 +321,8 @@ Get the error from the last DNS resolver command.
Resolver error number (`h_errno`) from last call.
---
#### RESULT$=Dns Get Address By Name$(Domain Name$)
Look up the first IP address associated with this hostname.
@ -282,32 +337,8 @@ out. There's no way to set this timeout, or cancel or override it via AMOS.
String with IP address, or blank string on error.
#### RESULT=Socket Status(Socket)
Returns basic connection information about a socket.
##### Warning
Since none of the socket processing of this extension happens in the
background, you're likely better off using other means to detect
socket status.
* Disconnected: Try a recv and get zero bytes back. Check Socket Errno.
* Broken: Try a send. If it fails, check Socket Errno.
* Ready: Use the Async Wait functions.
##### Returns
Status of socket:
* 0 = Closed
* 2 = Listening
* 6 = Connecting
* 7 = Connected
### Low Level
## Low Level
#### RESULT=Socket Setsockopt Int(Socket, Option, Value)
@ -319,6 +350,8 @@ Socket Reuse Addr().
* Result of setsockopt call
---
#### RESULT=Socket Getsockopt Int(Socket, Option)
Get a socket option. You probably want SO_ERROR,
@ -329,6 +362,8 @@ attempt a connection with a non-blocking socket.
* Result of getsockopt call
---
#### ADDR=Socket Fdset Zero(fd_set)
Clear out the specified fd_set.
@ -338,6 +373,8 @@ Clear out the specified fd_set.
* Address to that particular fd_set
* -1 if fd_set out of range. You get 16 of them.
---
#### ADDR=Socket Fdset Set(fd_set, Socket to Value BOOL)
Set or clear a socket bit in an fd_set.

View File

@ -130,6 +130,7 @@ Socket Library Close
* [Hop to the Top: Bunny's Revenge](https://rabbit.robsmithdev.co.uk/)
* The game uses this extension to send and receive high score information.
I also did some of the art for the game!
* [Gopherized](https://allanon71.itch.io/gopherized)
Doing something cool with the extension?
[Contact me](https://theindustriousrabbit.com/about) and I'll add it to the list!
@ -168,10 +169,12 @@ throw a link to theindustriousrabbit.com somewhere! You can
also find a donate link on
[the About section on The Industrious Rabbit](https://theindustriousrabbit.com/about).
## Feedback? Bug reports?
## Feedback? Bug reports? Patches?
Go to the [About section on The Industrious Rabbit](https://theindustriousrabbit.com/about)
to contact me.
First, run `test/TestSuite` to generate a `report.txt` file.
Then, go to the [About section on The Industrious Rabbit](https://theindustriousrabbit.com/about)
to contact me, send the `report.txt` along with the details on your issue.
## Changelog
@ -207,7 +210,20 @@ to contact me.
* `Dns Get Address By Name$`
* `Socket Recv$`
# Development
### 1.1.3
Internal release.
### 1.1.4 (2024-05-02)
* Fix bug in fdset macro where using D3 for a parameter could cause corruption.
* Copy a null-terminated copy of IP address for `SocketIPAddressPortToSockaddr`.
* Add test suite to exercise extension functionality.
* Fix several crash bugs found due to the test suite.
* Retructure API docs for easier reading.
* Improve build and release tooling.
## Development
### Environment
@ -239,9 +255,25 @@ Run `bin/setup` to do most of the setups above.
### Debugging
#### Cross-platform
Modify data in the `DebugArea` and read it by `Peek`/`Deek`/`Leek`ing from
the base address provided by `Socket Get Debug Area`.
#### WinUAE/FS-UAE
In the debugger, set a memory breakpoint at `$100` for two written bytes:
```
w 0 100 2
```
Then, in your code, clear those two bytes to stop execution at that point:
```asm
CLR.W $100
```
### Releasing
#### Ubuntu/Debian

View File

@ -1,6 +1,6 @@
#!/bin/bash
for i in examples/*.amos; do
for i in examples/*.amos test/*.amos; do
echo "$i"
~/Projects/amostools/listamos -e AMOSPro_BSDSocket.Lib "${i}" > "${i%.amos}.basic" 2>/dev/null
~/Projects/amostools/listamos -e src/AMOSPro_BSDSocket.Lib "${i}" > "${i%.amos}.basic" 2>/dev/null
done

View File

@ -35,7 +35,7 @@ FileUtils.rm_rf 'aminet'
FileUtils.mkdir_p build_dir
FileUtils.mkdir_p 'aminet'
FileUtils.mv 'src/AMOSPro_BSDSocket.Lib', 'AMOSPro_BSDSocket.Lib' if File.exist?('src/AMOSPro_BSDSocket.Lib')
FileUtils.cp 'src/AMOSPro_BSDSocket.Lib', 'AMOSPro_BSDSocket.Lib'
hackerbun_target = File.expand_path("dist/AMOSPro_BSDSocket_#{version}.lha")

BIN
src/AMOSPro_BSDSocket.Lib Normal file

Binary file not shown.

View File

@ -7,7 +7,7 @@
; extension number 18
ExtNb equ 18-1
Version MACRO
dc.b "1.1.2-20240318"
dc.b "1.1.4-20240426"
ENDM
VerNumber equ $1
@ -22,23 +22,190 @@ VerNumber equ $1
Include "+AMOS_Includes.s"
Include "bsdsocket_lvo.i"
Include "LongDivide.s"
Include "Constants.s"
Include "fd_set.s"
Include "AMOSMacros.s"
; get the effective address of something in extension memory
Dlea MACRO
MOVE.L ExtAdr+ExtNb*16(A5),\2
ADD.W #\1-MB,\2
ENDM
; load the base of extension memory into a register
Dload MACRO
MOVE.L ExtAdr+ExtNb*16(A5),\1
ENDM
; call an AmigaOS function via LVO(A6)
CALLLIB MACRO
JSR _LVO\1(A6)
ENDM
; bsdsocket library stuff
; ported from the various C include headers
SOCK_STREAM EQU 1
PF_INET EQU 2
AF_INET EQU PF_INET
IPPROTO_TCP EQU 6
; get the BSDSocket library ready for CALLLIB
LoadBSDSocketBaseFromA3 MACRO
INADDR_ANY EQU 0
FIONBIO EQU $8004667E
FIONASYNC EQU $8004667D
SOL_SOCKET EQU $FFFF
SO_REUSEADDR EQU $4
MAX_SOCKETS EQU 64
len_sockaddr_in EQU 16
sockaddr_in_sin_family EQU 1
sockaddr_in_sin_port EQU 2
sockaddr_in_sin_addr EQU 4
; global errors
Error_OtherError EQU -1
Error_LibraryNotOpen EQU -2
Error_PortOutOfRange EQU -11
Error_FdsetOutOfRange EQU -11
Error_UnableToBind EQU -12
; socket herrno and tag lists
; built from:
; * https://wiki.amigaos.net/amiga/autodocs/bsdsocket.doc.txt
; * https://github.com/deplinenoise/amiga-sdk/blob/master/netinclude/amitcp/socketbasetags.h
; * http://amigadev.elowar.com/read/ADCD_2.1/Includes_and_Autodocs_2._guide/node012E.html
TAG_USER EQU (1<<31)
SBTF_REF EQU $8000
SBTB_CODE EQU 1
SBTS_CODE EQU $3FFF
SBTC_HERRNO EQU 6
HerrnoTag EQU (TAG_USER|SBTF_REF|((SBTC_HERRNO&SBTS_CODE)<<SBTB_CODE))
; wrap code that doesn't take arguments with these
PreserveStackInstruction MACRO
MOVEM.L A2-A6/D6-D7,-(SP)
ENDM
RestoreStackInstruction MACRO
MOVEM.L (SP)+,A2-A6/D6-D7
ENDM
; wrap code that takes arguments with these
PreserveStackFunction MACRO
MOVEM.L A2/A4-A6/D6-D7,-(SP)
ENDM
RestoreStackFunction MACRO
MOVEM.L (SP)+,A2/A4-A6/D6-D7
ENDM
LoadBSDSocketBase MACRO
MOVE.L BSDSocketBase-MB(A3),A6
ENDM
WithDataStorage MACRO
MOVE.L A3,-(SP)
Dload A3
ENDM
EndDataStorage MACRO
MOVE.L (SP)+,A3
ENDM
; fdset macros
EnsureValidFdset MACRO
CMP.L #MaxFd_sets,\1
BLT \2
MOVE.L #Error_FdsetOutOfRange,D3
RestoreStackFunction
Ret_Int
ENDM
EnsureValidFdsetBit MACRO
CMP.L #64,\1
BGE _EnsureValidFdsetBit_Fail\@
BRA \2
_EnsureValidFdsetBit_Fail\@:
MOVE.L \3,D3
RestoreStackFunction
Ret_Int
ENDM
LeaFdset MACRO
MOVE.L \1,-(SP)
Dlea fd_sets,\2 ; base of all, these are longs
ROL.L #3,\1 ; multiply by 8
ADD.L \1,\2 ; add to base of all
MOVE.L (SP)+,\1
ENDM
; LeaFdsetForBit fd_set reg,target address,target bit in address
LeaFdsetForBit MACRO
LeaFdset \1,\2 ; get fdset base address in \2
MOVEM.L D3-D4,-(SP)
MOVE.L \3,D3 ; Put target bit into D3
ROR.L #5,D3 ; lop off the first 5 bits
AND.L #$7,D3 ; only keep the top three
ROL.L #2,D3 ; multiply by 4
ADD.L D3,\2 ; add that value to the fdset address
MOVE.L \3,D4
AND.L #$1F,D4 ; only keep 0-31 in \3
MOVEQ #1,D3
ROL.L D4,D3 ; shift that bit left as many as target
MOVE.L D3,\3 ; put that in the target
MOVEM.L (SP)+,D3-D4
ENDM
; d0 = value to be divided
; d1 = divisor
; returns:
; d0 = divided value
; d1 = remainder
LongDivideD0ByD1 MACRO
CMP.L D0,D1
BMI _LongDivide_StartDivide\@
MOVE.L D0,D1
MOVEQ #0,D0
BRA _LongDivide_Skip\@
_LongDivide_StartDivide\@:
MOVEM.L D2-D4,-(SP)
MOVEQ #0,D2 ; remainder
MOVE.L #31,D3 ; bit tracking
; d4 tracks the status register
_LongDivide_ContinueDivide\@:
ASL.L #1,D0
SCS D4 ; bit that got rolled out
AND.L #1,D4
ROL.L #1,D2
ADD.L D4,D2 ; roll the value onto the remainder
MOVE.L D2,D4
SUB.L D1,D4
BMI _LongDivide_NotDivisible\@
ADDQ #1,D0
MOVE.L D4,D2
_LongDivide_NotDivisible\@:
DBRA D3,_LongDivide_ContinueDivide\@
MOVE.L D2,D1
MOVEM.L (SP)+,D2-D4
_LongDivide_Skip\@:
ENDM
EvenOutStringAddress MACRO
MOVE.W \1,\2
AND.W #$0001,\2
ADD.W \2,\1
ENDM
; check if we've opened the bsd socket library
; we do this a lot, this could probably become something
; we jsr to...
@ -290,16 +457,16 @@ End
CALLLIB OpenLibrary
MOVE.L D0,BSDSocketBase-MB(A3)
BEQ .Finish
BEQ _SocketLibraryOpen_Finish
; reserve ram for sockaddr_ins
MOVE.L #MAX_SOCKETS*len_sockaddr_in,D0
Rjsr L_RamFast
BEQ .Finish
BEQ _SocketLibraryOpen_Finish
MOVE.L D0,sockaddr_ram-MB(A3)
.Finish:
_SocketLibraryOpen_Finish:
MOVE.L BSDSocketBase-MB(A3),D3
RestoreStackInstruction
@ -345,7 +512,7 @@ End
;
; Turn an IP address and port into a sockaddr_in strucure
;
; d0 - 0 on success, -1 on failure
; d0 - address of sockaddr_in on success, -1 on failure
; - - - - - - - -
Lib_Def SocketIPAddressPortToSockaddr
@ -366,14 +533,26 @@ _ToSockaddr_PortOK:
MOVE.L sockaddr_ram-MB(A3),A0
ADD.L D3,A0 ; A0 contains our offset in ram
MOVE.B #len_sockaddr_in,sockaddr_in_sin_len(A0)
MOVE.B #AF_INET,sockaddr_in_sin_family(A0)
MOVE.W D2,sockaddr_in_sin_port(A0)
MOVEM.L A0-A3/D3,-(SP)
MOVE.L D1,A1 ; ip string address
MOVE.W (A1)+,D3 ; string length
MOVE.L D1,A0 ; ip address
ADDQ #2,A0 ; string data starts 2 bytes in
BNE _ToSockaddr_StringHasLength
MOVEM.L (SP)+,A0-A3/D3
MOVEM.L (SP)+,A0/A3/D3
MOVE.L #-14,D0
RTS
_ToSockaddr_StringHasLength:
; temporarily store a null-terminated copy of the ip string in A0
MOVE.L A0,A2
SUBQ #1,D3 ; DBRA loop runs D3 + 1 times
_ToSockaddr_CopyIPString:
MOVE.B (A1)+,(A2)+
DBRA D3,_ToSockaddr_CopyIPString
MOVE.B #0,(A2) ; end of string
; if the string contains "INADDR_ANY", we use that value instead
MOVE.L A0,A1
@ -393,12 +572,20 @@ _ToSockaddr_KeepCheckingString_2:
_ToSockaddr_ParseIPAddress:
Dload A3
LoadBSDSocketBaseFromA3
LoadBSDSocketBase
CALLLIB inet_addr
_ToSockaddr_DoneParsing:
MOVEM.L (SP)+,A0-A3/D3
MOVE.L D0,sockaddr_in_sin_addr(A0)
; create struct sockaddr_in
MOVE.B #len_sockaddr_in,(A0)
MOVE.B #AF_INET,sockaddr_in_sin_family(A0)
MOVE.W D2,sockaddr_in_sin_port(A0)
LEA sockaddr_in_sin_addr(A0),A3
MOVE.L D0,(A3)+
CLR.L (A3)+
CLR.L (A3)+
MOVE.L A0,D0
MOVEM.L (SP)+,A0/A3/D3
@ -429,7 +616,7 @@ _SocketCreateInetSocket_LibraryOpen:
MOVE.L #SOCK_STREAM,D1
MOVE.L #IPPROTO_TCP,D2
Dload A3
LoadBSDSocketBaseFromA3
LoadBSDSocketBase
CALLLIB socket
MOVE.L D0,D3
@ -478,7 +665,6 @@ _SocketCreateInetSocket_Done:
Ret_Int
_SocketConnect_LibraryOpen:
MOVE.L D0,-(SP) ; socket id onto stack
Rbsr L_SocketIPAddressPortToSockaddr
@ -502,7 +688,7 @@ _SocketConnect_SockaddrIn:
; socket id is in D0
; sockaddr_in is in A0
MOVE.L #len_sockaddr_in,D1 ; len
LoadBSDSocketBaseFromA3
LoadBSDSocketBase
CALLLIB connect
MOVEM.L (SP)+,A0/A3
@ -538,8 +724,8 @@ _SocketConnect_SockaddrIn:
_SocketSendString_LibraryOpen:
MOVEQ #0,D2 ; flags
WithDataStorageToA3
LoadBSDSocketBaseFromA3
WithDataStorage
LoadBSDSocketBase
CALLLIB send
EndDataStorage
@ -584,8 +770,8 @@ _SocketSendData_LibraryOpen:
_SocketSendData_NotNegative:
MOVEQ #0,D2 ; flags
WithDataStorageToA3
LoadBSDSocketBaseFromA3
WithDataStorage
LoadBSDSocketBase
CALLLIB send
EndDataStorage
@ -635,11 +821,11 @@ _SocketBind_SockaddrIn:
MOVE.L D0,A0
MOVE.L (SP)+,D0
WithDataStorageToA3
WithDataStorage
; socket id is in D0
; sockaddr_in is in A0
MOVE.L #len_sockaddr_in,D1 ; len
LoadBSDSocketBaseFromA3
LoadBSDSocketBase
CALLLIB bind
EndDataStorage
@ -658,22 +844,22 @@ _SocketBind_SockaddrIn:
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par SocketErrno
; - - - - - - - - - - - - -
PreserveStackInstruction
PreserveStackFunction
EnsureBSDSocketLibrary _SocketErrno_LibraryOpen
RestoreStackInstruction
RestoreStackFunction
Ret_Int
_SocketErrno_LibraryOpen:
WithDataStorageToA3
LoadBSDSocketBaseFromA3
WithDataStorage
LoadBSDSocketBase
CALLLIB Errno
EndDataStorage
MOVE.L D0,D3
RestoreStackInstruction
RestoreStackFunction
RTS
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -701,8 +887,8 @@ _SocketListen_LibraryOpen:
MOVE.L D3,D2
MOVEQ #5,D1
WithDataStorageToA3
LoadBSDSocketBaseFromA3
WithDataStorage
LoadBSDSocketBase
CALLLIB listen
EndDataStorage
@ -737,10 +923,10 @@ _SocketAccept_LibraryOpen:
MOVE.L D3,D2
WithDataStorageToA3
WithDataStorage
Dlea AcceptScratchArea,A0
Dlea len_sockaddr_in_ptr,A1
LoadBSDSocketBaseFromA3
LoadBSDSocketBase
CALLLIB accept
EndDataStorage
@ -803,11 +989,11 @@ _SocketSetNonblocking_IsBlocking:
_SocketSetNonblocking_Ioctl:
WithDataStorageToA3
WithDataStorage
MOVE.L D1,IoctlSockOptScratch-MB(A3)
Dlea IoctlSockOptScratch,A0
MOVE.L #FIONBIO,D1
LoadBSDSocketBaseFromA3
LoadBSDSocketBase
CALLLIB IoctlSocket
MOVE.L D0,D3
@ -865,12 +1051,12 @@ _SocketGetsockoptInt_LibraryOpen:
MOVE.L #SOL_SOCKET,D1 ; level
MOVE.L A3,-(SP)
WithDataStorageToA3
WithDataStorage
Dlea IoctlSockOptScratch,A0 ; optval
MOVE.L #4,getsockopt_len-MB(A3)
Dlea getsockopt_len,A1
LoadBSDSocketBaseFromA3
LoadBSDSocketBase
CALLLIB getsockopt
EndDataStorage
MOVE.L (SP)+,A3
@ -1144,6 +1330,12 @@ _SocketSelect_PerformSelect
; - - - - - - - - - - - - -
PreserveStackFunction
EnsureBSDSocketLibrary _SocketGetHost_LibraryOpen
RestoreStackFunction
Ret_Int
_SocketGetHost_LibraryOpen:
MULU #len_sockaddr_in,D3
Dload A0
MOVE.L sockaddr_ram-MB(A0),A0
@ -1164,6 +1356,13 @@ _SocketSelect_PerformSelect
; - - - - - - - - - - - - -
PreserveStackFunction
EnsureBSDSocketLibrary _SocketGetPort_LibraryOpen
RestoreStackFunction
Ret_Int
_SocketGetPort_LibraryOpen:
MULU #len_sockaddr_in,D3
Dload A0
MOVE.L sockaddr_ram-MB(A0),A0
@ -1184,15 +1383,17 @@ _SocketSelect_PerformSelect
Lib_Par SocketInetNtoA
; - - - - - - - - - - - - -
PreserveStackFunction
EnsureBSDSocketLibrary _SocketInetNtoA_LibraryOpen
EnsureBSDSocketLibrary _SocketInetNtoa_LibraryOpen
MOVE.L ChVide(A5),D3
RestoreStackFunction
Ret_Int
Ret_String
_SocketInetNtoA_LibraryOpen:
_SocketInetNtoa_LibraryOpen:
MOVE.L D3,D0
WithDataStorageToA3
LoadBSDSocketBaseFromA3
WithDataStorage
LoadBSDSocketBase
CALLLIB Inet_NtoA
EndDataStorage
@ -1222,6 +1423,7 @@ _SocketInetNtoA_StringSizeLoop:
MOVE.W D4,(A0)+ ; length of string
SUBQ #1,D4
_SocketInetNtoA_StringCopyLoop:
MOVE.B (A2,D4),(A0,D4)
DBRA D4,_SocketInetNtoA_StringCopyLoop
@ -1272,12 +1474,14 @@ _SocketRecvString_NotNegative:
_SocketRecvString_NotTooLong:
MOVE.L A3,-(SP) ; preserve A3
MOVE.L D0,-(SP) ; preserve D0
; reserve memory for recv buffer
Rjsr L_RamFast ; D0 now contains memory pointer
BNE _SocketRecvString_BufferAllocated
; reserve failed
MOVE.L (SP)+,D0
MOVE.L (SP)+,A3
MOVE.L ChVide(A5),D3 ; empty string
@ -1291,10 +1495,12 @@ _SocketRecvString_BufferAllocated:
MOVEQ #0,D2 ; flags
MOVEM.L A0-A1/D1,-(SP)
WithDataStorageToA3
LoadBSDSocketBaseFromA3
WithDataStorage
LoadBSDSocketBase
CALLLIB recv ; D0 has received length or -1
EndDataStorage
MOVEM.L (SP)+,A0-A1/D1
; did we receive data? if we didn't get a single byte, we're done
@ -1305,6 +1511,7 @@ _SocketRecvString_BufferAllocated:
MOVE.L D1,D0
MOVE.L A0,A1
Rjsr L_RamFree
MOVE.L (SP)+,A3
MOVE.L ChVide(A5),D3
@ -1312,7 +1519,6 @@ _SocketRecvString_BufferAllocated:
Ret_String
; TODO received data is wrong somewhere
_SocketRecvString_DataReceived:
; D0 contains socket receive length
@ -1344,7 +1550,7 @@ _SocketRecvString_CopyData:
MOVE.L A0,-(SP)
MOVE.L A3,A1
Rjsr L_RamFree
MOVE.L (SP)+,D3
MOVE.L (SP)+,D3 ; string return
MOVE.L (SP)+,A3
RestoreStackFunction
@ -1383,8 +1589,8 @@ _SocketRecvData_LibraryOpen:
Ret_Int
_SocketRecvData_PositiveLength:
WithDataStorageToA3
LoadBSDSocketBaseFromA3
WithDataStorage
LoadBSDSocketBase
CALLLIB recv ; D0 has received length or -1
EndDataStorage
@ -1393,6 +1599,8 @@ _SocketRecvData_PositiveLength:
RestoreStackFunction
Ret_Int
; actually close the library
Lib_Def DoSocketLibraryClose
@ -1407,6 +1615,7 @@ _SocketRecvData_PositiveLength:
CLR.L sockaddr_ram-MB(A3) ; prevent double free
_DoSocketLibraryClose_CloseLibrary:
MOVE.L BSDSocketBase-MB(A3),D0
BEQ _DoSocketLibraryClose_Skip
@ -1463,7 +1672,7 @@ _SocketWaitAsyncWriting_LibraryOpen:
Rbsr L_MicrosecondsToTimeval ; A3 contains timeval
Dload A4
MOVE.L D0,-(SP)
MOVEM.L D0,-(SP)
; set up WaitSelect
MOVEQ #0,D1
LeaFdset D1,A1 ; write fdset
@ -1485,7 +1694,7 @@ _SocketWaitAsyncWriting_LibraryOpen:
TST.L D0
BEQ _SocketWaitAsyncWriting_Timeout
BMI _SocketWaitAsyncWriting_Error
MOVE.L (SP)+,D0 ; D0 contains socket again
MOVEM.L (SP)+,D0 ; D0 contains socket again
Dload A4
; a socket became interesting, check the Fdset
@ -1511,19 +1720,19 @@ _SocketWaitAsyncWriting_CheckSockopt:
MOVE.L A3,-(SP)
WithDataStorageToA3
WithDataStorage
Dlea IoctlSockOptScratch,A0 ; optval
MOVE.L #4,getsockopt_len-MB(A3)
Dlea getsockopt_len,A1
LoadBSDSocketBaseFromA3
LoadBSDSocketBase
CALLLIB getsockopt
EndDataStorage
MOVE.L (SP)+,A3
TST.L D0
BMI _SocketWaitAsyncWriting_Error
BMI _SocketWaitAsyncWriting_Error2
Dlea IoctlSockOptScratch,A0
MOVE.L (A0),D0
@ -1545,6 +1754,7 @@ _SocketWaitAsyncWriting_Ready:
_SocketWaitAsyncWriting_Error:
MOVE.L (SP)+,D1
_SocketWaitAsyncWriting_Error2:
MOVEM.L (SP)+,A3-A4
MOVE.L #-1,D3
@ -1626,7 +1836,6 @@ _SocketWaitAsyncReading_LibraryOpen:
BMI _SocketWaitAsyncReading_Done
MOVE.L (SP)+,D0 ; D0 contains socket again
;Dload A4
; a socket became interesting, check the Fdset
MOVE.L D0,D3 ; socket in D3
MOVEQ #0,D1 ; fdset in D1
@ -1721,12 +1930,12 @@ _SocketReuseAddr_LibraryOpen:
MOVE.L #SOL_SOCKET,D1 ; Level
WithDataStorageToA3
WithDataStorage
Dlea IoctlSockOptScratch,A0 ; optval
MOVE.L D3,A0
MOVEQ #4,D3
LoadBSDSocketBaseFromA3
LoadBSDSocketBase
CALLLIB setsockopt
EndDataStorage
@ -1737,44 +1946,46 @@ _SocketReuseAddr_LibraryOpen:
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =Dns Get Address By Name$(Name String)
;
; Get the status of a socket
; Convert a host name to an IP address
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par DnsGetHostAddressByName
PreserveStackFunction
EnsureBSDSocketLibrary .LibraryOpen
EnsureBSDSocketLibrary _DnsGetHostAddressByName_LibraryOpen
MOVE.L ChVide(A5),D3
RestoreStackFunction
Ret_String
.LibraryOpen:
_DnsGetHostAddressByName_LibraryOpen:
; string so you need demande, hichaine, and chvide
MOVE.L D3,A0 ; name
MOVEQ #0,D0
MOVE.W (A0)+,D0 ; d0 contains length
MOVE.L D0,D1 ; d1 also has length
MOVE.L D0,D2 ; d2 also has length
Rjsr L_RamFast ; d0 contains address
BNE .StringRamAllocated
BNE _DnsGetHostAddressByName_StringRamAllocated
MOVE.L ChVide(A5),D3
RestoreStackFunction
Ret_String
.StringRamAllocated:
_DnsGetHostAddressByName_StringRamAllocated:
MOVE.L D0,A1 ; a1 contains address
SUBQ #1,D1 ; reduce by one for DBRA
.KeepCopyingAMOSString
_DnsGetHostAddressByName_KeepCopyingAMOSString:
MOVE.B (A0)+,(A1)+ ; byte copy
DBRA D1,.KeepCopyingAMOSString ; keep copying
DBRA D1,_DnsGetHostAddressByName_KeepCopyingAMOSString ; keep copying
MOVE.B #0,(A1)+ ; null terminate string
MOVE.L D0,A0 ; first param of gethostbyname
MOVEM.L A0/D2,-(SP)
WithDataStorageToA3
LoadBSDSocketBaseFromA3
WithDataStorage
LoadBSDSocketBase
CALLLIB gethostbyname
EndDataStorage
MOVEM.L (SP)+,A0/D2
@ -1787,21 +1998,21 @@ _SocketReuseAddr_LibraryOpen:
MOVE.L (SP)+,D0
TST.L D0
BNE .GetIPAddress
BNE _DnsGetHostAddressByName_GetIPAddress
RestoreStackFunction
MOVE.L ChVide(A5),D3
Ret_String
.GetIPAddress:
_DnsGetHostAddressByName_GetIPAddress:
MOVE.L D0,A0
MOVE.L 16(A0),A1 ; **h_addr_list
MOVE.L (A1),A1 ; *h_addr_list
MOVE.L (A1),D0 ; h_addr_list[0]
WithDataStorageToA3
LoadBSDSocketBaseFromA3
WithDataStorage
LoadBSDSocketBase
CALLLIB Inet_NtoA
EndDataStorage
@ -1809,27 +2020,32 @@ _SocketReuseAddr_LibraryOpen:
MOVE.L A2,-(SP)
MOVEQ #0,D3
.GetIPAddressLength:
_DnsGetHostAddressByName_GetIPAddressLength:
ADDQ #1,D3
TST.B (A2)+
BNE .GetIPAddressLength
BNE _DnsGetHostAddressByName_GetIPAddressLength
MOVE.L (SP)+,A2
SUBQ #1,D3
MOVE.L D3,D4
AND.W #$FFFE,D3
ADDQ #2,D3
Rjsr L_Demande ; string is in A0/A1
LEA 2(A0,D3.W),A1
MOVE.L A1,HiChaine(A5)
MOVE.L A0,D3
MOVE.L A0,A1
MOVE.W D4,(A1)+
MOVE.W D4,(A0)+
SUBQ #1,D4
.KeepCopying:
MOVE.B (A2,D4),(A0,D4)
DBRA D4,.KeepCopying
_DnsGetHostAddressByName_KeepCopying:
MOVE.B (A2)+,(A1)+
DBRA D4,_DnsGetHostAddressByName_KeepCopying
MOVE.L A0,D3
RestoreStackFunction
@ -1844,7 +2060,7 @@ _SocketReuseAddr_LibraryOpen:
; - - - - - - - - - - - - -
PreserveStackFunction
MOVE.L D3,D4 ; milliseconds
MOVE.L D3,D4 ; milliseconts
MOVE.L (A3)+,D0 ; socket id
EnsureBSDSocketLibrary _SocketSetTimeout_LibraryOpen
@ -1866,7 +2082,7 @@ _SocketSetTimeout_LibraryOpen:
MOVE.L (A0)+,(A1)+
SUB.L #8,A1 ; go back
WithDataStorageToA3
WithDataStorage
; socket is d0
MOVE.L #SOL_SOCKET,D1 ; Level
MOVE.L #$1005,D2 ; SO_SNDTIMEO
@ -1874,7 +2090,7 @@ _SocketSetTimeout_LibraryOpen:
MOVEQ #8,D3
MOVEM.L D0/A0,-(SP)
LoadBSDSocketBaseFromA3
LoadBSDSocketBase
CALLLIB setsockopt
TST.L D0
@ -1885,7 +2101,7 @@ _SocketSetTimeout_LibraryOpen:
MOVE.L #$1006,D2 ; SO_RCVTIMEO
MOVEQ #8,D3
LoadBSDSocketBaseFromA3
LoadBSDSocketBase
CALLLIB setsockopt
EndDataStorage
@ -1912,17 +2128,17 @@ _SocketSetTimeout_Fail:
Lib_Par SocketCloseSocket
; - - - - - - - - - - - - -
PreserveStackFunction
EnsureBSDSocketLibrary .LibraryOpen
EnsureBSDSocketLibrary _SocketCloseSocket_LibraryOpen
RestoreStackFunction
Ret_Int
.LibraryOpen:
_SocketCloseSocket_LibraryOpen:
MOVE.L D3,D0
WithDataStorageToA3
LoadBSDSocketBaseFromA3
WithDataStorage
LoadBSDSocketBase
CALLLIB CloseSocket
EndDataStorage
@ -1939,7 +2155,12 @@ _SocketSetTimeout_Fail:
Lib_Par SocketHerrno
; - - - - - - - - - - - - -
PreserveStackFunction
EnsureBSDSocketLibrary _SocketHerrno_LibraryOpen
RestoreStackFunction
Ret_Int
_SocketHerrno_LibraryOpen:
; set up tag list memory and place for herrno to go
Dlea AcceptScratchArea,A0
MOVE.L A0,A2
@ -1952,13 +2173,13 @@ _SocketSetTimeout_Fail:
MOVE.L 0,(A0)+
MOVE.L A2,A0
WithDataStorageToA3
LoadBSDSocketBaseFromA3
WithDataStorage
LoadBSDSocketBase
CALLLIB SocketBaseTagList
EndDataStorage
TST.L D0
BEQ .success
BEQ _SocketHerrno_success
; failed
MOVE.L #-1,D3
@ -1966,7 +2187,7 @@ _SocketSetTimeout_Fail:
RestoreStackFunction
Ret_Int
.success
_SocketHerrno_success:
MOVE.L (A1),D3
RestoreStackFunction

40
src/BSDSocket_Labels.s Normal file
View File

@ -0,0 +1,40 @@
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; BSDSocket.s, list of the library functions on the 02-05-2024 14:22:07
;
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
L_Cold: set 0
L_SocketLibraryOpen: set 2
L_SocketLibraryClose: set 3
L_DoSocketSockaddrFree: set 4
L_SocketIPAddressPortToSockaddr:set 5
L_SocketCreateInetSocket:set 6
L_SocketConnect: set 7
L_SocketSendString: set 8
L_SocketSendData: set 9
L_SocketBind: set 10
L_SocketErrno: set 11
L_SocketListen: set 12
L_SocketAccept: set 13
L_SocketSetNonblocking: set 14
L_SocketSetsockoptInt: set 15
L_SocketGetsockoptInt: set 16
L_SocketFdsetZero: set 17
L_SocketFdsetSet: set 18
L_SocketFdsetIsSet: set 19
L_SocketSelect: set 20
L_SocketGetDebugArea: set 21
L_SocketGetHost: set 22
L_SocketGetPort: set 23
L_SocketInetNtoA: set 24
L_SocketRecvString: set 25
L_SocketRecvData: set 26
L_DoSocketLibraryClose: set 27
L_SocketWaitAsyncWriting:set 28
L_SocketWaitAsyncReading:set 29
L_SocketReuseAddr: set 30
L_MicrosecondsToTimeval:set 31
L_SetSockoptInt: set 32
L_DnsGetHostAddressByName:set 33
L_SocketSetTimeout: set 34
L_SocketCloseSocket: set 35
L_SocketHerrno: set 36

5
src/BSDSocket_Size.s Normal file
View File

@ -0,0 +1,5 @@
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; BSDSocket.s, library size on the 02-05-2024 14:22:07
;
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lib_Size equ 39

View File

@ -9,5 +9,4 @@ FAILAT 21
copy AMOSPro_System:APSystem/AMOSPro_BSDSocket.lib AMOSPro_System:APSystem/AMOSPro_BSDSocket.lib.bak
FAILAT 10
copy AMOSPro_BSDSocket.Lib AMOSPro_System:APSystem/
;use an amos file here that includes the plugin to quickly build a test program
;apcmp "aqua_test_plugin.amos" inclib
apcmp "/test/TestSuite.amos" inclib

107
src/bsdsocket_lib.fd Normal file
View File

@ -0,0 +1,107 @@
##base _SocketBase
##public
##bias 30
socket(domain,type,protocol)(d0/d1/d2)
bind(sock,name,namelen)(d0/a0/d1)
listen(sock,backlog)(d0/d1)
accept(sock,addr,addrlen)(d0/a0/a1)
connect(sock,name,namelen)(d0/a0/d1)
sendto(sock,buf,len,flags,to,tolen)(d0/a0/d1/d2/a1/d3)
send(sock,buf,len,flags)(d0/a0/d1/d2)
recvfrom(sock,buf,len,flags,addr,addrlen)(d0/a0/d1/d2/a1/a2)
recv(sock,buf,len,flags)(d0/a0/d1/d2)
shutdown(sock,how)(d0/d1)
setsockopt(sock,level,optname,optval,optlen)(d0/d1/d2/a0/d3)
getsockopt(sock,level,optname,optval,optlen)(d0/d1/d2/a0/a1)
getsockname(sock,name,namelen)(d0/a0/a1)
getpeername(sock,name,namelen)(d0/a0/a1)
IoctlSocket(sock,req,argp)(d0/d1/a0)
CloseSocket(sock)(d0)
WaitSelect(nfds,read_fds,write_fds,except_fds,timeout,signals)(d0/a0/a1/a2/a3/d1)
SetSocketSignals(int_mask,io_mask,urgent_mask)(d0/d1/d2)
getdtablesize()()
ObtainSocket(id,domain,type,protocol)(d0/d1/d2/d3)
ReleaseSocket(sock,id)(d0/d1)
ReleaseCopyOfSocket(sock,id)(d0/d1)
Errno()()
SetErrnoPtr(errno_ptr,size)(a0/d0)
Inet_NtoA(ip)(d0)
inet_addr(cp)(a0)
Inet_LnaOf(in)(d0)
Inet_NetOf(in)(d0)
Inet_MakeAddr(net,host)(d0/d1)
inet_network(cp)(a0)
gethostbyname(name)(a0)
gethostbyaddr(addr,len,type)(a0/d0/d1)
getnetbyname(name)(a0)
getnetbyaddr(net,type)(d0/d1)
getservbyname(name,proto)(a0/a1)
getservbyport(port,proto)(d0/a0)
getprotobyname(name)(a0)
getprotobynumber(proto)(d0)
vsyslog(pri,msg,args)(d0/a0/a1)
Dup2Socket(old_socket,new_socket)(d0/d1)
sendmsg(sock,msg,flags)(d0/a0/d1)
recvmsg(sock,msg,flags)(d0/a0/d1)
gethostname(name,namelen)(a0/d0)
gethostid()()
SocketBaseTagList(tags)(a0)
GetSocketEvents(event_ptr)(a0)
##bias 366
bpf_open(channel)(d0)
bpf_close(channel)(d0)
bpf_read(channel,buffer,len)(d0/a0/d1)
bpf_write(channel,buffer,len)(d0/a0/d1)
bpf_set_notify_mask(channel,signal_mask)(d1/d0)
bpf_set_interrupt_mask(channel,signal_mask)(d0/d1)
bpf_ioctl(channel,command,buffer)(d0/d1/a0)
bpf_data_waiting(channel)(d0)
AddRouteTagList(tags)(a0)
DeleteRouteTagList(tags)(a0)
##bias 432
FreeRouteInfo(buf)(a0)
GetRouteInfo(address_family,flags)(d0/d1)
AddInterfaceTagList(interface_name,device_name,unit,tags)(a0/a1/d0/a2)
ConfigureInterfaceTagList(interface_name,tags)(a0/a1)
ReleaseInterfaceList(list)(a0)
ObtainInterfaceList()()
QueryInterfaceTagList(interface_name,tags)(a0/a1)
CreateAddrAllocMessageA(version,protocol,interface_name,result_ptr,tags)(d0/d1/a0/a1/a2)
DeleteAddrAllocMessage(aam)(a0)
BeginInterfaceConfig(message)(a0)
AbortInterfaceConfig(message)(a0)
AddNetMonitorHookTagList(type,hook,tags)(d0/a0/a1)
RemoveNetMonitorHook(hook)(a0)
GetNetworkStatistics(type,version,destination,size)(d0/d1/a0/d2)
AddDomainNameServer(address)(a0)
RemoveDomainNameServer(address)(a0)
ReleaseDomainNameServerList(list)(a0)
ObtainDomainNameServerList()()
setnetent(stay_open)(d0)
endnetent()()
getnetent()()
setprotoent(stay_open)(d0)
endprotoent()()
getprotoent()()
setservent(stay_open)(d0)
endservent()()
getservent()()
inet_aton(cp,addr)(a0/a1)
inet_ntop(af,src,dst,size)(d0/a0/a1/d1)
inet_pton(af,src,dst)(d0/a0/a1)
In_LocalAddr(address)(d0)
In_CanForward(address)(d0)
mbuf_copym(m,off,len)(a0/d0/d1)
mbuf_copyback(m,off,len,cp)(a0/d0/d1/a1)
mbuf_copydata(m,off,len,cp)(a0/d0/d1/a1)
mbuf_free(m)(a0)
mbuf_freem(m)(a0)
mbuf_get()()
mbuf_gethdr()()
mbuf_prepend(m,len)(a0/d0)
mbuf_cat(m,n)(a0/a1)
mbuf_adj(mp,req_len)(a0/d0)
mbuf_pullup(m,len)(a0/d0)
ProcessIsServer(pr)(a0)
ObtainServerSocket()()
##end

208
src/bsdsocket_lvo.i Normal file
View File

@ -0,0 +1,208 @@
IFND LIBRARIES_BSDSOCKET_LVO_I
LIBRARIES_BSDSOCKET_LVO_I SET 1
XDEF _LVOsocket
XDEF _LVObind
XDEF _LVOlisten
XDEF _LVOaccept
XDEF _LVOconnect
XDEF _LVOsendto
XDEF _LVOsend
XDEF _LVOrecvfrom
XDEF _LVOrecv
XDEF _LVOshutdown
XDEF _LVOsetsockopt
XDEF _LVOgetsockopt
XDEF _LVOgetsockname
XDEF _LVOgetpeername
XDEF _LVOIoctlSocket
XDEF _LVOCloseSocket
XDEF _LVOWaitSelect
XDEF _LVOSetSocketSignals
XDEF _LVOgetdtablesize
XDEF _LVOObtainSocket
XDEF _LVOReleaseSocket
XDEF _LVOReleaseCopyOfSocket
XDEF _LVOErrno
XDEF _LVOSetErrnoPtr
XDEF _LVOInet_NtoA
XDEF _LVOinet_addr
XDEF _LVOInet_LnaOf
XDEF _LVOInet_NetOf
XDEF _LVOInet_MakeAddr
XDEF _LVOinet_network
XDEF _LVOgethostbyname
XDEF _LVOgethostbyaddr
XDEF _LVOgetnetbyname
XDEF _LVOgetnetbyaddr
XDEF _LVOgetservbyname
XDEF _LVOgetservbyport
XDEF _LVOgetprotobyname
XDEF _LVOgetprotobynumber
XDEF _LVOvsyslog
XDEF _LVODup2Socket
XDEF _LVOsendmsg
XDEF _LVOrecvmsg
XDEF _LVOgethostname
XDEF _LVOgethostid
XDEF _LVOSocketBaseTagList
XDEF _LVOGetSocketEvents
XDEF _LVObpf_open
XDEF _LVObpf_close
XDEF _LVObpf_read
XDEF _LVObpf_write
XDEF _LVObpf_set_notify_mask
XDEF _LVObpf_set_interrupt_mask
XDEF _LVObpf_ioctl
XDEF _LVObpf_data_waiting
XDEF _LVOAddRouteTagList
XDEF _LVODeleteRouteTagList
XDEF _LVOFreeRouteInfo
XDEF _LVOGetRouteInfo
XDEF _LVOAddInterfaceTagList
XDEF _LVOConfigureInterfaceTagList
XDEF _LVOReleaseInterfaceList
XDEF _LVOObtainInterfaceList
XDEF _LVOQueryInterfaceTagList
XDEF _LVOCreateAddrAllocMessageA
XDEF _LVODeleteAddrAllocMessage
XDEF _LVOBeginInterfaceConfig
XDEF _LVOAbortInterfaceConfig
XDEF _LVOAddNetMonitorHookTagList
XDEF _LVORemoveNetMonitorHook
XDEF _LVOGetNetworkStatistics
XDEF _LVOAddDomainNameServer
XDEF _LVORemoveDomainNameServer
XDEF _LVOReleaseDomainNameServerList
XDEF _LVOObtainDomainNameServerList
XDEF _LVOsetnetent
XDEF _LVOendnetent
XDEF _LVOgetnetent
XDEF _LVOsetprotoent
XDEF _LVOendprotoent
XDEF _LVOgetprotoent
XDEF _LVOsetservent
XDEF _LVOendservent
XDEF _LVOgetservent
XDEF _LVOinet_aton
XDEF _LVOinet_ntop
XDEF _LVOinet_pton
XDEF _LVOIn_LocalAddr
XDEF _LVOIn_CanForward
XDEF _LVOmbuf_copym
XDEF _LVOmbuf_copyback
XDEF _LVOmbuf_copydata
XDEF _LVOmbuf_free
XDEF _LVOmbuf_freem
XDEF _LVOmbuf_get
XDEF _LVOmbuf_gethdr
XDEF _LVOmbuf_prepend
XDEF _LVOmbuf_cat
XDEF _LVOmbuf_adj
XDEF _LVOmbuf_pullup
XDEF _LVOProcessIsServer
XDEF _LVOObtainServerSocket
_LVOsocket EQU -30
_LVObind EQU -36
_LVOlisten EQU -42
_LVOaccept EQU -48
_LVOconnect EQU -54
_LVOsendto EQU -60
_LVOsend EQU -66
_LVOrecvfrom EQU -72
_LVOrecv EQU -78
_LVOshutdown EQU -84
_LVOsetsockopt EQU -90
_LVOgetsockopt EQU -96
_LVOgetsockname EQU -102
_LVOgetpeername EQU -108
_LVOIoctlSocket EQU -114
_LVOCloseSocket EQU -120
_LVOWaitSelect EQU -126
_LVOSetSocketSignals EQU -132
_LVOgetdtablesize EQU -138
_LVOObtainSocket EQU -144
_LVOReleaseSocket EQU -150
_LVOReleaseCopyOfSocket EQU -156
_LVOErrno EQU -162
_LVOSetErrnoPtr EQU -168
_LVOInet_NtoA EQU -174
_LVOinet_addr EQU -180
_LVOInet_LnaOf EQU -186
_LVOInet_NetOf EQU -192
_LVOInet_MakeAddr EQU -198
_LVOinet_network EQU -204
_LVOgethostbyname EQU -210
_LVOgethostbyaddr EQU -216
_LVOgetnetbyname EQU -222
_LVOgetnetbyaddr EQU -228
_LVOgetservbyname EQU -234
_LVOgetservbyport EQU -240
_LVOgetprotobyname EQU -246
_LVOgetprotobynumber EQU -252
_LVOvsyslog EQU -258
_LVODup2Socket EQU -264
_LVOsendmsg EQU -270
_LVOrecvmsg EQU -276
_LVOgethostname EQU -282
_LVOgethostid EQU -288
_LVOSocketBaseTagList EQU -294
_LVOGetSocketEvents EQU -300
_LVObpf_open EQU -366
_LVObpf_close EQU -372
_LVObpf_read EQU -378
_LVObpf_write EQU -384
_LVObpf_set_notify_mask EQU -390
_LVObpf_set_interrupt_mask EQU -396
_LVObpf_ioctl EQU -402
_LVObpf_data_waiting EQU -408
_LVOAddRouteTagList EQU -414
_LVODeleteRouteTagList EQU -420
_LVOFreeRouteInfo EQU -432
_LVOGetRouteInfo EQU -438
_LVOAddInterfaceTagList EQU -444
_LVOConfigureInterfaceTagList EQU -450
_LVOReleaseInterfaceList EQU -456
_LVOObtainInterfaceList EQU -462
_LVOQueryInterfaceTagList EQU -468
_LVOCreateAddrAllocMessageA EQU -474
_LVODeleteAddrAllocMessage EQU -480
_LVOBeginInterfaceConfig EQU -486
_LVOAbortInterfaceConfig EQU -492
_LVOAddNetMonitorHookTagList EQU -498
_LVORemoveNetMonitorHook EQU -504
_LVOGetNetworkStatistics EQU -510
_LVOAddDomainNameServer EQU -516
_LVORemoveDomainNameServer EQU -522
_LVOReleaseDomainNameServerList EQU -528
_LVOObtainDomainNameServerList EQU -534
_LVOsetnetent EQU -540
_LVOendnetent EQU -546
_LVOgetnetent EQU -552
_LVOsetprotoent EQU -558
_LVOendprotoent EQU -564
_LVOgetprotoent EQU -570
_LVOsetservent EQU -576
_LVOendservent EQU -582
_LVOgetservent EQU -588
_LVOinet_aton EQU -594
_LVOinet_ntop EQU -600
_LVOinet_pton EQU -606
_LVOIn_LocalAddr EQU -612
_LVOIn_CanForward EQU -618
_LVOmbuf_copym EQU -624
_LVOmbuf_copyback EQU -630
_LVOmbuf_copydata EQU -636
_LVOmbuf_free EQU -642
_LVOmbuf_freem EQU -648
_LVOmbuf_get EQU -654
_LVOmbuf_gethdr EQU -660
_LVOmbuf_prepend EQU -666
_LVOmbuf_cat EQU -672
_LVOmbuf_adj EQU -678
_LVOmbuf_pullup EQU -684
_LVOProcessIsServer EQU -690
_LVOObtainServerSocket EQU -696
ENDC

BIN
test/TestSuite Normal file

Binary file not shown.

BIN
test/TestSuite.amos Normal file

Binary file not shown.

354
test/TestSuite.basic Normal file
View File

@ -0,0 +1,354 @@
' BSD Socket Extension Test Suite
'
' Exercise all known functionality of the extension and write
' a report file detailing the result.
Screen Open 0,640,200,4,Hires
_FILE_HANDLE=1
Dim _CONTEXT$(10)
_CONTEXT_INDEX=0
Global _FILE_HANDLE,_CONTEXT$(),_CONTEXT_INDEX
Procedure _ADD_TO_REPORT[MESSAGE$]
_CONTEXT_STRING$=""
For I=0 To _CONTEXT_INDEX-1
_CONTEXT_STRING$=_CONTEXT_STRING$+_CONTEXT$(I)
If I<>(_CONTEXT_INDEX-1)
_CONTEXT_STRING$=_CONTEXT_STRING$+"/"
End If
Next I
_OUTPUT$="["+_CONTEXT_STRING$+"] "+MESSAGE$
Print #_FILE_HANDLE,_OUTPUT$
Print _OUTPUT$
' ensure line is printed on screen to catch crashes
Wait Vbl
End Proc
Procedure _BEGIN_CONTEXT[NAME$]
_CONTEXT$(_CONTEXT_INDEX)=NAME$
_CONTEXT_INDEX=_CONTEXT_INDEX+1
End Proc
Procedure _END_CONTEXT
_CONTEXT_INDEX=_CONTEXT_INDEX-1
End Proc
Open Out _FILE_HANDLE,"report.txt"
_BEGIN_CONTEXT["Socket Library Open"]
_BEGIN_CONTEXT["Open Library"]
_LIBRARY_ADDRESS=Socket Library Open
_ADD_TO_REPORT[Str$(_LIBRARY_ADDRESS)]
_END_CONTEXT
If _LIBRARY_ADDRESS=0
_ADD_TO_REPORT["bsdsocket.library not available, ending tests"]
_END_CONTEXT
Goto _FINISH_SUITE
End If
_BEGIN_CONTEXT["Double open"]
_NEW_LIBRARY_ADDRESS=Socket Library Open
_ADD_TO_REPORT[Str$(_NEW_LIBRARY_ADDRESS)]
_END_CONTEXT
_END_CONTEXT
_BEGIN_CONTEXT["Socket Create Inet Socket"]
SOCKET=Socket Create Inet Socket
_ADD_TO_REPORT[Str$(SOCKET)]
_END_CONTEXT
_BEGIN_CONTEXT["Socket Reuse Addr"]
RESULT=Socket Reuse Addr(SOCKET)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_BEGIN_CONTEXT["Socket Set Nonblocking"]
_BEGIN_CONTEXT["False"]
RESULT=Socket Set Nonblocking(SOCKET,False)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_BEGIN_CONTEXT["True"]
RESULT=Socket Set Nonblocking(SOCKET,True)
_ADD_TO_REPORT[Str$(RESULT)]
_ADD_TO_REPORT["Preserving this state for rest of tests"]
_END_CONTEXT
_END_CONTEXT
_BEGIN_CONTEXT["Dns Get Address By Name$"]
_BEGIN_CONTEXT["Bad domain name"]
IP$=Dns Get Address By Name$("u8dsf93jsdfoiodsoi.sdfjdsoifueru.sadfasdsdasd")
Print IP$
_ADD_TO_REPORT[IP$]
_END_CONTEXT
_BEGIN_CONTEXT["localhost"]
IP$=Dns Get Address By Name$("localhost")
_ADD_TO_REPORT[IP$]
_END_CONTEXT
_BEGIN_CONTEXT["aminet.net"]
IP$=Dns Get Address By Name$("aminet.net")
Print IP$
_ADD_TO_REPORT[IP$]
_ADD_TO_REPORT["Using this IP address for connection tests"]
_END_CONTEXT
_BEGIN_CONTEXT["Returned string can be manipulated"]
_ADD_TO_REPORT["Cat"+IP$+"Dog"]
_END_CONTEXT
_END_CONTEXT
_BEGIN_CONTEXT["Socket Connect"]
_BEGIN_CONTEXT["port too high"]
RESULT=Socket Connect(SOCKET To IP$,999999)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_BEGIN_CONTEXT["blank ip"]
RESULT=Socket Connect(SOCKET To "",80)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_BEGIN_CONTEXT["invalid ip -- requires reopening failed socket"]
RESULT=Socket Connect(SOCKET To "999.999.999.999",80)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_BEGIN_CONTEXT["Socket Close Socket"]
RESULT=Socket Close Socket(SOCKET)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
' re-set up this socket after a failed connection
SOCKET=Socket Create Inet Socket
_=Socket Set Nonblocking(SOCKET,True)
_BEGIN_CONTEXT["aminet IP ("+IP$+") from above"]
RESULT=Socket Connect(SOCKET To IP$,80)
_ADD_TO_REPORT[Str$(RESULT)+" (ok to be -1, will Wait Async Writing next)"]
_END_CONTEXT
_END_CONTEXT
_BEGIN_CONTEXT["Socket Wait Async Writing"]
_BEGIN_CONTEXT["With unconnected socket"]
OTHER_SOCKET=Socket Create Inet Socket
_=Socket Set Nonblocking(OTHER_SOCKET,True)
_BEGIN_CONTEXT["2 second timeout"]
RESULT=Socket Wait Async Writing(OTHER_SOCKET,2000)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_BEGIN_CONTEXT["Zero timeout"]
RESULT=Socket Wait Async Writing(OTHER_SOCKET,0)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_END_CONTEXT
_BEGIN_CONTEXT["Connected socket"]
_BEGIN_CONTEXT["Two second timeout"]
RESULT=Socket Wait Async Writing(SOCKET,2000)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_BEGIN_CONTEXT["Zero timeout"]
RESULT=Socket Wait Async Writing(SOCKET,0)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_BEGIN_CONTEXT["Attempt to get actual connection"]
For TRIES=0 To 10
RESULT=Socket Wait Async Writing(SOCKET,500)
_ADD_TO_REPORT[Str$(RESULT)]
If RESULT>0
Exit
End If
Next TRIES
_END_CONTEXT
_END_CONTEXT
_END_CONTEXT
_BEGIN_CONTEXT["Socket Get Host"]
_BEGIN_CONTEXT["socket id too high"]
RESULT=Socket Get Host(999999)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_BEGIN_CONTEXT["socket id is valid"]
RESULT=Socket Get Host(SOCKET)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_END_CONTEXT
_BEGIN_CONTEXT["Socket Get Port"]
_BEGIN_CONTEXT["socket id too high"]
RESULT=Socket Get Port(999999)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_BEGIN_CONTEXT["socket id is valid"]
RESULT=Socket Get Port(SOCKET)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_END_CONTEXT
_BEGIN_CONTEXT["Socket Inet Ntoa$"]
_BEGIN_CONTEXT["Use the socket host"]
RESULT$=Socket Inet Ntoa$(Socket Get Host(SOCKET))
_ADD_TO_REPORT[RESULT$]
_END_CONTEXT
_BEGIN_CONTEXT["String can be manipulated"]
_ADD_TO_REPORT["Cat"+RESULT$+"Dog"]
_END_CONTEXT
_END_CONTEXT
_BEGIN_CONTEXT["Socket Send and Socket Send$"]
HTTP_REQUEST_HEADERS$="GET / HTTP/1.0"+Chr$(10)+"Host: amiga"+Chr$(10)+Chr$(10)
_BEGIN_CONTEXT["Socket send$ first half"]
FIRST_HALF$=Left$(HTTP_REQUEST_HEADERS$,10)
RESULT=Socket Send$(SOCKET,FIRST_HALF$)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_BEGIN_CONTEXT["Socket send second half"]
SECOND_HALF_START=Varptr(HTTP_REQUEST_HEADERS$)+10
SECOND_HALF_LENGTH=Len(HTTP_REQUEST_HEADERS$)-10
RESULT=Socket Send(SOCKET,SECOND_HALF_START,SECOND_HALF_LENGTH)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_END_CONTEXT
_BEGIN_CONTEXT["Socket wait Async Reading"]
_BEGIN_CONTEXT["With unconnected socket"]
_BEGIN_CONTEXT["2 second timeout"]
RESULT=Socket Wait Async Reading(OTHER_SOCKET,2000)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_BEGIN_CONTEXT["Zero timeout"]
RESULT=Socket Wait Async Reading(OTHER_SOCKET,0)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_END_CONTEXT
_BEGIN_CONTEXT["With aminet socket"]
_BEGIN_CONTEXT["2 second timeout"]
RESULT=Socket Wait Async Reading(SOCKET,2000)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_BEGIN_CONTEXT["Zero timeout"]
RESULT=Socket Wait Async Reading(SOCKET,0)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_END_CONTEXT
_END_CONTEXT
'Goto _FINISH_SUITE
_BEGIN_CONTEXT["Socket Recv$ and Socket Recv"]
_BEGIN_CONTEXT["Socket Recv$"]
_BEGIN_CONTEXT["Read 20 characters"]
RESULT$=Socket Recv$(SOCKET,20)
_ADD_TO_REPORT[RESULT$]
_END_CONTEXT
_BEGIN_CONTEXT["String can be manipulated"]
_ADD_TO_REPORT["Cat"+RESULT$+"Dog"]
_END_CONTEXT
_END_CONTEXT
_BEGIN_CONTEXT["Socket Read"]
Reserve As Work 20,20
_BEGIN_CONTEXT["Read 20 bytes"]
RESULT=Socket Recv(SOCKET To Start(20),20)
_ADD_TO_REPORT[Str$(RESULT)]
_END_CONTEXT
_BEGIN_CONTEXT["Data was read"]
BASE$="12345678901234567890"
For I=0 To 19
Mid$(BASE$,I+1,1)=Chr$(Peek(Start(20)+I))
Next I
_ADD_TO_REPORT[BASE$]
_END_CONTEXT
Erase 20
_END_CONTEXT
_END_CONTEXT
_FINISH_SUITE:
_BEGIN_CONTEXT["Socket Library Close"]
_BEGIN_CONTEXT["Close"]
Socket Library Close
_ADD_TO_REPORT["Success"]
_END_CONTEXT
_BEGIN_CONTEXT["Double close"]
Socket Library Close
_ADD_TO_REPORT["Success"]
_END_CONTEXT
_END_CONTEXT
_BEGIN_CONTEXT["Call functions with library closed"]
_=Socket Set Nonblocking(0,True)
_ADD_TO_REPORT["Socket Set Nonblocking"]
_=Socket Reuse Addr(0)
_ADD_TO_REPORT["Socket Reuse Addr"]
_=Socket Create Inet Socket
_ADD_TO_REPORT["Socket Create Inet Socket"]
_=Socket Connect(0 To "",0)
_ADD_TO_REPORT["Socket Connect"]
_=Socket Bind(0 To "",0)
_ADD_TO_REPORT["Socket Bind"]
_=Socket Listen(0)
_ADD_TO_REPORT["Socket Listen"]
_=Socket Accept(0)
_ADD_TO_REPORT["Socket Accept"]
_=Socket Wait Async Reading(0,0)
_ADD_TO_REPORT["Socket Wait Async Reading"]
_=Socket Wait Async Writing(0,0)
_ADD_TO_REPORT["Socket Wait Async Writing"]
_=Socket Set Timeout(0,0)
_ADD_TO_REPORT["Socket Set Timeout"]
_=Socket Close Socket(0)
_ADD_TO_REPORT["Socket Close Socket"]
_=Socket Send$(0,"")
_ADD_TO_REPORT["Socket Send$"]
_=Socket Send(0,0,0)
_ADD_TO_REPORT["Socket Send"]
_$=Socket Recv$(0,0)
_ADD_TO_REPORT["Socket Recv$"]
_=Socket Recv(0 To 0,0)
_ADD_TO_REPORT["Socket Recv"]
_=Socket Get Host(0)
_ADD_TO_REPORT["Socket Get Host"]
_=Socket Get Port(0)
_ADD_TO_REPORT["Socket Get Port"]
_$=Socket Inet Ntoa$(0)
_ADD_TO_REPORT["Socket Inet Ntoa$"]
_=Socket Errno
_ADD_TO_REPORT["Socket Errno"]
_=Socket Herrno
_ADD_TO_REPORT["Socket Herrno"]
_$=Dns Get Address By Name$("")
_ADD_TO_REPORT["Dns Get Address By Name$"]
_END_CONTEXT
Close 1