From 12b859eaf347708669b27b9a72453d25626db579 Mon Sep 17 00:00:00 2001 From: John Bintz Date: Fri, 26 Apr 2024 16:14:46 -0400 Subject: [PATCH] wow it's working --- API.md | 19 ++- bin/rebuild_raw_source | 2 +- src/AMOSPro_BSDSocket.Lib | Bin 6188 -> 6180 bytes src/BSDSocket.s | 2 - src/BSDSocket_Labels.s | 2 +- src/BSDSocket_Size.s | 2 +- src/report.txt | 34 +++++ test/TestSuite | Bin 22264 -> 65428 bytes test/TestSuite.amos | Bin 8374 -> 8960 bytes test/TestSuite.basic | 271 ++++++++++++++++++++++++++++++++++++++ 10 files changed, 324 insertions(+), 8 deletions(-) create mode 100644 src/report.txt create mode 100644 test/TestSuite.basic diff --git a/API.md b/API.md index 3f07354..e1d86ec 100644 --- a/API.md +++ b/API.md @@ -63,8 +63,19 @@ Create a new Internet socket for reading or writing. #### RESULT=Socket Connect(Socket to IPAddress$, Port) -Attempt to connect to a remote host. Currently doesn't -support DNS lookups. +Attempt to connect to a remote IP address. + +##### Emulation vs. Physical/FPGA Amiga note + +On emulated Amigas (FS-UAE) with emulated `bsdsocket.library`, a failure in +`Socket Connect` due to giving the function a bad IP address allows you to reuse +the socket. On real or FPGA-based Amiga running real TCP/IP stacks (MiamiDX, +Roadshow), the socket will be made unusable and you'll need to +`Socket Close Socket` and reopen the socket with whatever parameters necessary. +Closing and opening `bsdsocket.library` has the same effect. + +Always close and re-open a socket if you have any `Socket Connect` failure and +any non-blocking polling loops time out! ##### Returns @@ -74,6 +85,7 @@ support DNS lookups. the socket with Socket Select and Socket Getsockopt Int to see if the connection succeeded * -11 port out of range +* -13 IP address has zero length --- @@ -82,7 +94,7 @@ support DNS lookups. Set a server socket to reuse an interface and port that had been used recently. You likely want this if you're building something that listens on a port for connections. This calls -setsockopt() for you. +`setsockopt()` for you. ##### Returns @@ -182,6 +194,7 @@ Set a socket to timeout after Wait_ms milliseconds if reading or writing doesn't Close a socket. + ##### Returns * 0 on success diff --git a/bin/rebuild_raw_source b/bin/rebuild_raw_source index 2a1b19b..3c2c04a 100755 --- a/bin/rebuild_raw_source +++ b/bin/rebuild_raw_source @@ -1,6 +1,6 @@ #!/bin/bash -for i in examples/*.amos; do +for i in examples/*.amos test/*.amos; do echo "$i" ~/Projects/amostools/listamos -e AMOSPro_BSDSocket.Lib "${i}" > "${i%.amos}.basic" 2>/dev/null done diff --git a/src/AMOSPro_BSDSocket.Lib b/src/AMOSPro_BSDSocket.Lib index 781ff6cb98dc50b0a95c38a3841de4569127688c..c7308ecba14273d3c79c34456be4b549eb2a9b08 100644 GIT binary patch delta 45 ycmZ2uu*6`3xF`by1M^D;1~wqg;0I(2F))ajOw^HNwA$zv#<6)3M;kvA^Ctkrz6n_X delta 54 zcmZ2tu*P75xF{0?1M^D;1~wqg;0I(2F))Z&P1KQOwB6_y#=+)P$-uzKuz3zg8$SzB G_7eaPq6#Dc diff --git a/src/BSDSocket.s b/src/BSDSocket.s index 49f4e5a..e557aad 100644 --- a/src/BSDSocket.s +++ b/src/BSDSocket.s @@ -682,8 +682,6 @@ _SocketConnect_SockaddrIn: MOVE.L D0,A0 MOVE.L (SP)+,D0 - CLR.W $100 - MOVE.L D0,-(SP) MOVEM.L A0/A3,-(SP) Dload A3 diff --git a/src/BSDSocket_Labels.s b/src/BSDSocket_Labels.s index 5e81b7d..e449567 100644 --- a/src/BSDSocket_Labels.s +++ b/src/BSDSocket_Labels.s @@ -1,5 +1,5 @@ ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -; BSDSocket.s, list of the library functions on the 26-04-2024 08:23:46 +; BSDSocket.s, list of the library functions on the 26-04-2024 14:45:36 ; ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ L_Cold: set 0 diff --git a/src/BSDSocket_Size.s b/src/BSDSocket_Size.s index f3e9d7f..7aa7186 100644 --- a/src/BSDSocket_Size.s +++ b/src/BSDSocket_Size.s @@ -1,5 +1,5 @@ ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -; BSDSocket.s, library size on the 26-04-2024 08:23:46 +; BSDSocket.s, library size on the 26-04-2024 14:45:36 ; ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Lib_Size equ 39 diff --git a/src/report.txt b/src/report.txt new file mode 100644 index 0000000..9caf71b --- /dev/null +++ b/src/report.txt @@ -0,0 +1,34 @@ +[Socket Library Open/Open Library] 1075577444 +[Socket Library Open/Double open] 1075577444 +[Socket Create Inet Socket] 0 +[Socket Set Nonblocking/False] 0 +[Socket Set Nonblocking/True] 0 +[Socket Set Nonblocking/True] Preserving this state for rest of tests +[Dns Get Address By Name$/Bad domain name] +[Dns Get Address By Name$/localhost] 127.0.0.1 +[Dns Get Address By Name$/aminet.net] 35.223.124.178 +[Dns Get Address By Name$/aminet.net] Using this IP address for connection tests +[Dns Get Address By Name$/Returned string can be manipulated] Cat35.223.124.178Dog +[Socket Connect/port too high] -11 +[Socket Connect/blank ip] -14 +[Socket Connect/invalid ip] -1 +[Socket Connect/aminet IP (35.223.124.178) from above] -1 (ok to be -1, will Wait Async Writing next) +[Socket Wait Async Writing/With unconnected socket/2 second timeout] 1 +[Socket Wait Async Writing/With unconnected socket/Zero timeout] 1 +[Socket Wait Async Writing/Connected socket/Two second timeout] 1 +[Socket Wait Async Writing/Connected socket/Zero timeout] 1 +[Socket Wait Async Writing/Connected socket/Attempt to get actual connection] 1 +[Socket Wait Async Writing/Socket Send and Socket Send$/Socket send$ first half] 10 +[Socket Wait Async Writing/Socket Send and Socket Send$/Socket send second half] 18 +[Socket Wait Async Writing/Socket wait Async Reading/With unconnected socket/2 second timeout] 1 +[Socket Wait Async Writing/Socket wait Async Reading/With unconnected socket/Zero timeout] 1 +[Socket Wait Async Writing/Socket wait Async Reading/With aminet socket/2 second timeout] 1 +[Socket Wait Async Writing/Socket wait Async Reading/With aminet socket/Zero timeout] 1 +[Socket Wait Async Writing/Socket Recv$ and Socket Recv/Socket Recv$/Read 20 characters] HTTP/1.1 302 Found + +[Socket Wait Async Writing/Socket Recv$ and Socket Recv/Socket Recv$/String can be manipulated] CatHTTP/1.1 302 Found +Dog +[Socket Wait Async Writing/Socket Recv$ and Socket Recv/Socket Read/Read 20 bytes] 20 +[Socket Wait Async Writing/Socket Recv$ and Socket Recv/Socket Read/Data was read] Date: Fri, 26 Apr 20 +[Socket Wait Async Writing/Socket Library Close/Close] Success +[Socket Wait Async Writing/Socket Library Close/Double close] Success diff --git a/test/TestSuite b/test/TestSuite index bedc0e5a8ed46eeb53871e76d0de7f10a8763772..01256c2b0ac118b5486db423a28d07ab4acc556e 100644 GIT binary patch literal 65428 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 delta 6965 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 delta 1688 zcmaJ=U1$_n6h3n|J7#~ft?9&_{h7(cCTnV>#;8GK8=}Y}8e^eSi%2Ki?8IHVX2b3n zmLM9$CkZin(w8El!3Uqpf~}8|Cn=JLwiF+vls<__1qJb;pttwlnaxhJNtcCl=icvp z=R5a)XD0pNpmOl|i7$;qnR0&2nA){_j{#uZysrE~=s(wA=!E`-K`Bn?V@ye%Y!8Q} z6#KewOGkbDbE#>T(4TO`KfuFP{{cUM%vO*6jNu2oEf4bWw|s-pIkY$R2I!m&<>J_P z7QT*aSZL0w^s)>kt9-s-(?u9*rSKGN#xaM_n?EJ=GR`Es@bf^=#<-b)z*Pfp37y7! z!J|CrVMC_Vgybi&x+#HsL%aBHE;LZz)$vh?WlrPU5bH^#@Gunqy@q+EcVcx*9KUKA zO*P0o?Z|Z7v0;IUp2k00T+!XQC$ghaw3~&M$UdjJZl)r+JwGv(Dde+8eiCK@K9(5Q z+H0w09{%7+E%V8TJJL>*bO}-r{=^tB70(%&Z;MkF=h6O$XN~S7n}zPm<`;c57lxvp zvr49TsM@m(07N<8C;<~zJyi}DT1OgMC24U%IjqLrR!=4q>j?7T6dZ2r^bo-X-bIKd z0fYg+(AxaYDyUREFh`8bGl#>;KIekI-Wc<$hUu0J>@ni_bKCY)%)0z$VHT)qcxJ@EU< zEm0YKKJpYGAh9YQW%U~|t%%;<3`W98EP^-Ckq$Gt374sH!VgpHx31RL39HBrmY6rVJ{#LfK;4vZ8`n zuqMvhIabJ-ZVrlJPpqY(80lT7n2z7XR6=E}#QOQ$R%6e37)mIFt{7}S(TR~n@2Ugg zD84hFxVv)TwTNfa^~8K)P-d2E1wbRBH0f-KOTISzUfU+(Z(3BucbeAs{$H7R>_DYo z8^m)HDclZ<;Jgu1lzNtH?^-Q3uTHHydKY^){6*LGI#|rO?{M)ftWNW&#nG)zLfo(_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 + +_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 + +_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"] +' this value will change in the interpreter as tests run +' we are hacking the gibson here +BASE$="12345678901234567890" +Copy Start(20),Start(20)+20 To Varptr(DEST$) +_ADD_TO_REPORT[DEST$] +_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 + +Close 1