summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/amiga/stand/device-streams/COPYING339
-rw-r--r--sys/arch/amiga/stand/device-streams/README57
-rw-r--r--sys/arch/amiga/stand/device-streams/devices.c157
-rw-r--r--sys/arch/amiga/stand/device-streams/devices.h51
-rw-r--r--sys/arch/amiga/stand/device-streams/devtostream.c437
-rw-r--r--sys/arch/amiga/stand/device-streams/devtostream.gz.uu296
-rw-r--r--sys/arch/amiga/stand/device-streams/getdevices.c326
-rw-r--r--sys/arch/amiga/stand/device-streams/getdevices.h80
-rw-r--r--sys/arch/amiga/stand/device-streams/getopt.lib.gz.uu47
-rw-r--r--sys/arch/amiga/stand/device-streams/protos.h47
-rw-r--r--sys/arch/amiga/stand/device-streams/protos_template.h8
-rw-r--r--sys/arch/amiga/stand/device-streams/rdbinfo.c268
-rw-r--r--sys/arch/amiga/stand/device-streams/rdbinfo.gz.uu261
-rw-r--r--sys/arch/amiga/stand/device-streams/smkfile60
-rw-r--r--sys/arch/amiga/stand/device-streams/streamtodev.c456
-rw-r--r--sys/arch/amiga/stand/device-streams/streamtodev.gz.uu305
-rw-r--r--sys/arch/amiga/stand/device-streams/unixemul.lib.gz.uu50
-rw-r--r--sys/arch/amiga/stand/device-streams/util.c342
-rw-r--r--sys/arch/amiga/stand/device-streams/util.h67
-rw-r--r--sys/arch/amiga/stand/device-streams/xdevtostream.gz.uu298
-rw-r--r--sys/arch/amiga/stand/device-streams/xstreamtodev.gz.uu306
21 files changed, 4258 insertions, 0 deletions
diff --git a/sys/arch/amiga/stand/device-streams/COPYING b/sys/arch/amiga/stand/device-streams/COPYING
new file mode 100644
index 00000000000..a43ea2126fb
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/COPYING
@@ -0,0 +1,339 @@
+ 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/sys/arch/amiga/stand/device-streams/README b/sys/arch/amiga/stand/device-streams/README
new file mode 100644
index 00000000000..a2f18032287
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/README
@@ -0,0 +1,57 @@
+ Utilities in archive
+ - rdbinfo: Print Info on RDB devices.
+ - streamtodev: Copy a stream to a device.
+ - devtostream: Copy a device image to a stream.
+ - xstreamtodev: Same as streamtodev with extra options.
+ - xdevtostream: Same as devtostream with extra options.
+
+-------
+ rdbinfo, streamtodev, devtostream, xdevtostream and xstreamtodev
+ are all: Copyright (C) 1993 Christian E. Hopps
+
+ The word program below refers to all the above programs.
+
+ 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.
+-------
+
+Here are some programs I whipped together for use in NetBSD. I hope
+that these replace ``devtofile'' and ``filetodev''. They are much safer
+programs to use, plus that can use streams not just files. e.g.
+
+ devtofile --rdb=BSD_TRANSFER --quiet | tar -xvf -
+
+although streamtodev seems to have a bit of a problem with tar, tar terminates
+before streamtodev has read all of tar's input...
+
+Anyway all 4 stream programs will not allow you to cross partition boundries,
+and they only work on devices that have RDB's. The 2 x{program}'s add the
+``feature'' of letting you specify start and end blocks within a partition's
+boundries. I never use this but with it comes almost the same functionality
+as ``filetodev'' and ``devtofile'' (still with some safeguards).
+
+type {program} --help for a template and options.
+
+One thing I should point out, all the options are search restrictors, if not
+specified then they are treated as matching everything, e.g. ``streamtodev''
+will grab the first partition on the first unit of the first device it finds
+on the dos list. Play around with ``rdbinfo'' for a while if you don't
+understand this; all the programs use a similar algorithm.
+
+I have tested these somewhat, but I cannot guarentee they work perfect
+therefore I insert my standard disclaimer:
+
+Chris...
+email: sycom.mi.org!ro-chp!chopps
+
diff --git a/sys/arch/amiga/stand/device-streams/devices.c b/sys/arch/amiga/stand/device-streams/devices.c
new file mode 100644
index 00000000000..5c27180c299
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/devices.c
@@ -0,0 +1,157 @@
+/* --------------------------------------------------
+ | NAME
+ | devices
+ | PURPOSE
+ | handle exec devices in a standard way.
+ | NOTES
+ |
+ | COPYRIGHT
+ | Copyright (C) 1993 Christian E. Hopps
+ |
+ | 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.
+ |
+ | HISTORY
+ | chopps - Oct 9, 1993: Created.
+ +--------------------------------------------------- */
+
+#include "util.h"
+#include "devices.h"
+
+/* returns structure with device open. */
+struct device_data *
+alloc_device (char *name, ulong unit, ulong flags, ulong iosize)
+{
+ struct device_data *dd = zmalloc (sizeof (*dd));
+ if (NULL == dd) {
+ return (NULL);
+ }
+ dd->port = CreateMsgPort ();
+ if (NULL == dd->port) {
+ free_device (dd);
+ return (NULL);
+ }
+ dd->io = CreateIORequest (dd->port, iosize);
+ if (NULL == dd->io) {
+ free_device (dd);
+ return (NULL);
+ }
+ dd->name = copy_string (name);
+ if (NULL == dd->name) {
+ free_device (dd);
+ return (NULL);
+ }
+ dd->unit = unit;
+ dd->flags = flags;
+
+ if (open_device (dd)) {
+ free_device (dd);
+ return (NULL);
+ }
+
+ return (dd);
+}
+
+void
+free_device (struct device_data *dd)
+{
+ if (dd) {
+ close_device (dd);
+ DeleteIORequest (dd->io);
+ DeleteMsgPort (dd->port);
+ zfree (dd->name);
+ }
+}
+
+int
+open_device (struct device_data *dd)
+{
+ int error = -1;
+ if (dd && !dd->open) {
+ error = OpenDevice (dd->name, dd->unit, dd->io, dd->flags);
+ if (!error) {
+ dd->open = 1;
+ } else {
+ if (-1 != error) {
+ D(debug_message ("warn: unable to open \"%s\" unit: %ld flags 0x%lx",
+ dd->name, dd->unit, dd->flags));
+ D(debug_message (" reason: error %ld", error));
+ }
+ dd->open = 0;
+ }
+ }
+ return (error);
+}
+
+void
+close_device (struct device_data *dd)
+{
+ if (dd) {
+ if (dd->open) {
+ if(!CheckIO (dd->io)) {
+ AbortIO (dd->io);
+ WaitIO (dd->io);
+ }
+ CloseDevice (dd->io);
+ dd->open = 0;
+ }
+ }
+}
+
+/* returns actual number of bytes written or -1 for error. */
+ulong
+device_read (struct device_data *dd, ulong offset, ulong bytes, void *buffer)
+{
+ struct IOStdReq *io = (struct IOStdReq *)dd->io;
+ io->io_Length = bytes;
+ io->io_Offset = offset;
+ io->io_Data = buffer;
+
+ if (!device_do_command (dd, CMD_READ)) {
+ return (io->io_Actual);
+ }
+ return (-1);
+}
+
+/* returns actual number of bytes written or -1 for error. */
+ulong
+device_write (struct device_data *dd, ulong offset, ulong bytes, void *buffer)
+{
+ struct IOStdReq *io = (struct IOStdReq *)dd->io;
+ io->io_Length = bytes;
+ io->io_Offset = offset;
+ io->io_Data = buffer;
+ if (!device_do_command (dd, CMD_WRITE)) {
+ return (io->io_Actual);
+ }
+ return (-1);
+}
+
+/* returns the error from DoIO () */
+int
+device_do_command (struct device_data *dd, UWORD command)
+{
+ int error = -1;
+ if (dd) {
+ if (dd->open) {
+ dd->io->io_Command = command;
+ error = (int) DoIO (dd->io);
+ } else {
+ dd->io->io_Error = -1;
+ }
+ }
+ return (error);
+}
+
+
diff --git a/sys/arch/amiga/stand/device-streams/devices.h b/sys/arch/amiga/stand/device-streams/devices.h
new file mode 100644
index 00000000000..58b87b32d65
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/devices.h
@@ -0,0 +1,51 @@
+/* --------------------------------------------------
+ | NAME
+ | devices
+ | PURPOSE
+ | provide simple routines and access to an exec device.
+ | NOTES
+ |
+ | COPYRIGHT
+ | Copyright (C) 1993 Christian E. Hopps
+ |
+ | 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.
+ |
+ | HISTORY
+ | chopps - Oct 9, 1993: Created.
+ +--------------------------------------------------- */
+
+#if ! defined (_DEVICES_H)
+#define _DEVICES_H
+#include "util.h"
+#include <exec/ports.h>
+#include <exec/io.h>
+#include <exec/devices.h>
+
+struct device_data {
+ struct MsgPort *port;
+ struct IORequest *io;
+ char *name;
+ ulong unit;
+ ulong flags;
+ int open;
+
+};
+
+struct device_data * init_device (char *name, ulong unit, ulong flags, ulong iosize);
+int open_device (struct device_data *dd);
+void close_device (struct device_data *dd);
+void free_device (struct device_data *dd);
+
+#endif /* _DEVICES_H */
diff --git a/sys/arch/amiga/stand/device-streams/devtostream.c b/sys/arch/amiga/stand/device-streams/devtostream.c
new file mode 100644
index 00000000000..01b2155cb69
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/devtostream.c
@@ -0,0 +1,437 @@
+/* --------------------------------------------------
+ | NAME
+ | devtostream
+ | PURPOSE
+ | dump all data on a device to a stream.
+ |
+ | NOTES
+ | only works for RDB partitions.
+ |
+ | COPYRIGHT
+ | Copyright (C) 1993 Christian E. Hopps
+ |
+ | 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.
+ |
+ | HISTORY
+ | chopps - Oct 9, 1993: Created.
+ +--------------------------------------------------- */
+
+#include <dos/dos.h>
+#include <dos/dosextens.h>
+#include <dos/rdargs.h>
+#include <cstartup.h>
+#include <string.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <signal.h>
+#define __GNU_LIBRARY__ 1
+#include <getopt.h>
+#undef __GNU_LIBRARY__
+#include "getdevices.h"
+
+#if defined (SASC)
+/* we will handle this ourselves. */
+int __regargs chkabort (void)
+{
+ return 0;
+}
+int __regargs Chk_Abort (void)
+{
+ return 0;
+}
+#endif
+
+struct partition *find_partition (struct List *dl, char *dev_name, char *part_name,
+ ulong unit, ulong start_block, ulong end_block);
+void dev_to_file (char *name, ulong unit, ulong bpb, FILE *file, ulong cb, ulong end);
+int check_values (struct partition *p, ulong st, ulong end, int exp);
+
+struct option long_options[] = {
+ { "output", required_argument, NULL, 'o' },
+ { "rdb-name", required_argument, NULL, 'n'},
+#if defined (EXPERT_VERSION)
+ { "start-block", required_argument, NULL, 's'},
+ { "end-block", required_argument, NULL, 'e'},
+ { "expert-mode", no_argument, NULL, 'x'},
+#endif
+ { "device", required_argument, NULL, 'd'},
+ { "unit", required_argument, NULL, 'u'},
+ { "buffer-blocks", required_argument, NULL, 'b'},
+ { "verbose", no_argument, NULL, 'V'},
+ { "help", no_argument, NULL, 'h'},
+ { "version", no_argument, NULL, 'v' },
+ { "quiet", no_argument, NULL, 'q' },
+ { NULL, 0, NULL, 0 }
+};
+char *short_options = "?qvVhn:d:u:b:o:"
+#if defined (EXPERT_VERSION)
+"xs:e:"
+#endif
+;
+
+char *cmd_vers_string = "\0$VERS devtostream 1.0 (93.10.10)";
+char *version_string = "devtostream V1.0 -- Copyright 1993 Christian E. Hopps\n";
+
+char *help_string = "Usage: %s [options]\n"
+"Options:\n"
+" -[vVxghnsedubo] [--output=file] [--rdb-name=partition_name]\n"
+" [--device=device_name] [--unit=unit_num] [--version]\n"
+#if defined (EXPERT_VERSION)
+" [--start-block=block] [--end-block=block] [--expert-mode]\n"
+#endif
+" [--buffer-blocks=blocks] [--verbose] [--quiet] [--help]\n"
+"\n"
+"Number Formats: (where `n\' are alpha-num. digits)\n"
+" 0[xX]nnn | [xX]nnn | nnn[hH] | $nnn - for Hex\n"
+" nnn[oO] - for octal\n"
+" nnn[bB] - for binary\n"
+" nnn - for decimal (also default for non-recognized)\n"
+"\n"
+" given the above you can also postpend a [MKk] for Megabyte\n"
+" Kilobyte and kilobyte respectively. [range checking inuse]";
+
+
+char *opt_outfile_name;
+char *opt_rdb_name;
+char *opt_device_name;
+ulong opt_unit = -1; /* -1 for invalid */
+ulong opt_start_block = -1; /* -1 for invalid. */
+ulong opt_end_block = -1; /* -1 for invalid */
+ulong opt_verbose;
+ulong opt_expert;
+ulong opt_debug;
+ulong opt_quiet = 0;
+ulong number_of_buffer_blocks = 100;
+
+FILE *mout;
+FILE *min;
+
+int
+main (int argc, char **argv)
+{
+ int ret = 0;
+ int opt;
+ int opt_quit = 0;
+ int opt_version = 0;
+ int opt_help = 0;
+ int longind = 0;
+ struct List *dl;
+ FILE *file = NULL;
+
+ signal (SIGINT, SIG_IGN);
+
+ mout = stdout;
+ min = stdin;
+
+ if (argc) {
+ while (EOF != (opt = getopt_long (argc, argv, short_options,
+ long_options, &longind))) {
+ switch (opt) {
+ case 'q':
+ opt_quiet = 1;
+ break;
+ case 'v':
+ opt_version = 1;
+ opt_quit = 1;
+ break;
+ case 'V':
+ opt_verbose = 1;
+ break;
+ case '?':
+ case 'h':
+ opt_help = 1;
+ opt_quit = 1;
+ break;
+ case 'n':
+ opt_rdb_name = optarg;
+ break;
+ case 'd':
+ opt_device_name = optarg;
+ break;
+ case 'o':
+ opt_outfile_name = optarg;
+ break;
+ case 'b':
+ if (!(string_to_number (optarg, &number_of_buffer_blocks))) {
+ opt_quit = 1;
+ opt_help = 1;
+ ret = 20;
+ }
+ break;
+#if defined (EXPERT_VERSION)
+ case 'x':
+ opt_expert = 1;
+ break;
+ case 's':
+ if (!(string_to_number (optarg, &opt_start_block))) {
+ opt_quit = 1;
+ opt_help = 1;
+ ret = 20;
+ }
+ break;
+ case 'e':
+ if (!(string_to_number (optarg, &opt_end_block))) {
+ opt_quit = 1;
+ opt_help = 1;
+ ret = 20;
+ }
+ break;
+#endif /* EXPERT_VERSION */
+ case 'u':
+ if (!(string_to_number (optarg, &opt_unit))) {
+ opt_quit = 1;
+ opt_help = 1;
+ ret = 20;
+ }
+ break;
+ case 'g':
+ opt_debug = 1;
+ }
+ }
+ if (!opt_outfile_name) {
+ mout = fopen ("*", "w+");
+ if (!mout) {
+ return (20);
+ }
+ file = stdout;
+ }
+ if (opt_quiet && opt_expert) {
+ message ("--quiet-mode (-q) and --expert-mode (-x) not allowed at same time.\n");
+ opt_quit = 1;
+ ret = 20;
+ }
+ if (opt_version) {
+ message (version_string, argv[0]);
+ }
+ if (opt_help) {
+ message (help_string, argv[0]);
+ }
+ if (opt_quit) {
+ return (ret);
+ }
+ /* there should be NO messages before this point!! */
+ dl = get_drive_list ();
+ if (dl) {
+ struct partition *p = find_partition (dl, opt_device_name, opt_rdb_name,
+ opt_unit, opt_start_block,
+ opt_end_block);
+ if (p) {
+ if (opt_outfile_name) {
+ file = fopen (opt_outfile_name, "w");
+ }
+ if (file) {
+ if (!isatty (fileno(file))) {
+ int def = 'N';
+ ulong st, end;
+ if (!opt_quiet) {
+ message ("found partition: \"%s\" capacity: %ld.%ld Megs",
+ p->name, megs (p->total_blocks*p->block_size),
+ tenths_of_a_meg (p->total_blocks*p->block_size));
+ message ("start block: %ld end block: %ld total blocks: %ld",
+ p->start_block, p->end_block, p->total_blocks);
+ message ("block Size: %ld", p->block_size);
+ }
+ st = opt_start_block;
+ end = opt_end_block;
+ if (st == (ulong)-1) {
+ st = p->start_block;
+ }
+ if (end == (ulong)-1) {
+ end = p->end_block;
+ }
+ if (check_values (p, st, end, opt_expert)) {
+ int do_it = 0; /* default do not. */
+ if (!opt_quiet) {
+ message ("dumping: start block: %ld to end block: %ld [size: %ldK]\n",
+ st, end, ((end-st)*p->unit->bytes_per_block)/1024);
+ def = ask_bool (def, 'y', "write from partition \"%s\" to file \"%s\"",
+ p->name, opt_outfile_name ? opt_outfile_name
+ : "stdout");
+ if (tolower (def) == 'y') {
+ do_it = 1;
+ }
+ } else {
+ do_it = 1;
+ }
+ if (do_it) {
+ dev_to_file (p->unit->name, p->unit->unit,
+ p->unit->bytes_per_block, file, st, end);
+ } else {
+ message ("ok, quiting...");
+ }
+ }
+ } else {
+ warn_message ("Pipes and re-direction will work but interactive\n"
+ "input/output is prohibited.");
+ }
+ if (opt_outfile_name) {
+ fclose (file);
+ }
+ }
+ } else {
+ warn_message ("could not locate a partition with your specs.");
+ }
+ free_drive_list (dl);
+ }
+ if (!opt_outfile_name) {
+ fclose (mout);
+ }
+ }
+ return (0);
+}
+
+int
+check_values (struct partition *p, ulong st, ulong end, int exp)
+{
+ if (st > end) {
+ message ("error: Your end block [%ld] is less than your start block [%ld]!\n",
+ st,end);
+ return (0);
+ }
+ if (st < p->start_block || st > p->end_block ||
+ end > p->end_block || end < p->start_block) {
+ warn_message ("ERROR: start and end blocks cannot cross partition boundries.");
+ return (0);
+ }
+ if (st != p->start_block || end != p->end_block) {
+ if (exp) {
+ message ("Please note the values you gave for start and end\n"
+ "do NOT match the partition in question.");
+ } else {
+ message ("error: you must set specify the `expert-mode\' argument to gain\n"
+ " access inside the partition (ie. not the exact\n"
+ " same block numbers as the partition's).");
+ return (0);
+ }
+ }
+ return (1);
+}
+
+int
+check_break (void)
+{
+ if (SIGBREAKF_CTRL_C & SetSignal (0, SIGBREAKF_CTRL_C)) {
+ return (1);
+ }
+ return (0);
+}
+
+void
+dev_to_file (char *name, ulong unit, ulong bpb, FILE *file, ulong cb, ulong end)
+{
+ struct device_data *dd = alloc_device (name, unit, 0, sizeof (struct IOStdReq));
+ if (dd) {
+ ulong num_buffers = number_of_buffer_blocks;
+ ulong total_blocks = end - cb + 1;
+ ulong bw = 0;
+ void *buffer = zmalloc (num_buffers*bpb);
+ if (buffer) {
+ while (cb <= end) {
+ if (num_buffers > (end - cb + 1)) {
+ num_buffers = (end - cb + 1);
+ }
+
+ if (check_break ()) {
+ break;
+ }
+ /* Read from device. */
+ if (!opt_quiet) {
+ fprintf (mout, "reading: %08ld -> %08ld [%3ld%%] \r", cb,
+ cb + num_buffers - 1,
+ ((bw+(num_buffers/2))*100/total_blocks));
+ fflush (mout);
+ }
+ if (bpb*num_buffers != device_read (dd, cb*bpb, num_buffers*bpb, buffer)) {
+ fprintf (mout, "\n");
+ warn_message ("couldn't complete operation, read failed.");
+ break;
+ }
+
+ /* Write to file. */
+ bw += num_buffers;
+ if (!opt_quiet) {
+ fprintf (mout, "writing: %08ld -> %08ld [%3ld%%] \r", cb,
+ cb + num_buffers - 1,
+ (bw*100/total_blocks));
+ fflush (mout);
+ }
+ if (num_buffers != fwrite (buffer, bpb, num_buffers, file)) {
+ fprintf (mout, "\n");
+ warn_message ("couldn't complete operation, write failed.");
+ break;
+ }
+ cb += num_buffers;
+ }
+ zfree (buffer);
+ fprintf (mout, "\n");
+ } else {
+ warn_message ("couldn't allocate io for operation.");
+ }
+ free_device (dd);
+ } else {
+ warn_message ("couldn't open device \"%s\" unit: %ld for operation.",
+ name, unit);
+ }
+}
+
+/* all the arguments, except the drive list itself, are search limiters. */
+/* they are generalized with: NULL for strings and (ulong)-1 for ulongs. */
+/* also the function returns as soon as all non-generalized criterion are met.*/
+struct partition *
+find_partition (struct List *dl, char *dev_name, char *part_name,
+ ulong unit, ulong start_block, ulong end_block)
+{
+ struct Node *dn, *un, *pn;
+ /* walk list of devices. */
+ for (dn = dl->lh_Head; dn->ln_Succ; dn = dn->ln_Succ) {
+ struct device *d = ptrfrom (struct device, node, dn);
+
+ if (dev_name == NULL || (!stricmp (dev_name, d->name))) {
+ /* walk list of units. */
+
+ for (un = d->units.lh_Head; un->ln_Succ; un = un->ln_Succ) {
+ struct unit *u = ptrfrom (struct unit, node, un);
+
+ if (unit == (ulong)-1 || (u->unit == unit)) {
+ /* walk list of partitions. */
+ for (pn = u->parts.lh_Head; pn->ln_Succ; pn = pn->ln_Succ) {
+ struct partition *p = ptrfrom (struct partition, node, pn);
+ int do_it = 1;
+
+ if (part_name && stricmp (p->name, part_name)) {
+ do_it = 0;
+ }
+ if (start_block != (ulong)-1 &&
+ (start_block < p->start_block ||
+ start_block > p->end_block)) {
+ do_it = 0;
+ }
+ if (end_block != (ulong)-1 &&
+ (end_block > p->end_block ||
+ end_block < p->start_block)) {
+ do_it = 0;
+ }
+ if (do_it) {
+ return (p);
+ }
+ }
+ }
+ }
+ }
+ }
+ return (NULL);
+}
+
+
diff --git a/sys/arch/amiga/stand/device-streams/devtostream.gz.uu b/sys/arch/amiga/stand/device-streams/devtostream.gz.uu
new file mode 100644
index 00000000000..d47fb701b3c
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/devtostream.gz.uu
@@ -0,0 +1,296 @@
+begin 754 devtostream.gz
+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
+A$U<6UP]P?1O74[B>Q/48K@=QA;4^"B[_;R9`AY9,5@``
+`
+end
diff --git a/sys/arch/amiga/stand/device-streams/getdevices.c b/sys/arch/amiga/stand/device-streams/getdevices.c
new file mode 100644
index 00000000000..0a56d0d078d
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/getdevices.c
@@ -0,0 +1,326 @@
+/* --------------------------------------------------
+ | NAME
+ | getdevices
+ | PURPOSE
+ | build a drive list from RDB from exec.device's
+ | found on the Dos list.
+ | NOTES
+ | This code relies on peoples hard drive controllers
+ | working properly. I used similar code in some
+ | cross dos configuration code and it seemed to
+ | lock some amiga controllers up when it polled
+ | each unit. I don't wish to do all the checks
+ | I did then, so if your controller is one of these
+ | types (you'll find out I guess) sorry.
+ |
+ | known working types:
+ | ----------------------
+ | scsi.device.
+ | gvpscsi.device.
+ |
+ | COPYRIGHT
+ | Copyright (C) 1993 Christian E. Hopps
+ |
+ | 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.
+ |
+ | HISTORY
+ | chopps - Oct 9, 1993: Created.
+ +--------------------------------------------------- */
+
+#include <dos/dos.h>
+#include <dos/dosextens.h>
+#include <dos/filehandler.h>
+#include <devices/hardblocks.h>
+#include <string.h>
+#include "util.h"
+#include "getdevices.h"
+
+struct List *
+get_drive_list (void)
+{
+ struct DosList *dl;
+ struct device *dev;
+
+ struct List *drive_list = zmalloc (sizeof (*drive_list));
+ if (drive_list == NULL) {
+ return (NULL);
+ }
+ NewList (drive_list);
+
+ D (debug_message ("Walking (LDF_READ|LDF_DEVICES) dos list."));
+ /* walk the dos list and fetch our device names. */
+ dl = LockDosList (LDF_DEVICES|LDF_READ); {
+ while (dl = NextDosEntry (dl,LDF_DEVICES)) {
+ char * name;
+
+ name = get_hard_drive_device_name (dl);
+ if (name) { /* if the drive has a device */
+ /* name. */
+ add_name_to_drive_list (drive_list, name);
+ }
+ }
+ } UnLockDosList (LDF_DEVICES);
+ D (debug_message ("done walking (LDF_READ|LDF_DEVICES) dos list."));
+
+ /* now get the units. */
+ dev = ptrfrom (struct device, node, drive_list->lh_Head);
+ while (dev->node.ln_Succ) {
+ ulong i;
+ for (i = 0; i < 7; i++) {
+ struct device_data *dd = alloc_device (dev->name, i, 0, sizeof (struct IOStdReq));
+ if (dd) {
+ /* we have a unit. */
+ do_unit (dev, dd);
+ free_device (dd);
+ }
+ }
+ dev = ptrfrom (struct device, node, dev->node.ln_Succ);
+ }
+ return (drive_list);
+}
+
+void
+free_drive_list (struct List *l)
+{
+ struct device *d = ptrfrom (struct device, node, l->lh_Head);
+ while (d->node.ln_Succ) {
+ struct Node *n;
+ struct device *next = ptrfrom (struct device, node, d->node.ln_Succ);
+ D (verbose_debug_message ("zfree()'ing \"%s\"", d->name));
+ while (n = RemHead (&d->units)) {
+ struct unit *u = ptrfrom (struct unit, node, n);
+ free_unit (u);
+ }
+ zfree (d->name); /* free name. */
+ zfree (d); /* free node. */
+ d = next;
+ }
+}
+
+/* this function returns an error or 0 for success. */
+/* -1 for NO MEM. */
+/* 1 for already on list */
+int
+add_name_to_drive_list (struct List *l, char *dev_name)
+{
+ if (!find_name (l,dev_name)) { /* not on list. */
+ struct device *d;
+
+ verbose_message ("found new device \"%s\"", dev_name);
+ d = zmalloc (sizeof (*d));
+ if (d) {
+ d->node.ln_Name = d->name = copy_string (dev_name);
+ NewList (&d->units);
+ if (d->name) {
+ AddTail (l, &d->node);
+ return (0);
+ }
+ zfree (d);
+ }
+ warn_message ("cannot allocate, unable to process \"%s\"",dev_name);
+ return (-1);
+ } else {
+ return (1);
+ }
+}
+
+
+char *
+get_hard_drive_device_name (struct DosList *dl)
+{
+ struct DeviceNode *dn = (struct DeviceNode *)dl;
+ if (dn->dn_Type == DLT_DEVICE) {
+ struct FileSysStartupMsg *m = BADDR (dn->dn_Startup);
+ D (debug_message ("checking dos device \"%b\" for info.", dl->dol_Name));
+ if (m && valid_mem (m)) {
+ ULONG *envec = BADDR (m->fssm_Environ);
+ char *name = BADDR (m->fssm_Device); /* null term bstring. */
+ name++; /* inc for bstring adj. */
+
+ if (valid_mem (envec) && valid_mem (name)) {
+ if (envec[DE_TABLESIZE] > DE_UPPERCYL) {
+ ulong dev_size = envec[DE_UPPERCYL] - envec[DE_LOWCYL] + 1;
+ dev_size *= envec[DE_NUMHEADS] * envec[DE_BLKSPERTRACK];
+ dev_size *= envec[DE_SIZEBLOCK] << 2;
+ if (dev_size > (1024*1024*2)) {
+ return (name); /* if larger than 2M */
+ }
+ }
+ } else {
+ D (verbose_debug_message ("\"%b\"'s startup message is non-standard.", dl->dol_Name));
+ }
+ } else {
+ D (verbose_debug_message ("\"%b\" has no startup message.", dl->dol_Name));
+ }
+ }
+ return (NULL);
+}
+
+ulong checksum (ulong sl, ulong *buf)
+{
+ ulong ck = 0;
+ while (sl--) {
+ ck += *buf++;
+ }
+ return (ck);
+}
+
+void
+do_unit (struct device *dev, struct device_data *dd)
+{
+ struct unit *u = zmalloc (sizeof (*u));
+ if (u) {
+ int i;
+ u->name = dev->name;
+ NewList (&u->parts);
+ u->unit = dd->unit;
+ u->flags = dd->flags;
+ u->rdb_at = (ulong)-1L;
+ u->rdb = zmalloc (512);
+ if (NULL == u->rdb) {
+ free_unit (u);
+ return;
+ }
+ /* scans the first 200 blocks for the RDB root. */
+ for (i = 0; i<200; i++) {
+ if (512 != device_read (dd, 512*i, 512, u->rdb)) {
+ verbose_message ("warn: unable to read \"%s\" unit: %ld flags 0x%lx",
+ dd->name, dd->unit, dd->flags);
+ free_unit (u);
+ return;
+ }
+ if (u->rdb->rdb_ID == IDNAME_RIGIDDISK) {
+ if (!checksum (u->rdb->rdb_SummedLongs, (ulong *)u->rdb)) {
+ u->rdb_at = i;
+ u->cylinders = u->rdb->rdb_Cylinders;
+ u->heads = u->rdb->rdb_Heads;
+ u->blocks_per_track = u->rdb->rdb_Sectors;
+ u->bytes_per_block = u->rdb->rdb_BlockBytes;
+ u->total_blocks = u->cylinders*u->heads*u->blocks_per_track;
+ verbose_message ("found drive %.8s %.16s %.4s [capacity:%ldM]"
+ "\n at unit %ld on device \"%s\"" ,
+ u->rdb->rdb_DiskVendor,
+ u->rdb->rdb_DiskProduct,
+ u->rdb->rdb_DiskRevision,
+ (u->total_blocks*u->bytes_per_block)/(1024*1024),
+ u->unit, u->name);
+ if (u->rdb->rdb_PartitionList != (ulong)~0) {
+ get_partitions (dd, u);
+ }
+ AddTail (&dev->units, &u->node);
+ break;
+ } else {
+ warn_message ("found RDB at %ld on unit %ld of \"%s\", failed checksum", i, u->unit, u->name);
+ break;
+ }
+ }
+ }
+ if (u->rdb_at == (ulong)-1L) {
+ verbose_message ("\"%s\" at unit: %ld has no RDB.", u->name, u->unit);
+ free_unit (u);
+ return;
+ }
+ }
+}
+
+void
+free_unit (struct unit *u)
+{
+ if (u) {
+ struct Node *n;
+ while (n = RemHead (&u->parts)) {
+ struct partition *p = ptrfrom (struct partition, node, n);
+ free_partition (p);
+ }
+ zfree (u->rdb);
+ zfree (u);
+ }
+}
+
+
+void
+get_partitions (struct device_data *dd, struct unit *u)
+{
+ ulong bpb = u->bytes_per_block;
+ struct PartitionBlock *pb = zmalloc (bpb);
+ if (pb) {
+ ulong partblock = u->rdb->rdb_PartitionList;
+ while (partblock != (ulong)~0) {
+ ulong nextpartblock = (ulong)~0;
+
+ if (bpb != device_read (dd, bpb*partblock, bpb, pb)) {
+ verbose_message ("warn: unable to read block: %ld from \"%s\" unit: %ld flags 0x%lx",
+ partblock, dd->name, dd->unit, dd->flags);
+ break;
+ }
+ if (pb->pb_ID == IDNAME_PARTITION) {
+ if (!checksum (pb->pb_SummedLongs, (ulong *)pb)) {
+ if (pb->pb_Environment[DE_TABLESIZE] > DE_UPPERCYL) {
+ struct partition *p = zmalloc (sizeof (struct partition));
+ if (p) {
+ ulong *e;
+ CopyMem (pb, &p->pb, sizeof (struct PartitionBlock));
+ e = p->pb.pb_Environment;
+ p->name = p->pb.pb_DriveName;
+ p->name[p->name[0]+1] = 0;
+ p->name++; /* adjust for size */
+ /* byte. */
+ p->node.ln_Name = p->name;
+ p->unit = u;
+ p->start_block = e[DE_LOWCYL]*e[DE_NUMHEADS]*e[DE_BLKSPERTRACK];
+ p->end_block = (e[DE_UPPERCYL]+1)*e[DE_NUMHEADS]*e[DE_BLKSPERTRACK] - 1;
+ p->total_blocks = p->end_block - p->start_block + 1;
+ p->block_size = e[DE_SIZEBLOCK] << 2;
+
+ /* the size stuff is convoluted to avoid overflow. */
+ verbose_message ("| partition: \"%s\" sb: %ld eb: %ld totb: %ld",
+ p->name, p->start_block,
+ p->end_block, p->total_blocks);
+ verbose_message ("| Block Size: %ld Capacity: %ld.%ldM",
+ p->block_size,
+ (p->block_size*p->total_blocks)/(1024*1024),
+ (10*((p->block_size*p->total_blocks)/(1024) % 1024))/1024);
+
+ nextpartblock = pb->pb_Next;
+ p->unit = u;
+ AddTail (&u->parts, &p->node);
+ } else {
+ warn_message ("failed to allocate memory for partition");
+ }
+ } else {
+ warn_message ("found PART at %ld on unit %ld of\"%s\",\n tablesize to small",
+ partblock, u->unit, u->name);
+ break;
+ }
+
+ } else {
+ warn_message ("found PART at %ld on unit %ld of \"%s\", failed checksum",
+ partblock, u->unit, u->name);
+ break;
+ }
+ }
+ partblock = nextpartblock;
+ }
+ zfree (pb);
+ }
+}
+
+void
+free_partition (struct partition *p)
+{
+ zfree (p);
+}
+
+
diff --git a/sys/arch/amiga/stand/device-streams/getdevices.h b/sys/arch/amiga/stand/device-streams/getdevices.h
new file mode 100644
index 00000000000..237d86aef08
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/getdevices.h
@@ -0,0 +1,80 @@
+/* --------------------------------------------------
+ | NAME
+ | getdevices
+ | PURPOSE
+ | header for getdevices.c
+ | NOTES
+ |
+ | COPYRIGHT
+ | Copyright (C) 1993 Christian E. Hopps
+ |
+ | 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.
+ |
+ | HISTORY
+ | chopps - Oct 9, 1993: Created.
+ +--------------------------------------------------- */
+
+#if ! defined (_GETDEVICES_H)
+#define _GETDEVICES_H
+
+#include "util.h"
+#include "devices.h"
+#include <devices/hardblocks.h>
+
+struct device {
+ struct Node node;
+ struct List units;
+ char *name; /* name of exec device. */
+
+};
+
+/* structure that holds all info on this paticular unit for an exec device. */
+struct unit {
+ struct Node node;
+ struct List parts;
+ struct RigidDiskBlock *rdb;
+ char *name; /* just a pointer to the */
+ /* lists data. */
+ ulong rdb_at; /* what block the rdb is at. */
+ ulong unit; /* unit number of drive. */
+ ulong flags; /* unit number of drive. */
+ ulong total_blocks; /* total blocks on drive. */
+ ulong cylinders; /* number of cylinders. */
+ ulong heads; /* number of heads. */
+ ulong blocks_per_track; /* number of blocks per head */
+ /* per cylinder. */
+ ulong bytes_per_block; /* number of bytes per block. */
+};
+
+struct partition {
+ struct Node node;
+ struct unit *unit; /* back pointer. */
+ struct PartitionBlock pb; /* partition block. */
+ char *name; /* name of the partition. */
+ ulong start_block; /* block that partition */
+ /* starts on. */
+ ulong end_block; /* block that partition ends */
+ /* on. */
+ ulong total_blocks; /* total number of blocks for */
+ /* this partition (e-s+1) */
+ ulong block_size; /* size of blocks for this partition. */
+};
+
+struct List * get_drive_list (void);
+void free_drive_list (struct List *l);
+int add_name_to_drive_list (struct List *l, char *dev_name);
+char * get_hard_drive_device_name (struct DosList *dl);
+
+#endif /* _GETDEVICES_H */
diff --git a/sys/arch/amiga/stand/device-streams/getopt.lib.gz.uu b/sys/arch/amiga/stand/device-streams/getopt.lib.gz.uu
new file mode 100644
index 00000000000..cc00be8fa75
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/getopt.lib.gz.uu
@@ -0,0 +1,47 @@
+begin 754 getopt.lib.gz
+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
+9G&KMLME*N?3]UKK1^^V7_P+#6FL6)`X``'<7
+`
+end
diff --git a/sys/arch/amiga/stand/device-streams/protos.h b/sys/arch/amiga/stand/device-streams/protos.h
new file mode 100644
index 00000000000..cdbd5cd7cee
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/protos.h
@@ -0,0 +1,47 @@
+/* START: "getdevices.c" */
+struct List * get_drive_list (void);
+void free_drive_list (struct List *l);
+int add_name_to_drive_list (struct List *l, char *dev_name);
+char * get_hard_drive_device_name (struct DosList *dl);
+ulong checksum (ulong sl, ulong *buf);
+void do_unit (struct device *dev, struct device_data *dd);
+void free_unit (struct unit *u);
+void get_partitions (struct device_data *dd, struct unit *u);
+void free_partition (struct partition *p);
+/* END: "getdevices.c" */
+/* START: "devices.c" */
+struct device_data * alloc_device (char *name, ulong unit, ulong flags, ulong iosize);
+void free_device (struct device_data *dd);
+int open_device (struct device_data *dd);
+void close_device (struct device_data *dd);
+ulong device_read (struct device_data *dd, ulong offset, ulong bytes, void *buffer);
+ulong device_write (struct device_data *dd, ulong offset, ulong bytes, void *buffer);
+int device_do_command (struct device_data *dd, UWORD command);
+/* END: "devices.c" */
+/* START: "util.c" */
+int string_to_number (char *s, unsigned long *num);
+char * stripws (char *s);
+char *fgetline (FILE *fp);
+int flush_to_eol (FILE *fp);
+char *concat_strings (const char *before, const char *after);
+void free_string (char *string);
+char * alloc_string (char *s);
+int ask_bool (int def, int other, char *f, ...);
+void * zmalloc (size_t b);
+void zfree (void *mem);
+struct Node * find_name (struct List *l, char *s);
+void verbose_message (char *f, ...);
+void debug_message (char *f, ...);
+void verbose_debug_message (char *f, ...);
+void message (char *f, ...);
+void warn_message (char *f, ...);
+void vmessage (char *f, va_list ap);
+/* END: "util.c" */
+/* START: "system" */
+#include <clib/alib_protos.h>
+#include <clib/exec_protos.h>
+#include <clib/dos_protos.h>
+#include <pragmas/exec_pragmas.h>
+#include <pragmas/dos_pragmas.h>
+extern struct Library *DOSBase;
+/* END: "system" */
diff --git a/sys/arch/amiga/stand/device-streams/protos_template.h b/sys/arch/amiga/stand/device-streams/protos_template.h
new file mode 100644
index 00000000000..bb64ad9493a
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/protos_template.h
@@ -0,0 +1,8 @@
+/* START: "system" */
+#include <clib/alib_protos.h>
+#include <clib/exec_protos.h>
+#include <clib/dos_protos.h>
+#include <pragmas/exec_pragmas.h>
+#include <pragmas/dos_pragmas.h>
+extern struct Library *DOSBase;
+/* END: "system" */
diff --git a/sys/arch/amiga/stand/device-streams/rdbinfo.c b/sys/arch/amiga/stand/device-streams/rdbinfo.c
new file mode 100644
index 00000000000..5ec8942e0df
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/rdbinfo.c
@@ -0,0 +1,268 @@
+/* --------------------------------------------------
+ | NAME
+ | rdbinfo
+ | PURPOSE
+ | get info on all or some RDB devices.
+ |
+ | NOTES
+ | only works for RDB partitions.
+ |
+ | COPYRIGHT
+ | Copyright (C) 1993 Christian E. Hopps
+ |
+ | 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.
+ |
+ | HISTORY
+ | chopps - Oct 9, 1993: Created.
+ +--------------------------------------------------- */
+
+#include <dos/dos.h>
+#include <dos/dosextens.h>
+#include <dos/rdargs.h>
+#include <cstartup.h>
+#include <string.h>
+#include <ctype.h>
+#include <signal.h>
+#define __GNU_LIBRARY__ 1
+#include <getopt.h>
+#undef __GNU_LIBRARY__
+#include "getdevices.h"
+
+#if defined (SASC)
+/* we will handle this ourselves. */
+int __regargs chkabort (void)
+{
+ return 0;
+}
+int __regargs Chk_Abort (void)
+{
+ return 0;
+}
+#endif
+
+void get_info (struct List *dl, char *dev_name, char *part_name,ulong unit,
+ ulong start_block, ulong end_block);
+
+struct option long_options[] = {
+ { "rdb-name", required_argument, NULL, 'n'},
+ { "start-block", required_argument, NULL, 's'},
+ { "end-block", required_argument, NULL, 'e'},
+ { "device", required_argument, NULL, 'd'},
+ { "unit", required_argument, NULL, 'u'},
+ { "verbose", no_argument, NULL, 'V'},
+ { "expert-mode", no_argument, NULL, 'x'},
+ { "debug-mode", no_argument, NULL, 'g'},
+ { "help", no_argument, NULL, 'h'},
+ { "version", no_argument, NULL, 'v' },
+ { NULL, 0, NULL, 0 }
+};
+char *short_options = "?vVxghn:s:e:d:u:";
+
+char *cmd_vers_string = "\0$VERS rdbinfo 1.0 (93.10.10)";
+char *version_string = "rdbinfo V1.0 -- Copyright 1993 Christian E. Hopps\n";
+
+char *help_string = "Usage: %s [options]\n"
+"Options:\n"
+" -[vVxghnsedu] [--rdb-name=partition_name] [--expert-mode]\n"
+" [--start-block=block] [--end-block=block] [--debug-mode]\n"
+" [--device=device_name] [--unit=unit_num] [--version]\n"
+" [--verbose] [--help]"
+"\n"
+"Number Formats: (where `n\' are alpha-num. digits)\n"
+" 0[xX]nnn | [xX]nnn | nnn[hH] | $nnn - for Hex\n"
+" nnn[oO] - for octal\n"
+" nnn[bB] - for binary\n"
+" nnn - for decimal (also default for non-recognized)\n"
+"\n"
+" given the above you can also postpend a [MKk] for Megabyte\n"
+" Kilobyte and kilobyte respectively. [range checking inuse]";
+
+char *opt_rdb_name;
+char *opt_device_name;
+ulong opt_unit = -1; /* -1 for any */
+ulong opt_start_block = -1; /* -1 for any */
+ulong opt_end_block = -1; /* -1 for any */
+ulong opt_verbose;
+ulong opt_expert;
+ulong opt_debug;
+
+FILE *mout;
+FILE *min;
+
+int
+main (int argc, char **argv)
+{
+ int ret = 0;
+ int opt;
+ int opt_quit = 0;
+ int opt_version = 0;
+ int opt_help = 0;
+ int longind = 0;
+
+ signal (SIGINT, SIG_IGN);
+
+ mout = stdout;
+ min = stdin;
+
+ if (argc) {
+ struct List *dl;
+ while (EOF != (opt = getopt_long (argc, argv, short_options,
+ long_options, &longind))) {
+ switch (opt) {
+ case 'v':
+ opt_version = 1;
+ opt_quit = 1;
+ break;
+ case 'V':
+ opt_verbose = 1;
+ break;
+ case 'x':
+ opt_expert = 1;
+ break;
+ case '?':
+ case 'h':
+ opt_help = 1;
+ opt_quit = 1;
+ break;
+ case 'n':
+ opt_rdb_name = optarg;
+ break;
+ case 'd':
+ opt_device_name = optarg;
+ break;
+ case 's':
+ if (!(string_to_number (optarg, &opt_start_block))) {
+ opt_quit = 1;
+ opt_help = 1;
+ ret = 20;
+ }
+ break;
+ case 'e':
+ if (!(string_to_number (optarg, &opt_end_block))) {
+ opt_quit = 1;
+ opt_help = 1;
+ ret = 20;
+ }
+ break;
+ case 'u':
+ if (!(string_to_number (optarg, &opt_unit))) {
+ opt_quit = 1;
+ opt_help = 1;
+ ret = 20;
+ }
+ break;
+ case 'g':
+ opt_debug = 1;
+ }
+ }
+ if (opt_version) {
+ message (version_string, argv[0]);
+ }
+ if (opt_help) {
+ message (help_string, argv[0], short_options,
+ 2 + strlen (argv[0]), "",
+ 2 + strlen (argv[0]), "",
+ 2 + strlen (argv[0]), "");
+ }
+ if (opt_quit) {
+ return (ret);
+ }
+ dl = get_drive_list ();
+ if (dl) {
+ get_info (dl, opt_device_name, opt_rdb_name,
+ opt_unit, opt_start_block,
+ opt_end_block);
+ free_drive_list (dl);
+ }
+ }
+ return (ret);
+}
+
+int
+check_break (void)
+{
+ if (SIGBREAKF_CTRL_C & SetSignal (0, SIGBREAKF_CTRL_C)) {
+ return (1);
+ }
+ return (0);
+}
+
+void
+get_info (struct List *dl, char *dev_name, char *part_name,
+ ulong unit, ulong start_block, ulong end_block)
+{
+ struct Node *dn, *un, *pn;
+ int ctrlc = 0;
+
+ /* walk list of devices. */
+
+ for (dn = dl->lh_Head; (!ctrlc) && dn->ln_Succ; ctrlc = check_break(), dn = dn->ln_Succ) {
+ struct device *d = ptrfrom (struct device, node, dn);
+
+ if (dev_name == NULL || (!stricmp (dev_name, d->name))) {
+ /* walk list of units. */
+ for (un = d->units.lh_Head; (!ctrlc) && un->ln_Succ; ctrlc = check_break(), un = un->ln_Succ) {
+ struct unit *u = ptrfrom (struct unit, node, un);
+ int unit_printed = 0;
+
+ if (unit == (ulong)-1 || (u->unit == unit)) {
+
+ /* walk list of partitions. */
+ for (pn = u->parts.lh_Head; (!ctrlc) && pn->ln_Succ; ctrlc = check_break(), pn = pn->ln_Succ) {
+ struct partition *p = ptrfrom (struct partition, node, pn);
+ int do_it = 1;
+
+ if (part_name && stricmp (p->name, part_name)) {
+ do_it = 0;
+ }
+ if (start_block != (ulong)-1 && start_block != p->start_block) {
+ do_it = 0;
+ }
+ if (end_block != (ulong)-1 && end_block != p->end_block) {
+ do_it = 0;
+ }
+ if (do_it) {
+ if (unit_printed == 0) {
+ message ("Device: \"%s\" Unit: %ld Capacity: %ld.%ld Megs",
+ u->name, u->unit,
+ megs (u->total_blocks*u->bytes_per_block),
+ tenths_of_a_meg (u->total_blocks*u->bytes_per_block));
+ message ("DiskVendor: %.8s DiskProduct %.16s DiskRevision: %.4s",
+ u->rdb->rdb_DiskVendor, u->rdb->rdb_DiskProduct,
+ u->rdb->rdb_DiskRevision);
+ message ("Cylinders: %ld Heads: %ld Blks-p-Trk: %ld [Blks-p-Cyl: %ld]",
+ u->cylinders, u->heads, u->blocks_per_track,
+ u->heads * u->blocks_per_track);
+ message ("Total Blocks: %ld Block Size %ld",
+ u->total_blocks, u->bytes_per_block);
+ unit_printed = 1;
+ }
+ message ("\n--| Partition: \"%s\" Capacity: %ld.%ld Megs",
+ p->name, megs (p->total_blocks*p->block_size),
+ tenths_of_a_meg (p->total_blocks*p->block_size));
+ message ("--| Start Block: %ld End Block: %ld Total Blocks: %ld",
+ p->start_block, p->end_block, p->total_blocks);
+ message ("--| Block Size: %ld", p->block_size);
+ }
+ }
+ if (unit_printed) {
+ message ("###");
+ }
+ }
+ }
+ }
+ }
+}
+
diff --git a/sys/arch/amiga/stand/device-streams/rdbinfo.gz.uu b/sys/arch/amiga/stand/device-streams/rdbinfo.gz.uu
new file mode 100644
index 00000000000..1e9bf39133c
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/rdbinfo.gz.uu
@@ -0,0 +1,261 @@
+begin 754 rdbinfo.gz
+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
+'ZO0BM$L``#\^
+`
+end
diff --git a/sys/arch/amiga/stand/device-streams/smkfile b/sys/arch/amiga/stand/device-streams/smkfile
new file mode 100644
index 00000000000..308d1819c52
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/smkfile
@@ -0,0 +1,60 @@
+# Makefile for stream-device utilities.
+#
+# Copyright (C) 1993 Christian E. Hopps
+#
+# 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.
+
+protos=protos.h
+stdsrcs= getdevices.c devices.c util.c
+stdobjs= getdevices.o devices.o util.o
+srcs=streamtodev.c rdbinfo.c devtostream.c $(stdsrcs)
+objs=streamtodev.o rdbinfo.o devtostream.o $(stdobjs)
+
+copts= nostkchk # DEFINE DEBUG_ENABLED_VERSION=1 debug=s
+
+all: $(protos) devtostream rdbinfo streamtodev xdevtostream xstreamtodev
+
+streamtodev: streamtodev.o $(stdobjs)
+ slink SC SD ND to $@ from lib:c.o streamtodev.o $(stdobjs) lib getopt.lib unixemul.lib lib:sc.lib lib:amiga.lib
+
+devtostream: devtostream.o $(stdobjs)
+ slink SC SD ND to $@ from lib:c.o devtostream.o $(stdobjs) lib getopt.lib unixemul.lib lib:sc.lib lib:amiga.lib
+
+rdbinfo: rdbinfo.o $(stdobjs)
+ slink SC SD ND to $@ from lib:c.o rdbinfo.o $(stdobjs) lib getopt.lib unixemul.lib lib:sc.lib lib:amiga.lib
+
+xstreamtodev: xstreamtodev.o $(stdobjs)
+ slink SC SD ND to $@ from lib:c.o xstreamtodev.o $(stdobjs) lib getopt.lib unixemul.lib lib:sc.lib lib:amiga.lib
+
+xdevtostream: xdevtostream.o $(stdobjs)
+ slink SC SD ND to $@ from lib:c.o xdevtostream.o $(stdobjs) lib getopt.lib unixemul.lib lib:sc.lib lib:amiga.lib
+
+
+.c.o:
+ sc $(copts) gst=custom:system.gst $<
+
+$(protos): $(stdsrcs)
+ protoman db=$(protos) $?
+
+clean:
+ -delete \#?.o
+ -delete devtostream rdbinfo streamtodev
+ copy clone protos_template.h protos.h
+
+xstreamtodev.o: streamtodev.c
+ sc $(copts) DEFINE EXPERT_VERSION=1 gst=custom:system.gst objname=$@ $<
+
+xdevtostream.o: devtostream.c
+ sc $(copts) DEFINE EXPERT_VERSION=1 gst=custom:system.gst objname=$@ $<
diff --git a/sys/arch/amiga/stand/device-streams/streamtodev.c b/sys/arch/amiga/stand/device-streams/streamtodev.c
new file mode 100644
index 00000000000..821086f35a5
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/streamtodev.c
@@ -0,0 +1,456 @@
+/* --------------------------------------------------
+ | NAME
+ | streamtodev
+ | PURPOSE
+ | dump all data from stream to a device.
+ |
+ | NOTES
+ | only works for RDB partitions.
+ |
+ | COPYRIGHT
+ | Copyright (C) 1993 Christian E. Hopps
+ |
+ | 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.
+ |
+ | HISTORY
+ | chopps - Oct 9, 1993: Created.
+ +--------------------------------------------------- */
+
+#include <dos/dos.h>
+#include <dos/dosextens.h>
+#include <dos/rdargs.h>
+#include <cstartup.h>
+#include <string.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <signal.h>
+#define __GNU_LIBRARY__ 1
+#include <getopt.h>
+#undef __GNU_LIBRARY__
+#include "getdevices.h"
+
+#if defined (SASC)
+/* we will handle this ourselves. */
+int __regargs chkabort (void)
+{
+ return 0;
+}
+int __regargs Chk_Abort (void)
+{
+ return 0;
+}
+#endif
+
+struct partition *find_partition (struct List *dl, char *dev_name, char *part_name,
+ ulong unit, ulong start_block, ulong end_block);
+void file_to_dev (char *name, ulong unit, ulong bpb, FILE *file, ulong cb, ulong end);
+int check_values (struct partition *p, ulong st, ulong end, int exp);
+
+struct option long_options[] = {
+ { "input", required_argument, NULL, 'f' },
+ { "rdb-name", required_argument, NULL, 'n'},
+#if defined (EXPERT_VERSION)
+ { "start-block", required_argument, NULL, 's'},
+ { "end-block", required_argument, NULL, 'e'},
+ { "expert-mode", no_argument, NULL, 'x'},
+#endif
+ { "device", required_argument, NULL, 'd'},
+ { "unit", required_argument, NULL, 'u'},
+ { "buffer-blocks", required_argument, NULL, 'b'},
+ { "verbose", no_argument, NULL, 'V'},
+ { "debug-mode", no_argument, NULL, 'g'},
+ { "help", no_argument, NULL, 'h'},
+ { "version", no_argument, NULL, 'v' },
+ { "quiet", no_argument, NULL, 'q' },
+ { NULL, 0, NULL, 0 }
+};
+char *short_options = "?qvVghn:d:u:b:f:"
+#if defined (EXPERT_VERSION)
+"xs:e:"
+#endif
+;
+
+char *cmd_vers_string = "\0$VERS devtostream 1.0 (93.10.10)";
+char *version_string = "devtostream V1.0 -- Copyright 1993 Christian E. Hopps\n";
+
+char *help_string = "Usage: %s [options]\n"
+"Options:\n"
+" -[vVxghnsedubo] [--input=file] [--rdb-name=partition_name]\n"
+#if defined (EXPERT_VERSION)
+" [--start-block=block] [--end-block=block] [--expert-mode]\n"
+#endif
+" [--device=device_name] [--unit=unit_num] [--version]\n"
+" [--buffer-blocks=blocks] [--verbose] [--quiet] [--help]\n"
+"\n"
+"Number Formats: (where `n\' are alpha-num. digits)\n"
+" 0[xX]nnn | [xX]nnn | nnn[hH] | $nnn - for Hex\n"
+" nnn[oO] - for octal\n"
+" nnn[bB] - for binary\n"
+" nnn - for decimal (also default for non-recognized)\n"
+"\n"
+" given the above you can also postpend a [MKk] for Megabyte\n"
+" Kilobyte and kilobyte respectively. [range checking inuse]";
+
+
+char *opt_infile_name;
+char *opt_rdb_name;
+char *opt_device_name;
+ulong opt_unit = -1; /* -1 for invalid */
+ulong opt_start_block = -1; /* -1 for invalid. */
+ulong opt_end_block = -1; /* -1 for invalid */
+ulong opt_verbose;
+ulong opt_expert;
+ulong opt_debug;
+ulong opt_quiet = 0;
+ulong number_of_buffer_blocks = 100;
+
+FILE *mout;
+FILE *min;
+
+int
+main (int argc, char **argv)
+{
+ int ret = 0;
+ int opt;
+ int opt_quit = 0;
+ int opt_version = 0;
+ int opt_help = 0;
+ int longind = 0;
+ struct List *dl;
+ FILE *file = NULL;
+
+ mout = stdout;
+ min = stdin;
+
+ signal (SIGINT, SIG_IGN);
+
+ if (argc) {
+ while (EOF != (opt = getopt_long (argc, argv, short_options,
+ long_options, &longind))) {
+ switch (opt) {
+ case 'q':
+ opt_quiet = 1;
+ break;
+ case 'v':
+ opt_version = 1;
+ opt_quit = 1;
+ break;
+ case 'V':
+ opt_verbose = 1;
+ break;
+ case '?':
+ case 'h':
+ opt_help = 1;
+ opt_quit = 1;
+ break;
+ case 'n':
+ opt_rdb_name = optarg;
+ break;
+ case 'd':
+ opt_device_name = optarg;
+ break;
+ case 'f':
+ opt_infile_name = optarg;
+ break;
+ case 'b':
+ if (!(string_to_number (optarg, &number_of_buffer_blocks))) {
+ opt_quit = 1;
+ opt_help = 1;
+ ret = 20;
+ }
+ break;
+#if defined (EXPERT_VERSION)
+ case 'x':
+ opt_expert = 1;
+ break;
+ case 's':
+ if (!(string_to_number (optarg, &opt_start_block))) {
+ opt_quit = 1;
+ opt_help = 1;
+ ret = 20;
+ }
+ break;
+ case 'e':
+ if (!(string_to_number (optarg, &opt_end_block))) {
+ opt_quit = 1;
+ opt_help = 1;
+ ret = 20;
+ }
+ break;
+#endif /* EXPERT_VERSION */
+ case 'u':
+ if (!(string_to_number (optarg, &opt_unit))) {
+ opt_quit = 1;
+ opt_help = 1;
+ ret = 20;
+ }
+ break;
+ case 'g':
+ opt_debug = 1;
+ }
+ }
+ if (opt_quiet && opt_expert) {
+ message ("--quiet-mode (-q) and --expert-mode (-x) not allowed at same time.\n");
+ opt_quit = 1;
+ ret = 20;
+ }
+ if (opt_version) {
+ message (version_string, argv[0]);
+ }
+ if (opt_help) {
+ message (help_string, argv[0]);
+ }
+ if (opt_quit) {
+ return (ret);
+ }
+ if (!opt_infile_name) {
+ min = fopen ("*", "w+");
+ if (!min) {
+ return (20);
+ }
+ file = stdin;
+ }
+ /* there should be NO messages before this point!! */
+ dl = get_drive_list ();
+ if (dl) {
+ struct partition *p = find_partition (dl, opt_device_name, opt_rdb_name,
+ opt_unit, opt_start_block,
+ opt_end_block);
+ if (p) {
+ if (opt_infile_name) {
+ file = fopen (opt_infile_name, "r");
+ }
+ if (file) {
+ if (!isatty (fileno(file))) {
+ int def = 'N';
+ ulong st, end;
+ if (!opt_quiet) {
+ message ("found partition: \"%s\" capacity: %ld.%ld Megs",
+ p->name, megs (p->total_blocks*p->block_size),
+ tenths_of_a_meg (p->total_blocks*p->block_size));
+ message ("start block: %ld end block: %ld total blocks: %ld",
+ p->start_block, p->end_block, p->total_blocks);
+ message ("block Size: %ld", p->block_size);
+ }
+ st = opt_start_block;
+ end = opt_end_block;
+ if (st == (ulong)-1) {
+ st = p->start_block;
+ }
+ if (end == (ulong)-1) {
+ end = p->end_block;
+ }
+ if (check_values (p, st, end, opt_expert)) {
+ int do_it = 0; /* default don't do it. */
+ if (!opt_quiet) {
+ message ("dumping to: start block: %ld to end block: %ld [size: %ldK]\n",
+ st, end, ((end-st)*p->unit->bytes_per_block)/1024);
+ def = ask_bool (def, 'y', "write from file \"%s\" to partition \"%s\"",
+ opt_infile_name ? opt_infile_name
+ : "stdin", p->name);
+ if (tolower (def) == 'y') {
+ do_it = 1;
+ }
+ } else {
+ /* in quiet mode we always work. */
+ do_it = 1;
+ }
+ if (do_it) {
+ file_to_dev (p->unit->name, p->unit->unit,
+ p->unit->bytes_per_block, file,
+ st, end);
+ } else {
+ message ("ok, quiting...");
+ }
+ }
+ } else {
+ warn_message ("Pipes and re-direction will work but interactive\n"
+ "input/output is prohibited.");
+ }
+ if (opt_infile_name) {
+ fclose (file);
+ }
+ }
+ } else {
+ warn_message ("could not locate a partition with your specs.");
+ }
+ free_drive_list (dl);
+ }
+ if (!opt_infile_name) {
+ fclose (min);
+ }
+ }
+ return (0);
+}
+
+int
+check_values (struct partition *p, ulong st, ulong end, int exp)
+{
+ if (st > end) {
+ message ("error: Your end block [%ld] is less than your start block [%ld]!\n",
+ st,end);
+ return (0);
+ }
+ if (st < p->start_block || st > p->end_block ||
+ end > p->end_block || end < p->start_block) {
+ warn_message ("ERROR: start and end blocks cannot cross partition boundries.");
+ return (0);
+ }
+ if (st != p->start_block || end != p->end_block) {
+ if (exp) {
+ message ("Please note the values you gave for start and end\n"
+ "do NOT match the partition in question.");
+ } else {
+ message ("error: you must set specify the `expert-mode\' argument to gain\n"
+ " access inside the partition (ie. not the exact\n"
+ " same block numbers as the partition's).");
+ return (0);
+ }
+ }
+ return (1);
+}
+
+int
+check_break (void)
+{
+ if (SIGBREAKF_CTRL_C & SetSignal (0, SIGBREAKF_CTRL_C)) {
+ return (1);
+ }
+ return (0);
+}
+
+void
+file_to_dev (char *name, ulong unit, ulong bpb, FILE *file, ulong cb, ulong end)
+{
+ struct device_data *dd = alloc_device (name, unit, 0, sizeof (struct IOStdReq));
+ if (dd) {
+ ulong num_buffers = number_of_buffer_blocks;
+ ulong total_blocks = end - cb + 1;
+ ulong bw = 0, btw = 0, bytetw = 0;
+ int last_write = 0;
+ void *buffer = zmalloc (num_buffers*bpb);
+ if (buffer) {
+ while (cb <= end && !last_write) {
+ /* read from file. */
+ if (!opt_quiet) {
+ fprintf (mout, "reading: %08ld -> %08ld [%3ld%%] \r", cb,
+ cb + num_buffers - 1,
+ ((bw+(num_buffers/2))*100/total_blocks));
+ fflush (mout);
+ }
+ bytetw = fread (buffer, 1, bpb*num_buffers, file);
+ if ((bytetw != (num_buffers*bpb)) && ferror (file)) {
+ fprintf (mout, "\n");
+ warn_message ("couldn't complete operation, read failed.");
+ break;
+ } else if (bytetw == 0) {
+ break;
+ }
+
+ /* write to device. */
+ if (bytetw != (num_buffers*bpb)) {
+ btw = bytetw/bpb + (bytetw % bpb ? 1 : 0);
+ if (bytetw % bpb) {
+ warn_message ("warning non blocked input received, early termination.");
+ last_write = 1;
+ }
+ } else {
+ btw = num_buffers;
+ }
+
+ if (check_break ()) {
+ last_write = 1;
+ }
+
+ if ((cb + btw - 1) > end) {
+ message ("error: stream tried to overwrite device boundries, trimming.");
+ btw = end - cb + 1;
+ last_write = 1;
+ }
+ if (!opt_quiet) {
+ fprintf (mout, "writing: %08ld -> %08ld [%3ld%%] \r", cb,
+ cb + num_buffers - 1,
+ ((btw+bw)*100/total_blocks));
+ fflush (mout);
+ }
+ if (bpb*btw != device_write (dd, cb*bpb, btw*bpb, buffer)) {
+ fprintf (mout, "\n");
+ warn_message ("couldn't complete operation, write failed.");
+ break;
+ }
+ bw += btw;
+ cb += btw;
+ }
+ zfree (buffer);
+ fprintf (mout, "\n");
+ } else {
+ warn_message ("couldn't allocate io for operation.");
+ }
+ free_device (dd);
+ } else {
+ warn_message ("couldn't open device \"%s\" unit: %ld for operation.",
+ name, unit);
+ }
+}
+
+/* all the arguments, except the drive list itself, are search limiters. */
+/* they are generalized with: NULL for strings and (ulong)-1 for ulongs. */
+/* also the function returns as soon as all non-generalized criterion are met.*/
+struct partition *
+find_partition (struct List *dl, char *dev_name, char *part_name,
+ ulong unit, ulong start_block, ulong end_block)
+{
+ struct Node *dn, *un, *pn;
+ /* walk list of devices. */
+ for (dn = dl->lh_Head; dn->ln_Succ; dn = dn->ln_Succ) {
+ struct device *d = ptrfrom (struct device, node, dn);
+
+ if (dev_name == NULL || (!stricmp (dev_name, d->name))) {
+ /* walk list of units. */
+
+ for (un = d->units.lh_Head; un->ln_Succ; un = un->ln_Succ) {
+ struct unit *u = ptrfrom (struct unit, node, un);
+
+ if (unit == (ulong)-1 || (u->unit == unit)) {
+ /* walk list of partitions. */
+ for (pn = u->parts.lh_Head; pn->ln_Succ; pn = pn->ln_Succ) {
+ struct partition *p = ptrfrom (struct partition, node, pn);
+ int do_it = 1;
+
+ if (part_name && stricmp (p->name, part_name)) {
+ do_it = 0;
+ }
+ if (start_block != (ulong)-1 &&
+ (start_block < p->start_block ||
+ start_block > p->end_block)) {
+ do_it = 0;
+ }
+ if (end_block != (ulong)-1 &&
+ (end_block > p->end_block ||
+ end_block < p->start_block)) {
+ do_it = 0;
+ }
+ if (do_it) {
+ return (p);
+ }
+ }
+ }
+ }
+ }
+ }
+ return (NULL);
+}
+
+
diff --git a/sys/arch/amiga/stand/device-streams/streamtodev.gz.uu b/sys/arch/amiga/stand/device-streams/streamtodev.gz.uu
new file mode 100644
index 00000000000..6b2fb88a5ed
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/streamtodev.gz.uu
@@ -0,0 +1,305 @@
+begin 754 streamtodev.gz
+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
+,X,K_!F3+/G4460``
+`
+end
diff --git a/sys/arch/amiga/stand/device-streams/unixemul.lib.gz.uu b/sys/arch/amiga/stand/device-streams/unixemul.lib.gz.uu
new file mode 100644
index 00000000000..83f3f7a0e45
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/unixemul.lib.gz.uu
@@ -0,0 +1,50 @@
+begin 754 unixemul.lib.gz
+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
+IMUYD6^8^:_T_9J4ZY%0*>5YTO*F6RY9-[C'K;2;_6?L/(.>0)=`.``"4
+`
+end
diff --git a/sys/arch/amiga/stand/device-streams/util.c b/sys/arch/amiga/stand/device-streams/util.c
new file mode 100644
index 00000000000..d3bfeb0a683
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/util.c
@@ -0,0 +1,342 @@
+/* --------------------------------------------------
+ | NAME
+ | util
+ | PURPOSE
+ | provide some standard useful utility functions.
+ | NOTES
+ |
+ | COPYRIGHT
+ | Copyright (C) 1993 Christian E. Hopps
+ |
+ | 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.
+ |
+ | HISTORY
+ | chopps - Oct 9, 1993: Created.
+ +--------------------------------------------------- */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <error.h>
+#include <ctype.h>
+#include <stdarg.h>
+#include "util.h"
+#include "string.h"
+
+/* Utility functions */
+
+/* string functions.
+ */
+int
+string_to_number(char *s, unsigned long *num)
+{
+ char *ns;
+ int base, errsave = errno;
+ unsigned long res;
+ int len;
+ s = stpblk(s);
+ ns = s;
+ len = strlen (s);
+ if((!strnicmp(s,"0x",2))) { /* check 0[xX]nnnnnnnn */
+ /* Hex number */
+ s += 2;
+ ns += 2;
+ base = 16;
+ } else if((!strnicmp(s,"x",1)) || /* check [xX]nnnnnnnn */
+ (s[0] == '$')) { /* check $nnnnnnnn */
+ /* Hex number */
+ s++;
+ ns++;
+ base = 16;
+ } else if((len && tolower (s[len-1]) == 'h') || /* check nnnnnnnn[Hh] */
+ (len>1 && tolower (s[len-2]) == 'h')) {
+
+ /* Hex number */
+ base = 16;
+ } else if((len && tolower (s[len-1]) == 'o') || /* check nnnnnnnnnn[Oo] */
+ (len>1 && tolower (s[len-2]) == 'o')) {
+ /* octal */
+ base = 8;
+ } else if( (len && tolower (s[len-1]) == 'b') || /* check nnnnnnnnnn[Bb] */
+ (len>1 && tolower (s[len-2]) == 'b')) {
+ /* binary */
+ base = 2;
+ } else {
+ /* assume decimal */
+ base = 10;
+ }
+ errno = 0;
+ len = strlen (s);
+ res = strtoul(s,&ns,base);
+ if(ns == s || (res == 0xffffffff && errno == ERANGE)) {
+ errno = errsave;
+ return(0); /* failed */
+ } else {
+ errno = errsave;
+ if ((len && s[len-1] == 'M') ||
+ (len>1 && s[len-2] == 'M')) {
+ /* result should be in Megabytes */
+ if (res <= 0xfff) {
+ res <<= 20;
+ } else {
+ errno = ERANGE;
+ return (0);
+ }
+ } else if ((len && tolower (s[len-1]) == 'k') ||
+ (len>1 && tolower (s[len-2]) == 'k')) {
+ /* result should be in kilobytes */
+ if (res <= 0x3ffffff) {
+ res <<= 10;
+ } else {
+ errno = ERANGE;
+ return (0);
+ }
+ }
+ *num = res;
+ }
+ return(ns - s); /* it worked */
+}
+
+char *
+stripws (char *s)
+{
+ while (isspace (*s)) {
+ s++;
+ }
+ return (s);
+}
+
+/* string = fgetline(fileptr) :: replacement for fgets. no length limits. */
+/* ------------------------- */
+/* fgetline function returns a dynamic string of any length. The string is */
+/* the next line from ``fp'' arg. Returns NULL for failure or EOF the */
+/* reason can be detirmened by feof() and errno. On an error that is not */
+/* EOF will flush the buffer to EOL if possible. The returned string has */
+/* the newline stripped. */
+
+/* sorry about the asm like comments I wrote this for a school project and */
+/* the prof is decidedly in favor of verbosity. I think the code is clear */
+/* enough alone, and most of these comments clutter the clarity. Oh well.*/
+
+char *fgetline(FILE *fp)
+{
+ enum local_constants { locbufsize = 40 };
+ char *retstr = NULL, *temp;
+ char locbuf[locbufsize];
+ char locbuflen = 0;
+
+ while(1) { /* do forever. */
+ while(locbuflen < (locbufsize-1)) {
+ int ch = fgetc(fp); /* get next character from */
+ /* stream. */
+
+ if(ch == EOF) { /* check for end of file. */
+ free_string(retstr); /* free_string retstr */
+ /* if EOF. */
+ return(NULL); /* and return NULL. */
+ } else if( ch == '\n' ) {
+ locbuf[locbuflen] = 0; /* got newline null term. */
+ temp = concat_strings(retstr,locbuf); /* and concat local */
+ /* buffer. */
+ free_string(retstr);
+ return(temp); /* return new string. */
+ } else {
+ locbuf[locbuflen++] = ch; /* add to local buffer */
+ }
+ }
+ /* we need to reset out local buffer. */
+ locbuf[locbuflen] = 0; /* null terminate. */
+ temp = retstr;
+ retstr = concat_strings(retstr,locbuf); /* concatenate locbuf to */
+ /* older string. */
+ locbuflen = 0; /* zero local buffer. */
+ free_string(temp); /* free old string. */
+
+ if(retstr == NULL) {
+ flush_to_eol(fp); /* flush to EOL on fail. */
+ return(NULL); /* and return NULL. */
+ }
+ }
+}
+
+/* flush ``fp'' to end of line, if possible. returns 0 on success or EOF for */
+/* error. */
+int flush_to_eol(FILE *fp)
+{
+ int ch;
+ while(EOF != (ch = fgetc(fp))) { /* loop until EOF */
+ if(ch == '\n') { /* if newline, return. */
+ return(0);
+ }
+ }
+ return(EOF);
+}
+
+/* Concatenate 2 strings into a new one. Both or either of the inputs */
+/* ``before'' and ``after'' can be NULL. returns NULL for failure */
+/* setting errno acordingly. */
+char *concat_strings(const char *before, const char *after)
+{
+ char *string = NULL;
+ int len1 = 0, len2 = 0;
+ if(before) /* if non null */
+ len1 = strlen(before); /* get length */
+
+ if(after) /* if non null */
+ len2 = strlen(after); /* get length */
+
+ string = malloc(len1 + len2 + 1); /* allocate storage for */
+ /* new string. */
+ if(string) {
+ memcpy(string,before,len1); /* copy ``before'' */
+ memcpy(&string[len1],after,len2); /* cat ``after'' */
+ string[len1+len2] = '\0'; /* null terminate. */
+ }
+ return(string); /* return string (or NULL) */
+}
+
+/* free_string() - frees a string gotten from misc string routines. input */
+/* can be NULL. */
+void free_string(char *string)
+{
+ if(string) /* if non NULL */
+ free(string); /* free string. */
+}
+
+char *
+alloc_string (char *s)
+{
+ char *d = malloc (strlen (s) + 1);
+ if (d) {
+ strcpy (d, s);
+ }
+ return (d);
+}
+
+int
+ask_bool (int def, int other, char *f, ...)
+{
+ char buffer[20];
+ va_list ap;
+ va_start (ap, f);
+ vfprintf (mout, f, ap);
+ fprintf (mout, "? [%lc%lc]:",toupper (def),tolower (other));
+ fflush (mout);
+ if (fgets (buffer, 18, min)) {
+ char *s = stripws (buffer);
+ if (s[0] != 0 && s[0] != '\n') {
+ def = (int) s[0];
+ }
+ }
+ if (buffer[strlen (buffer)-1] != '\n') {
+ flush_to_eol (min);
+ }
+ return (def);
+}
+
+void *
+zmalloc (size_t b)
+{
+ void *mem = malloc (b);
+ if (mem) {
+ memset (mem, 0, b);
+ }
+ return (mem);
+}
+
+void
+zfree (void *mem)
+{
+ if (mem)
+ free (mem);
+}
+
+struct Node *
+find_name (struct List *l, char *s)
+{
+ struct Node *n = l->lh_Head;
+ while (n->ln_Succ) {
+ if (!stricmp (s, n->ln_Name)) {
+ return (n);
+ }
+ n = n->ln_Succ;
+ }
+ return (NULL);
+}
+
+void
+verbose_message (char *f, ...)
+{
+ if (opt_verbose) {
+ va_list ap;
+ va_start (ap, f);
+ vfprintf (mout, f, ap);
+ fprintf (mout, "\n");
+ }
+}
+
+void
+debug_message (char *f, ...)
+{
+ if (opt_debug) {
+ va_list ap;
+ va_start (ap, f);
+ fprintf (mout, "debug: ");
+ vfprintf (mout, f, ap);
+ fprintf (mout, "\n");
+ }
+}
+
+void
+verbose_debug_message (char *f, ...)
+{
+ if (opt_verbose && opt_debug) {
+ va_list ap;
+ va_start (ap, f);
+ fprintf (mout, "debug: ");
+ vfprintf (mout, f, ap);
+ fprintf (mout, "\n");
+ }
+}
+
+void
+message (char *f, ...)
+{
+ va_list ap;
+ va_start (ap, f);
+ vfprintf (mout, f, ap);
+ fprintf (mout, "\n");
+}
+
+void
+warn_message (char *f, ...)
+{
+ va_list ap;
+ va_start (ap, f);
+ fprintf (mout, "warn: ");
+ vfprintf (mout, f, ap);
+ fprintf (mout, "\n");
+}
+
+void
+vmessage (char *f, va_list ap)
+{
+ vfprintf (mout, f, ap);
+ fprintf (mout, "\n");
+}
+
+
+
diff --git a/sys/arch/amiga/stand/device-streams/util.h b/sys/arch/amiga/stand/device-streams/util.h
new file mode 100644
index 00000000000..cd20df60677
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/util.h
@@ -0,0 +1,67 @@
+/* --------------------------------------------------
+ | NAME
+ | util
+ | PURPOSE
+ | header for util.c
+ | NOTES
+ |
+ | COPYRIGHT
+ | Copyright (C) 1993 Christian E. Hopps
+ |
+ | 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.
+ |
+ | HISTORY
+ | chopps - Oct 9, 1993: Created.
+ +--------------------------------------------------- */
+
+#if ! defined (_UTIL_H)
+#define _UTIL_H
+
+#include <exec/types.h>
+#include <exec/memory.h>
+#include <exec/nodes.h>
+#include <exec/lists.h>
+#include <dos/dos.h>
+#include <dos/dosextens.h>
+
+#include <clib/exec_protos.h>
+#include <pragmas/exec_pragmas.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdio.h>
+
+typedef ULONG ulong;
+
+#include "protos.h"
+extern ulong opt_debug;
+extern ulong opt_verbose;
+
+/* Macros */
+#define copy_string(x) alloc_string (x)
+#define ptrfrom(st,fl,p) ((st *)(((char *)p) - (offsetof (st,fl))))
+#define valid_mem(m) (TypeOfMem (m))
+#define megs(x) ((x)/(1024*1024))
+#define tenths_of_a_meg(x) ((10*(((x)/1024) % 1024))/1024)
+
+extern FILE *mout;
+extern FILE *min;
+
+#if defined (DEBUG_ENABLED_VERSION)
+#define D(x) x
+#else
+#define D(x)
+#endif
+
+#endif /* _UTIL_H */
diff --git a/sys/arch/amiga/stand/device-streams/xdevtostream.gz.uu b/sys/arch/amiga/stand/device-streams/xdevtostream.gz.uu
new file mode 100644
index 00000000000..ec129057b13
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/xdevtostream.gz.uu
@@ -0,0 +1,298 @@
+begin 754 xdevtostream.gz
+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
+G.A*FLU2B>1K7SW$=P47O_CV#:Q\N>F,@I?>WY,+_!BSZ[KA85P``
+`
+end
diff --git a/sys/arch/amiga/stand/device-streams/xstreamtodev.gz.uu b/sys/arch/amiga/stand/device-streams/xstreamtodev.gz.uu
new file mode 100644
index 00000000000..538801fc530
--- /dev/null
+++ b/sys/arch/amiga/stand/device-streams/xstreamtodev.gz.uu
@@ -0,0 +1,306 @@
+begin 754 xstreamtodev.gz
+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
+`
+end