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/ build/
aminet/ aminet/
Disk.info Disk.info
private-test/
stuff/ stuff/
patches/
.vamosrc
activate
test/report.txt
test/TestSuite.info
src/report.txt
src/BSDSocket_Labels.s src/BSDSocket_Labels.s
src/BSDSocket_Size.s src/BSDSocket_Size.s
src/bsdsocket_lib.fd src/bsdsocket_lib.fd
src/bsdsocket_lvo.i src/bsdsocket_lvo.i
src/*.Lib src/*.Lib
.vamosrc
activate
test/

117
API.md
View File

@ -3,7 +3,9 @@
Most functions will return -2 if the bsdsocket.library is Most functions will return -2 if the bsdsocket.library is
not open. not open.
### Setup ---
## Setup
#### ADDR=Socket Library Open #### 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 * If needed, you'll be able to directly access library functions
using this address. using this address.
---
#### Socket Library Close #### Socket Library Close
Close bsdsocket.library. This is safe to call if the library Close bsdsocket.library. This is safe to call if the library
is not open is not open
---
#### RESULT=Socket Set Nonblocking(Socket, IsNonblocking BOOL) #### RESULT=Socket Set Nonblocking(Socket, IsNonblocking BOOL)
Make a socket blocking (False, default), or nonblocking (True). 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 of IoctlSocket call.
---
#### RESULT=Socket Reuse Addr(Socket) #### RESULT=Socket Reuse Addr(Socket)
Make a listening socket reuse the address it's trying to bind to. 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. * Result of setsockopt call.
---
## Connections
### Connections
#### SOCKET=Socket Create Inet Socket #### SOCKET=Socket Create Inet Socket
@ -51,10 +59,23 @@ Create a new Internet socket for reading or writing.
* Socket number on success * Socket number on success
* -1 on failure * -1 on failure
---
#### RESULT=Socket Connect(Socket to IPAddress$, Port) #### RESULT=Socket Connect(Socket to IPAddress$, Port)
Attempt to connect to a remote host. Currently doesn't Attempt to connect to a remote IP address.
support DNS lookups.
##### 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 ##### Returns
@ -64,19 +85,24 @@ support DNS lookups.
the socket with Socket Select and Socket Getsockopt Int the socket with Socket Select and Socket Getsockopt Int
to see if the connection succeeded to see if the connection succeeded
* -11 port out of range * -11 port out of range
* -13 IP address has zero length
---
#### RESULT=Socket Reuse Addr(Socket) #### RESULT=Socket Reuse Addr(Socket)
Set a server socket to reuse an interface and port that had Set a server socket to reuse an interface and port that had
been used recently. You likely want this if you're building been used recently. You likely want this if you're building
something that listens on a port for connections. This calls something that listens on a port for connections. This calls
setsockopt() for you. `setsockopt()` for you.
##### Returns ##### Returns
The result of calling setsockopt() while setting your socket The result of calling setsockopt() while setting your socket
to reuse addresses. to reuse addresses.
---
#### RESULT=Socket Bind(Socket to IPAddress, Port) #### RESULT=Socket Bind(Socket to IPAddress, Port)
Attempt to bind a socket to a network interface. Use Attempt to bind a socket to a network interface. Use
@ -89,6 +115,8 @@ interfaces.
* -1 on other error * -1 on other error
* -11 port out of range * -11 port out of range
---
#### RESULT=Socket Listen(Socket) #### RESULT=Socket Listen(Socket)
Start listening for connections. Start listening for connections.
@ -98,6 +126,8 @@ Start listening for connections.
* 0 on success * 0 on success
* -1 on failure * -1 on failure
---
#### NEW_SOCKET=Socket Accept(Socket) #### NEW_SOCKET=Socket Accept(Socket)
Get the socket that connected to this one. Wait for a connect 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 * The remote socket number on success
* -1 on failure * -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. 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 Use on a listen socket to await new connections, or on a connected socket to await
a remote socket to send you data. incoming data packets.
##### Returns ##### Returns
@ -127,7 +159,9 @@ a remote socket to send you data.
* -1 on error. Use `Socket Errno` for more detail. * -1 on error. Use `Socket Errno` for more detail.
* 1 on success. * 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. 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 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. checks will return 1.
* 1 on success. * 1 on success.
---
#### RESULT=Socket Set Timeout(Socket, Wait_ms) #### RESULT=Socket Set Timeout(Socket, Wait_ms)
Set a socket to timeout after Wait_ms milliseconds if reading or writing doesn't complete. 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 * 0 on success
* -1 on error * -1 on error
---
#### RESULT=Socket Close Socket(Socket) #### RESULT=Socket Close Socket(Socket)
Close a socket. Close a socket.
##### Returns ##### Returns
* 0 on success * 0 on success
* -1 on error * -1 on error
---
## Data Transfers
### Data Transfers
#### SENT=Socket Send$(Socket, String$) #### SENT=Socket Send$(Socket, String$)
@ -194,6 +233,8 @@ End Proc
* Number of characters sent * Number of characters sent
* -1 on other error * -1 on other error
---
#### SENT=Socket Send(Socket, Data Pointer, Length) #### SENT=Socket Send(Socket, Data Pointer, Length)
Send a block of data to a connected socket. 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 * Number of characters sent
* -1 on other error * -1 on other error
---
#### DATA$=Socket Recv$(Socket, MaxLength) #### DATA$=Socket Recv$(Socket, MaxLength)
Retrieve at most MaxLength bytes from Socket, and put them into a string. 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. * 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 Retrieve at most MaxLength bytes from Socket, and put them into the memory
address at Dataptr. address at Dataptr.
@ -222,9 +267,9 @@ address at Dataptr.
* Count of bytes read * Count of bytes read
* -1 on error * -1 on error
---
## Informational
### Informational
#### HOST=Socket Get Host(Socket) #### 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 * Host as a long value
---
#### PORT=Socket Get Port(Socket) #### PORT=Socket Get Port(Socket)
Get the 16-bit port (Word) value the given socket is using. 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 * Port as a word value
---
#### RESULT$=Socket Inet Ntoa$(Host) #### RESULT$=Socket Inet Ntoa$(Host)
Turn a long Host address into a string. Turn a long Host address into a string.
@ -250,6 +299,8 @@ Turn a long Host address into a string.
* IP address as string * IP address as string
---
#### RESULT=Socket Errno #### RESULT=Socket Errno
Get the error from the last command. Note that this is 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 Error number from last call. Look in <sys/error.h> for more
details. details.
---
#### RESULT=Socket Herrno #### RESULT=Socket Herrno
Get the error from the last DNS resolver command. 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. Resolver error number (`h_errno`) from last call.
---
#### RESULT$=Dns Get Address By Name$(Domain Name$) #### RESULT$=Dns Get Address By Name$(Domain Name$)
Look up the first IP address associated with this hostname. 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. String with IP address, or blank string on error.
#### RESULT=Socket Status(Socket)
Returns basic connection information about a socket. ## Low Level
##### 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
#### RESULT=Socket Setsockopt Int(Socket, Option, Value) #### RESULT=Socket Setsockopt Int(Socket, Option, Value)
@ -319,6 +350,8 @@ Socket Reuse Addr().
* Result of setsockopt call * Result of setsockopt call
---
#### RESULT=Socket Getsockopt Int(Socket, Option) #### RESULT=Socket Getsockopt Int(Socket, Option)
Get a socket option. You probably want SO_ERROR, 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 * Result of getsockopt call
---
#### ADDR=Socket Fdset Zero(fd_set) #### ADDR=Socket Fdset Zero(fd_set)
Clear out the specified fd_set. Clear out the specified fd_set.
@ -338,6 +373,8 @@ Clear out the specified fd_set.
* Address to that particular fd_set * Address to that particular fd_set
* -1 if fd_set out of range. You get 16 of them. * -1 if fd_set out of range. You get 16 of them.
---
#### ADDR=Socket Fdset Set(fd_set, Socket to Value BOOL) #### ADDR=Socket Fdset Set(fd_set, Socket to Value BOOL)
Set or clear a socket bit in an fd_set. 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/) * [Hop to the Top: Bunny's Revenge](https://rabbit.robsmithdev.co.uk/)
* The game uses this extension to send and receive high score information. * The game uses this extension to send and receive high score information.
I also did some of the art for the game! I also did some of the art for the game!
* [Gopherized](https://allanon71.itch.io/gopherized)
Doing something cool with the extension? Doing something cool with the extension?
[Contact me](https://theindustriousrabbit.com/about) and I'll add it to the list! [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 also find a donate link on
[the About section on The Industrious Rabbit](https://theindustriousrabbit.com/about). [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) First, run `test/TestSuite` to generate a `report.txt` file.
to contact me.
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 ## Changelog
@ -207,7 +210,20 @@ to contact me.
* `Dns Get Address By Name$` * `Dns Get Address By Name$`
* `Socket Recv$` * `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 ### Environment
@ -239,9 +255,25 @@ Run `bin/setup` to do most of the setups above.
### Debugging ### Debugging
#### Cross-platform
Modify data in the `DebugArea` and read it by `Peek`/`Deek`/`Leek`ing from Modify data in the `DebugArea` and read it by `Peek`/`Deek`/`Leek`ing from
the base address provided by `Socket Get Debug Area`. 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 ### Releasing
#### Ubuntu/Debian #### Ubuntu/Debian

View File

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
for i in examples/*.amos; do for i in examples/*.amos test/*.amos; do
echo "$i" 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 done

View File

@ -35,7 +35,7 @@ FileUtils.rm_rf 'aminet'
FileUtils.mkdir_p build_dir FileUtils.mkdir_p build_dir
FileUtils.mkdir_p 'aminet' 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") 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 ; extension number 18
ExtNb equ 18-1 ExtNb equ 18-1
Version MACRO Version MACRO
dc.b "1.1.2-20240318" dc.b "1.1.4-20240426"
ENDM ENDM
VerNumber equ $1 VerNumber equ $1
@ -22,23 +22,190 @@ VerNumber equ $1
Include "+AMOS_Includes.s" Include "+AMOS_Includes.s"
Include "bsdsocket_lvo.i" Include "bsdsocket_lvo.i"
Include "LongDivide.s" ; get the effective address of something in extension memory
Include "Constants.s" Dlea MACRO
Include "fd_set.s" MOVE.L ExtAdr+ExtNb*16(A5),\2
Include "AMOSMacros.s" 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) ; call an AmigaOS function via LVO(A6)
CALLLIB MACRO CALLLIB MACRO
JSR _LVO\1(A6) JSR _LVO\1(A6)
ENDM 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 INADDR_ANY EQU 0
LoadBSDSocketBaseFromA3 MACRO
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 MOVE.L BSDSocketBase-MB(A3),A6
ENDM 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 ; check if we've opened the bsd socket library
; we do this a lot, this could probably become something ; we do this a lot, this could probably become something
; we jsr to... ; we jsr to...
@ -290,16 +457,16 @@ End
CALLLIB OpenLibrary CALLLIB OpenLibrary
MOVE.L D0,BSDSocketBase-MB(A3) MOVE.L D0,BSDSocketBase-MB(A3)
BEQ .Finish BEQ _SocketLibraryOpen_Finish
; reserve ram for sockaddr_ins ; reserve ram for sockaddr_ins
MOVE.L #MAX_SOCKETS*len_sockaddr_in,D0 MOVE.L #MAX_SOCKETS*len_sockaddr_in,D0
Rjsr L_RamFast Rjsr L_RamFast
BEQ .Finish BEQ _SocketLibraryOpen_Finish
MOVE.L D0,sockaddr_ram-MB(A3) MOVE.L D0,sockaddr_ram-MB(A3)
.Finish: _SocketLibraryOpen_Finish:
MOVE.L BSDSocketBase-MB(A3),D3 MOVE.L BSDSocketBase-MB(A3),D3
RestoreStackInstruction RestoreStackInstruction
@ -345,7 +512,7 @@ End
; ;
; Turn an IP address and port into a sockaddr_in strucure ; 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 Lib_Def SocketIPAddressPortToSockaddr
@ -366,14 +533,26 @@ _ToSockaddr_PortOK:
MOVE.L sockaddr_ram-MB(A3),A0 MOVE.L sockaddr_ram-MB(A3),A0
ADD.L D3,A0 ; A0 contains our offset in ram 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) 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 BNE _ToSockaddr_StringHasLength
ADDQ #2,A0 ; string data starts 2 bytes in 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 ; if the string contains "INADDR_ANY", we use that value instead
MOVE.L A0,A1 MOVE.L A0,A1
@ -393,12 +572,20 @@ _ToSockaddr_KeepCheckingString_2:
_ToSockaddr_ParseIPAddress: _ToSockaddr_ParseIPAddress:
Dload A3 Dload A3
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB inet_addr CALLLIB inet_addr
_ToSockaddr_DoneParsing: _ToSockaddr_DoneParsing:
MOVEM.L (SP)+,A0-A3/D3 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 MOVE.L A0,D0
MOVEM.L (SP)+,A0/A3/D3 MOVEM.L (SP)+,A0/A3/D3
@ -429,7 +616,7 @@ _SocketCreateInetSocket_LibraryOpen:
MOVE.L #SOCK_STREAM,D1 MOVE.L #SOCK_STREAM,D1
MOVE.L #IPPROTO_TCP,D2 MOVE.L #IPPROTO_TCP,D2
Dload A3 Dload A3
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB socket CALLLIB socket
MOVE.L D0,D3 MOVE.L D0,D3
@ -478,7 +665,6 @@ _SocketCreateInetSocket_Done:
Ret_Int Ret_Int
_SocketConnect_LibraryOpen: _SocketConnect_LibraryOpen:
MOVE.L D0,-(SP) ; socket id onto stack MOVE.L D0,-(SP) ; socket id onto stack
Rbsr L_SocketIPAddressPortToSockaddr Rbsr L_SocketIPAddressPortToSockaddr
@ -502,7 +688,7 @@ _SocketConnect_SockaddrIn:
; socket id is in D0 ; socket id is in D0
; sockaddr_in is in A0 ; sockaddr_in is in A0
MOVE.L #len_sockaddr_in,D1 ; len MOVE.L #len_sockaddr_in,D1 ; len
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB connect CALLLIB connect
MOVEM.L (SP)+,A0/A3 MOVEM.L (SP)+,A0/A3
@ -538,8 +724,8 @@ _SocketConnect_SockaddrIn:
_SocketSendString_LibraryOpen: _SocketSendString_LibraryOpen:
MOVEQ #0,D2 ; flags MOVEQ #0,D2 ; flags
WithDataStorageToA3 WithDataStorage
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB send CALLLIB send
EndDataStorage EndDataStorage
@ -584,8 +770,8 @@ _SocketSendData_LibraryOpen:
_SocketSendData_NotNegative: _SocketSendData_NotNegative:
MOVEQ #0,D2 ; flags MOVEQ #0,D2 ; flags
WithDataStorageToA3 WithDataStorage
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB send CALLLIB send
EndDataStorage EndDataStorage
@ -635,11 +821,11 @@ _SocketBind_SockaddrIn:
MOVE.L D0,A0 MOVE.L D0,A0
MOVE.L (SP)+,D0 MOVE.L (SP)+,D0
WithDataStorageToA3 WithDataStorage
; socket id is in D0 ; socket id is in D0
; sockaddr_in is in A0 ; sockaddr_in is in A0
MOVE.L #len_sockaddr_in,D1 ; len MOVE.L #len_sockaddr_in,D1 ; len
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB bind CALLLIB bind
EndDataStorage EndDataStorage
@ -658,22 +844,22 @@ _SocketBind_SockaddrIn:
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par SocketErrno Lib_Par SocketErrno
; - - - - - - - - - - - - - ; - - - - - - - - - - - - -
PreserveStackInstruction PreserveStackFunction
EnsureBSDSocketLibrary _SocketErrno_LibraryOpen EnsureBSDSocketLibrary _SocketErrno_LibraryOpen
RestoreStackInstruction RestoreStackFunction
Ret_Int Ret_Int
_SocketErrno_LibraryOpen: _SocketErrno_LibraryOpen:
WithDataStorageToA3 WithDataStorage
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB Errno CALLLIB Errno
EndDataStorage EndDataStorage
MOVE.L D0,D3 MOVE.L D0,D3
RestoreStackInstruction RestoreStackFunction
RTS RTS
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -701,8 +887,8 @@ _SocketListen_LibraryOpen:
MOVE.L D3,D2 MOVE.L D3,D2
MOVEQ #5,D1 MOVEQ #5,D1
WithDataStorageToA3 WithDataStorage
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB listen CALLLIB listen
EndDataStorage EndDataStorage
@ -737,10 +923,10 @@ _SocketAccept_LibraryOpen:
MOVE.L D3,D2 MOVE.L D3,D2
WithDataStorageToA3 WithDataStorage
Dlea AcceptScratchArea,A0 Dlea AcceptScratchArea,A0
Dlea len_sockaddr_in_ptr,A1 Dlea len_sockaddr_in_ptr,A1
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB accept CALLLIB accept
EndDataStorage EndDataStorage
@ -803,11 +989,11 @@ _SocketSetNonblocking_IsBlocking:
_SocketSetNonblocking_Ioctl: _SocketSetNonblocking_Ioctl:
WithDataStorageToA3 WithDataStorage
MOVE.L D1,IoctlSockOptScratch-MB(A3) MOVE.L D1,IoctlSockOptScratch-MB(A3)
Dlea IoctlSockOptScratch,A0 Dlea IoctlSockOptScratch,A0
MOVE.L #FIONBIO,D1 MOVE.L #FIONBIO,D1
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB IoctlSocket CALLLIB IoctlSocket
MOVE.L D0,D3 MOVE.L D0,D3
@ -865,12 +1051,12 @@ _SocketGetsockoptInt_LibraryOpen:
MOVE.L #SOL_SOCKET,D1 ; level MOVE.L #SOL_SOCKET,D1 ; level
MOVE.L A3,-(SP) MOVE.L A3,-(SP)
WithDataStorageToA3 WithDataStorage
Dlea IoctlSockOptScratch,A0 ; optval Dlea IoctlSockOptScratch,A0 ; optval
MOVE.L #4,getsockopt_len-MB(A3) MOVE.L #4,getsockopt_len-MB(A3)
Dlea getsockopt_len,A1 Dlea getsockopt_len,A1
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB getsockopt CALLLIB getsockopt
EndDataStorage EndDataStorage
MOVE.L (SP)+,A3 MOVE.L (SP)+,A3
@ -1144,6 +1330,12 @@ _SocketSelect_PerformSelect
; - - - - - - - - - - - - - ; - - - - - - - - - - - - -
PreserveStackFunction PreserveStackFunction
EnsureBSDSocketLibrary _SocketGetHost_LibraryOpen
RestoreStackFunction
Ret_Int
_SocketGetHost_LibraryOpen:
MULU #len_sockaddr_in,D3 MULU #len_sockaddr_in,D3
Dload A0 Dload A0
MOVE.L sockaddr_ram-MB(A0),A0 MOVE.L sockaddr_ram-MB(A0),A0
@ -1164,6 +1356,13 @@ _SocketSelect_PerformSelect
; - - - - - - - - - - - - - ; - - - - - - - - - - - - -
PreserveStackFunction PreserveStackFunction
EnsureBSDSocketLibrary _SocketGetPort_LibraryOpen
RestoreStackFunction
Ret_Int
_SocketGetPort_LibraryOpen:
MULU #len_sockaddr_in,D3 MULU #len_sockaddr_in,D3
Dload A0 Dload A0
MOVE.L sockaddr_ram-MB(A0),A0 MOVE.L sockaddr_ram-MB(A0),A0
@ -1184,15 +1383,17 @@ _SocketSelect_PerformSelect
Lib_Par SocketInetNtoA Lib_Par SocketInetNtoA
; - - - - - - - - - - - - - ; - - - - - - - - - - - - -
PreserveStackFunction PreserveStackFunction
EnsureBSDSocketLibrary _SocketInetNtoA_LibraryOpen EnsureBSDSocketLibrary _SocketInetNtoa_LibraryOpen
MOVE.L ChVide(A5),D3
RestoreStackFunction RestoreStackFunction
Ret_Int Ret_String
_SocketInetNtoA_LibraryOpen: _SocketInetNtoa_LibraryOpen:
MOVE.L D3,D0 MOVE.L D3,D0
WithDataStorageToA3 WithDataStorage
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB Inet_NtoA CALLLIB Inet_NtoA
EndDataStorage EndDataStorage
@ -1222,6 +1423,7 @@ _SocketInetNtoA_StringSizeLoop:
MOVE.W D4,(A0)+ ; length of string MOVE.W D4,(A0)+ ; length of string
SUBQ #1,D4 SUBQ #1,D4
_SocketInetNtoA_StringCopyLoop: _SocketInetNtoA_StringCopyLoop:
MOVE.B (A2,D4),(A0,D4) MOVE.B (A2,D4),(A0,D4)
DBRA D4,_SocketInetNtoA_StringCopyLoop DBRA D4,_SocketInetNtoA_StringCopyLoop
@ -1272,12 +1474,14 @@ _SocketRecvString_NotNegative:
_SocketRecvString_NotTooLong: _SocketRecvString_NotTooLong:
MOVE.L A3,-(SP) ; preserve A3 MOVE.L A3,-(SP) ; preserve A3
MOVE.L D0,-(SP) ; preserve D0 MOVE.L D0,-(SP) ; preserve D0
; reserve memory for recv buffer ; reserve memory for recv buffer
Rjsr L_RamFast ; D0 now contains memory pointer Rjsr L_RamFast ; D0 now contains memory pointer
BNE _SocketRecvString_BufferAllocated BNE _SocketRecvString_BufferAllocated
; reserve failed ; reserve failed
MOVE.L (SP)+,D0 MOVE.L (SP)+,D0
MOVE.L (SP)+,A3 MOVE.L (SP)+,A3
MOVE.L ChVide(A5),D3 ; empty string MOVE.L ChVide(A5),D3 ; empty string
@ -1291,10 +1495,12 @@ _SocketRecvString_BufferAllocated:
MOVEQ #0,D2 ; flags MOVEQ #0,D2 ; flags
MOVEM.L A0-A1/D1,-(SP) MOVEM.L A0-A1/D1,-(SP)
WithDataStorageToA3
LoadBSDSocketBaseFromA3 WithDataStorage
LoadBSDSocketBase
CALLLIB recv ; D0 has received length or -1 CALLLIB recv ; D0 has received length or -1
EndDataStorage EndDataStorage
MOVEM.L (SP)+,A0-A1/D1 MOVEM.L (SP)+,A0-A1/D1
; did we receive data? if we didn't get a single byte, we're done ; 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 D1,D0
MOVE.L A0,A1 MOVE.L A0,A1
Rjsr L_RamFree Rjsr L_RamFree
MOVE.L (SP)+,A3 MOVE.L (SP)+,A3
MOVE.L ChVide(A5),D3 MOVE.L ChVide(A5),D3
@ -1312,7 +1519,6 @@ _SocketRecvString_BufferAllocated:
Ret_String Ret_String
; TODO received data is wrong somewhere ; TODO received data is wrong somewhere
_SocketRecvString_DataReceived: _SocketRecvString_DataReceived:
; D0 contains socket receive length ; D0 contains socket receive length
@ -1344,7 +1550,7 @@ _SocketRecvString_CopyData:
MOVE.L A0,-(SP) MOVE.L A0,-(SP)
MOVE.L A3,A1 MOVE.L A3,A1
Rjsr L_RamFree Rjsr L_RamFree
MOVE.L (SP)+,D3 MOVE.L (SP)+,D3 ; string return
MOVE.L (SP)+,A3 MOVE.L (SP)+,A3
RestoreStackFunction RestoreStackFunction
@ -1383,8 +1589,8 @@ _SocketRecvData_LibraryOpen:
Ret_Int Ret_Int
_SocketRecvData_PositiveLength: _SocketRecvData_PositiveLength:
WithDataStorageToA3 WithDataStorage
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB recv ; D0 has received length or -1 CALLLIB recv ; D0 has received length or -1
EndDataStorage EndDataStorage
@ -1393,6 +1599,8 @@ _SocketRecvData_PositiveLength:
RestoreStackFunction RestoreStackFunction
Ret_Int Ret_Int
; actually close the library ; actually close the library
Lib_Def DoSocketLibraryClose Lib_Def DoSocketLibraryClose
@ -1407,6 +1615,7 @@ _SocketRecvData_PositiveLength:
CLR.L sockaddr_ram-MB(A3) ; prevent double free CLR.L sockaddr_ram-MB(A3) ; prevent double free
_DoSocketLibraryClose_CloseLibrary: _DoSocketLibraryClose_CloseLibrary:
MOVE.L BSDSocketBase-MB(A3),D0 MOVE.L BSDSocketBase-MB(A3),D0
BEQ _DoSocketLibraryClose_Skip BEQ _DoSocketLibraryClose_Skip
@ -1463,7 +1672,7 @@ _SocketWaitAsyncWriting_LibraryOpen:
Rbsr L_MicrosecondsToTimeval ; A3 contains timeval Rbsr L_MicrosecondsToTimeval ; A3 contains timeval
Dload A4 Dload A4
MOVE.L D0,-(SP) MOVEM.L D0,-(SP)
; set up WaitSelect ; set up WaitSelect
MOVEQ #0,D1 MOVEQ #0,D1
LeaFdset D1,A1 ; write fdset LeaFdset D1,A1 ; write fdset
@ -1485,7 +1694,7 @@ _SocketWaitAsyncWriting_LibraryOpen:
TST.L D0 TST.L D0
BEQ _SocketWaitAsyncWriting_Timeout BEQ _SocketWaitAsyncWriting_Timeout
BMI _SocketWaitAsyncWriting_Error BMI _SocketWaitAsyncWriting_Error
MOVE.L (SP)+,D0 ; D0 contains socket again MOVEM.L (SP)+,D0 ; D0 contains socket again
Dload A4 Dload A4
; a socket became interesting, check the Fdset ; a socket became interesting, check the Fdset
@ -1511,19 +1720,19 @@ _SocketWaitAsyncWriting_CheckSockopt:
MOVE.L A3,-(SP) MOVE.L A3,-(SP)
WithDataStorageToA3 WithDataStorage
Dlea IoctlSockOptScratch,A0 ; optval Dlea IoctlSockOptScratch,A0 ; optval
MOVE.L #4,getsockopt_len-MB(A3) MOVE.L #4,getsockopt_len-MB(A3)
Dlea getsockopt_len,A1 Dlea getsockopt_len,A1
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB getsockopt CALLLIB getsockopt
EndDataStorage EndDataStorage
MOVE.L (SP)+,A3 MOVE.L (SP)+,A3
TST.L D0 TST.L D0
BMI _SocketWaitAsyncWriting_Error BMI _SocketWaitAsyncWriting_Error2
Dlea IoctlSockOptScratch,A0 Dlea IoctlSockOptScratch,A0
MOVE.L (A0),D0 MOVE.L (A0),D0
@ -1545,6 +1754,7 @@ _SocketWaitAsyncWriting_Ready:
_SocketWaitAsyncWriting_Error: _SocketWaitAsyncWriting_Error:
MOVE.L (SP)+,D1 MOVE.L (SP)+,D1
_SocketWaitAsyncWriting_Error2:
MOVEM.L (SP)+,A3-A4 MOVEM.L (SP)+,A3-A4
MOVE.L #-1,D3 MOVE.L #-1,D3
@ -1626,7 +1836,6 @@ _SocketWaitAsyncReading_LibraryOpen:
BMI _SocketWaitAsyncReading_Done BMI _SocketWaitAsyncReading_Done
MOVE.L (SP)+,D0 ; D0 contains socket again MOVE.L (SP)+,D0 ; D0 contains socket again
;Dload A4
; a socket became interesting, check the Fdset ; a socket became interesting, check the Fdset
MOVE.L D0,D3 ; socket in D3 MOVE.L D0,D3 ; socket in D3
MOVEQ #0,D1 ; fdset in D1 MOVEQ #0,D1 ; fdset in D1
@ -1721,12 +1930,12 @@ _SocketReuseAddr_LibraryOpen:
MOVE.L #SOL_SOCKET,D1 ; Level MOVE.L #SOL_SOCKET,D1 ; Level
WithDataStorageToA3 WithDataStorage
Dlea IoctlSockOptScratch,A0 ; optval Dlea IoctlSockOptScratch,A0 ; optval
MOVE.L D3,A0 MOVE.L D3,A0
MOVEQ #4,D3 MOVEQ #4,D3
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB setsockopt CALLLIB setsockopt
EndDataStorage EndDataStorage
@ -1737,44 +1946,46 @@ _SocketReuseAddr_LibraryOpen:
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =Dns Get Address By Name$(Name String) ; =Dns Get Address By Name$(Name String)
; ;
; Get the status of a socket ; Convert a host name to an IP address
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par DnsGetHostAddressByName Lib_Par DnsGetHostAddressByName
PreserveStackFunction PreserveStackFunction
EnsureBSDSocketLibrary .LibraryOpen EnsureBSDSocketLibrary _DnsGetHostAddressByName_LibraryOpen
MOVE.L ChVide(A5),D3 MOVE.L ChVide(A5),D3
RestoreStackFunction RestoreStackFunction
Ret_String Ret_String
.LibraryOpen: _DnsGetHostAddressByName_LibraryOpen:
; string so you need demande, hichaine, and chvide ; string so you need demande, hichaine, and chvide
MOVE.L D3,A0 ; name MOVE.L D3,A0 ; name
MOVEQ #0,D0
MOVE.W (A0)+,D0 ; d0 contains length MOVE.W (A0)+,D0 ; d0 contains length
MOVE.L D0,D1 ; d1 also has length MOVE.L D0,D1 ; d1 also has length
MOVE.L D0,D2 ; d2 also has length MOVE.L D0,D2 ; d2 also has length
Rjsr L_RamFast ; d0 contains address Rjsr L_RamFast ; d0 contains address
BNE .StringRamAllocated BNE _DnsGetHostAddressByName_StringRamAllocated
MOVE.L ChVide(A5),D3 MOVE.L ChVide(A5),D3
RestoreStackFunction RestoreStackFunction
Ret_String Ret_String
.StringRamAllocated: _DnsGetHostAddressByName_StringRamAllocated:
MOVE.L D0,A1 ; a1 contains address MOVE.L D0,A1 ; a1 contains address
SUBQ #1,D1 ; reduce by one for DBRA SUBQ #1,D1 ; reduce by one for DBRA
.KeepCopyingAMOSString
_DnsGetHostAddressByName_KeepCopyingAMOSString:
MOVE.B (A0)+,(A1)+ ; byte copy 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.B #0,(A1)+ ; null terminate string
MOVE.L D0,A0 ; first param of gethostbyname MOVE.L D0,A0 ; first param of gethostbyname
MOVEM.L A0/D2,-(SP) MOVEM.L A0/D2,-(SP)
WithDataStorageToA3 WithDataStorage
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB gethostbyname CALLLIB gethostbyname
EndDataStorage EndDataStorage
MOVEM.L (SP)+,A0/D2 MOVEM.L (SP)+,A0/D2
@ -1787,21 +1998,21 @@ _SocketReuseAddr_LibraryOpen:
MOVE.L (SP)+,D0 MOVE.L (SP)+,D0
TST.L D0 TST.L D0
BNE .GetIPAddress BNE _DnsGetHostAddressByName_GetIPAddress
RestoreStackFunction RestoreStackFunction
MOVE.L ChVide(A5),D3 MOVE.L ChVide(A5),D3
Ret_String Ret_String
.GetIPAddress: _DnsGetHostAddressByName_GetIPAddress:
MOVE.L D0,A0 MOVE.L D0,A0
MOVE.L 16(A0),A1 ; **h_addr_list MOVE.L 16(A0),A1 ; **h_addr_list
MOVE.L (A1),A1 ; *h_addr_list MOVE.L (A1),A1 ; *h_addr_list
MOVE.L (A1),D0 ; h_addr_list[0] MOVE.L (A1),D0 ; h_addr_list[0]
WithDataStorageToA3 WithDataStorage
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB Inet_NtoA CALLLIB Inet_NtoA
EndDataStorage EndDataStorage
@ -1809,27 +2020,32 @@ _SocketReuseAddr_LibraryOpen:
MOVE.L A2,-(SP) MOVE.L A2,-(SP)
MOVEQ #0,D3 MOVEQ #0,D3
.GetIPAddressLength: _DnsGetHostAddressByName_GetIPAddressLength:
ADDQ #1,D3 ADDQ #1,D3
TST.B (A2)+ TST.B (A2)+
BNE .GetIPAddressLength BNE _DnsGetHostAddressByName_GetIPAddressLength
MOVE.L (SP)+,A2 MOVE.L (SP)+,A2
SUBQ #1,D3
MOVE.L D3,D4 MOVE.L D3,D4
AND.W #$FFFE,D3 AND.W #$FFFE,D3
ADDQ #2,D3 ADDQ #2,D3
Rjsr L_Demande ; string is in A0/A1 Rjsr L_Demande ; string is in A0/A1
LEA 2(A0,D3.W),A1 LEA 2(A0,D3.W),A1
MOVE.L A1,HiChaine(A5) MOVE.L A1,HiChaine(A5)
MOVE.L A0,D3 MOVE.L A0,A1
MOVE.W D4,(A1)+
MOVE.W D4,(A0)+
SUBQ #1,D4 SUBQ #1,D4
.KeepCopying: _DnsGetHostAddressByName_KeepCopying:
MOVE.B (A2,D4),(A0,D4) MOVE.B (A2)+,(A1)+
DBRA D4,.KeepCopying DBRA D4,_DnsGetHostAddressByName_KeepCopying
MOVE.L A0,D3
RestoreStackFunction RestoreStackFunction
@ -1844,7 +2060,7 @@ _SocketReuseAddr_LibraryOpen:
; - - - - - - - - - - - - - ; - - - - - - - - - - - - -
PreserveStackFunction PreserveStackFunction
MOVE.L D3,D4 ; milliseconds MOVE.L D3,D4 ; milliseconts
MOVE.L (A3)+,D0 ; socket id MOVE.L (A3)+,D0 ; socket id
EnsureBSDSocketLibrary _SocketSetTimeout_LibraryOpen EnsureBSDSocketLibrary _SocketSetTimeout_LibraryOpen
@ -1866,7 +2082,7 @@ _SocketSetTimeout_LibraryOpen:
MOVE.L (A0)+,(A1)+ MOVE.L (A0)+,(A1)+
SUB.L #8,A1 ; go back SUB.L #8,A1 ; go back
WithDataStorageToA3 WithDataStorage
; socket is d0 ; socket is d0
MOVE.L #SOL_SOCKET,D1 ; Level MOVE.L #SOL_SOCKET,D1 ; Level
MOVE.L #$1005,D2 ; SO_SNDTIMEO MOVE.L #$1005,D2 ; SO_SNDTIMEO
@ -1874,7 +2090,7 @@ _SocketSetTimeout_LibraryOpen:
MOVEQ #8,D3 MOVEQ #8,D3
MOVEM.L D0/A0,-(SP) MOVEM.L D0/A0,-(SP)
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB setsockopt CALLLIB setsockopt
TST.L D0 TST.L D0
@ -1885,7 +2101,7 @@ _SocketSetTimeout_LibraryOpen:
MOVE.L #$1006,D2 ; SO_RCVTIMEO MOVE.L #$1006,D2 ; SO_RCVTIMEO
MOVEQ #8,D3 MOVEQ #8,D3
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB setsockopt CALLLIB setsockopt
EndDataStorage EndDataStorage
@ -1912,17 +2128,17 @@ _SocketSetTimeout_Fail:
Lib_Par SocketCloseSocket Lib_Par SocketCloseSocket
; - - - - - - - - - - - - - ; - - - - - - - - - - - - -
PreserveStackFunction PreserveStackFunction
EnsureBSDSocketLibrary .LibraryOpen EnsureBSDSocketLibrary _SocketCloseSocket_LibraryOpen
RestoreStackFunction RestoreStackFunction
Ret_Int Ret_Int
.LibraryOpen: _SocketCloseSocket_LibraryOpen:
MOVE.L D3,D0 MOVE.L D3,D0
WithDataStorageToA3 WithDataStorage
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB CloseSocket CALLLIB CloseSocket
EndDataStorage EndDataStorage
@ -1939,7 +2155,12 @@ _SocketSetTimeout_Fail:
Lib_Par SocketHerrno Lib_Par SocketHerrno
; - - - - - - - - - - - - - ; - - - - - - - - - - - - -
PreserveStackFunction PreserveStackFunction
EnsureBSDSocketLibrary _SocketHerrno_LibraryOpen
RestoreStackFunction
Ret_Int
_SocketHerrno_LibraryOpen:
; set up tag list memory and place for herrno to go ; set up tag list memory and place for herrno to go
Dlea AcceptScratchArea,A0 Dlea AcceptScratchArea,A0
MOVE.L A0,A2 MOVE.L A0,A2
@ -1952,13 +2173,13 @@ _SocketSetTimeout_Fail:
MOVE.L 0,(A0)+ MOVE.L 0,(A0)+
MOVE.L A2,A0 MOVE.L A2,A0
WithDataStorageToA3 WithDataStorage
LoadBSDSocketBaseFromA3 LoadBSDSocketBase
CALLLIB SocketBaseTagList CALLLIB SocketBaseTagList
EndDataStorage EndDataStorage
TST.L D0 TST.L D0
BEQ .success BEQ _SocketHerrno_success
; failed ; failed
MOVE.L #-1,D3 MOVE.L #-1,D3
@ -1966,7 +2187,7 @@ _SocketSetTimeout_Fail:
RestoreStackFunction RestoreStackFunction
Ret_Int Ret_Int
.success _SocketHerrno_success:
MOVE.L (A1),D3 MOVE.L (A1),D3
RestoreStackFunction 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 copy AMOSPro_System:APSystem/AMOSPro_BSDSocket.lib AMOSPro_System:APSystem/AMOSPro_BSDSocket.lib.bak
FAILAT 10 FAILAT 10
copy AMOSPro_BSDSocket.Lib AMOSPro_System:APSystem/ copy AMOSPro_BSDSocket.Lib AMOSPro_System:APSystem/
;use an amos file here that includes the plugin to quickly build a test program apcmp "/test/TestSuite.amos" inclib
;apcmp "aqua_test_plugin.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