diff options
7 files changed, 1088 insertions, 0 deletions
diff --git a/frontends/riscos/distribution/!System/310/Modules/Network/SockWatch,ffa b/frontends/riscos/distribution/!System/310/Modules/Network/SockWatch,ffa Binary files differnew file mode 100644 index 000000000..e589cfdb4 --- /dev/null +++ b/frontends/riscos/distribution/!System/310/Modules/Network/SockWatch,ffa diff --git a/frontends/riscos/distribution/3rdParty/SocketWatch/!Info b/frontends/riscos/distribution/3rdParty/SocketWatch/!Info new file mode 100644 index 000000000..cda797782 --- /dev/null +++ b/frontends/riscos/distribution/3rdParty/SocketWatch/!Info @@ -0,0 +1,137 @@ +Name : SocketWatch +Purpose: Asynchronous socket operations without null polls +Version: 0.07 (11-01-2019) +Status : GNU GPL +Authors: Dickon Hood, Frank de Bruijn + +This isn't an official release. + +In November 2003 I noticed SocketWatch 0.04y had a couple of bugs. After I had +corrected them and was almost ready to release 0.05, I discovered the +'official' place for SocketWatch was now on the Nettle site +(http://nettle.sourceforge.net). So I contacted the Nettle maintainers, told +them about the bugs and sent them all the work I had done on repairing it, +more or less expecting to hear something about an official release 0.05 within +a couple of months... + +Still nothing three months later, so I sent one more e-mail (which remained +unanswered) and put 0.05 on my site. + + +Installing +========== +The zip archive contains an application called !ModInst. Run it to install the +module on your computer. If you want to install the module manually, you can +find it in !ModInst.Resources.!System.310.Modules.Network. + + +Source +====== +The source code is provided as an ObjAsm file in the Source directory in the +archive. If you want to assemble the module again, run the Build file. The +module will be recreated and moved to the !ModInst application for +installation. + + +Version history +=============== +11-01-2019 0.07 +---------------- +Catered for errors in SocketWatch_Register better. +Added notes about use with AcornSSL. + +12-06-2012 +---------- +Removed dependency on private library (providing constants) so the source can +be used stand alone. Added Build script (previous builds were done from +StrongED, using a multipurpose ObjAsmRun script). Nothing changed otherwise. +MD5 checksum still f2bb3f8d911d0b20a43d6ee135c3ae97. + +23-06-2006 0.06 +---------------- +Fixed small bug in the AtomicReset SWI (flags not restored in 26 bit mode, so +IRQ bit not cleared). Not sure if this ever bothered anyone (think not as it +was already present in 0.04y). +Removed disabling interrupts in EventHandler as event handlers are entered +with interrupts disabled. +Also some more source clean ups and more comments added. +MD5 checksum: f2bb3f8d911d0b20a43d6ee135c3ae97. + +14-08-2005 +---------------- +Moved the source to ObjAsm. No functional changes to the code. MD5 checksum +still 90f3323981a0e287f488e9a59b2e5373. No new release. + +12-12-2003 0.05 +---------------- +First one by me. Came about when I was investigating a memory leak on my RPC. +MD5 checksum of the module: 90f3323981a0e287f488e9a59b2e5373. + +The detailed list of changes below was for the benefit of the Nettle +maintainers and originally sent to Ian in an e-mail on 11-12-2003. +Use the single file source of 0.04y as a reference. + +- Most of the variable definitions from Flags% to r12End% aren't required. You + just need SockList% (with a FNdb(-4) instead of a FNdb(4)) and r12End%. The + rest was removed. +- No flag definitions are needed. Removed. +- Socket structure definitions and ErrorChunk%: no changes. +- From the module header to EventHandler_GotOne32%: merely some optimisations. +- Error texts: were placed near the routines that use them. This was mainly + cosmetic, but it had the added advantage of allowing me to replace all the + FNADRLs with simple ADRs. +- GetBlock%: removed. +- ReleaseBlock%: removed. +- IsHexNum_lp1%: not required. Removed. +- moveBytes%: not required. Removed. +- From title string to SWI-handler: no real changes. +- From Command% to CommandText%: moved the table and the help and syntax texts + for the commands to just before the SWDL_Code% routine and 'cleaned up' the + texts a bit, but that qualifies as cosmetic. +- Syslog_Name%: not required. Removed. +- Syslog_Version%: not required. Removed. +- From Init% to FinalCode%: several changes, the most important one being the + removal of the claiming of a 16K block of temporary workspace which was + neither used nor released. + There's also the stacking of r7 to r9/r11. It's true that these registers + should be saved (according to the PRM) but only if they're modified. So why + bother if they're not? Replacing this with just stacking r14 enabled a + 'cleaner' jump out of the routines on errors. + At the very beginning of Init%, I inserted a check for a value in r12 on + entry. This has to do with re-initialisation after a 'Tidy' operation. Not + sure if that's still required though (hasn't the 'Tidy' functionality been + blocked or removed from RISC OS these days or is that an unfounded rumour?). + I removed everything connected with the CRC-check, including the error text. + SocketWatch is the only module I've ever come across using something like + this and I honestly fail to see what use it is here. But if you do see that, + then by all means leave it in. + In Final% the (unused) ModuleDying% flag was set, but as that had been + removed anyway, so were the three instructions involved in this action. + Actually, as the variable Flags% was re-used to point at the module flags + word, this flag bit isn't set in the first word of the workspace at all. In + fact, on finalisation SocketWatch 0.04y sets bit 1 of the word 592 bytes + from the address r12 happens to point at. That *could* be in the unused 16K + block that was claimed on initialisation, but there's no guarantee. Nasty + (and no, I hadn't realised this yet when I wrote the comment on Flags% in + the Source_004y file...). + FinalCode% (renamed release%) was more or less integrated with Init% (sort + of 'glued to the bottom') but otherwise essentially unchanged, apart from + removing the call to ReleaseBlock% (including the stacking/unstacking of + r14) in favour of a simple MOV r0,#7 / SWI XOS_Module sequence). +- SWI_Register% contained some code at the start (up to the Bvs instruction) I + couldn't make sense of. If you can, please enlighten me. I asked Dickon + about this in my first email to him and he didn't understand it anymore + either. So I removed it. + The rest is essentially unchanged (cosmetics only), but I did replace the + call to GetBlock% and the 'push' and 'pop' instructions around it with the + MOV/SWI instructions that were actually required here. +- SWI_Deregister%: no changes except for replacing the call to ReleaseBlock% + and its surrounding 'push'/'pop' with the necessary MOV and SWI. +- SWI_AtomicReset%: optimisations only. +- SWI_AllocPW%: no changes. +- SWI_DeallocPW%: no changes. +- SWDL_Code%: cosmetic changes only. + +02-12-2002 0.04y +----------------- +By Dickon Hood. See the !ReadMe file. diff --git a/frontends/riscos/distribution/3rdParty/SocketWatch/Origin,b28 b/frontends/riscos/distribution/3rdParty/SocketWatch/Origin,b28 new file mode 100644 index 000000000..34a71d981 --- /dev/null +++ b/frontends/riscos/distribution/3rdParty/SocketWatch/Origin,b28 @@ -0,0 +1 @@ +https://www.aconet.org/tools/ diff --git a/frontends/riscos/distribution/3rdParty/SocketWatch/Source/!ReadMe b/frontends/riscos/distribution/3rdParty/SocketWatch/Source/!ReadMe new file mode 100644 index 000000000..ea24c7802 --- /dev/null +++ b/frontends/riscos/distribution/3rdParty/SocketWatch/Source/!ReadMe @@ -0,0 +1,133 @@ +Document v0.07. (C) Dickon Hood, see licence for details of copying etc. + + +SocketWatch +=========== + +SocketWatch is a simple module designed to reduce the requirement of Wimp +applications using sockets to constantly poll them using Null Wimp polls for +data. + +If you're not a programmer, stop reading now, this will probably make little +sense to you. If you are a programmer, but don't write networking +applications, again, this is unlikely to be of interest. + + +Rationale +--------- + +At boot time, my machine loads and runs five seperate applications which +require open sockets. As none of these have support modules associated with +them, I'm assuming that they are constantly polling the sockets they open on +null polls. This is inefficient. + +Sockets can be marked as asynchronous. If they are, an Internet event (19) +is generated whenever something interesting happens to them. Events are only +accessable to modules, however, and are useless in a Wimp environment. The +answer is to write a module which does that and notifies the parent +application that something has happened. If every application did this, +there'd be another five or six modules running on my machine, all doing much +the same job, which I don't need. + +This attempts to address the issue by implementing a module with an open +interface, and one which is generic enough to be applicable to almost every +app. which could want to use it. + + +Usage +----- + +SocketWatch relies upon a feature of Risc OS 3.1 and upwards, so won't work +on ROS2. Sorry, but there we go. + +Sockets are registered with the module. At this point, the socket is marked +as asynchronous (so the parent app. doesn't need to). A pollword and bit +number to set are also supplied. + +As some internal structure has to be created, a pollword of 0 is acceptable, +and, if passed, the module will use one of the words in this structure as the +pollword. This is returned to the app. in r0. + +When an Internet event is triggered, the module scans all registered sockets. +If one is matched, the appropriate bit is set in the pollword. This allows +other bits to be reserved for other things. Note, it is not an error for a +socket to have multiple pollwords associated with it; there is no reason I +can think of for two apps. to share one socket (*why* is another matter, but +it shouldn't be an error); these may both register PWs for them. + +Usage with AcornSSL +------------------- +SocketWatch should only be used with the normal socket numbers, not the ssl +socket handles used by AcornSSL. +However, it can be used for secure sockets with a sequence like: + Socket_Create to get socket normal socket descriptor + AcornSSL_CreateSession to get ssl socket + SocketWatch_Register of normal socket descriptor + +SWIs +---- + +SWI SocketWatch_Register (0x52280) + +On entry: r0 => pollword, 0 for module to allocate one, + r1 = bitmask to set if there's activity + r2 = socket number. + +On exit: r0 => pollword. + If an error is raised by Socket_Ioctl, r0 is => error block + and the socket is not registered. + +If the pollword passed is 0, one allocated from the internal structure will +be returned. Note that this is freed when at the time of deregistering and +may not be used afterwards. + + + +SWI SocketWatch_Deregister (0x52281) + +On entry: r0 = socket, + r1 => pollword. + +On exit: all preserved. + +The socket is no longer watched. If the pollword was allocated by the +module, it is not valid once this call is called. + + + +SWI SocketWatch_AtomicReset (0x52282) + +On entry: r0 => pollword + r1 = new value + +On exit: r0 = old value + r1 preserved. + +This SWI reads from r0, writes r1 to r0, then exits, all with IRQs off, +making it an atomic operation (ie., one which may not be interrupted). It is +a problem with Pollwords in that they're used by IRQ or Callback code, yet +read and reset by usermode code which can't disable IRQs easily. This +removes the problem where the app. reads the PW, IRQ routine sets a couple of +bits, then the forground resets it. + + + +SWI SocketWatch_AllocPW (0x52283) + +On entry: - + +On exit: r0 => 4 bytes of RAM which may be released by SWI +SocketWatch_DeallocPW. + +ATM, this SWI claims four bytes of RMA; this isn't efficient, and may be +changed in later releases. The SWI is provided for convenience's sake. + + + +SWI SocketWatch_DeallocPW (0x52284) + +On entry: r0 => pollword, as allocated by SWI SocketWatch_AllocPW. + +On exit: all preserved. + +ATM this calls OS_Module 7 to free the word. diff --git a/frontends/riscos/distribution/3rdParty/SocketWatch/Source/Build,fd7 b/frontends/riscos/distribution/3rdParty/SocketWatch/Source/Build,fd7 new file mode 100644 index 000000000..e7418707d --- /dev/null +++ b/frontends/riscos/distribution/3rdParty/SocketWatch/Source/Build,fd7 @@ -0,0 +1,16 @@ +| SocketWatchBuild 1.00 12-06-2012 + +Set SocketWatchSource$Dir <Obey$Dir> +Set SocketWatchTarget$Dir <SocketWatchSource$Dir>.^.!ModInst.Resources.!System.310.Modules.Network + +RMEnsure DDEUtils 0.00 IfThere System:Modules.DDEUtils Then RMLoad System:Modules.DDEUtils +RMEnsure DDEUtils 0.00 Error DDEUtils module not found + +ObjAsm -throwback <SocketWatchSource$Dir>.Source <SocketWatchSource$Dir>.[Object] +Link -verbose -rmf -output <SocketWatchSource$Dir>.SockWatch <SocketWatchSource$Dir>.[Object] +Remove <SocketWatchSource$Dir>.[Object] + +IfThere <SocketWatchTarget$Dir> Then Copy <SocketWatchSource$Dir>.SockWatch <SocketWatchTarget$Dir>.* A~CDF~L~N~P~Q~R~S~T~V + +Unset SocketWatchTarget$Dir +Unset SocketWatchSource$Dir
\ No newline at end of file diff --git a/frontends/riscos/distribution/3rdParty/SocketWatch/Source/Licence b/frontends/riscos/distribution/3rdParty/SocketWatch/Source/Licence new file mode 100644 index 000000000..dc63aaca0 --- /dev/null +++ b/frontends/riscos/distribution/3rdParty/SocketWatch/Source/Licence @@ -0,0 +1,340 @@ + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) 19yy <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/frontends/riscos/distribution/3rdParty/SocketWatch/Source/Source b/frontends/riscos/distribution/3rdParty/SocketWatch/Source/Source new file mode 100644 index 000000000..03b48b088 --- /dev/null +++ b/frontends/riscos/distribution/3rdParty/SocketWatch/Source/Source @@ -0,0 +1,461 @@ +; SocketWatch.Source 0.07 11-01-2019 + +; This is the source code for version 0.07 of the SocketWatch module, originally by Dickon Hood. +; It's GNU GPL (see the file 'Licence'). +; See the !Info file for more information. +; +; Frank de Bruijn, June 2006. +; v0.07 (11/01/2019) Martin Avison catered for errors using AcornSSL, and any other Ioctl errors: +; AcornSSL_Ioctl will set FIOASYNC for SSL sockets ... but Internet event gives +; base integer socket, so SocketWatch cannot match it on socket & pollword. +; Socketwatch must therefore only be used with base integer socket descriptors, +; (although they may be secured using AcornSSL_CreateSession). +; If Socket_Ioctl is called with SSL socket, it gives error 'Bad file descriptor' but registers it. +; This change removes any registration after any Ioctl error, and returns the error. +; + + GBLS NAME + GBLS VERSION + GBLS DATE +NAME SETS "SocketWatch" +VERSION SETS "0.07" +DATE SETS "11 Jan 2019" + +wp RN r12 ; workspace pointer + +X * &20000 ; bit 17 + +OS_Write0 * &02 ; some SWIs +OS_NewLine * &03 +OS_Byte * &06 +OS_Module * &1E +OS_Claim * &1F +OS_Release * &20 +OS_ConvertHex8 * &D4 +Socket_Ioctl * &41212 + +iFlag26 * 1<<27 ; IRQ flags +iFlag32 * 1<<7 + + ^ 0 +SockList # 4 ; workspace block : entry to linked list, defined below +WorkspaceSize * @ ; size of block + + ^ 0 +SockNext # 4 ; socket structure: next in list +SockDescriptor # 4 ; the socket this describes +SockPollword # 4 ; pollword for this socket +SockBits # 4 ; bit to set (0..31) in the pollword if there's activity +SockSize # 4 ; size of an entry + +SWIChunk * &52280 +ErrorChunk * &815B00 + + + AREA codeblock,CODE,READONLY + + + ENTRY + + +ModuleHeader + DCD 0 ; no start code + DCD Initialise - ModuleHeader + DCD Finalise - ModuleHeader + DCD 0 ; no service call handler + DCD Title - ModuleHeader + DCD Help - ModuleHeader + DCD Commands - ModuleHeader + DCD SWIChunk + DCD SWIHandler - ModuleHeader + DCD SWITable - ModuleHeader + DCD 0 ; no SWI decoding code + DCD 0 ; no Messages filename offset + DCD Flags - ModuleHeader + + +Flags DCD 1 + + +Title DCB NAME,0 + + +Help DCB NAME,9,VERSION," (",DATE,") © 2002 Dickon Hood",0 + ALIGN + + +; ------------------------------------------------------------------------------------------------------------------------------------ +; Initialisation, finalisation - SVC mode +; ------------------------------------------------------------------------------------------------------------------------------------ + +Initialise ROUT +; Entry : r10 = pointer to environment string +; r11 = I/O base of instantiation number (PRM 1-208) +; r12 = pointer to private word (non zero? then after OS_Module 8) +; r13 = pointer to supervisor stack + STR lr, [sp, #-4]! + LDR r2, [wp] + TEQ r2, #0 ; don't (re)initialise if there's a value (pointer) in wp + LDRNE pc, [sp], #4 + MOV r0, #6 + MOV r3, #WorkspaceSize + SWI X+OS_Module + LDRVS pc, [sp], #4 ; exit if no room in RMA + STR r2, [wp] + MOV wp, r2 + MOV r0, #0 +0000 STR r0, [r2], #4 ; clear workspace + SUBS r3, r3, #4 + BGT %b0000 + MOV r0, #16 ; EventV + ADR r1, EventHandler + MOV r2, wp ; workspace pointer + SWI X+OS_Claim + MOVVS r3, r0 + BVS %f0020 + MOV r0, #14 ; enable + MOV r1, #19 ; Internet event + SWI X+OS_Byte + LDRVC pc, [sp], #4 + B %f0010 +Finalise ; (PRM 1-209, 3-73) +; Entry : r10 = fatality indicator: 0=non fatal, 1=fatal +; r11 = instantiation number +; r12 = pointer to private word +; r13 = pointer to supervisor stack + STR lr, [sp, #-4]! + LDR wp, [wp] + LDR r0, [wp, #SockList] + TEQ r0, #0 + ADRNE r0, Finalise_Error + BNE %f0030 +0010 MOV r3, r0 + MOV r0, #13 ; disable + MOV r1, #19 ; Internet event + SWI X+OS_Byte +0020 MOV r0, #16 ; EventV + ADR r1, EventHandler + MOV r2, wp ; workspace pointer + SWI X+OS_Release + MOV r0, #7 + MOV r2, wp + SWI X+OS_Module ; free workspace + SUBS r0, r3, #0 + LDREQ pc, [sp], #4 ; V will be clear if Z is set +0030 CMPVC r0, #1<<31 + CMNVC r0, #1<<31 ; set V + LDR pc, [sp], #4 +Finalise_Error + DCD ErrorChunk+5 + DCB "Still watching sockets - can't be killed yet",0 + ALIGN + + +; ------------------------------------------------------------------------------------------------------------------------------------ +; Event handling - SVC or IRQ mode +; ------------------------------------------------------------------------------------------------------------------------------------ + +EventHandler ROUT +; Function: Handle an event by checking the thread flag and then setting up a callback flag (pollword) to process it. +; Entry : r0 = event number +; r1 = event reason +; r2 = socket descriptor +; interrupts disabled (PRM 1-146) + TEQ r0, #19 + MOVNE pc, lr ; exit if not Internet event + TEQ r1, #1 ; or not 'data waiting' + TEQNE r1, #2 ; or not 'urgent data' + TEQNE r1, #3 ; or not 'connection broken' + MOVNE pc, lr + LDR r0, [wp, #SockList] + TEQ r0, #0 ; or not watching anything + MOVEQ r0, #19 + MOVEQ pc, lr + STMFD sp!, {r1-r3, lr} +0000 LDR lr, [r0, #SockDescriptor] + TEQ lr, r2 ; else find the right descriptor(s) + BNE %f0010 + LDR r2, [r0, #SockBits] + LDR lr, [r0, #SockPollword] + LDR r1, [lr] + ORR r1, r1, r2 + STR r1, [lr] +0010 LDR r0, [r0, #SockNext] + TEQ r0, #0 + BNE %b0000 + MOV r0, #19 ; Internet event + LDMFD sp!, {r1-r3, pc} + + +; ------------------------------------------------------------------------------------------------------------------------------------ +; SWI's - SVC mode +; ---------------- +; Entry : r0-r9 = caller's values +; r11 = five bottom bits of SWI number +; r12 = pointer to private word +; r13 = pointer to supervisor stack +; r14 = return address as usual +; ------------------------------------------------------------------------------------------------------------------------------------ + +SWITable + DCB NAME,0 + DCB "Register",0 + DCB "Deregister",0 + DCB "AtomicReset",0 + DCB "AllocPW",0 + DCB "DeallocPW",0 + DCB 0 ; end of table + ALIGN + + +SWIHandler ROUT + LDR wp, [wp] + CMP r11, #(%f0010-%f0000)/4 + ADDLE pc, pc, r11, lsl #2 + B %f0010 +0000 B SWI_Register + B SWI_Deregister + B SWI_AtomicReset + B SWI_AllocPW + B SWI_DeallocPW +0010 CMPVC r0, #1<<31 + CMNVC r0, #1<<31 ; set V + ADD r0, pc, #0 + MOV pc, lr + DCD &1E6 + DCB "No such SWI",0 + ALIGN + + +SWI_Register ROUT +; Function: Returns the pollword in r0; if this is zero on entry, it assigns one itself. +; Entry : r0 = pointer to pollword or zero +; r1 = flag bits +; r2 = socket descriptor (not a AcornSSL socket) + STMFD sp!, {r0-r4, lr} + MOV r4, r2 ; socket descriptor + TEQ r0, #0 + MOVEQ r3, #SockSize+4 ; claim one word extra if the pollword is zero on entry + MOVNE r3, #SockSize + MOV r0, #6 + SWI X+OS_Module + BVS %f0000 + LDR r3, [wp, #SockList] ; previous start entry or zero + STR r2, [wp, #SockList] ; pointer to new block + STR r3, [r2, #SockNext] + LDR r0, [sp] + TEQ r0, #0 + ADDEQ r0, r2, #SockSize ; use word in structure if pollword was zero on entry + STR r0, [r2, #SockPollword] + STR r0, [sp] ; store pointer to pollword in r0 on stack + STR r1, [r2, #SockBits] + STR r4, [r2, #SockDescriptor] + MOV r0, r4 + LDR r1, Ioctl_FIOASYNC + ADR r2, Ioctl_Arg ; 'On' + SWI X+Socket_Ioctl ; set FIOASYNC + LDMVCFD sp!, {r0-r4, pc} +; An error leaves the socket still 'registered' with some RMA workspace +v0.07 +; and returned r0 => error not pollword, so cannot be deregistered! +v0.07 +; Fixed to free the block again (and adjust chain) & then return error. +v0.07 + STR r0, [sp] ; save error ptr for return +v0.07 + LDR r2, [wp, #SockList] ; pointer to new block +v0.07 + LDR r3, [r2, #SockNext] ; => next block +v0.07 + STR r3, [wp, #SockList] ; and re-link +v0.07 + MOV r0, #7 ; free the new block +v0.07 + SWI X+OS_Module ; +v0.07 + CMPVC r0, #1<<31 ; clear V +v0.07 + CMNVC r0, #1<<31 ; set V +v0.07 + LDMFD sp!, {r0-r4, pc} ; +v0.07 + +0000 ADD sp, sp, #4 ; discard stacked r0 + LDMFD sp!, {r1-r4, pc} +Ioctl_FIOASYNC DCD &8004667D +Ioctl_Arg DCD 1 + + +SWI_Deregister ROUT + STMFD sp!, {r0-r4, lr} + LDR r4, [wp, #SockList] ; get pointer to list + MOV r2, #0 ; set 'last' to zero +0000 TEQ r4, #0 + BEQ %f0010 + LDR r3, [r4, #SockDescriptor] + TEQ r0, r3 ; sockets the same? + LDREQ r3, [r4, #SockPollword] + TEQEQ r1, r3 ; same pollword? + MOVNE r2, r4 + LDRNE r4, [r4, #SockNext] + BNE %b0000 + LDR r3, [r4, #SockNext] + TEQ r2, #0 ; was there a last one? + STRNE r3, [r2, #SockNext] + STREQ r3, [wp, #SockList] + MOV r2, r4 + MOV r0, #7 ; free the block + SWI X+OS_Module + LDMFD sp!, {r0-r4, pc} +0010 CMPVC r0, #1<<31 + CMNVC r0, #1<<31 ; set V + ADD sp, sp, #4 ; discard stacked r0 + ADD r0, pc, #0 + LDMFD sp!, {r1-r4, pc} + DCD ErrorChunk+4 + DCB "Attempt to free an unregistered socket/pollword pair",0 + ALIGN + + +SWI_AtomicReset ROUT + TEQ pc, pc + BEQ %f0000 ; in 32 bit mode + STMFD sp!, {lr} + TST lr, #iFlag26 + TEQEQP lr, #iFlag26 ; IRQ off (no mode change, so no NOP required) + LDR lr, [r0] + STR r1, [r0] + MOV r0, lr + LDMFD sp!, {pc}^ ; IRQ restored (also clears V as this was clear on entry) +0000 STMFD sp!, {r2, lr} + MRS r2, cpsr + ORR lr, r2, #iFlag32 + MSR cpsr_c, lr ; IRQ off + LDR lr, [r0] + STR r1, [r0] + MOV r0, lr + MSR cpsr_c, r2 ; IRQ restored (also clears V as this was clear on entry) + LDMFD sp!, {r2, pc} + + +SWI_AllocPW + STMFD sp!, {r2-r3, lr} + MOV r0, #6 + MOV r3, #4 + SWI X+OS_Module + MOVVC r0, r2 + LDMFD sp!, {r2-r3, pc} + + +SWI_DeallocPW ROUT + STMFD sp!, {r0-r3, lr} + MOV r3, r0 + MOV r1, r0 + LDR r2, [wp, #SockList] + TEQ r2, #0 + BEQ %f0010 +0000 LDR r0, [r2, #SockPollword] + TEQ r0, r1 + LDREQ r0, [r2, #SockDescriptor] + LDR r2, [r2, #SockNext] + BLEQ SWI_Deregister + TEQ r2, #0 + BNE %b0000 +0010 MOV r2, r3 + MOV r0, #7 + SWI X+OS_Module + LDMVCFD sp!, {r0-r3, pc} + ADD sp, sp, #4 + LDMFD sp!, {r1-r3, pc} + + +; ------------------------------------------------------------------------------------------------------------------------------------ +; Commands - SVC mode +; ------------------- +; Entry : r0 = pointer to command tail +; r1 = number of parameters +; r12 = pointer to private word +; r13 = stack pointer +; r14 = return address +; Exit : r0 = pointer to error block if V=1 +; r7-r11 = must be unaltered +; ------------------------------------------------------------------------------------------------------------------------------------ + +Commands + DCB NAME,0 ; command name + ALIGN + DCD 0 ; no command code + DCD 0 ; no information + DCD 0 ; no invalid syntax - use default + DCD Help_Name - ModuleHeader + + DCB NAME,"_DumpList",0 ; command name + ALIGN + DCD Command_DumpList - ModuleHeader + DCD 0 ; no information + DCD Syntax_DumpList - ModuleHeader + DCD Help_DumpList - ModuleHeader + + DCD 0 ; end of table + +Help_Name + DCB "The ",NAME," module enables applications to do asynchronous socket",13,10 + DCB "operations without null polls. See the !ReadMe file for more information.",13,10 + DCB "This module is released under the terms of the GNU General Public License.",0 + +Help_DumpList + DCB "*",NAME,"_DumpList dumps the current list of watched sockets.",13,10 + DCB "Useful for debugging purposes.",13,10 + DCB "Syntax: " +Syntax_DumpList + DCB "*",NAME,"_DumpList",0 + + ALIGN + + +Command_DumpList ROUT + LDR wp, [wp] + STR lr, [sp, #-4]! + LDR r6, [wp, #SockList] + TEQ r6, #0 + BEQ %f0010 + SUB sp, sp, #12 ; get some scratch space... +0000 ADR r0, SWDL_x + SWI X+OS_Write0 + LDR r0, [r6, #SockDescriptor] + MOV r1, sp + MOV r2, #9 + SWI X+OS_ConvertHex8 + ADDVS r0, r0, #4 + SWI X+OS_Write0 + ADR r0, SWDL_y + SWI X+OS_Write0 + LDR r0, [r6, #SockPollword] + MOV r1, sp + MOV r2, #9 + SWI X+OS_ConvertHex8 + ADDVS r0, r0, #4 + SWI X+OS_Write0 + ADR r0, SWDL_z + SWI X+OS_Write0 + LDR r0, [r6, #SockBits] + MOV r1, sp + MOV r2, #9 + SWI X+OS_ConvertHex8 + ADDVS r0, r0, #4 + SWI X+OS_Write0 + SWI X+OS_NewLine + LDR r6, [r6, #SockNext] + TEQ r6, #0 + BNE %b0000 + ADD sp, sp, #12 + LDR pc, [sp], #4 +0010 ADR r0, SWDL_NowtString + SWI OS_Write0 + SWI OS_NewLine + LDR pc, [sp], #4 +SWDL_x DCB "Socket 0x",0 +SWDL_y DCB ", pollword 0x",0 +SWDL_z DCB ", bitmask 0x",0 + ALIGN +SWDL_NowtString + DCB "Nothing registered - nothing to do",0 + ALIGN + + + DCB 10,10 + DCB "Dickon Hood: dickon@fluff.org, dickon@oaktree.co.uk, in order of preference.",10 + DCB "Frank de Bruijn: frank@aconet.org",10 + DCB 10 + ALIGN + + + END |