Compare commits
No commits in common. "main" and "jb/async-writing-bug" have entirely different histories.
main
...
jb/async-w
|
@ -4,17 +4,3 @@ dist/
|
||||||
build/
|
build/
|
||||||
aminet/
|
aminet/
|
||||||
Disk.info
|
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
|
|
||||||
libs/
|
|
||||||
|
|
Binary file not shown.
127
API.md
127
API.md
|
@ -3,9 +3,7 @@
|
||||||
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
|
||||||
|
|
||||||
|
@ -18,15 +16,11 @@ 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).
|
||||||
|
@ -35,8 +29,6 @@ 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.
|
||||||
|
@ -46,9 +38,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
|
||||||
|
|
||||||
|
@ -59,23 +51,10 @@ 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 IP address.
|
Attempt to connect to a remote host. Currently doesn't
|
||||||
|
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
|
||||||
|
|
||||||
|
@ -85,24 +64,19 @@ any non-blocking polling loops time out!
|
||||||
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
|
||||||
|
@ -115,8 +89,6 @@ 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.
|
||||||
|
@ -126,8 +98,6 @@ 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
|
||||||
|
@ -145,13 +115,11 @@ 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 on a listen socket to await new connections, or on a connected socket to await
|
Use this when you're waiting for a client to connect to you, or if you're waiting for
|
||||||
incoming data packets.
|
a remote socket to send you data.
|
||||||
|
|
||||||
##### Returns
|
##### Returns
|
||||||
|
|
||||||
|
@ -159,9 +127,7 @@ incoming data packets.
|
||||||
* -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
|
||||||
|
@ -177,8 +143,6 @@ 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.
|
||||||
|
@ -188,21 +152,18 @@ 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)
|
||||||
|
|
||||||
#### 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$)
|
||||||
|
|
||||||
|
@ -233,8 +194,6 @@ 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.
|
||||||
|
@ -244,8 +203,6 @@ 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.
|
||||||
|
@ -255,9 +212,7 @@ 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.
|
||||||
|
@ -267,9 +222,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)
|
||||||
|
|
||||||
|
@ -279,8 +234,6 @@ 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.
|
||||||
|
@ -289,8 +242,6 @@ 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.
|
||||||
|
@ -299,8 +250,6 @@ 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
|
||||||
|
@ -311,18 +260,6 @@ 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
|
|
||||||
|
|
||||||
Get the error from the last DNS resolver command.
|
|
||||||
|
|
||||||
##### Returns
|
|
||||||
|
|
||||||
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.
|
||||||
|
@ -337,8 +274,32 @@ 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)
|
||||||
|
|
||||||
## Low Level
|
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
|
||||||
|
|
||||||
#### RESULT=Socket Setsockopt Int(Socket, Option, Value)
|
#### RESULT=Socket Setsockopt Int(Socket, Option, Value)
|
||||||
|
|
||||||
|
@ -350,8 +311,6 @@ 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,
|
||||||
|
@ -362,8 +321,6 @@ 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.
|
||||||
|
@ -373,8 +330,6 @@ 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.
|
||||||
|
|
108
README.md
108
README.md
|
@ -127,10 +127,6 @@ Socket Library Close
|
||||||
* [AQUABYSS](https://agedcode.com/agedcode/en/games/aquabyss)
|
* [AQUABYSS](https://agedcode.com/agedcode/en/games/aquabyss)
|
||||||
* As of April 2023, the extension's been in heavy use for over a month
|
* As of April 2023, the extension's been in heavy use for over a month
|
||||||
on the client side of the game.
|
on the client side of the game.
|
||||||
* [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?
|
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!
|
||||||
|
@ -153,16 +149,6 @@ Doing something cool with the extension?
|
||||||
timeouts using `Socket Async Wait Writing` to determine if the Internet
|
timeouts using `Socket Async Wait Writing` to determine if the Internet
|
||||||
is available.
|
is available.
|
||||||
|
|
||||||
## Slot 18 taken already?
|
|
||||||
|
|
||||||
I'm also building releases for slots 9, 11, and 17. They're available for
|
|
||||||
separate download from each Release version 1.1.4 and on.
|
|
||||||
|
|
||||||
Note that you won't be able to load the test AMOS programs, or any other
|
|
||||||
progaam using the Slot 18 version, because AMOS uses the extension's slot
|
|
||||||
number in the saved tile. You'll have to export and import ASCII versions
|
|
||||||
of programs.
|
|
||||||
|
|
||||||
## Versioning
|
## Versioning
|
||||||
|
|
||||||
This project uses semantic versioning.
|
This project uses semantic versioning.
|
||||||
|
@ -172,19 +158,17 @@ This project uses semantic versioning.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Copyright 2023-2024 John Bintz. Licensed under the MIT License.
|
Copyright 2023 John Bintz. Licensed under the MIT License.
|
||||||
|
|
||||||
If you use this in your project, and you really want to,
|
If you use this in your project, and you really want to,
|
||||||
throw a link to theindustriousrabbit.com somewhere! You can
|
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? Patches?
|
## Feedback? Bug reports?
|
||||||
|
|
||||||
First, run `test/TestSuite` to generate a `report.txt` file.
|
Go to the [About section on The Industrious Rabbit](https://theindustriousrabbit.com/about)
|
||||||
|
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
|
||||||
|
|
||||||
|
@ -197,92 +181,14 @@ to contact me, send the `report.txt` along with the details on your issue.
|
||||||
* Fix bug in Socket Wait Async Writing where result of getsockopt was
|
* Fix bug in Socket Wait Async Writing where result of getsockopt was
|
||||||
incorrectly used.
|
incorrectly used.
|
||||||
|
|
||||||
### 1.1.0 (2024-02-23)
|
|
||||||
|
|
||||||
* Fix bug in `Dns Get Host Address By Name$` where it assumed AMOS strings are
|
|
||||||
null-terminated. They are not.
|
|
||||||
* Add `Socket Herrno` to aid in debugging resolver errors.
|
|
||||||
|
|
||||||
### 1.1.1 (2024-03-17)
|
|
||||||
|
|
||||||
* Fix bug in `Socket Inet Ntoa$` where the null terminator on the result of
|
|
||||||
calling `Inet_NtoA` was being included in the AMOS string.
|
|
||||||
* Fix crash bug in `Socket Inet Ntoa$` if called with the BSD Socket library
|
|
||||||
was not open.
|
|
||||||
|
|
||||||
### 1.1.2 (2024-03-18)
|
|
||||||
|
|
||||||
* Fix all functions that return strings so that strings work properly
|
|
||||||
in AMOS. While you could kind of use the immediate return value of the
|
|
||||||
string, any future manipulation of that string would fail. This fixes
|
|
||||||
the following functions:
|
|
||||||
* `Socket Inet Ntoa$`
|
|
||||||
* `Dns Get Address By Name$`
|
|
||||||
* `Socket Recv$`
|
|
||||||
|
|
||||||
### 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
|
## Development
|
||||||
|
|
||||||
### Environment
|
### Environment
|
||||||
|
|
||||||
#### Native Amiga
|
|
||||||
|
|
||||||
* Clone the [AMOS Professional source code](https://github.com/AOZ-Studio/AMOS-Professional-Official)
|
* Clone the [AMOS Professional source code](https://github.com/AOZ-Studio/AMOS-Professional-Official)
|
||||||
* Copy `AMOSPro Sources/+lequ.s` to `+LEqu.s`
|
* Run `execute absdsocket`
|
||||||
* Generate the socket LVO file in the `src` directory
|
* Note that you'll have to fix up some assigns and files in the AMOS Professional
|
||||||
* Install [`fd2pragma`](https://aminet.net/package/dev/misc/fd2pragma) in your path
|
source directory. I'll update this README with those changes once I track them down...
|
||||||
* Download `https://raw.githubusercontent.com/cnvogelg/amitools/master/amitools/data/fd/bsdsocket_lib.fd` to `src`
|
|
||||||
* In a Shell:
|
|
||||||
|
|
||||||
```
|
|
||||||
cd src
|
|
||||||
fd2pragma bsdsocket_lib.fd to "" special 20
|
|
||||||
```
|
|
||||||
|
|
||||||
* Fix up `src/absdsocket` to match your system's setup
|
|
||||||
* In a Shell:
|
|
||||||
|
|
||||||
```
|
|
||||||
cd src
|
|
||||||
execute absdsocket
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Emulated setup (WinUAE, FS-UAE, Amiberry)
|
|
||||||
|
|
||||||
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
|
### Releasing
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
for i in examples/*.amos test/*.amos; do
|
for i in examples/*.amos; do
|
||||||
echo "$i"
|
echo "$i"
|
||||||
~/Projects/amostools/listamos -e src/AMOSPro_BSDSocket.Lib "${i}" > "${i%.amos}.basic" 2>/dev/null
|
~/Projects/amostools/listamos -e AMOSPro_BSDSocket.Lib "${i}" > "${i%.amos}.basic" 2>/dev/null
|
||||||
done
|
done
|
||||||
|
|
70
bin/release
70
bin/release
|
@ -6,14 +6,14 @@ require 'erb'
|
||||||
|
|
||||||
source = File.read('src/BSDSocket.s')
|
source = File.read('src/BSDSocket.s')
|
||||||
|
|
||||||
aminet_template = ERB.new(File.read('aminet.readme.erb'))
|
aminet_template = ERB.new(File.read("aminet.readme.erb"))
|
||||||
|
|
||||||
capture_version = false
|
capture_version = false
|
||||||
version = nil
|
version = nil
|
||||||
|
|
||||||
source.lines.each do |line|
|
source.lines.each do |line|
|
||||||
if capture_version
|
if capture_version
|
||||||
version = line[/dc\.b "([^"]+)"/, 1]
|
version = line[/dc\.b "([^"]+)"/,1]
|
||||||
|
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
|
@ -24,22 +24,6 @@ source.lines.each do |line|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
FileUtils.cp 'src/AMOSPro_BSDSocket.Lib', 'AMOSPro_BSDSocket.Lib'
|
|
||||||
|
|
||||||
strings = []
|
|
||||||
Open3.popen2e('strings', 'AMOSPro_BSDSocket.Lib') do |stdin, stdout_and_stderr, wait_thr|
|
|
||||||
stdin.close
|
|
||||||
|
|
||||||
stdout_and_stderr.each { |l| strings << l }
|
|
||||||
|
|
||||||
wait_thr.join
|
|
||||||
end
|
|
||||||
|
|
||||||
unless strings.any? { |s| s[version] }
|
|
||||||
puts "Extension build doesn't match source version! Did you rebuild it yet on the Amiga?"
|
|
||||||
exit 1
|
|
||||||
end
|
|
||||||
|
|
||||||
FileUtils.mkdir_p 'dist'
|
FileUtils.mkdir_p 'dist'
|
||||||
|
|
||||||
build_base = 'build'
|
build_base = 'build'
|
||||||
|
@ -47,59 +31,51 @@ project_name = 'BSDSocket-Extension'
|
||||||
|
|
||||||
build_dir = File.join(build_base, project_name)
|
build_dir = File.join(build_base, project_name)
|
||||||
FileUtils.rm_rf build_dir
|
FileUtils.rm_rf build_dir
|
||||||
FileUtils.rm_rf 'aminet'
|
|
||||||
FileUtils.mkdir_p build_dir
|
FileUtils.mkdir_p build_dir
|
||||||
FileUtils.mkdir_p 'aminet'
|
FileUtils.mkdir_p 'aminet'
|
||||||
|
|
||||||
hackerbun_target = File.expand_path("dist/AMOSPro_BSDSocket_#{version}.lha")
|
hackerbun_target = File.expand_path("dist/AMOSPro_BSDSocket_#{version}.lha")
|
||||||
|
|
||||||
[
|
[
|
||||||
'AMOSPro_BSDSocket.Lib',
|
"AMOSPro_BSDSocket.Lib",
|
||||||
'README.md',
|
"README.md",
|
||||||
'API.md',
|
"API.md",
|
||||||
'LICENSE'
|
"LICENSE",
|
||||||
].each do |file|
|
].each do |file|
|
||||||
target = "#{build_dir}/#{file}"
|
target = "#{build_dir}/#{file}"
|
||||||
FileUtils.mkdir_p File.dirname(target)
|
FileUtils.mkdir_p File.dirname(target)
|
||||||
FileUtils.cp file, target
|
FileUtils.cp file, target
|
||||||
end
|
end
|
||||||
|
|
||||||
gitignores = File.readlines('.gitignore').map(&:strip)
|
[
|
||||||
|
"src",
|
||||||
%w[
|
"examples"
|
||||||
src
|
|
||||||
examples
|
|
||||||
].each do |dir|
|
].each do |dir|
|
||||||
FileUtils.cp_r dir, "#{build_dir}/#{dir}"
|
FileUtils.cp_r dir, "#{build_dir}/#{dir}"
|
||||||
|
|
||||||
Dir["#{build_dir}/#{dir}/**/*"].each do |file|
|
|
||||||
FileUtils.rm file if gitignores.any? { |gi| File.fnmatch(gi, file) }
|
|
||||||
FileUtils.rm file if [/\.fd$/, /\.i$/].any? { |p| file[p] }
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
Dir['icons/**/*.info'].each do |info|
|
Dir["icons/**/*.info"].each do |info|
|
||||||
target = info.gsub('icons/', build_base + '/')
|
target = info.gsub("icons/", build_base + "/")
|
||||||
FileUtils.mkdir_p File.dirname(target)
|
FileUtils.mkdir_p File.dirname(target)
|
||||||
FileUtils.cp info, target
|
FileUtils.cp info, target
|
||||||
end
|
end
|
||||||
|
|
||||||
Dir.chdir build_base do
|
Dir.chdir build_base do
|
||||||
Open3.popen2e(
|
Open3.popen2e(
|
||||||
'jlha', 'c', hackerbun_target,
|
"jlha", "c", hackerbun_target,
|
||||||
*(Dir['*'])
|
*(Dir["*"])) do |stdin, stdout_and_stderr, wait_thr|
|
||||||
) do |stdin, stdout_and_stderr, wait_thr|
|
|
||||||
Thread.new do
|
Thread.new do
|
||||||
stdout_and_stderr.each { |l| puts l }
|
stdout_and_stderr.each { |l| puts l }
|
||||||
|
end
|
||||||
|
|
||||||
|
stdin.close
|
||||||
|
|
||||||
|
wait_thr.value
|
||||||
end
|
end
|
||||||
|
|
||||||
stdin.close
|
|
||||||
|
|
||||||
wait_thr.value
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
FileUtils.cp hackerbun_target, 'aminet/BSDSocket-Extension.lha'
|
FileUtils.cp hackerbun_target, "aminet/BSDSocket-Extension.lha"
|
||||||
File.open('aminet/BSDSocket-Extension.readme', 'w') do |fh|
|
File.open("aminet/BSDSocket-Extension.readme", "w") do |fh|
|
||||||
fh.puts aminet_template.result(binding)
|
fh.puts aminet_template.result(binding)
|
||||||
end
|
end
|
||||||
|
|
24
bin/setup
24
bin/setup
|
@ -1,24 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
mkdir -p stuff
|
|
||||||
if [ ! -d stuff/AMOS-Professional-Official ]; then
|
|
||||||
cd stuff
|
|
||||||
git clone https://code.hackerbun.dev/TheIndustriousRabbit/amos-professional.git
|
|
||||||
cd ..
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -f src/bsdsocket_lib.fd ]; then
|
|
||||||
cd src
|
|
||||||
wget https://raw.githubusercontent.com/cnvogelg/amitools/master/amitools/data/fd/bsdsocket_lib.fd
|
|
||||||
cd ..
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "On the emulated Amiga, mount this folder at amos-pro-bsdsocket-extension: and run"
|
|
||||||
echo
|
|
||||||
echo "cd amos-pro-bsdsocket-extension:"
|
|
||||||
echo "cd src"
|
|
||||||
echo 'fd2pragma bsdsocket_lib.fd to "" special 20'
|
|
||||||
echo
|
|
||||||
echo "Then, to build the software, run:"
|
|
||||||
echo
|
|
||||||
echo "execute absdsocket"
|
|
298
src/BSDSocket.s
298
src/BSDSocket.s
|
@ -1,14 +1,13 @@
|
||||||
; BSDSocket Extension for AMOS Professional
|
; BSDSocket Extension for AMOS Professional
|
||||||
; Copyright 2023-2024 John Bintz
|
; Copyright 2023 John Bintz
|
||||||
; Licensed under the MIT License
|
; Licensed under the MIT License
|
||||||
;
|
;
|
||||||
; Writing this code the right way, 25 years later.
|
; Writing this code the right way, 25 years later.
|
||||||
|
|
||||||
; extension number 18
|
; extension number 18
|
||||||
; this now comes from GenAm command line option
|
ExtNb equ 18-1
|
||||||
;ExtNb equ 18-1
|
|
||||||
Version MACRO
|
Version MACRO
|
||||||
dc.b "1.1.4-20240502"
|
dc.b "1.0.1-20230403"
|
||||||
ENDM
|
ENDM
|
||||||
VerNumber equ $1
|
VerNumber equ $1
|
||||||
|
|
||||||
|
@ -16,12 +15,12 @@ VerNumber equ $1
|
||||||
; Include the files automatically calculated by
|
; Include the files automatically calculated by
|
||||||
; Library_Digest.AMOS
|
; Library_Digest.AMOS
|
||||||
;---------------------------------------------------------------------
|
;---------------------------------------------------------------------
|
||||||
Incdir "AMOSPro_Sources:"
|
Incdir "Stuff:development/amos-professional-official-mas/"
|
||||||
Incdir "AMOSPro_Sources:includes/"
|
Incdir "Stuff:development/amos-professional-official-mas/includes/"
|
||||||
Include "BSDSocket_Size.s"
|
Include "BSDSocket_Size.s"
|
||||||
Include "BSDSocket_Labels.s"
|
Include "BSDSocket_Labels.s"
|
||||||
Include "+AMOS_Includes.s"
|
Include "+AMOS_Includes.s"
|
||||||
Include "bsdsocket_lvo.i"
|
Include "socket_lvo.i"
|
||||||
|
|
||||||
; get the effective address of something in extension memory
|
; get the effective address of something in extension memory
|
||||||
Dlea MACRO
|
Dlea MACRO
|
||||||
|
@ -57,6 +56,7 @@ SO_REUSEADDR EQU $4
|
||||||
MAX_SOCKETS EQU 64
|
MAX_SOCKETS EQU 64
|
||||||
|
|
||||||
len_sockaddr_in EQU 16
|
len_sockaddr_in EQU 16
|
||||||
|
sockaddr_in_sin_len EQU 0
|
||||||
sockaddr_in_sin_family EQU 1
|
sockaddr_in_sin_family EQU 1
|
||||||
sockaddr_in_sin_port EQU 2
|
sockaddr_in_sin_port EQU 2
|
||||||
sockaddr_in_sin_addr EQU 4
|
sockaddr_in_sin_addr EQU 4
|
||||||
|
@ -68,20 +68,6 @@ Error_PortOutOfRange EQU -11
|
||||||
Error_FdsetOutOfRange EQU -11
|
Error_FdsetOutOfRange EQU -11
|
||||||
Error_UnableToBind EQU -12
|
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
|
; wrap code that doesn't take arguments with these
|
||||||
PreserveStackInstruction MACRO
|
PreserveStackInstruction MACRO
|
||||||
MOVEM.L A2-A6/D6-D7,-(SP)
|
MOVEM.L A2-A6/D6-D7,-(SP)
|
||||||
|
@ -142,20 +128,19 @@ LeaFdset MACRO
|
||||||
; LeaFdsetForBit fd_set reg,target address,target bit in address
|
; LeaFdsetForBit fd_set reg,target address,target bit in address
|
||||||
LeaFdsetForBit MACRO
|
LeaFdsetForBit MACRO
|
||||||
LeaFdset \1,\2 ; get fdset base address in \2
|
LeaFdset \1,\2 ; get fdset base address in \2
|
||||||
MOVEM.L D3-D4,-(SP)
|
MOVE.L D3,-(SP)
|
||||||
MOVE.L \3,D3 ; Put target bit into D3
|
MOVE.L \3,D3 ; Put target bit into D3
|
||||||
ROR.L #5,D3 ; lop off the first 5 bits
|
ROR.L #5,D3 ; lop off the first 5 bits
|
||||||
AND.L #$7,D3 ; only keep the top three
|
AND.L #$7,D3 ; only keep the top three
|
||||||
ROL.L #2,D3 ; multiply by 4
|
ROL.L #2,D3 ; multiply by 4
|
||||||
ADD.L D3,\2 ; add that value to the fdset address
|
ADD.L D3,\2 ; add that value to the fdset address
|
||||||
|
|
||||||
MOVE.L \3,D4
|
AND.L #$1F,\3 ; only keep 0-31 in \3
|
||||||
AND.L #$1F,D4 ; only keep 0-31 in \3
|
|
||||||
|
|
||||||
MOVEQ #1,D3
|
MOVEQ #1,D3
|
||||||
ROL.L D4,D3 ; shift that bit left as many as target
|
ROL.L \3,D3 ; shift that bit left as many as target
|
||||||
MOVE.L D3,\3 ; put that in the target
|
MOVE.L D3,\3 ; put that in the target
|
||||||
MOVEM.L (SP)+,D3-D4
|
MOVE.L (SP)+,D3
|
||||||
|
|
||||||
ENDM
|
ENDM
|
||||||
|
|
||||||
|
@ -345,9 +330,6 @@ C_Tk dc.w 1,0
|
||||||
AddTokenFunction SocketCloseSocket
|
AddTokenFunction SocketCloseSocket
|
||||||
dc.b "socket close socke","t"+$80,"00",-1
|
dc.b "socket close socke","t"+$80,"00",-1
|
||||||
|
|
||||||
AddTokenFunction SocketHerrno
|
|
||||||
dc.b "socket herrn","o"+$80,"0",-1
|
|
||||||
|
|
||||||
; TOKEN_END
|
; TOKEN_END
|
||||||
dc.w 0
|
dc.w 0
|
||||||
dc.l 0 ; Important!
|
dc.l 0 ; Important!
|
||||||
|
@ -404,8 +386,6 @@ getsockopt_len ds.l 1
|
||||||
MaxSocketSeen dc.w 0
|
MaxSocketSeen dc.w 0
|
||||||
|
|
||||||
sockaddr_ram ds.l 1
|
sockaddr_ram ds.l 1
|
||||||
|
|
||||||
; also used for errno tags
|
|
||||||
AcceptScratchArea ds.b 16
|
AcceptScratchArea ds.b 16
|
||||||
SelectScratchArea ds.l 2
|
SelectScratchArea ds.l 2
|
||||||
|
|
||||||
|
@ -513,7 +493,7 @@ _SocketLibraryOpen_Finish:
|
||||||
;
|
;
|
||||||
; Turn an IP address and port into a sockaddr_in strucure
|
; Turn an IP address and port into a sockaddr_in strucure
|
||||||
;
|
;
|
||||||
; d0 - address of sockaddr_in on success, -1 on failure
|
; d0 - 0 on success, -1 on failure
|
||||||
; - - - - - - - -
|
; - - - - - - - -
|
||||||
Lib_Def SocketIPAddressPortToSockaddr
|
Lib_Def SocketIPAddressPortToSockaddr
|
||||||
|
|
||||||
|
@ -534,26 +514,14 @@ _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
|
|
||||||
|
|
||||||
BNE _ToSockaddr_StringHasLength
|
MOVE.L D1,A0 ; ip address
|
||||||
MOVEM.L (SP)+,A0-A3/D3
|
ADDQ #2,A0 ; string data starts 2 bytes in
|
||||||
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
|
||||||
|
@ -578,15 +546,7 @@ _ToSockaddr_ParseIPAddress:
|
||||||
|
|
||||||
_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
|
||||||
|
@ -666,6 +626,7 @@ _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
|
||||||
|
@ -845,11 +806,11 @@ _SocketBind_SockaddrIn:
|
||||||
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Lib_Par SocketErrno
|
Lib_Par SocketErrno
|
||||||
; - - - - - - - - - - - - -
|
; - - - - - - - - - - - - -
|
||||||
PreserveStackFunction
|
PreserveStackInstruction
|
||||||
|
|
||||||
EnsureBSDSocketLibrary _SocketErrno_LibraryOpen
|
EnsureBSDSocketLibrary _SocketErrno_LibraryOpen
|
||||||
|
|
||||||
RestoreStackFunction
|
RestoreStackInstruction
|
||||||
Ret_Int
|
Ret_Int
|
||||||
|
|
||||||
_SocketErrno_LibraryOpen:
|
_SocketErrno_LibraryOpen:
|
||||||
|
@ -860,7 +821,7 @@ _SocketErrno_LibraryOpen:
|
||||||
|
|
||||||
MOVE.L D0,D3
|
MOVE.L D0,D3
|
||||||
|
|
||||||
RestoreStackFunction
|
RestoreStackInstruction
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -1331,12 +1292,6 @@ _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
|
||||||
|
@ -1357,13 +1312,6 @@ _SocketGetHost_LibraryOpen:
|
||||||
; - - - - - - - - - - - - -
|
; - - - - - - - - - - - - -
|
||||||
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
|
||||||
|
@ -1386,10 +1334,8 @@ _SocketGetPort_LibraryOpen:
|
||||||
PreserveStackFunction
|
PreserveStackFunction
|
||||||
EnsureBSDSocketLibrary _SocketInetNtoa_LibraryOpen
|
EnsureBSDSocketLibrary _SocketInetNtoa_LibraryOpen
|
||||||
|
|
||||||
MOVE.L ChVide(A5),D3
|
RestoreStackInstruction
|
||||||
|
Ret_Int
|
||||||
RestoreStackFunction
|
|
||||||
Ret_String
|
|
||||||
|
|
||||||
_SocketInetNtoa_LibraryOpen:
|
_SocketInetNtoa_LibraryOpen:
|
||||||
MOVE.L D3,D0
|
MOVE.L D3,D0
|
||||||
|
@ -1406,28 +1352,21 @@ _SocketInetNtoA_StringSizeLoop:
|
||||||
TST.B (A0)+
|
TST.B (A0)+
|
||||||
BNE _SocketInetNtoA_StringSizeLoop
|
BNE _SocketInetNtoA_StringSizeLoop
|
||||||
|
|
||||||
MOVE.L A0,D4
|
MOVE.L A0,D3
|
||||||
SUB.L A2,D4 ; D4 = length
|
SUB.L A2,D3 ; D3 = length
|
||||||
SUBQ #1,D4 ; get rid of the null terminator
|
|
||||||
|
|
||||||
; add 2 and even out the space
|
|
||||||
MOVE.L D4,D3
|
|
||||||
AND.W #$FFFE,D3
|
|
||||||
ADDQ.W #2,D3
|
|
||||||
|
|
||||||
Rjsr L_Demande ; string base address is in A0/A1
|
Rjsr L_Demande ; string base address is in A0/A1
|
||||||
|
|
||||||
LEA 2(A0,D3.W),A1
|
MOVE.W D3,(A0)+ ; length of string
|
||||||
|
SUBQ #1,D3
|
||||||
MOVE.L A1,HiChaine(A5)
|
|
||||||
MOVE.L A0,A1
|
|
||||||
|
|
||||||
MOVE.W D4,(A0)+ ; length of string
|
|
||||||
SUBQ #1,D4
|
|
||||||
|
|
||||||
_SocketInetNtoA_StringCopyLoop:
|
_SocketInetNtoA_StringCopyLoop:
|
||||||
MOVE.B (A2,D4),(A0,D4)
|
MOVE.B (A2,D3),(A0,D3)
|
||||||
DBRA D4,_SocketInetNtoA_StringCopyLoop
|
DBRA D3,_SocketInetNtoA_StringCopyLoop
|
||||||
|
|
||||||
|
; make the address even
|
||||||
|
EvenOutStringAddress A0,D3
|
||||||
|
|
||||||
|
MOVE.L A0,HiChaine(A5) ; Does L_Demande nuke A5 too?
|
||||||
|
|
||||||
MOVE.L A1,D3 ; string return
|
MOVE.L A1,D3 ; string return
|
||||||
|
|
||||||
|
@ -1492,7 +1431,7 @@ _SocketRecvString_NotTooLong:
|
||||||
_SocketRecvString_BufferAllocated:
|
_SocketRecvString_BufferAllocated:
|
||||||
MOVE.L D0,A0 ; buffer address
|
MOVE.L D0,A0 ; buffer address
|
||||||
MOVE.L D1,D0 ; socket
|
MOVE.L D1,D0 ; socket
|
||||||
MOVE.L (SP)+,D1 ; reserved ram buffer length
|
MOVE.L (SP)+,D1 ; length
|
||||||
MOVEQ #0,D2 ; flags
|
MOVEQ #0,D2 ; flags
|
||||||
|
|
||||||
MOVEM.L A0-A1/D1,-(SP)
|
MOVEM.L A0-A1/D1,-(SP)
|
||||||
|
@ -1520,38 +1459,39 @@ _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 receive length
|
||||||
|
|
||||||
; TODO: handle zero return length
|
MOVE.L D1,-(SP)
|
||||||
|
|
||||||
MOVE.L A0,A2 ; A2 contains read buffer
|
|
||||||
|
|
||||||
MOVE.L D1,-(SP) ; reserved ram buffer length
|
|
||||||
; demande/hichaine string setup
|
|
||||||
MOVEQ #0,D3
|
MOVEQ #0,D3
|
||||||
MOVE.W D0,D3
|
MOVE.W D0,D3 ; prep for L_Demande. can we request a zero length string?
|
||||||
AND.W #$FFFE,D3
|
MOVE.L A0,A2 ; L_Demande blows away A0 and A1, A2 now contains buffer
|
||||||
ADDQ #2,D3
|
|
||||||
Rjsr L_Demande ; A0/A1 contain string address
|
Rjsr L_Demande ; A0/A1 contain string address
|
||||||
|
|
||||||
LEA 2(A0,D3.W),A1
|
MOVE.W D3,(A0)+ ; put in string length
|
||||||
MOVE.L A1,HiChaine(A5)
|
SUBQ #1,D3 ; reduce by one for DBRA
|
||||||
MOVE.L A0,A1
|
|
||||||
|
|
||||||
MOVE.W D0,(A1)+ ; put in string length
|
|
||||||
SUBQ #1,D0 ; reduce by one for DBRA
|
|
||||||
MOVE.L A2,A3 ; A3 now contains start of buffer
|
MOVE.L A2,A3 ; A3 now contains start of buffer
|
||||||
|
|
||||||
_SocketRecvString_CopyData:
|
_SocketRecvString_CopyData:
|
||||||
MOVE.B (A2,D0),(A1,D0)
|
MOVE.B (A2,D3),(A0,D3)
|
||||||
DBRA D0,_SocketRecvString_CopyData
|
DBRA D3,_SocketRecvString_CopyData
|
||||||
MOVE.L (SP)+,D0 ; reserved ram buffer length
|
|
||||||
|
|
||||||
MOVE.L A0,-(SP)
|
EvenOutStringAddress A0,D2
|
||||||
|
|
||||||
|
; add to string manager for garbage collection?
|
||||||
|
MOVE.L A0,HiChaine(A5)
|
||||||
|
MOVE.L (SP)+,D0
|
||||||
|
|
||||||
|
; free ram
|
||||||
|
MOVE.L A1,-(SP) ; A1 contains our string addres
|
||||||
|
|
||||||
|
;MOVE.L D1,D0
|
||||||
MOVE.L A3,A1
|
MOVE.L A3,A1
|
||||||
Rjsr L_RamFree
|
Rjsr L_RamFree
|
||||||
|
|
||||||
MOVE.L (SP)+,D3 ; string return
|
MOVE.L (SP)+,D3 ; string return
|
||||||
|
|
||||||
MOVE.L (SP)+,A3
|
MOVE.L (SP)+,A3
|
||||||
|
|
||||||
RestoreStackFunction
|
RestoreStackFunction
|
||||||
|
@ -1673,7 +1613,7 @@ _SocketWaitAsyncWriting_LibraryOpen:
|
||||||
Rbsr L_MicrosecondsToTimeval ; A3 contains timeval
|
Rbsr L_MicrosecondsToTimeval ; A3 contains timeval
|
||||||
|
|
||||||
Dload A4
|
Dload A4
|
||||||
MOVEM.L D0,-(SP)
|
MOVE.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
|
||||||
|
@ -1695,7 +1635,7 @@ _SocketWaitAsyncWriting_LibraryOpen:
|
||||||
TST.L D0
|
TST.L D0
|
||||||
BEQ _SocketWaitAsyncWriting_Timeout
|
BEQ _SocketWaitAsyncWriting_Timeout
|
||||||
BMI _SocketWaitAsyncWriting_Error
|
BMI _SocketWaitAsyncWriting_Error
|
||||||
MOVEM.L (SP)+,D0 ; D0 contains socket again
|
MOVE.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
|
||||||
|
@ -1733,7 +1673,7 @@ _SocketWaitAsyncWriting_CheckSockopt:
|
||||||
MOVE.L (SP)+,A3
|
MOVE.L (SP)+,A3
|
||||||
|
|
||||||
TST.L D0
|
TST.L D0
|
||||||
BMI _SocketWaitAsyncWriting_Error2
|
BMI _SocketWaitAsyncWriting_Error
|
||||||
|
|
||||||
Dlea IoctlSockOptScratch,A0
|
Dlea IoctlSockOptScratch,A0
|
||||||
MOVE.L (A0),D0
|
MOVE.L (A0),D0
|
||||||
|
@ -1755,7 +1695,6 @@ _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
|
||||||
|
@ -1837,6 +1776,7 @@ _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
|
||||||
|
@ -1945,9 +1885,9 @@ _SocketReuseAddr_LibraryOpen:
|
||||||
|
|
||||||
|
|
||||||
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
; =Dns Get Address By Name$(Name String)
|
; =Dns Get Host Address By Name$(Name String)
|
||||||
;
|
;
|
||||||
; Convert a host name to an IP address
|
; Get the status of a socket
|
||||||
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Lib_Par DnsGetHostAddressByName
|
Lib_Par DnsGetHostAddressByName
|
||||||
|
|
||||||
|
@ -1960,43 +1900,15 @@ _SocketReuseAddr_LibraryOpen:
|
||||||
Ret_String
|
Ret_String
|
||||||
|
|
||||||
_DnsGetHostAddressByName_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
|
ADD.L #2,A0 ; skip length, string is null terminated (?)
|
||||||
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 _DnsGetHostAddressByName_StringRamAllocated
|
|
||||||
|
|
||||||
MOVE.L ChVide(A5),D3
|
WithDataStorage
|
||||||
|
LoadBSDSocketBase
|
||||||
RestoreStackFunction
|
CALLLIB gethostbyname
|
||||||
Ret_String
|
EndDataStorage
|
||||||
|
|
||||||
_DnsGetHostAddressByName_StringRamAllocated:
|
|
||||||
MOVE.L D0,A1 ; a1 contains address
|
|
||||||
SUBQ #1,D1 ; reduce by one for DBRA
|
|
||||||
|
|
||||||
_DnsGetHostAddressByName_KeepCopyingAMOSString:
|
|
||||||
MOVE.B (A0)+,(A1)+ ; byte copy
|
|
||||||
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)
|
|
||||||
WithDataStorage
|
|
||||||
LoadBSDSocketBase
|
|
||||||
CALLLIB gethostbyname
|
|
||||||
EndDataStorage
|
|
||||||
MOVEM.L (SP)+,A0/D2
|
|
||||||
|
|
||||||
; free the ram before we go any farther
|
|
||||||
MOVE.L D0,-(SP)
|
|
||||||
MOVE.L A0,A1
|
|
||||||
MOVE.L D2,D0
|
|
||||||
Rjsr L_RamFree
|
|
||||||
MOVE.L (SP)+,D0
|
|
||||||
|
|
||||||
TST.L D0
|
TST.L D0
|
||||||
BNE _DnsGetHostAddressByName_GetIPAddress
|
BNE _DnsGetHostAddressByName_GetIPAddress
|
||||||
|
@ -2007,6 +1919,7 @@ _DnsGetHostAddressByName_KeepCopyingAMOSString:
|
||||||
Ret_String
|
Ret_String
|
||||||
|
|
||||||
_DnsGetHostAddressByName_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
|
||||||
|
@ -2027,26 +1940,18 @@ _DnsGetHostAddressByName_GetIPAddressLength:
|
||||||
BNE _DnsGetHostAddressByName_GetIPAddressLength
|
BNE _DnsGetHostAddressByName_GetIPAddressLength
|
||||||
MOVE.L (SP)+,A2
|
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
|
Rjsr L_Demande ; string is in A0/A1
|
||||||
LEA 2(A0,D3.W),A1
|
MOVE.W D3,(A0)+
|
||||||
MOVE.L A1,HiChaine(A5)
|
SUBQ #1,D3
|
||||||
MOVE.L A0,A1
|
|
||||||
|
|
||||||
MOVE.W D4,(A1)+
|
|
||||||
|
|
||||||
SUBQ #1,D4
|
|
||||||
|
|
||||||
_DnsGetHostAddressByName_KeepCopying:
|
_DnsGetHostAddressByName_KeepCopying:
|
||||||
MOVE.B (A2)+,(A1)+
|
MOVE.B (A2,D3),(A0,D3)
|
||||||
DBRA D4,_DnsGetHostAddressByName_KeepCopying
|
DBRA D3,_DnsGetHostAddressByName_KeepCopying
|
||||||
|
|
||||||
MOVE.L A0,D3
|
EvenOutStringAddress A0,D0
|
||||||
|
|
||||||
|
MOVE.L A0,HiChaine(A5)
|
||||||
|
MOVE.L A1,D3
|
||||||
|
|
||||||
RestoreStackFunction
|
RestoreStackFunction
|
||||||
|
|
||||||
|
@ -2148,51 +2053,6 @@ _SocketCloseSocket_LibraryOpen:
|
||||||
RestoreStackFunction
|
RestoreStackFunction
|
||||||
Ret_Int
|
Ret_Int
|
||||||
|
|
||||||
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
; Int=Socket Herrno
|
|
||||||
;
|
|
||||||
; Return Herrno value, errors related to DNS resolution
|
|
||||||
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
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
|
|
||||||
Dlea SelectScratchArea,A1
|
|
||||||
|
|
||||||
; build the tag list
|
|
||||||
MOVE.L HerrnoTag,(A0)+
|
|
||||||
MOVE.L A1,(A0)+
|
|
||||||
MOVE.L 0,(A0)+
|
|
||||||
MOVE.L 0,(A0)+
|
|
||||||
MOVE.L A2,A0
|
|
||||||
|
|
||||||
WithDataStorage
|
|
||||||
LoadBSDSocketBase
|
|
||||||
CALLLIB SocketBaseTagList
|
|
||||||
EndDataStorage
|
|
||||||
|
|
||||||
TST.L D0
|
|
||||||
BEQ _SocketHerrno_success
|
|
||||||
|
|
||||||
; failed
|
|
||||||
MOVE.L #-1,D3
|
|
||||||
|
|
||||||
RestoreStackFunction
|
|
||||||
Ret_Int
|
|
||||||
|
|
||||||
_SocketHerrno_success:
|
|
||||||
MOVE.L (A1),D3
|
|
||||||
|
|
||||||
RestoreStackFunction
|
|
||||||
Ret_Int
|
|
||||||
;
|
;
|
||||||
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
; Even if you do not have error messages, you MUST
|
; Even if you do not have error messages, you MUST
|
||||||
|
|
|
@ -1,20 +1,10 @@
|
||||||
echo "***Assembling AMOSPro_BSDSocket.Lib"
|
echo "***Assembling AMOSPro_BSDSocket.Lib"
|
||||||
assign AMOSPro_System: SYS:Development/AMOS_Pro
|
assign AMOSPro_System: MiSTerHD:Development/AMOSPro/AMOS_Pro
|
||||||
assign AMOSPro_Sources: amos-pro-bsdsocket-extension:stuff/AMOS-Professional-Official
|
Stuff:Development/AMOS-Professional-Official-mas/c/Library_Digest BSDSocket.s
|
||||||
AMOSPro_Sources:c/Library_Digest BSDSocket.s
|
Stuff:Development/AMOS-Professional-Official-mas/c/Genam FROM BSDSocket.s TO AMOSPro_BSDSocket.Lib
|
||||||
AMOSPro_Sources:c/Genam FROM BSDSocket.s TO AMOSPro_BSDSocket.Lib -e ExtNb=18-1
|
|
||||||
;delete >NIL: BSDSocket_Labels.s
|
;delete >NIL: BSDSocket_Labels.s
|
||||||
;delete >NIL: BSDSocket_Size.s
|
;delete >NIL: BSDSocket_Size.s
|
||||||
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
|
|
||||||
copy AMOSPro_BSDSocket.Lib AMOSPro_System:APSystem/
|
copy AMOSPro_BSDSocket.Lib AMOSPro_System:APSystem/
|
||||||
apcmp "/test/TestSuite.amos" inclib
|
;use an amos file here that includes the plugin to quickly build a test program
|
||||||
|
;apcmp "aqua_test_plugin.amos" inclib
|
||||||
echo "Build for slot 9"
|
|
||||||
AMOSPro_Sources:c/Genam FROM BSDSocket.s TO AMOSPro_BSDSocket_Slot9.Lib -e ExtNb=9-1
|
|
||||||
echo "Build for slot 11"
|
|
||||||
AMOSPro_Sources:c/Genam FROM BSDSocket.s TO AMOSPro_BSDSocket_Slot11.Lib -e ExtNb=11-1
|
|
||||||
echo "Build for slot 17"
|
|
||||||
AMOSPro_Sources:c/Genam FROM BSDSocket.s TO AMOSPro_BSDSocket_Slot17.Lib -e ExtNb=17-1
|
|
||||||
|
|
||||||
|
|
BIN
test/TestSuite
BIN
test/TestSuite
Binary file not shown.
Binary file not shown.
|
@ -1,354 +0,0 @@
|
||||||
' 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
|
|
Loading…
Reference in New Issue