add directory Linux-0.11

This commit is contained in:
gohigh
2024-02-19 00:21:01 -05:00
parent ca9fe7ce11
commit 26e015eb99
85 changed files with 8336 additions and 0 deletions

Binary file not shown.

View File

@@ -0,0 +1,31 @@
Edpart.exe is a disk partition editor capable of managing up to four
partitions on PC/XT and AT hard disks. It specifically says "no
copyright", so I figured someone else might like to use it rather than
doing fdisk/diskfix pairs to create partitions.
There's no instruction file and no real on-line help, so here's a
summary:
EDPART.EXE maintains up to four hard disk partitions on either of two
hard drives. If it sees more than one hard drive, it will ask which
one to edit.
The commands are:
CREATE Create hard disk partitions
DELETE Delete hard disk partitions
STATUS Bootable partitions may have the following status:
ACTIVE This partition is the boot partition
READ/WRITE R/W, not the boot partition
Non-bootable partitions (``extensions'') may be any of:
READ/WRITE
READ-ONLY
INACCESSIBLE
TYPE There are four types; for Minix purposes, either "extension"
type will do to my knowledge.
DOS(4) Bootable For DOS 3.x
DOS(4) Extension
DOS(1) Bootable For DOS 2.x
DOS(1) Extension
The "Bootable" partitions are recognized by MS-DOS directly,
so I don't advise using either of them for Minix.

Binary file not shown.

View File

@@ -0,0 +1,79 @@
This stuff is mostly self explanatory, but:
part takes one optional argument, which is the disk number with
which to start (either 0 or 1. 0 is default).
286pd1.sys and 286pd2.sys are for driving partitions on your first
and second disks, respectively. They will only work on 80186 or higher
processors. For 8086/8088 computers, use pdisk1.sys, pdisk2.sys. They
are just a *wee* bit slower....
fdins is for use when you're short of free space in "low menory" --
i.e. free interrupt vectors. fdintins, on the other hand, doesn't
use up any application space memory. In either case, these programs
don't do *anything* directly -- you run them in order to create a
.COM program that does the dirty work. You get TBL1.com, TBL2.com,
TBL1INT.com, or TBL2INT.com, depending on whether you run fdins,
fdintins and specifiy disk 1 or 2 (== 0 or 1).
pformat is for when you want to be particularly destructive with your
new partition. You run "pformat <drive>:" where <drive> must be a
valid pdisk. It's good for marking newly developed bad sectors,
I guess. Be careful.
According to tests I ran with the PC Magazine benchmark program, disk access
to a pdisk is actually faster than the normal DOS driver (i.e. C: or a DOS
3.3/4.x extended DOS partition). (This may only be true using the 286 version,
and may be affected by your usage. The main point is that you certainly do
not take a performance *cut* by using my program.)
I am not including most of the COPYING file that comes with stuff from the
Free Software Foundation (Richard Stallman, et al.) because I don't know
if I'm allowed, but that's what I intend for this software. Specifically,
you can *give* away as many copies of this software as you like. You can
charge a *reasonable* handling fee. You can even incorporate parts of it
into other projects, as long as you distribute at least the source you got
from pdisk. I don't want money or contributions, I want plaudits. I hope
this software is helpful to you.
When you find the inevitable bug (there are *none* in the driver, but I
don't absolutely swear for the partitioning program), please try to
fix it yourself and let me know the solution. Failing that, drop me a
line describing the situation exactly, especially including DOS version and
all hardware, including fixed disk and controller type. I don;t promise
to do anything about it, but I might.
One thing I recommend from experience: my boot code will only work on some
IBM compatibles. It is best to use the manafacturer's (or generic) MSDOS
fdisk to set up the initial partition, then use "format c: /s" to set up
your bootable DOS partition. If you can get this working right with pdisk,
that would be nice.
have fun. Scott E. Garfinkle
smsdpg!seg@uunet.uu.net
<The following is taken from Project Gnu's AWK distribution, the COPYING
File. I hope I'm not violating their copyright, or anything.
>
NO WARRANTY
BECAUSE PDISK IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY NO
WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW. EXCEPT
WHEN OTHERWISE STATED IN WRITING, SCOTT GARFINKLE
AND/OR OTHER PARTIES PROVIDE PDISK "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 PDISK IS WITH YOU. SHOULD PDISK PROVE DEFECTIVE, YOU
ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL SCOTT GARFINKLE
AND/OR ANY OTHER PARTY
WHO MAY MODIFY AND REDISTRIBUTE PDISK AS PERMITTED ABOVE, BE LIABLE TO
YOU FOR DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES, OR OTHER
SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
INABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR A
FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS) PDISK, EVEN
IF YOU HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR
ANY CLAIM BY ANY OTHER PARTY.

View File

@@ -0,0 +1,182 @@
/*
rawrite.c Write a binary image to a 360K diskette.
By Mark Becker
Usage:
MS-DOS prompt> RAWRITE
And follow the prompts.
History
-------
1.0 - Initial release
1.1 - Beta test (fixing bugs) 4/5/91
Some BIOS's don't like full-track writes.
1.101 - Last beta release. 4/8/91
Fixed BIOS full-track write by only
writing 3 sectors at a time.
1.2 - Final code and documentation clean-ups. 4/9/91
*/
#include <alloc.h>
#include <bios.h>
#include <ctype.h>
#include <dir.h>
#include <dos.h>
#include <io.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE (!FALSE)
#define SECTORSIZE 512
#define RESET 0
#define LAST 1
#define READ 2
#define WRITE 3
#define VERIFY 4
#define FORMAT 5
int done;
/*
Catch ^C and ^Break.
*/
int handler(void)
{
done = TRUE;
return(0);
}
void msg(char (*s))
{
fprintf(stderr, "%s\n", s);
_exit(1);
}
/*
Identify the error code with a real error message.
*/
void Error(int (status))
{
switch (status) {
case 0x00: msg("Operation Successful"); break;
case 0x01: msg("Bad command"); break;
case 0x02: msg("Address mark not found"); break;
case 0x03: msg("Attempt to write on write-protected disk"); break;
case 0x04: msg("Sector not found"); break;
case 0x05: msg("Reset failed (hard disk)"); break;
case 0x06: msg("Disk changed since last operation"); break;
case 0x07: msg("Drive parameter activity failed"); break;
case 0x08: msg("DMA overrun"); break;
case 0x09: msg("Attempt to DMA across 64K boundary"); break;
case 0x0A: msg("Bad sector detected"); break;
case 0x0B: msg("Bad track detected"); break;
case 0x0C: msg("Unsupported track"); break;
case 0x10: msg("Bad CRC/ECC on disk read"); break;
case 0x11: msg("CRC/ECC corrected data error"); break;
case 0x20: msg("Controller has failed"); break;
case 0x40: msg("Seek operation failed"); break;
case 0x80: msg("Attachment failed to respond"); break;
case 0xAA: msg("Drive not ready (hard disk only"); break;
case 0xBB: msg("Undefined error occurred (hard disk only)"); break;
case 0xCC: msg("Write fault occurred"); break;
case 0xE0: msg("Status error"); break;
case 0xFF: msg("Sense operation failed"); break;
}
_exit(1);
}
/*
Identify what kind of diskette is installed in the specified drive.
Return the number of sectors per track assumed as follows:
9 - 360 K and 720 K 5.25".
15 - 1.2 M HD 5.25".
18 - 1.44 M 3.5".
*/
int nsects(int (drive))
{
static int nsect[] = {18, 15, 9};
char *buffer;
int i, status;
/*
Read sector 1, head 0, track 0 to get the BIOS running.
*/
buffer = (char *)malloc(SECTORSIZE);
biosdisk(RESET, drive, 0, 0, 0, 0, buffer);
status = biosdisk(READ, drive, 0, 10, 1, 1, buffer);
if (status == 0x06) /* Door signal change? */
status = biosdisk(READ, drive, 0, 0, 1, 1, buffer);
for (i=0; i < sizeof(nsect)/sizeof(int); ++i) {
biosdisk(RESET, drive, 0, 0, 0, 0, buffer);
status = biosdisk(READ, drive, 0, 0, nsect[i], 1, buffer);
if (status == 0x06)
status = biosdisk(READ, drive, 0, 0, nsect[i], 1, buffer);
if (status == 0x00) break;
}
if (i == sizeof(nsect)/sizeof(int)) {
msg("Can't figure out how many sectors/track for this diskette.");
}
free(buffer);
return(nsect[i]);
}
void main(void)
{
char fname[MAXPATH];
char *buffer, *pbuf;
int count, fdin, drive, head, track, status, spt, buflength, ns;
puts("RaWrite 1.2 - Write disk file to raw floppy diskette\n");
ctrlbrk(handler);
printf("Enter source file name: ");
scanf("%s", fname);
_fmode = O_BINARY;
if ((fdin = open(fname, O_RDONLY)) <= 0) {
perror(fname);
exit(1);
}
printf("Enter destination drive: ");
scanf("%s", fname);
drive = fname[0];
drive = (islower(drive) ? toupper(drive) : drive) - 'A';
printf("Please insert a formatted diskette into ");
printf("drive %c: and press -ENTER- :", drive + 'A');
while (bioskey(1) == 0) ; /* Wait... */
if ((bioskey(0) & 0x7F) == 3) exit(1); /* Check for ^C */
putchar('\n');
done = FALSE;
/*
* Determine number of sectors per track and allocate buffers.
*/
spt = nsects(drive);
buflength = spt * SECTORSIZE;
buffer = (char *)malloc(buflength);
printf("Number of sectors per track for this disk is %d\n", spt);
printf("Writing image to drive %c:. Press ^C to abort.\n", drive+'A');
/*
* Start writing data to diskette until there is no more data to write.
*/
head = track = 0;
while ((count = read(fdin, buffer, buflength)) > 0 && !done) {
pbuf = buffer;
for (ns = 1; count > 0 && !done; ns+=3) {
printf("Track: %02d Head: %2d Sector: %2d\r", track, head, ns);
status = biosdisk(WRITE, drive, head, track, ns, 3, pbuf);
if (status != 0) Error(status);
count -= (3*SECTORSIZE);
pbuf += (3*SECTORSIZE);
}
if ((head = (head + 1) & 1) == 0) ++track;
}
if (eof(fdin)) {
printf("\nDone.\n");
biosdisk(2, drive, 0, 0, 1, 1, buffer); /* Retract head */
}
} /* end main */

View File

@@ -0,0 +1,86 @@
RaWrite 1.2
-----------
Purpose
-------
Write a disk image file to a 360K floppy disk.
Equipment/Software Requirements
-------------------------------
PC/XT/AT with a floppy disk drive capable of reading and writing a 360K
diskette.
This program uses generic low-level BIOS diskette read/write functions. It
should be portable to nearly every PC in existance. PS/2's should be able
to run RawWrite but this has not been tested.
CAVEAT
------
This program will write ANY disk file to a floppy, overwriting any previous
information that may have been present. If you wish to re-use a diskette
under MS-DOS thats been written to by RawWrite then the disk will need to be
reformatted; all MS-DOS specific information will have been erased.
How to Compile
--------------
TCC rawrite.c
The source code is specific to Borland International's Turbo C 2.01 and has
been tested in all memory models.
Usage
-----
C> RAWRITE
And follow the prompts. All arguments are case-insensitive.
A sample run is shown below. The disk file being written, in this example,
is named DEMODISK and the destination - where the image is being written -
is the B: drive.
This program may be aborted at any time by typing ^C.
Sample Run
----------
C> RAWRITE
RaWrite 1.2 - Write disk file to raw floppy diskette
Enter source file name: DEMODISK
Enter destination drive: B
Please insert a formatted 360K diskette into drive B: and press -ENTER- :
Writing image to drive B:
Errors
------
RaWrite attempts to determine if the diskette is a 360K, 720K, 1.2M, or
1.44M diskette by reading specific sectors. If the inserted diskette is not
one of the mentioned types, then RaWrite will abort with a short error
message.
Errors such as write protect, door open, bad disk, bad sector, etc. cause a
program abort with a short error message.
History
-------
1.0 - Initial release
1.1 - Beta test (fixing bugs) 4/5/91
Some BIOS's don't like full-track writes.
1.101 - Last beta release. 4/8/91
Fixed BIOS full-track write by only only
writing 3 sectors at a time.
1.2 - Final code and documentation clean-ups. 4/9/91

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,11 @@
pmake.Z is the make from the bsd net release #2.
pm_supp.tar.Z is a tar file of some support "include" files used
by that version of make.
It may not completely correctly handle error conditions from children,
since I had to guess a bit on how to recode its abuse of the old
union wait.
John Kohl
jtkohl@cs.berkeley.edu
[sources on request; that's another kermit, though.]

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

256
Linux-0.11/docs/FAQ Normal file
View File

@@ -0,0 +1,256 @@
daemon@ATHENA.MIT.EDU (Robert Blum) Linux_Activists 12/19/91 01:39 (253 lines)
Subject: A FAQ is coming...
Date: Thu, 19 Dec 91 07:29:21 +0100
From: blum@cip-s01.informatik.rwth-aachen.de (Robert Blum)
To: linux-activists@joker.cs.hut.fi
Hi Linuxers!
Following is a FAQ-compilation (most credits to Linus) for Linux.
Mail me, if you like it, and mail me, if you dislike it or have
any ideas on changing this.
Thanks in advance,
Robert Blum
QUESTION: What is linux?
ANSWER: Linux is a small unix for 386-AT computers, that has the added
advantage of being free. It is still in beta-testing, but is slowly
getting useful even for somewhat real developement.
QUESTION: Does it run on my computer?
ANSWER: Linux has been written on a clone-386, with IDE drives and a VGA
screen. It should work on most similar setups. The harddisk should be
AT-standard (ie not SCSI, ESDI), and the system must be ISA. Otherwise
the requirements seem relatively small: a 386 (SX, DX or any 486). The
current version (0.10) needs a colour screen adapter, but this is not
the case with the next version.
It needs at least 2M to run, and 4M is definitely a plus. It can happily
use up to 16M (and more if you change some things).
QUESTION: Will linux run on a PC or 286-AT? If not, why?
ANSWER: Linux uses the 386 chip protected mode functions extensively,
and is a true 32-bit operating system. Thus x86 chips, x<3, will simply
not run it.
QUESTION: Does linux do paging? Can I have virtual memory on my small
machine?
ANSWER: Linux does use the 386 paging unit, but currently only for
memory management. No use of disks as expansion RAM. This is one of the
things that will be implemented sometime in the (far?) future. Linux
also uses the paging unit to share pages between several processes after
a fork: thus it needs less memory. However, almost all the user programs
available for linux are GNU software, which want gobs and gobs of
memory. This is the reason at least 4M is recommended: GNU cc (gcc)
simply won't run in less.
QUESTION: Can I have tasks spanning the full 4GB of addressable 386
memory? No more 64kB limits like in coherent or standard minix?
ANSWER: Linux does limit the task-size, but at a much more reasonable
64MB (MEGA-byte, not kilos), so bigger programs are no problem.
QUESTION: Does the bigger program sizes mean I can run X?
ANSWER: X is not ported to linux, and though I hope it will be some day,
I cannot guarantee it. It's big, and wants a lot from the system.
QUESTION: Where can I get linux? Is there a mailserver?
ANSWER: Linux can be gotten by anonymous ftp from
nic.funet.fi (128.214.6.100):
directory /pub/OS/Linux
Tupac-Amaru.Informatik.RWTH-Aachen.DE (137.226.112.31):
directory /pub/msdos/replace
tsx-11.mit.edu (18.172.1.2):
directory /pub/linux
ftp.eecs.umich.edu (141.212.99.7):
directory linux
You might want to check out which of these is the most up-to-date.
If you don't have ftp-capability, you are in trouble. You might try
mailing "mailserver@nic.funet.fi" with "help" in the body of the mail.
QUESTION: Is there a newsgroup or mailing-list about linux? Where can I
get my questions answered? How about bug-reports?
ANSWER: There is a mailing list set up at the address
'Linux-activists@niksula.hut.fi'. To join, mail a request to
'Linux-activists-request@niksula.hut.fi'. DO NOT mail "I want to
[un]subscribe" to the mailing-list, use the request-address.
Questions and bug-reports can be sent either to the mailing-list or to
"torvalds@kruuna.helsinki.fi", depending on which you find more
appropriate.
QUESTION: I got the minix-demo, but it won't boot. Linux boots from
floppy. What's wrong?
ANSWER: You probably wrote the minix demo to a 1.44M disk, which (for
some unfathomable reason) doesn't work. The minix demo wants a 720kB or
1.2M disk.
QUESTION: The minix-demo boots all right, but doesn't seem to recognize
my second harddisk. What's up?
ANSWER: The minix-demo does support a second harddisk, but there are no
special files made for it, and the minix demo doesn't include the
"mknod" command. Mount the linux root-floppy, and use the devices on
that.
QUESTION: How can I be sure I won't be writing over anything important?
I have to use DOS in on my machine, and I don't want to lose any files.
ANSWER: Back up everything. Just in case. Then, write some easily
recognizable pattern to the partition you have reserved for linux, using
some DOS tool. You can then use "cat /dev/hdX" under minix to examine
which of the partitions you used.
QUESTION: Minix mkfs doesn't accept the size I give the device, although
I double-checked with fdisk, and it's correct.
ANSWER: Be sure you give the size in BLOCKS, ie 1024 bytes, not sectors.
Also, make doubly certain that you have the correct partition.
QUESTION: I used the minix mkfs to make a filesystem on /dev/hd3 after
having checked that this was indeed the partition I had reserved. Minix
mounts the new partition ok, but linux doesn't. What gives?
ANSWER: In some cases partitions are numbered differently under minix
and linux. This seems to correlate to the FDISK version you have used.
/dev/hd3 under minix may be /dev/hd2 under linux etc.
There are a few rules about this: /dev/hd0 and /dev/hd5 are always the
same under linux and minix. DO NOT USE THEM, they are the whole raw
disk, not partitions. Also if a partition is on drive 1 under minix (ie
/dev/hd1-4), it is drive 1 under linux as well.
QUESTION: I mounted the linux filesystem, and copied the files from the
root-disk to the harddisk. Now I cannot find them any more, and
somethimes linux dies with a "panic: trying to free unused inode".
ANSWER: You have probably forgot to sync before rebooting. Linux, like
all unices, use a "buffer cache" to speed up reads and writes to disk.
On a machine that has enough memory, this buffer-cache is 1.5MB, and if
you forget to sync before exiting, it may not be fully written out to
disk. Re-mkfs and re-install (or try to use the preliminary fsck, but
remeber that although fsck tries to correct the faults it finds, it may
fail.)
QUESTION: the mtools package on the root-disk won't work. I get an
ENOENT error message for all devices.
ANSWER: mtools needs to be told which device to look for. Use 'ln' or
'mknod' to create a sepcial file called "/dev/dosX", where X is A, B or
C. This file should point to the device you want to read.
QUESTION: Turbo (Microsoft) Assembler won't compile the Linux boot code.
In fact, some of the opcodes in these files look completely unfamiliar. Why?
ANSWER: The Linux boot codes are written in Bruce Evans' minix assembler,
which has the same opcodes as the original minix assembler. There are a few
differences between these and normal DOS assemblers:
- No segments - everything is in the same segment (at least in the
bootsectors and setup, as they don't use the .data segments)
- mov[b|w|l] are shorter versions of mov ax,[byte|word|long] ptr [XXX].
This is how unix assemblers normally give the size (byte, word or long).
Gas has similar constructs.
- There is no "jmp short", the opcodes are "j" for a short jump and
"jmp" for a long one.
- "jmpi" is a jump with a segment:offset pair. I don't know how this is
written in DOS assembly.
QUESTION: While running du I get "Kernel panic: free_inode: bit already
cleared". Also, du produces a ENOENT error for all the files in certain
of my directories. What's going on?
ANSWER: These are both consistent with a bad file-system. That's relatively
easy to produce by not syncing before rebooting, as linux usually has 1.5MB
of buffer space held in memory (unless you have <=4M RAM, in which case
the buffers are only about 0.5MB). Also linux doesn't do anything
special about the bit-map blocks, and as they are used often, those are
the thing most likely to be in memory. If you reboot, and they haven't
been written to disk ...
I'm afraid that as long as there is no fsck for linux there is no way to
correct the matter (unless you have minix and can run minix fsck), and
the only thing to do is to reinstall the filesystem from scratch (ie do
a mkfs from the minix demodisk and reboot from the original
linux-floppy).
A sync is done only every 30 seconds normally (standard unix practice),
so do one by hand (some people think you should do 3 syncs after each
other, but that's superstition), or by logging out from the
startup-shell, which automatically syncs the system. Unmounting a
filesystem also syncs it (but of course you can never unmount root).
Another (sad) possibility is that you have bad blocks on your disk. Not
very probable, as they would have to be in the inode-tables, just a
couple of blocks in size. Again there aren't programs available to read
a disk for bad sectors and put them in some kind of "bad-sector-file".
On IDE drives this is no problem (bad sectors are automatically mapped
away).
QUESTION: What is the "em" binary?
ANSWER: Em is micro-EMacs (probably version 3.10).
QUESTION: I seem to be unable to compile anythong with gcc. Why?
ANSWER: If you have only 2 MB RAM, gcc will die silently without compiling
anything. You must have at least 4 MB to do compilations
QUESTION: I'm using a program that uses signal handlers which are installed
using sigaction() with the SA_NOMASK, and they get a general protection
error right after the signal handler tries to return. What's going
wrong?
ANSWER: You are using a libc.a that has an out-of-date signal.o and
sig_restore.o file, and they don't know how to deal with SA_NOMASK.
(The one in gccbin.tar.Z is out-of-date.) You can obtain the newer
signal.c from the unistd.tar.Z file, but don't use the associated
sig_restore.c from there; the FTP sites should have a separate
sig_restore.c which is up to date. While you're at it, you should also
get an updated crt0.c file as well, and install your new crt0.o and
libc.a in /usr/lib.
(This answer will likely change in the near future, since there are
plans to change the format of the signal trampoline code yet again....
but for now, this should be an accurate description of how things stand
now.)
QUESTION: gcc complains about not finding crt0.o and the system include files
What am i doing wrong ?
ANSWER: The include files normal place is in /usr/include. libc.a and *.a
should be in /usr/lib

248
Linux-0.11/docs/FAQ-0.11 Normal file
View File

@@ -0,0 +1,248 @@
QUESTION: What is linux?
ANSWER: Linux is a small unix for 386-AT computers, that has the added
advantage of being free. It is still in beta-testing, but is slowly
getting useful even for somewhat real developement.
QUESTION: Does it run on my computer?
ANSWER: Linux has been written on a clone-386, with IDE drives and a VGA
screen. It should work on most similar setups. The harddisk should be
AT-standard (ie not SCSI, ESDI), and the system must be ISA. Otherwise
the requirements seem relatively small: a 386 (SX, DX or any 486).
It needs at least 2M to run, and 4M is definitely a plus. It can happily
use up to 16M (and more if you change some things).
QUESTION: Will linux run on a PC or 286-AT? If not, why?
ANSWER: Linux uses the 386 chip protected mode functions extensively,
and is a true 32-bit operating system. Thus x86 chips, x<3, will simply
not run it.
QUESTION: Does linux do paging? Can I have virtual memory on my small
machine?
ANSWER: Linux does use the 386 paging unit, but currently only for
memory management. It currently is not doing any paging or swapping.
This is one of the things that will be implemented sometime in the
near future. Linux also uses the paging unit to share pages between
several processes after a fork: thus it needs less memory. However,
of the interesting programs which have been ported to linux so want
gobs and gobs of memory; in particular, the GNU C compiler (gcc) needs
at least 4 meg of memory.
Even after paging is implemented, 4 Megs would still be recommended,
since large programs would run very slowly.
QUESTION: Can I have tasks spanning the full 4GB of addressable 386
memory? No more 64kB limits like in coherent or standard minix?
ANSWER: Linux does limit the task-size, but at a much more reasonable
64MB (MEGA-byte, not kilos), so bigger programs are no problem.
QUESTION: Does the bigger program sizes mean I can run X?
ANSWER: X is not ported to linux, and though I hope it will be some day,
I cannot guarantee it. It's big, and wants a lot from the system.
QUESTION: Where can I get linux? Is there a mailserver?
ANSWER: Linux can be gotten by anonymous ftp from
nic.funet.fi (128.214.6.100):
directory /pub/OS/Linux
Tupac-Amaru.Informatik.RWTH-Aachen.DE (137.226.112.31):
directory /pub/msdos/replace
tsx-11.mit.edu (18.172.1.2):
directory /pub/linux
ftp.eecs.umich.edu (141.212.99.7):
directory linux
You might want to check out which of these is the most up-to-date.
If you don't have ftp-capability, you are in trouble. You might try
mailing "mailserver@nic.funet.fi" with "help" in the body of the mail.
QUESTION: Is there a newsgroup or mailing-list about linux? Where can I
get my questions answered? How about bug-reports?
ANSWER: There is a mailing list set up at the address
'Linux-activists@niksula.hut.fi'. To join, mail a request to
'Linux-activists-request@niksula.hut.fi'. DO NOT mail "I want to
[un]subscribe" to the mailing-list, use the request-address.
Questions and bug-reports can be sent either to the mailing-list or to
"torvalds@kruuna.helsinki.fi", depending on which you find more
appropriate.
QUESTION: I got the minix-demo, but it won't boot. Linux boots from
floppy. What's wrong?
ANSWER: You probably wrote the minix demo to a 1.44M disk, which (for
some unfathomable reason) doesn't work. The minix demo wants a 720kB or
1.2M disk.
In any case, you shouldn't need to use the Minix-demo disk any more;
as of version 0.11, Linux comes with sufficient filesystem utilities
(mkfs, fsck, etc.) so that Minix should no longer be required to bring
up an operating Linux system.
QUESTION: The minix-demo boots all right, but doesn't seem to
recognize my second harddisk. What's up? [SUGGESTION: delete this
question; see above first paragraph]
ANSWER: The minix-demo does support a second harddisk, but there are no
special files made for it, and the minix demo doesn't include the
"mknod" command. Mount the linux root-floppy, and use the devices on
that.
QUESTION: How can I be sure I won't be writing over anything important?
I have to use DOS in on my machine, and I don't want to lose any files.
ANSWER: Back up everything. Just in case. Then, write some easily
recognizable pattern to the partition you have reserved for linux, using
some DOS tool. You can then use "cat /dev/hdX" under minix to examine
which of the partitions you used.
QUESTION: The mkfs program doesn't accept the size I give the device,
although I double-checked with fdisk, and it's correct.
ANSWER: Be sure you give the size in BLOCKS, ie 1024 bytes, not sectors.
Also, make doubly certain that you have the correct partition.
QUESTION: I used the minix mkfs to make a filesystem on /dev/hd3 after
having checked that this was indeed the partition I had reserved. Minix
mounts the new partition ok, but linux doesn't. What gives?
ANSWER: In some cases partitions are numbered differently under minix
and linux. This seems to correlate to the FDISK version you have used.
/dev/hd3 under minix may be /dev/hd2 under linux etc.
There are a few rules about this: /dev/hd0 and /dev/hd5 are always the
same under linux and minix. DO NOT USE THEM, they are the whole raw
disk, not partitions. Also if a partition is on drive 1 under minix (ie
/dev/hd1-4), it is drive 1 under linux as well.
QUESTION: I mounted the linux filesystem, and copied the files from the
root-disk to the harddisk. Now I cannot find them any more, and
somethimes linux dies with a "panic: trying to free unused inode".
ANSWER: You have probably forgot to sync before rebooting. Linux, like
all unices, use a "buffer cache" to speed up reads and writes to disk.
On a machine that has enough memory, this buffer-cache is 1.5MB, and if
you forget to sync before exiting, it may not be fully written out to
disk. Re-mkfs and re-install (or try to use the preliminary fsck, but
remeber that although fsck tries to correct the faults it finds, it may
fail.)
QUESTION: the mtools package on the root-disk won't work. I get an
ENOENT error message for all devices.
ANSWER: mtools needs to be told which device to look for. Use 'ln' or
'mknod' to create a special file called "/dev/dosX", where X is A, B or
C. This file should point to the device you want to read.
QUESTION: Turbo (Microsoft) Assembler won't compile the Linux boot code.
In fact, some of the opcodes in these files look completely unfamiliar. Why?
ANSWER: The Linux boot codes are written in Bruce Evans' minix assembler,
which has the same opcodes as the original minix assembler. There are a few
differences between these and normal DOS assemblers:
- No segments - everything is in the same segment (at least in the
bootsectors and setup, as they don't use the .data segments)
- mov[b|w|l] are shorter versions of mov ax,[byte|word|long] ptr [XXX].
This is how unix assemblers normally give the size (byte, word or long).
Gas has similar constructs.
- There is no "jmp short", the opcodes are "j" for a short jump and
"jmp" for a long one.
- "jmpi" is a jump with a segment:offset pair. I don't know how this is
written in DOS assembly.
QUESTION: While running du I get "Kernel panic: free_inode: bit already
cleared". Also, du produces a ENOENT error for all the files in certain
of my directories. What's going on?
ANSWER: These are both consistent with a bad file-system. That's relatively
easy to produce by not syncing before rebooting, as linux usually has 1.5MB
of buffer space held in memory (unless you have <=4M RAM, in which case
the buffers are only about 0.5MB). Also linux doesn't do anything
special about the bit-map blocks, and as they are used often, those are
the thing most likely to be in memory. If you reboot, and they haven't
been written to disk ...
If this happens to you, you should run the fsck program to determine
to fix the inconsistencies in the file system. The syntax is:
fsck [-larvsm] device_name
You should first run it without any arguments, to assess the damage,
and then run it with the -r or (if you're feeling adventurous) -a
options to reapir the damage. The -a flag stands for automatic, which
means tath fsck won't bother to ask you for confirmation before it
fixes each inconsistency.
While the Linux system is in operation the disk buffers are forced out
to disk only every 30 seconds by the /bin/update program (if it were
done more frequently it would slow down the system). Before you halt,
powerdown, or reboot your system, you should use the 'sync' program to
manually write out any disk buffers to disk (some people think you
should do 3 syncs after each other, but that's superstition). Or, you
can log out out from the startup-shell, which automatically syncs the
system. Unmounting a filesystem also syncs it (but of course you can
never unmount root).
Another (sad) possibility is that you have bad blocks on your disk. Not
very probable, as they would have to be in the inode-tables, just a
couple of blocks in size. Again there aren't programs available to read
a disk for bad sectors and put them in some kind of "bad-sector-file".
On IDE drives this is no problem (bad sectors are automatically mapped
away).
QUESTION: What is the "em" binary?
ANSWER: Em is micro-EMacs (probably version 3.10).
QUESTION: I seem to be unable to compile anythong with gcc. Why?
ANSWER: If you have only 2 MB RAM, gcc will die silently without compiling
anything. You must have at least 4 MB to do compilations
QUESTION: I'm using a program that uses signal handlers which are installed
using sigaction() with the SA_NOMASK, and they get a general protection
error right after the signal handler tries to return. What's going
wrong?
ANSWER: You are using a libc.a that has an out-of-date signal.o and
sig_restore.o file, and they don't know how to deal with SA_NOMASK.
(The one in gccbin.tar.Z is out-of-date.) You can obtain complete
sources to the libc.a library from the FTP sites, and compile your own
to make sure that you have the most up-to-date versions of all the
library routines.
QUESTION: gcc complains about not finding crt0.o and the system include files
What am i doing wrong ?
ANSWER: The include files normal place is in /usr/include. libc.a and *.a
should be in /usr/lib

265
Linux-0.11/docs/FAQv.txt Normal file
View File

@@ -0,0 +1,265 @@
head 1.1;
branch ;
access ;
symbols ;
locks tytso:1.1; strict;
comment @# @;
1.1
date 91.12.19.11.59.54; author tytso; state Exp;
branches ;
next ;
desc
@@
1.1
log
@Initial revision
@
text
@
QUESTION: What is linux?
ANSWER: Linux is a small unix for 386-AT computers, that has the added
advantage of being free. It is still in beta-testing, but is slowly
getting useful even for somewhat real developement.
QUESTION: Does it run on my computer?
ANSWER: Linux has been written on a clone-386, with IDE drives and a VGA
screen. It should work on most similar setups. The harddisk should be
AT-standard (ie not SCSI, ESDI), and the system must be ISA. Otherwise
the requirements seem relatively small: a 386 (SX, DX or any 486). The
current version (0.10) needs a colour screen adapter, but this is not
the case with the next version.
It needs at least 2M to run, and 4M is definitely a plus. It can happily
use up to 16M (and more if you change some things).
QUESTION: Will linux run on a PC or 286-AT? If not, why?
ANSWER: Linux uses the 386 chip protected mode functions extensively,
and is a true 32-bit operating system. Thus x86 chips, x<3, will simply
not run it.
QUESTION: Does linux do paging? Can I have virtual memory on my small
machine?
ANSWER: Linux does use the 386 paging unit, but currently only for
memory management. No use of disks as expansion RAM. This is one of the
things that will be implemented sometime in the (far?) future. Linux
also uses the paging unit to share pages between several processes after
a fork: thus it needs less memory. However, almost all the user programs
available for linux are GNU software, which want gobs and gobs of
memory. This is the reason at least 4M is recommended: GNU cc (gcc)
simply won't run in less.
QUESTION: Can I have tasks spanning the full 4GB of addressable 386
memory? No more 64kB limits like in coherent or standard minix?
ANSWER: Linux does limit the task-size, but at a much more reasonable
64MB (MEGA-byte, not kilos), so bigger programs are no problem.
QUESTION: Does the bigger program sizes mean I can run X?
ANSWER: X is not ported to linux, and though I hope it will be some day,
I cannot guarantee it. It's big, and wants a lot from the system.
QUESTION: Where can I get linux? Is there a mailserver?
ANSWER: Linux can be gotten by anonymous ftp from
nic.funet.fi (128.214.6.100):
directory /pub/OS/Linux
Tupac-Amaru.Informatik.RWTH-Aachen.DE (137.226.112.31):
directory /pub/msdos/replace
tsx-11.mit.edu (18.172.1.2):
directory /pub/linux
ftp.eecs.umich.edu (141.212.99.7):
directory linux
You might want to check out which of these is the most up-to-date.
If you don't have ftp-capability, you are in trouble. You might try
mailing "mailserver@@nic.funet.fi" with "help" in the body of the mail.
QUESTION: Is there a newsgroup or mailing-list about linux? Where can I
get my questions answered? How about bug-reports?
ANSWER: There is a mailing list set up at the address
'Linux-activists@@niksula.hut.fi'. To join, mail a request to
'Linux-activists-request@@niksula.hut.fi'. DO NOT mail "I want to
[un]subscribe" to the mailing-list, use the request-address.
Questions and bug-reports can be sent either to the mailing-list or to
"torvalds@@kruuna.helsinki.fi", depending on which you find more
appropriate.
QUESTION: I got the minix-demo, but it won't boot. Linux boots from
floppy. What's wrong?
ANSWER: You probably wrote the minix demo to a 1.44M disk, which (for
some unfathomable reason) doesn't work. The minix demo wants a 720kB or
1.2M disk.
QUESTION: The minix-demo boots all right, but doesn't seem to recognize
my second harddisk. What's up?
ANSWER: The minix-demo does support a second harddisk, but there are no
special files made for it, and the minix demo doesn't include the
"mknod" command. Mount the linux root-floppy, and use the devices on
that.
QUESTION: How can I be sure I won't be writing over anything important?
I have to use DOS in on my machine, and I don't want to lose any files.
ANSWER: Back up everything. Just in case. Then, write some easily
recognizable pattern to the partition you have reserved for linux, using
some DOS tool. You can then use "cat /dev/hdX" under minix to examine
which of the partitions you used.
QUESTION: Minix mkfs doesn't accept the size I give the device, although
I double-checked with fdisk, and it's correct.
ANSWER: Be sure you give the size in BLOCKS, ie 1024 bytes, not sectors.
Also, make doubly certain that you have the correct partition.
QUESTION: I used the minix mkfs to make a filesystem on /dev/hd3 after
having checked that this was indeed the partition I had reserved. Minix
mounts the new partition ok, but linux doesn't. What gives?
ANSWER: In some cases partitions are numbered differently under minix
and linux. This seems to correlate to the FDISK version you have used.
/dev/hd3 under minix may be /dev/hd2 under linux etc.
There are a few rules about this: /dev/hd0 and /dev/hd5 are always the
same under linux and minix. DO NOT USE THEM, they are the whole raw
disk, not partitions. Also if a partition is on drive 1 under minix (ie
/dev/hd1-4), it is drive 1 under linux as well.
QUESTION: I mounted the linux filesystem, and copied the files from the
root-disk to the harddisk. Now I cannot find them any more, and
somethimes linux dies with a "panic: trying to free unused inode".
ANSWER: You have probably forgot to sync before rebooting. Linux, like
all unices, use a "buffer cache" to speed up reads and writes to disk.
On a machine that has enough memory, this buffer-cache is 1.5MB, and if
you forget to sync before exiting, it may not be fully written out to
disk. Re-mkfs and re-install (or try to use the preliminary fsck, but
remeber that although fsck tries to correct the faults it finds, it may
fail.)
QUESTION: the mtools package on the root-disk won't work. I get an
ENOENT error message for all devices.
ANSWER: mtools needs to be told which device to look for. Use 'ln' or
'mknod' to create a sepcial file called "/dev/dosX", where X is A, B or
C. This file should point to the device you want to read.
QUESTION: Turbo (Microsoft) Assembler won't compile the Linux boot code.
In fact, some of the opcodes in these files look completely unfamiliar. Why?
ANSWER: The Linux boot codes are written in Bruce Evans' minix assembler,
which has the same opcodes as the original minix assembler. There are a few
differences between these and normal DOS assemblers:
- No segments - everything is in the same segment (at least in the
bootsectors and setup, as they don't use the .data segments)
- mov[b|w|l] are shorter versions of mov ax,[byte|word|long] ptr [XXX].
This is how unix assemblers normally give the size (byte, word or long).
Gas has similar constructs.
- There is no "jmp short", the opcodes are "j" for a short jump and
"jmp" for a long one.
- "jmpi" is a jump with a segment:offset pair. I don't know how this is
written in DOS assembly.
QUESTION: While running du I get "Kernel panic: free_inode: bit already
cleared". Also, du produces a ENOENT error for all the files in certain
of my directories. What's going on?
ANSWER: These are both consistent with a bad file-system. That's relatively
easy to produce by not syncing before rebooting, as linux usually has 1.5MB
of buffer space held in memory (unless you have <=4M RAM, in which case
the buffers are only about 0.5MB). Also linux doesn't do anything
special about the bit-map blocks, and as they are used often, those are
the thing most likely to be in memory. If you reboot, and they haven't
been written to disk ...
I'm afraid that as long as there is no fsck for linux there is no way to
correct the matter (unless you have minix and can run minix fsck), and
the only thing to do is to reinstall the filesystem from scratch (ie do
a mkfs from the minix demodisk and reboot from the original
linux-floppy).
A sync is done only every 30 seconds normally (standard unix practice),
so do one by hand (some people think you should do 3 syncs after each
other, but that's superstition), or by logging out from the
startup-shell, which automatically syncs the system. Unmounting a
filesystem also syncs it (but of course you can never unmount root).
Another (sad) possibility is that you have bad blocks on your disk. Not
very probable, as they would have to be in the inode-tables, just a
couple of blocks in size. Again there aren't programs available to read
a disk for bad sectors and put them in some kind of "bad-sector-file".
On IDE drives this is no problem (bad sectors are automatically mapped
away).
QUESTION: What is the "em" binary?
ANSWER: Em is micro-EMacs (probably version 3.10).
QUESTION: I seem to be unable to compile anythong with gcc. Why?
ANSWER: If you have only 2 MB RAM, gcc will die silently without compiling
anything. You must have at least 4 MB to do compilations
QUESTION: I'm using a program that uses signal handlers which are installed
using sigaction() with the SA_NOMASK, and they get a general protection
error right after the signal handler tries to return. What's going
wrong?
ANSWER: You are using a libc.a that has an out-of-date signal.o and
sig_restore.o file, and they don't know how to deal with SA_NOMASK.
(The one in gccbin.tar.Z is out-of-date.) You can obtain the newer
signal.c from the unistd.tar.Z file, but don't use the associated
sig_restore.c from there; the FTP sites should have a separate
sig_restore.c which is up to date. While you're at it, you should also
get an updated crt0.c file as well, and install your new crt0.o and
libc.a in /usr/lib.
(This answer will likely change in the near future, since there are
plans to change the format of the signal trampoline code yet again....
but for now, this should be an accurate description of how things stand
now.)
QUESTION: gcc complains about not finding crt0.o and the system include files
What am i doing wrong ?
ANSWER: The include files normal place is in /usr/include. libc.a and *.a
should be in /usr/lib
@

View File

@@ -0,0 +1,113 @@
LINUX INFORMATION SHEET
1. WHAT IS LINUX 0.11
LINUX 0.11 is a freely distributable UNIX clone. It is almost
fully System V compatible. LINUX has been written from scratch, and
therefore does not contain any AT&T or MINIX code--not in the kernel,
the compiler, the utilities, or the libraries. For this reason it can
be made available with the complete source code via anonymous FTP.
Sorrily, it runs only on 386/486 AT-bus-machines. EISA will probably do
too, but you need an AT-Bus controller for your harddisk.
Version 0.11 is still a beta release, but it provides almost full
functionality. Various users have been able to compile bigger projects
like bison/flex by only changing the makefile to their needs, and these
tools are fully functional.
2. LINUX features
- System call compatible with V7 of the UNIX operating system
- Full multiprogramming (multiple programs can run at once)
- Memory paging with copy-on-write
- Demand loading of executables
- Page sharing of executables
- ANSI compliant C compiler (gcc)
- A complete set of compiler writing tools
(bison as yacc-replacement, flex as lex replacement)
- The gnu-born again shell (bash)
- Micro emacs
- most utilities you need for development
(cat, cp, kermit, ls, make, etc.)
- Over 200 library procedures (atoi, fork, malloc, read, stdio, etc.)
- Currently 3 national keyboards: finnish/us/german
- Full source code (in C) for the OS is freely distributable
- Full source code of the tools can be gotten from many anonymous ftp sites
(It's almost completel the GNU project)
- Runs in protected mode on 386 and above
- Support for extended memory up to 16M on 386 and above
- RS-232 serial line support with terminal emulation, kermit, zmodem, etc.
- Supports the real time clock
3. HARDWARE REQUIRED
- A 386 or 486 machine that is an AT-bus-machine. EISA will probably do
too.
- An IDE hard disk is required to use this system.
- Both 5.25" and 3.5" diskettes are supported
- At least 2 megabytes of RAM is required for LINUX to be operational,
but gcc will only work from 4 MB on.
- Any video card will do
- Up to two serial lines are supported
- The real time clock is supported
4. PARTIAL LIST OF UTILITIES INCLUDED IN OR AVAILABLE FOR LINUX 0.10
- The MTOOLS package (reading/writing to DOS)
- The complete GNU filetools (ls,cat,cp,mv,...)
- The GNU C compiler with GNU assembler,linker,ar,...
- bison
- flex
- rcs
- pmake (BSD 4.2 make)
- kermit
- Micro emacs
- less
- mkfs
- fsck
- mount/umount
5. LINUX BINARIES
The LINUX binaries (including all the tools) are available at three
anonymous FTP sites. These are:
nic.funet.fi:/pub/OS/Linux
tsx-11.mit.edu
tupac-amaru.informatik.rwth-aachen.de:/pub/msdos/replace
6. LEGAL STATUS OF LINUX
Although LINUX is supplied with the complete source code, it is
copyrighted software. But it is, opposite to MINIX available for free,
provided you obey to the rules specified in the LINUX copyright.
7. NEWS ABOUT LINUX
Since LINUX's introduction to the public there has been a rapidly
growing mailing list, "linux-activists@joker.cs.hut.fi". To subscribe
to this list, mail to "linux-activists-requests@joker.cs.hut.fi". If
the traffic in this lists increases further, there are plans to swap
(at least partially) over to comp.os.misc, so watch out for any LINUX
articles in this group. If you simply want to know whats the current
state of the art, do a "finger torvalds@kruuna.helsinki.fi", and you'll
get some information.
8. FUTURE PLANS
The major current project is bringing LINUX to a version number
greater than 1.0. It has also to undergo some (minor) revisions to be
compatible to the IEEE POSIX P1003.1 and P1003.2 standards. Various
people are currently working on
- math support/fp emulation in the kernel
- Page swapping (since paging is alreay implemented)
- A virtual filesystem layer
- STREAMS
If you want to join the developers, join the mailing list

View File

@@ -0,0 +1,206 @@
Using Linux v0.11
Linus Torvalds 08.12.91
NOTE: Users of 0.10, please check the "changed" list before using 0.11.
Booting linux
Linux-0.11 can easily be booted by getting the 2 files bootimage-0.11.Z
and rootimage-0.11.Z from the linux archive, uncompressing them and
writing them out to disks of the same size (ie 2 1.44M floppies or 2
1.2M floppies). Writing the disks is done with the "rawrite.exe" program
from dos, or with "dd" from unix. Linux is then booted simply by
inserting the bootdiskette in drive A, and rebooting the machine. If
everything goes well, linux will ask you to insert the root-disk after
loading the system. Hopefully linux will then correctly load the shell
executable, and leave you as root on the new system (prompt '# ').
Using it.
You can get a complete list of available commands by pressing <tab>
twice: the root-disk contains mostly setup-programs needed to install
the system on a harddisk. You can test them a bit, reading directories
etc.
In order to install linux on the harddisk, first check out your harddisk
by executing the command "fdisk" - it should show you all the partitions
available. If you have only 1 AT-harddisk, you should get a
errormessage, just ignore it. At my system fdisk reports the following:
/dev/hd1: 20476 blocks minix
/dev/hd2: 19975 blocks minix
/dev/hd3: 1020 blocks minix
/dev/hd4: 170 blocks active 16-bit DOS (>=32M)
/dev/hd6: 41641 blocks active minix
The partition type given (12-bit DOS, minix etc) doesn{t really mean
anything, unless it's a "extended partition", in which case you
shouldn't use that partition for anything: linux doesn't yet understand
them. When later using "mkfs" to make a linux file system, it won't
change the output of fdisk, so fdisk may well report "DOS", while in
fact you have made it a linux partition.
If fdisk doesn't print out anything but errors, linux is unable to read
your harddisk, and you are f**ked. Play around with the floppy version,
but you won't be able to do anything real.
Making a filesystem
In order to really use linux, you will have to make a filesystem on your
harddisk. This starts by deciding which partition you can use. Look
again at what fdisk reports, and try to figure out which of the
partitions you are using for DOS, OS/2 etc. /dev/hdX where X={1,2,3,4}
always refers to the first harddisk, X={6,7,8,9} always refers to the
second disk. /dev/hd0 and /dev/hd5 are special: they are all of the
drive, and mkfs will refuse to use them for a filesystem.
When you are certain you know which device points to which partition,
you make a filesystem on the partition of your choice by writing:
mkfs -c /dev/hdX blocks
where "-c" means that you want mkfs to check for errors, "dev/hdX" is
the free partition you intend to use for linux, and "blocks" is the
number of blocks fdisk reports for that particular partition. NOTE! mkfs
will overwrite the partition you selected, so be doubly (or triply) sure
that you don't mind that.
Note that when using the "-c" flag, mkfs will read through the entire
partition: this can take some time. If there are read errors, mkfs will
mark the particular block as bad, and continue: linux will also print a
little message "harddisk I/O error". After running mkfs these messages
should never occur again: if they do, your data may be corrupted.
Mounting the filesystem
After mkfs has exited, it's time to mount the file-system, and do the
necessary things to make it a root file system. Mount the new filesystem
on /user by writing:
cd /
mount /dev/hdX /user
If you get errors for this, mkfs failed, and there is probably something
seriously wrong.
After mounting the device, you want to move all the files on the current
floppy-root to the new fs. This can most easily be done by writing:
cd /user
for i in bin dev etc usr tmp floppy
do
cp +recursive +verbose /$i $i
done
sync
which will also tell you what it is doing (/bin/sh -> bin/sh etc).
After that, you should have a new filesystem that contains the bare
necessities to start hacking linux. Play around some more, and exit
linux by writing "logout or exit". This should result in
child 4 died with error code 0000
#
Do a couple of syncs (3 is a magic number), and reboot the machine.
ALWAYS remember to sync before rebooting: terrible things happen if you
don't.
Using the harddisk as root
Once you have happily made a new root, you will want to boot up with it.
This is done by changing a word at offset 508 in the boot-image. The
word (in 386-order, ie low byte first) tells the system which device to
use as root: it is initially 0, which means that we want to use a floppy
of the same type as the boot-disk (and this is the reason that you may
not use a 360kB boot-disk even though the system fits on one: it has to
be the same type as the root-diskette).
In order to use the harddisk as root, this value has to be changed to
point to the correct device. Harddisks have a major number of 3 under
linux, and the minor nr is the same as the number X in /dev/hdX. The
complete device number is then calculated with
DEV_NO = (major<<8)+minor
or alternatively major*256+minor. Thus /dev/hd1 is (3<<8)+1 = 0x301,
/dev/hd6 = 0x0306 etc. Assuming the partition you made into the new root
was /dev/hd2, you will have to write 0x0302 into the boot-image. That
is, you should change the 508th byte in the image to 0x02, and the 509th
byte to 0x03. There is a sample program for this in some of the older
INSTALL-notes, if you don't understand what it's all about.
Ok, I got the root on hd, what now?
As you have probably noticed, you cannot get very far with the binaries
found on the original root-diskette. So the first thing you want to do
is to import some new binaries. To do this you need to tell linux what
kind of floppies you have, as that's the easiest way to import things.
As with harddisk, floppies have device numbers, but this time major = 2
instead of 3. The minor number is not as easy: it's a composite that
tells which drive (A, B, C or D) and what type of drive (360kB, 1.2M,
1.44M etc). The formula is 'minor = type*4+nr', where nr is 0-3 for A-D,
and type is 2 for 1.2M disks, and 7 for 1.44M disks. There are other
types, but these should suffice for now.
Thus if you have a 1.2M A-drive, and want to call it "floppy0", you have
to tell linux so. This is done with the "mknod" command. mknod takes 4
paramters: the unix name of the device, a "b" or a "c" depending on
whether it's a Block of Character device, and the major and minor
numbers. Thus to make "floppy0" a 1.2M A-drive, you write:
mknod /dev/floppy0 b 2 8
b is for Block-device, the 2 is for floppy, and the 8 is 4*2+0, where
the 2 is 1.2M-drive and the 0 is drive A. Likewise to make a "floppy1"
device that is a 1.44M drive in B, you write:
mknod /dev/floppy1 b 2 29
where 29 = 4*7 + 1. There are a couple of standard names, for users
that are used to minix (major, minor in parentheses): /dev/PS0 is a
1.44M in A (2,28), /dev/PS1 a 1.44M in B (2,29), /dev/at0 is a 1.2M in A
(2,8), /dev/at1 is a 1.2M in B (2,9). Use mknod to make those that fit
your computer.
After you have made these special block devices, you can now read a
floppy under linux. The easiest way to import things into linux is by
writing a tar-file to a floppy with rawrite.exe, and then using:
tar xvf /dev/floppy0
to untar it under linux. This way you can get the gcc binaries etc
available from the linux-carrying sites.
Changes from 0.10:
- /bin/update is no longer automatically executed upon bootup: instead
the file /etc/rc is evaluated by the shell. This file can then start the
update process, mount andy needed filesystems, possibly fsck'ing them
first. A minimal /etc/rc looks like this:
/bin/update &
> /etc/mtab
echo " Ok."
- init() restarts the shell every time it is exited: logout from the
login shell results in a "child xxx died with error code yyy", a sync
and then a new shell as root.
- floppies work a lot better than in 0.10. Even using two floppies at
the same time seems to work out ok. Reading big chunks at a time is also
faster then in 0.10 (I think).
- harddisk errors are handled better. Use the "-c" option in mkfs to map
out all errors.
- linux accepts most video-cards: harcules, MDA, CGA etc seem to work.
- ^G beeps on the console, so command completion under bash etc will
notify of errors.
- sticky directories, corrected handling of uid/gid bits, and better
handling of protections when not root. Most of these won't be noticeable
until we get a init/login.

Binary file not shown.

Binary file not shown.

386
Linux-0.11/info/vt102.codes Normal file
View File

@@ -0,0 +1,386 @@
Escape codes for vt102 terminal. <kivinen@hut.fi>
All numbers below are octal.<n> means numeric value,<c> means character string.
If <n> is missing it is 0 or in cursor movements 1.
Reset and set modes
Set Modes
Esc [ <c> ; ... ; <c> h
033 133 073 073 150
Reset Modes
Esc [ <c> ; ... ; <c> l
033 133 073 073 154
Where <c> is
'2'= Lock keyboard (set); Unlock keyboard (reset)
'4'= Insert mode (set); Replace mode (reset)
'12'= Echo on (set); Echo off (reset)
'20'= Return = CR+LF (set); Return = CR (reset)
'?1'= Cursorkeys application (set); Cursorkeys normal (reset)
'?2'= Ansi (set); VT52 (reset)
'?3'= 132 char/row (set); 80 char/row (reset)
'?4'= Jump scroll (set); Smooth scroll (reset)
'?5'= Reverse screen (set); Normal screen (reset)
'?6'= Sets relative coordinates (set); Sets absolute coordinates (reset)
'?7'= Auto wrap (set); Auto wrap off (reset)
'?8'= Auto repeat on (set); Auto repeat off (reset)
'?18'= Send FF to printer after print screen (set); No char after PS (reset)
'?19'= Print screen prints full screen (set); PS prints scroll region (reset)
'?25'= Cursor on (set); Cursor off (reset)
Set scrolling region (n1=upper,n2=lower)
Esc [ <n1> ; <n2> r
033 133 073 162
Cursor movement (<n>=how many chars or lines), cursor stop at margin.
Up
Esc [ <n> A
033 133 101
Down
Esc [ <n> B
033 133 102
Right
Esc [ <n> C
033 133 103
Left
Esc [ n D
033 133 104
Cursor position (<n1>=y,<n2>=x, from top of screen or scroll region)
Esc [ <n1> ; <n2> H
033 133 073 110
Or Esc [ <n1> ; <n2> f
033 133 073 146
Index (cursor down with scroll up when at margin)
Esc D
033 104
Reverse index (cursor up with scroll down when at margin)
Esc M
033 115
Next line (CR+Index)
Esc E
033 105
Save cursor and attribute
Esc 7
033 067
Restore cursor and attribute
Esc 8
033 070
Keybad character selection
Application keypad mode
Esc =
033 075
Numeric keypad mode
Esc >
033 076
Keypadkeys codes generated
Numeric Application VT52 Application
0 0 (060) Esc O p (033 117 160) Esc ? p (033 077 160)
1 1 (061) Esc O q (033 117 161) Esc ? q (033 077 161)
2 2 (062) Esc O r (033 117 162) Esc ? r (033 077 162)
3 3 (063) Esc O s (033 117 163) Esc ? s (033 077 163)
4 4 (064) Esc O t (033 117 164) Esc ? t (033 077 164)
5 5 (065) Esc O u (033 117 165) Esc ? u (033 077 165)
6 6 (066) Esc O v (033 117 166) Esc ? v (033 077 166)
7 7 (067) Esc O w (033 117 167) Esc ? w (033 077 167)
8 8 (070) Esc O x (033 117 170) Esc ? x (033 077 170)
9 9 (071) Esc O y (033 117 171) Esc ? y (033 077 171)
- (minus) - (055) Esc O m (033 117 155) Esc ? m (033 077 155)
, (comma) , (054) Esc O l (033 117 154) Esc ? l (033 077 154)
. (period) . (056) Esc O n (033 117 156) Esc ? n (033 077 156)
Enter CR (015)* Esc O M (033 117 115) Esc ? M (033 077 115)
PF1 Esc O P Esc O P (033 117 120) Esc P (033 120)
PF2 Esc O Q Esc O Q (033 117 121) Esc Q (033 121)
PF3 Esc O R Esc O R (033 117 122) Esc R (033 122)
PF4 Esc O S Esc O S (033 117 123) Esc S (033 123)
* Or CR+LF (015 012)
Cursorkeys codes generated (changed by set and reset modes '?1')
normal application
Up Esc [ A Esc O A
033 133 101 033 117 101
Down Esc [ B Esc O B
033 133 102 033 117 102
Right Esc [ C Esc O C
033 133 103 033 117 103
Left Esc [ D Esc O D
033 133 104 033 117 104
Select chaacter set
UK as G0
Esc ( A
033 050 101
US as G0
Esc ( B
033 050 102
Special characters and line drawing character set as G0
Esc ( 0
033 050 060
Alternate ROM as G0
Esc ( 1
033 050 061
Alternate ROM special characters character set as G0
Esc ( 2
033 050 062
UK as G1
Esc ) A
033 051 101
US as G1
Esc ) B
033 051 102
Special characters and line drawing character set as G1
Esc ) 0
033 051 060
Alternate ROM as G1
Esc ) 1
033 051 061
Alternate ROM special characters character set as G1
Esc ) 2
033 051 062
Selects G2 for one character
Esc N
033 115
Selects G3 for one character
Esc O
033 117
Set graphic rendition
Esc [ <n> ; <n> m
033 133 073 156
Where <n> is
0 = Turn off attributes
1 = Bold (Full)
2 = Half
4 = Underline
5 = Blink
7 = Reverse
21 = Normal intensity
22 = Normal intensity
24 = Cancel underlined
25 = Cancel blinking
27 = Cancel reverse
Tab stops
Set horizontal tab
Esc H
033 110
Clear horizontal tab
Esc [ g
033 133 147
Or Esc [ 0 g
033 133 060 147
Clear all horizontal tabs
Esc [ 3 g
033 133 063 147
Line attributes
Double-height
Top half
Esc # 3
033 043 063
Bottom half
Esc # 4
033 043 064
Single-width, single-height
Esc # 5
033 043 065
Double-width
Esc # 6
033 043 066
Erasing
Erase in line
End of line (including cursor position)
Esc [ K
033 133 113
Or Esc [ 0 K
033 133 060 113
Beginning of line (including cursor position)
Esc [ 1 K
033 133 061 113
Complete line
Esc [ 2 K
033 133 062 113
Erase in display
End of screen (including cursor position)
Esc [ J
033 133 112
Or Esc [ 0 J
033 133 060 112
Beginning of screen (including cursor position)
Esc [ 1 J
033 133 061 112
Complete display
Esc [ 2 J
033 133 062 112
Computer editing
Delete characters (<n> characters right from cursor
Esc [ <n> P
033 133 120
Inser line (<n> lines)
Esc [ <n> L
033 133 114
Delete line (<n> lines)
Esc [ <n> M
033 133 115
Printing
Esc [ <c> i
033 133 151
Where <c> is
''= Same as '0'
'0'= Prints screen (full or scroll region)
'4'= Printer controller off
'5'= Printer controller on (Print all received chars to printer)
'?1'= Print cursor line
'?4'= Auto print off
'?5'= Auto print on (Prints line to printer when you exit from it)
Reports
Device status
Esc [ <c> n
033 133 156
Where <c> is
'0'=Response Ready, no malfunctions detected
'3'=Malfunction, error in self-test.
'5'=Status report request
'6'=Request cursor position.
'?10'=Response to printer status request, All ok.
'?11'=Response to printer status request, Printer is not ready.
'?13'=Response to printer status request, No printer.
'?15'=Status report request from printer
Cursor position raport (Response to request cursor position)
Esc [ <n1> ; <n2> R
033 133 073 122
Request terminal to identify itself (esc Z may not be supported in future)
Esc [ c
033 133 143
Esc [ 0 c
033 133 060 143
Esc Z
033 132
Response to terminal identify (VT102)
Esc [ ? 6 c
033 133 077 066 143
Reset to initial state
Esc c
033 143
Tests
Invoke confidence test
Esc [ 2 ; <n> y
033 133 062 073 171
Where <n> is
'1'= Power-up test
'2'= Data loopback test
'4'= EIA loopback test
'9'= Power-up tests (continuously)
'10'= Data loopback tests (continuously)
'12'= EIA loopback tests (continuously)
'16'= Printer loopback test
'24'= Printer loopback tests (continuously)
Screen adjustments
Esc # 8
033 043 070
Keyboard indicator
Led L1 off
Esc [ 0 q
033 133 060 181
Led L1 on
Esc [ 1 q
033 133 061 181
VT52 sequences
Ansi mode
Esc <
033 074
Cursor positioning
Up Esc A
033 101
Down Esc B
033 102
Right Esc C
033 103
Left Esc D
033 104
Home Esc H
033 110
Direct cursor address
Esc Y <line+040> <columns+040>
033 131
Reverse linefeed Esc I
033 111
Erase to end of line Esc K
033 113
Erase to end of screen Esc J
033 112
Auto print on Esc ^
033 136
Auto print off Esc
033 137
Printer controller on Esc W
033 127
Printer controller off Esc X
033 130
Print cursor line Esc V
033 135
Print screen Esc ]
033 135
Indentify request Esc Z
033 132
Response to indetify Esc / Z
request (VT52) 033 057 132
Special charset (same Esc F
as line draw in VT102 033 106
Normal char set Esc G
033 107
Control characters
000 = Null (fill character)
003 = ETX (Can be selected half-duplex turnaround char)
004 = EOT (Can be turnaround or disconnect char, if turn, then DLE-EOT=disc.)
005 = ENQ (Transmits answerback message)
007 = BEL (Generates bell tone)
010 = BS (Moves cursor left)
011 = HT (Moves cursor to next tab)
012 = LF (Linefeed or New line operation)
013 = VT (Processed as LF)
014 = FF (Processed as LF, can be selected turnaround char)
015 = CR (Moves cursor to left margin, can be turnaround char)
016 = SO (Selects G1 charset)
017 = SI (Selects G0 charset)
021 = DC1 (XON, causes terminal to continue transmit)
023 = DC3 (XOFF, causes terminal to stop transmitting)
030 = CAN (Cancels escape sequence)
032 = SUB (Processed as CAN)
033 = ESC (Processed as sequence indicator)

View File

@@ -0,0 +1,502 @@
.\"#! troff -Q -ms $1
.\" This is the "Xterm Control Sequences" document, originally written by
.\" Edward Moy, University of California, Berkeley, for the X.V10R4 xterm.
.\" Some minor edits have been made to begin to reconcile this document with
.\" the current sources, but it still has a long way to go:
.\"
.\" 1) I don't guarantee that this is 100% correct. I tried most of
.\" the things that seemed to be different, and this document
.\" reflects what I saw. Stuff that appears to be in the X10R4
.\" document and missing from this document is so because it
.\" appears not to be present in the X11 version of "xterm" (e.g.,
.\" the "Alternate Character ROM" character sets and the Sun TTY
.\" emulation).
.\"
.\" 2) It is definitely not 100% complete; some escape sequences
.\" that do something that's either unobservable - at least in
.\" the current state of the code - or not useful aren't
.\" documented. An example of the former are the Locking Shift
.\" sequences that modify the interpretation of the GR
.\" characters; at present, it sets a state variable that's
.\" unused, but perhaps some future version will use it (perhaps
.\" for displaying characters in the range 0200-0377?). An
.\" example of the latter is the sequence to set DECANM mode
.\" (ANSI/VT52 mode): it doesn't do what it does on a VT100,
.\" namely get the terminal to emulate a VT100, it only seems to
.\" fiddle the current character set a bit.
.\"
.\" 3) It doesn't document any of the mouse-related stuff, such as
.\" what the "Track Mouse" escape sequence does, or what the
.\" different mouse modes (MIT, VT220, "VT220 Hilite") do; I
.\" leave that to somebody familiar with that part of the code....
.\"
.\" Run this file through troff and use the -ms macro package.
.ND
.de St
.sp
.nr PD 0
.nr PI 1.5i
.nr VS 16
..
.de Ed
.nr PD .3v
.nr VS 12
..
.rm CH
.ds LH Xterm Control Sequences
.nr s 6*\n(PS/10
.ds L \s\nsBEL\s0
.ds E \s\nsESC\s0
.ds T \s\nsTAB\s0
.ds X \s\nsETX\s0
.ds N \s\nsENQ\s0
.ds e \s\nsETB\s0
.ds C \s\nsCAN\s0
.ds S \s\nsSUB\s0
.nr [W \w'\*L'u
.nr w \w'\*E'u
.if \nw>\n([W .nr [W \nw
.nr w \w'\*T'u
.if \nw>\n([W .nr [W \nw
.nr w \w'\*X'u
.if \nw>\n([W .nr [W \nw
.nr w \w'\*N'u
.if \nw>\n([W .nr [W \nw
.nr w \w'\*e'u
.if \nw>\n([W .nr [W \nw
.nr w \w'\*C'u
.if \nw>\n([W .nr [W \nw
.nr w \w'\*S'u
.if \nw>\n([W .nr [W \nw
.nr [W +\w'\|\|'u
.de []
.nr w \w'\\$2'
.nr H \\n([Wu-\\nwu
.nr h \\nHu/2u
.ds \\$1 \(br\v'-1p'\(br\v'1p'\h'\\nhu'\\$2\h'\\nHu-\\nhu'\(br\l'-\\n([Wu\(ul'\v'-1p'\(br\l'-\\n([Wu\(rn'\v'1p'\|
..
.[] Et \v'-1p'\*X\v'1p'
.[] En \v'-1p'\*N\v'1p'
.[] Be \v'-1p'\*L\v'1p'
.[] Bs \v'-1p'\s\nsBS\s0\v'1p'
.[] Ta \v'-1p'\*T\v'1p'
.[] Lf \v'-1p'\s\nsLF\s0\v'1p'
.[] Vt \v'-1p'\s\nsVT\s0\v'1p'
.[] Ff \v'-1p'\s\nsFF\s0\v'1p'
.[] Cr \v'-1p'\s\nsCR\s0\v'1p'
.[] So \v'-1p'\s\nsSO\s0\v'1p'
.[] Si \v'-1p'\s\nsSI\s0\v'1p'
.[] Eb \v'-1p'\*e\v'1p'
.[] Ca \v'-1p'\*C\v'1p'
.[] Su \v'-1p'\*S\v'1p'
.[] Es \v'-1p'\*E\v'1p'
.[] Fs \v'-1p'\s\nsFS\s0\v'1p'
.[] Gs \v'-1p'\s\nsGS\s0\v'1p'
.[] Rs \v'-1p'\s\nsRS\s0\v'1p'
.[] Us \v'-1p'\s\nsUS\s0\v'1p'
.[] # #
.[] (( (
.[] ) )
.[] * *
.[] + +
.[] 0 0
.[] 1 1
.[] 2 2
.[] 3 3
.[] 4 4
.[] 5 5
.[] 6 6
.[] 7 7
.[] 8 8
.[] 9 9
.[] : :
.[] ; ;
.[] = =
.[] > >
.[] ? ?
.[] @ @
.[] A A
.[] cB B
.[] C C
.[] D D
.[] E E
.[] F F
.[] H H
.[] J J
.[] K K
.[] L L
.[] M M
.[] N N
.[] O O
.[] P P
.[] R R
.[] S S
.[] T T
.[] Z Z
.[] [[ [
.[] ] ]
.[] ` \`
.[] a a
.[] b b
.[] c c
.[] d d
.[] f f
.[] g g
.[] h h
.[] i i
.[] j j
.[] k k
.[] l l
.[] m m
.[] n n
.[] o o
.[] p p
.[] q q
.[] r r
.[] s s
.[] t t
.[] x x
.[] | |
.[] } }
.[] c~ ~
.ds Cc \fIC\fP
.ds Ps \fIP\v'.3m'\h'-.2m'\s-2s\s0\v'-.3m'\fP
.ds Pm \fIP\v'.3m'\h'-.2m'\s-2m\s0\v'-.3m'\fP
.ds Pt \fIP\v'.3m'\h'-.2m'\s-2t\s0\v'-.3m'\fP
.ds Ix \fIx\fP
.ds Iy \fIy\fP
.ds Iw \fIw\fP
.ds Ih \fIh\fP
.ds Ir \fIr\fP
.ds Ic \fIc\fP
.nr LL 6.5i
.TL
Xterm Control Sequences
.am NP
.ds CF %
..
.SH
Definitions
.IP \*(Cc
A single (required) character.
.IP \*(Ps
A single (usually optional) numeric parameter, composed of one of more digits.
.IP \*(Pm
A multiple numeric parameter composed of any number of single numeric
parameters, separated by \*; character(s).
.IP \*(Pt
A text parameter composed of printable characters.
.SH
VT102 Mode
.ds RH VT102 Mode
.LP
Most of these control sequences are standard VT102 control sequences.
There are, however, additional ones to provide control of
.I xterm
dependent functions, like the scrollbar or window size.
.St
.IP \\*(Be
Bell (Ctrl-G)
.IP \\*(Bs
Backspace (Ctrl-H)
.IP \\*(Ta
Horizontal Tab (Ctrl-I)
.IP \\*(Lf
Line Feed or New Line (Ctrl-J)
.IP \\*(Vt
Vertical Tab (Ctrl-K)
.IP \\*(Ff
Form Feed or New Page (Ctrl-L)
.IP \\*(Cr
Carriage Return (Ctrl-M)
.IP \\*(So
Shift Out (Ctrl-N) \(-> Switch to Alternate Character Set
.IP \\*(Si
Shift In (Ctrl-O) \(-> Switch to Standard Character Set
.IP \\*(Es\\*#\\*8
DEC Screen Alignment Test (DECALN)
.IP \\*(Es\\*(((\\*(Cc
Select G0 Character Set (SCS)
\*(Cc = \*0 \(-> Special Character and Line Drawing Set
\*(Cc = \*A \(-> United Kingdom (UK)
\*(Cc = \*(cB \(-> United States (USASCII)
.IP \\*(Es\\*)\\*(Cc
Select G1 Character Set (SCS)
\*(Cc = \*0 \(-> Special Character and Line Drawing Set
\*(Cc = \*A \(-> United Kingdom (UK)
\*(Cc = \*(cB \(-> United States (USASCII)
.IP \\*(Es\\**\\*(Cc
Select G2 Character Set (SCS)
\*(Cc = \*0 \(-> Special Character and Line Drawing Set
\*(Cc = \*A \(-> United Kingdom (UK)
\*(Cc = \*(cB \(-> United States (USASCII)
.IP \\*(Es\\*+\\*(Cc
Select G3 Character Set (SCS)
\*(Cc = \*0 \(-> Special Character and Line Drawing Set
\*(Cc = \*A \(-> United Kingdom (UK)
\*(Cc = \*(cB \(-> United States (USASCII)
.IP \\*(Es\\*7
Save Cursor (DECSC)
.IP \\*(Es\\*8
Restore Cursor (DECRC)
.IP \\*(Es\\*=
Application Keypad (DECPAM)
.IP \\*(Es\\*>
Normal Keypad (DECPNM)
.IP \\*(Es\\*D
Index (IND)
.IP \\*(Es\\*E
Next Line (NEL)
.IP \\*(Es\\*H
Tab Set (HTS)
.IP \\*(Es\\*M
Reverse Index (RI)
.IP \\*(Es\\*N
Single Shift Select of G2 Character Set (SS2)
.IP \\*(Es\\*O
Single Shift Select of G3 Character Set (SS3)
.IP \\*(Es\\*Z
Return Terminal ID (DECID)
.IP \\*(Es\\*([[\\*(Ps\|\\*@
Insert \*(Ps (Blank) Character(s) (default = 1) (ICH)
.IP \\*(Es\\*([[\\*(Ps\|\\*A
Cursor Up \*(Ps Times (default = 1) (CUU)
.IP \\*(Es\\*([[\\*(Ps\|\\*(cB
Cursor Down \*(Ps Times (default = 1) (CUD)
.IP \\*(Es\\*([[\\*(Ps\|\\*C
Cursor Forward \*(Ps Times (default = 1) (CUF)
.IP \\*(Es\\*([[\\*(Ps\|\\*D
Cursor Backward \*(Ps Times (default = 1) (CUB)
.IP \\*(Es\\*([[\\*(Ps\|\\*;\\*(Ps\|\\*H
Cursor Position [row;column] (default = [1,1]) (CUP)
.IP \\*(Es\\*([[\\*(Ps\|\\*J
Erase in Display (ED)
\*(Ps = \*0 \(-> Clear Below (default)
\*(Ps = \*1 \(-> Clear Above
\*(Ps = \*2 \(-> Clear All
.IP \\*(Es\\*([[\\*(Ps\|\\*K
Erase in Line (EL)
\*(Ps = \*0 \(-> Clear to Right (default)
\*(Ps = \*1 \(-> Clear to Left
\*(Ps = \*2 \(-> Clear All
.IP \\*(Es\\*([[\\*(Ps\|\\*L
Insert \*(Ps Line(s) (default = 1) (IL)
.IP \\*(Es\\*([[\\*(Ps\|\\*M
Delete \*(Ps Line(s) (default = 1) (DL)
.IP \\*(Es\\*([[\\*(Ps\|\\*P
Delete \*(Ps Character(s) (default = 1) (DCH)
.IP \\*(Es\\*([[\\*(Ps\|\\*;\\*(Ps\|\\*;\\*(Ps\|\\*;\\*(Ps\|\\*;\\*(Ps\|\\*T
Track Mouse [func;startcol;startrow;firstrow;lastrow] XXX - describe
.IP \\*(Es\\*([[\\*(Ps\|\\*c
Device Attributes (default 0) (DA)
.IP \\*(Es\\*([[\\*(Ps\|\\*;\\*(Ps\|\\*f
Horizontal and Vertical Position [row;column] (default = [1,1]) (HVP)
.IP \\*(Es\\*([[\\*(Ps\|\\*g
Tab Clear
\*(Ps = \*0 \(-> Clear Current Column (default)
\*(Ps = \*3 \(-> Clear All
.IP \\*(Es\\*([[\\*(Ps\|\\*h
Mode Set (SET)
\*(Ps = \*4 \(-> Insert Mode (IRM)
\*(Ps = \*2\*0 \(-> Automatic Linefeed (LNM)
.IP \\*(Es\\*([[\\*(Ps\|\\*l
Mode Reset (RST)
\*(Ps = \*4 \(-> Insert Mode (IRM)
\*(Ps = \*2\*0 \(-> Automatic Linefeed (LNM)
.IP \\*(Es\\*([[\\*(Pm\|\\*m
Character Attributes (SGR)
\*(Ps = \*0 \(-> Normal (default)
\*(Ps = \*1 \(-> Blink (appears as Bold)
\*(Ps = \*4 \(-> Underscore
\*(Ps = \*5 \(-> Bold
\*(Ps = \*7 \(-> Inverse
.IP \\*(Es\\*([[\\*(Ps\|\\*n
Device Status Report (DSR)
\*(Ps = 5 \(-> Status Report \*(Es\*([[\*0\*n \(-> OK
\*(Ps = 6 \(-> Report Cursor Position (CPR) [row;column] as
\*(Es\*([[\*(Ir\|\*;\*(Ic\|\*R
.IP \\*(Es\\*([[\\*(Ps\|\\*;\\*(Ps\|\\*r
Set Scrolling Region [top;bottom] (default = full size of window) (DECSTBM)
.IP \\*(Es\\*([[\\*(Ps\|\\*x
Request Terminal Parameters (DECREQTPARM)
.IP \\*(Es\\*([[\\*?\\*(Ps\|\\*h
DEC Private Mode Set (DECSET)
\*(Ps = \*1 \(-> Application Cursor Keys (DECCKM)
\*(Ps = \*3 \(-> 132 Column Mode (DECCOLM)
\*(Ps = \*4 \(-> Smooth (Slow) Scroll (DECSCLM)
\*(Ps = \*5 \(-> Reverse Video (DECSCNM)
\*(Ps = \*6 \(-> Origin Mode (DECOM)
\*(Ps = \*7 \(-> Wraparound Mode (DECAWM)
\*(Ps = \*8 \(-> Auto-repeat Keys (DECARM)
\*(Ps = \*9 \(-> Send MIT Mouse Row & Column on Button Press
\*(Ps = \*3\*8 \(-> Enter Tektronix Mode (DECTEK)
\*(Ps = \*4\*0 \(-> Allow 80 \z\(<-\(-> 132 Mode
\*(Ps = \*4\*1 \(-> \fIcurses\fP(5) fix
\*(Ps = \*4\*4 \(-> Turn On Margin Bell
\*(Ps = \*4\*5 \(-> Reverse-wraparound Mode
\*(Ps = \*4\*6 \(-> Start Logging
\*(Ps = \*4\*7 \(-> Use Alternate Screen Buffer
\*(Ps = \*1\*0\*0\*0 \(-> Send VT200 Mouse Row & Column on Button Press
\*(Ps = \*1\*0\*0\*3 \(-> Send VT200 Hilite Mouse Row & Column on Button Press
.IP \\*(Es\\*([[\\*?\\*(Ps\|\\*l
DEC Private Mode Reset (DECRST)
\*(Ps = \*1 \(-> Normal Cursor Keys (DECCKM)
\*(Ps = \*3 \(-> 80 Column Mode (DECCOLM)
\*(Ps = \*4 \(-> Jump (Fast) Scroll (DECSCLM)
\*(Ps = \*5 \(-> Normal Video (DECSCNM)
\*(Ps = \*6 \(-> Normal Cursor Mode (DECOM)
\*(Ps = \*7 \(-> No Wraparound Mode (DECAWM)
\*(Ps = \*8 \(-> No Auto-repeat Keys (DECARM)
\*(Ps = \*9 \(-> Don't Send Mouse Row & Column on Button Press
\*(Ps = \*4\*0 \(-> Disallow 80 \z\(<-\(-> 132 Mode
\*(Ps = \*4\*1 \(-> No \fIcurses\fP(5) fix
\*(Ps = \*4\*4 \(-> Turn Off Margin Bell
\*(Ps = \*4\*5 \(-> No Reverse-wraparound Mode
\*(Ps = \*4\*6 \(-> Stop Logging
\*(Ps = \*4\*7 \(-> Use Normal Screen Buffer
\*(Ps = \*1\*0\*0\*0 \(-> Don't Send Mouse Row & Column on Button Press
\*(Ps = \*1\*0\*0\*3 \(-> Don't Send Mouse Row & Column on Button Press
.IP \\*(Es\\*([[\\*?\\*(Ps\|\\*r
Restore DEC Private Mode
\*(Ps = \*1 \(-> Normal/Application Cursor Keys (DECCKM)
\*(Ps = \*3 \(-> 80/132 Column Mode (DECCOLM)
\*(Ps = \*4 \(-> Jump (Fast)/Smooth (Slow) Scroll (DECSCLM)
\*(Ps = \*5 \(-> Normal/Reverse Video (DECSCNM)
\*(Ps = \*6 \(-> Normal/Origin Cursor Mode (DECOM)
\*(Ps = \*7 \(-> No Wraparound/Wraparound Mode (DECAWM)
\*(Ps = \*8 \(-> Auto-repeat/No Auto-repeat Keys (DECARM)
\*(Ps = \*9 \(-> Don't Send/Send MIT Mouse Row & Column on Button Press
\*(Ps = \*4\*0 \(-> Disallow/Allow 80 \z\(<-\(-> 132 Mode
\*(Ps = \*4\*1 \(-> Off/On \fIcurses\fP(5) fix
\*(Ps = \*4\*4 \(-> Turn Off/On Margin Bell
\*(Ps = \*4\*5 \(-> No Reverse-wraparound/Reverse-wraparound Mode
\*(Ps = \*4\*6 \(-> Stop/Start Logging
\*(Ps = \*4\*7 \(-> Use Normal/Alternate Screen Buffer
\*(Ps = \*1\*0\*0\*0 \(-> Don't Send/Send VT220 Mouse Row & Column on Button Press
\*(Ps = \*1\*0\*0\*3 \(-> Don't Send/Send VT220 Hilite Mouse Row & Column on Button Press
.IP \\*(Es\\*([[\\*?\\*(Ps\|\\*s
Save DEC Private Mode
\*(Ps = \*1 \(-> Normal/Application Cursor Keys (DECCKM)
\*(Ps = \*3 \(-> 80/132 Column Mode (DECCOLM)
\*(Ps = \*4 \(-> Jump (Fast)/Smooth (Slow) Scroll (DECSCLM)
\*(Ps = \*5 \(-> Normal/Reverse Video (DECSCNM)
\*(Ps = \*6 \(-> Normal/Origin Cursor Mode (DECOM)
\*(Ps = \*7 \(-> No Wraparound/Wraparound Mode (DECAWM)
\*(Ps = \*8 \(-> Auto-repeat/No Auto-repeat Keys (DECARM)
\*(Ps = \*9 \(-> Don't Send/Send MIT Mouse Row & Column on Button Press
\*(Ps = \*4\*0 \(-> Disallow/Allow 80 \z\(<-\(-> 132 Mode
\*(Ps = \*4\*1 \(-> Off/On \fIcurses\fP(5) fix
\*(Ps = \*4\*4 \(-> Turn Off/On Margin Bell
\*(Ps = \*4\*5 \(-> No Reverse-wraparound/Reverse-wraparound Mode
\*(Ps = \*4\*6 \(-> Stop/Start Logging
\*(Ps = \*4\*7 \(-> Use Normal/Alternate Screen Buffer
\*(Ps = \*1\*0\*0\*0 \(-> Don't Send/Send VT220 Mouse Row & Column on Button Press
\*(Ps = \*1\*0\*0\*3 \(-> Don't Send/Send VT220 Hilite Mouse Row & Column on Button Press
.IP \\*(Es\\*]\\*(Ps\|\\*;\\*(Pt\|\\*(Be
Set Text Parameters
\*(Ps = \*0 \(-> Change Icon Name and Window Title to \*(Pt
\*(Ps = \*1 \(-> Change Icon Name to \*(Pt
\*(Ps = \*2 \(-> Change Window Title to \*(Pt
\*(Ps = \*4\*6 \(-> Change Log File to \*(Pt
.IP \\*(Es\\*c
Full Reset (RIS)
.IP \\*(Es\\*n
Locking Shift Select of G2 Character Set (LS2)
.IP \\*(Es\\*o
Locking Shift Select of G3 Character Set (LS3)
.Ed
.SH
Tektronix 4015 Mode
.ds RH Tektronix 4015 Mode
.LP
Most of these sequences are standard Tektronix 4015 control sequences.
The major features missing are the alternate (APL) character set and
the write-thru and defocused modes.
.St
.IP \\*(Be
Bell (Ctrl-G)
.IP \\*(Bs
Backspace (Ctrl-H)
.IP \\*(Ta
Horizontal Tab (Ctrl-I)
.IP \\*(Lf
Line Feed or New Line (Ctrl-J)
.IP \\*(Vt
Vertical Tab (Ctrl-K)
.IP \\*(Ff
Form Feed or New Page (Ctrl-L)
.IP \\*(Cr
Carriage Return (Ctrl-M)
.IP \\*(Es\\*(Et
Switch to VT102 Mode
.IP \\*(Es\\*(En
Return Terminal Status
.IP \\*(Es\\*(Lf
PAGE (Clear Screen)
.IP \\*(Es\\*(Eb
COPY (Save Tektronix Codes to File)
.IP \\*(Es\\*(Ca
Bypass Condition
.IP \\*(Es\\*(Su
GIN mode
.IP \\*(Es\\*(Fs
Special Point Plot Mode
.IP \\*(Es\\*(Gs
Graph Mode (same as \*(Gs)
.IP \\*(Es\\*(Rs
Incremental Plot Mode (same as \*(Rs)
.IP \\*(Es\\*(Us
Alpha Mode (same as \*(Us)
.IP \\*(Es\\*8
Select Large Character Set
.IP \\*(Es\\*9
Select #2 Character Set
.IP \\*(Es\\*:
Select #3 Character Set
.IP \\*(Es\\*;
Select Small Character Set
.IP \\*(Es\\*]\\*(Ps\|\\*;\\*(Pt\|\\*(Be
Set Text Parameters
\*(Ps = \*0 \(-> Change Icon Name and Window Title to \*(Pt
\*(Ps = \*1 \(-> Change Icon Name to \*(Pt
\*(Ps = \*2 \(-> Change Window Title to \*(Pt
\*(Ps = \*4\*6 \(-> Change Log File to \*(Pt
.IP \\*(Es\\*`
Normal Z Axis and Normal (solid) Vectors
.IP \\*(Es\\*a
Normal Z Axis and Dotted Line Vectors
.IP \\*(Es\\*b
Normal Z Axis and Dot-Dashed Vectors
.IP \\*(Es\\*c
Normal Z Axis and Short-Dashed Vectors
.IP \\*(Es\\*d
Normal Z Axis and Long-Dashed Vectors
.IP \\*(Es\\*h
Defocused Z Axis and Normal (solid) Vectors
.IP \\*(Es\\*i
Defocused Z Axis and Dotted Line Vectors
.IP \\*(Es\\*j
Defocused Z Axis and Dot-Dashed Vectors
.IP \\*(Es\\*k
Defocused Z Axis and Short-Dashed Vectors
.IP \\*(Es\\*l
Defocused Z Axis and Long-Dashed Vectors
.IP \\*(Es\\*p
Write-Thru Mode and Normal (solid) Vectors
.IP \\*(Es\\*q
Write-Thru Mode and Dotted Line Vectors
.IP \\*(Es\\*r
Write-Thru Mode and Dot-Dashed Vectors
.IP \\*(Es\\*s
Write-Thru Mode and Short-Dashed Vectors
.IP \\*(Es\\*t
Write-Thru Mode and Long-Dashed Vectors
.IP \\*(Fs
Point Plot Mode
.IP \\*(Gs
Graph Mode
.IP \\*(Rs
Incremental Plot Mode
.IP \\*(Us
Alpha Mode
.Ed

View File

@@ -0,0 +1,220 @@
Date: 12 Sep 89 17:44:43 GMT
From: crdgw1!montnaro@uunet.uu.net (Skip Montanaro)
Organization: GE Corporate Research & Development, Schenectady, NY
Subject: XTerm Escape Sequences (X11 Version)
To: xpert@expo.lcs.mit.edu
I rummaged around through the xterm code and came up with the following
stuff. No guarantees. I'm headed out of town for a couple days and thought
it better to get it out than let it get stale. Comments, bugs, and other
notes are welcome. Somebody else can convert it to troff. I prefer LaTeX.
:-) I will try and get to the Tek mode stuff when I return, although I doubt
it's changed much from X10 XTerm.
I gleaned the basic stuff out of the charproc.c code, by hacking VTparse()
so it spit out leaves of the parse tree. I was mildly surprised to see
things like "ESC # BEL" turn up.
For most folks, the most interesting stuff will probably be "ESC ] Ps ND
string NP" down near the bottom. That's what you use to change the icon and
window labels, and the log file name. Most other things appear the same as
the X10 documentation, although a few DEC-ish mode parameters (42, 43, 48, &
49) seem to have disappeared.
------------------------------------------------------------------------------
BEL Bell (Ctrl-G)
BS Backspace (Ctrl-H)
HT Horizontal Tab (Ctrl-I)
NL Line Feed or New Line (Ctrl-J)
VT Vertical Tab (Ctrl-K)
NP Form Feed or New Page (Ctrl-L)
CR Carriage Return (Ctrl-M)
SO Shift Out (Ctrl-N) -> Switch to Alternate Character Set
SI Shift In (Ctrl-O) -> Switch to Standard Character Set
ESC BEL (Same as non-escaped BEL)
ESC BS (Same as non-escaped BS)
ESC HT (Same as non-escaped HT)
ESC NL (Same as non-escaped NL)
ESC VT (Same as non-escaped VT)
ESC NP (Same as non-escaped NP)
ESC CR (Same as non-escaped CR)
ESC SO (Same as non-escaped SO)
ESC SI (Same as non-escaped SI)
ESC # BEL (Same as non-escaped BEL)
ESC # BS (Same as non-escaped BS)
ESC # HT (Same as non-escaped HT)
ESC # NL (Same as non-escaped NL)
ESC # VT (Same as non-escaped VT)
ESC # NP (Same as non-escaped NP)
ESC # CR (Same as non-escaped CR)
ESC # SO (Same as non-escaped SO)
ESC # SI (Same as non-escaped SI)
ESC # 8 DEC Screen Alignment Test (DECALN)
ESC ( BEL (Same as non-escaped BEL)
ESC ( BS (Same as non-escaped BS)
ESC ( HT (Same as non-escaped HT)
ESC ( NL (Same as non-escaped NL)
ESC ( VT (Same as non-escaped VT)
ESC ( NP (Same as non-escaped NP)
ESC ( CR (Same as non-escaped CR)
ESC ( SO (Same as non-escaped SO)
ESC ( SI (Same as non-escaped SI)
ESC ( C Select G0 Character Set (SCS)
C = 0 -> Special Character and Line Drawing Set
C = 1 -> Alternate Character ROM Standard Set
C = 2 -> Alternate Character ROM Special Set
C = A -> United Kingdom (UK)
C = B -> United States (USASCII)
ESC ) C Select G1 Character Set (SCS)
C takes same values as above
ESC * C Select G2 Character Set (SCS)
C takes same values as above
ESC + C Select G3 Character Set (SCS)
C takes same values as above
ESC 7 Save Cursor (DECSC)
ESC 8 Restore Cursor (DECRC)
ESC = Application Keypad (DECPAM)
ESC > Normal Keypad (DECNM)
ESC D Index (IND)
ESC E Next Line (NEL)
ESC H Tab Set (HTS)
ESC M Reverse Index (RI)
ESC N Single Shift Select of G2 Character Set (SS2)
ESC O Single Shift Select of G3 Character Set (SS3)
ESC [ BEL (Same as non-escaped BEL)
ESC [ BS (Same as non-escaped BS)
ESC [ HT (Same as non-escaped HT)
ESC [ NL (Same as non-escaped NL)
ESC [ VT (Same as non-escaped VT)
ESC [ NP (Same as non-escaped NP)
ESC [ CR (Same as non-escaped CR)
ESC [ SO (Same as non-escaped SO)
ESC [ SI (Same as non-escaped SI)
ESC [ ? BEL (Same as non-escaped BEL)
ESC [ ? BS (Same as non-escaped BS)
ESC [ ? HT (Same as non-escaped HT)
ESC [ ? NL (Same as non-escaped NL)
ESC [ ? VT (Same as non-escaped VT)
ESC [ ? NP (Same as non-escaped NP)
ESC [ ? CR (Same as non-escaped CR)
ESC [ ? SO (Same as non-escaped SO)
ESC [ ? SI (Same as non-escaped SI)
ESC [ ? Ps h DEC Private Mode Set (DECSET)
Ps = 1 -> Application Cursor Keys (DECCKM)
Ps = 2 -> Set VT52 Mode
Ps = 3 -> 132 Column Mode (DECCOLM)
Ps = 4 -> Smooth (Slow) Scroll (DECSCLM)
Ps = 5 -> Reverse Video (DECSCNM)
Ps = 6 -> Origin Mode (DECOM)
Ps = 7 -> Wraparound Mode (DECAWM)
Ps = 8 -> Auto-Repeat Keys (DECARM)
Ps = 9 -> Send MIT Mouse Row & Column on Button
Press
Ps = 38 -> Enter Tektronix Mode (DECTEK)
Ps = 40 -> Allow 80 <-> 132 Mode
Ps = 41 -> curses(5) fix
Ps = 44 -> Turn on Margin Bell
Ps = 45 -> Reverse-wraparound Mode
Ps = 46 -> Start Logging
Ps = 47 -> Use Alternate Screen Buffer
Ps = 1000 -> xtem bogus sequence (???)
Ps = 1001 -> xtem sequence w/hilite tracking (???)
ESC [ ? Ps l DEC Private Mode Reset (DECRST)
Ps = 1 -> Normal Cursor Keys (DECCKM)
Ps = 3 -> 80 Column Mode (DECCOLM)
Ps = 4 -> Jump (Fast) Scroll (DECSCLM)
Ps = 5 -> Normal Video (DECSCNM)
Ps = 6 -> Normal Cursor Mode (DECOM)
Ps = 7 -> No Wraparound Mode (DECAWM)
Ps = 8 -> No Auto-Repeat Keys (DECARM)
Ps = 9 -> Don't Send MIT Mouse Row & Column on
Button Press
Ps = 40 -> Don't Allow 80 <-> 132 Mode
Ps = 41 -> No curses(5) fix
Ps = 44 -> Turn Off Margin Bell
Ps = 45 -> No Reverse-wraparound Mode
Ps = 46 -> Stop Logging
Ps = 47 -> Use Normal Screen Buffer
Ps = 1000 -> xtem bogus sequence (???)
Ps = 1001 -> xtem sequence w/hilite tracking (???)
ESC [ ? Ps r Restore DEC Private Mode
Ps = 1 -> Normal/Application Cursor Keys (DECCKM)
Ps = 3 -> 80/132 Column Mode (DECCOLM)
Ps = 4 -> Jump (Fast)/Smooth (Slow) Scroll (DECSCLM)
Ps = 5 -> Normal/Reverse Video (DECSCNM)
Ps = 6 -> Normal/Origin Cursor Mode (DECOM)
Ps = 7 -> No Wraparound/Wraparound Mode (DECAWM)
Ps = 8 -> Auto-repeat/No Auto-repeat Keys (DECARM)
Ps = 9 -> Don't Send/Send MIT Mouse Row & Column on
Button Press
Ps = 40 -> Disallow/Allow 80 <-> 132 Mode
Ps = 41 -> Off/On curses(5) fix
Ps = 44 -> Turn Off/On Margin Bell
Ps = 45 -> No Reverse-wraparound/Reverse-wraparound
Mode
Ps = 46 -> Stop/Start Logging
Ps = 47 -> Use Normal/Alternate Screen Buffer
Ps = 1000 -> mouse bogus sequence (???)
Ps = 1001 -> mouse bogus sequence (???)
ESC [ ? Ps s Save DEC Private Mode
Same P's as Restore DEC Private Mode
ESC [ Ps @ Insert Ps (Blank) Character(s) (default = 1) (ICH)
ESC [ Ps A Cursor Up Ps Times (default = 1) (CUU)
ESC [ Ps B Cursor Down Ps Times (default = 1) (CUD)
ESC [ Ps C Cursor Forward Ps Times (default = 1) (CUF)
ESC [ Ps D Cursor Backward Ps Times (default = 1) (CUB)
ESC [ Ps ; Ps H Cursor Position [row;column] (default = [1,1]) (CUP)
ESC [ Ps J Erase in Display
Ps = 0 -> Clear Below (default)
Ps = 1 -> Clear Above
Ps = 2 -> Clear All
ESC [ Ps K Erase in Line
Ps = 0 -> Clear to Right (default)
Ps = 1 -> Clear to Left
Ps = 2 -> Clear All
ESC [ Ps L Insert Ps lines (default = 1) (IL)
ESC [ Ps M Delete Ps lines (default = 1) (DL)
ESC [ Ps P Delete Ps Characters (default = 1) (DCH)
ESC [ T Track Mouse (???)
ESC [ Ps c Device Attributes (DA1)
ESC [ Ps ; Ps f Cursor Position [row;column] (default = [1,1]) (HVP)
ESC [ Ps g Tab Clear
Ps = 0 -> Clear Current Column (default)
Ps = 3 -> Clear All
ESC [ Ps h Mode Set (SET)
Ps = 4 -> Insert Mode (IRM)
Ps = 20 -> Automatic Linefeed (LNM)
ESC [ Ps l Mode Reset (RST)
Ps = 4 -> Insert Mode (IRM)
Ps = 20 -> Automatic Linefeed (LNM)
ESC [ Pm m Character Attributes (SGR)
Ps = 0 -> Normal (default)
Ps = 1 -> Blink (appears as Bold)
Ps = 4 -> Underscore
Ps = 5 -> Bold
Ps = 7 -> Inverse
ESC [ Ps n Device Status Report (DSR)
Ps = 5 -> Status Report ESC [ 0 n -> OK
Ps = 6 -> Report Cursor Position (CPR) [row;column]
as ESC [ r ; c R
ESC [ Ps ; Ps r Set Scrolling Region [top;bottom] (default = full size
of window) (DECSTBM)
ESC [ Ps x Request Terminal Parameters (DECREQTPARM)
ESC ] Ps ND string NP OSC Mode
ND can be any non-digit Character (it's discarded)
NP can be any non-printing Character (it's discarded)
string can be any ASCII printable string
(max 511 characters)
Ps = 0 -> use string as a new icon name and title
Ps = 1 -> use string is a new icon name only
Ps = 2 -> use string is a new title only
Ps = 46 -> use string as a new log file name
ESC c Full Reset
ESC n Switch to Alternate Character Set LS2
ESC o Switch to Alternate Character Set LS3
ESC | Switch to Alternate Graphics(?) Set LS3R
ESC } Switch to Alternate Graphics(?) Set LS2R
ESC ~ Switch to Alternate Graphics(?) Set LS1R
--
Skip Montanaro (montanaro@crdgw1.ge.com)

Binary file not shown.

View File

@@ -0,0 +1,89 @@
*** build.c.orig Sat Nov 9 21:50:51 1991
--- build.c Sat Nov 9 22:23:13 1991
***************
*** 17,24 ****
--- 17,27 ----
*/
#include <stdio.h> /* fprintf */
+ #include <string.h>
#include <stdlib.h> /* contains exit */
#include <sys/types.h> /* unistd.h needs this */
+ #include <sys/stat.h>
+ #include <linux/fs.h>
#include <unistd.h> /* contains read/write */
#include <fcntl.h>
***************
*** 25,30 ****
--- 28,36 ----
#define MINIX_HEADER 32
#define GCC_HEADER 1024
+ #define DEFAULT_MAJOR_ROOT 3
+ #define DEFAULT_MINOR_ROOT 6
+
/* max nr of sectors of setup: don't change unless you also change
* bootsect etc */
#define SETUP_SECTS 4
***************
*** 46,54 ****
{
int i,c,id;
char buf[1024];
! if (argc != 4)
usage();
for (i=0;i<sizeof buf; i++) buf[i]=0;
if ((id=open(argv[1],O_RDONLY,0))<0)
die("Unable to open 'boot'");
--- 52,85 ----
{
int i,c,id;
char buf[1024];
+ char major_root, minor_root;
+ struct stat sb;
! if ((argc != 4) && (argc != 5))
usage();
+ if (argc == 5) {
+ if (strcmp(argv[4], "FLOPPY")) {
+ if (stat(argv[4], &sb)) {
+ perror(argv[4]);
+ die("Couldn't stat root device.");
+ }
+ major_root = MAJOR(sb.st_rdev);
+ minor_root = MINOR(sb.st_rdev);
+ } else {
+ major_root = 0;
+ minor_root = 0;
+ }
+ } else {
+ major_root = DEFAULT_MAJOR_ROOT;
+ minor_root = DEFAULT_MINOR_ROOT;
+ }
+ fprintf(stderr, "Root device is (%d, %d)\n", major_root, minor_root);
+ if ((major_root != 2) && (major_root != 3) &&
+ (major_root != 0)) {
+ fprintf(stderr, "Illegal root device (major = %d)\n",
+ major_root);
+ die("Bad root device --- major #");
+ }
for (i=0;i<sizeof buf; i++) buf[i]=0;
if ((id=open(argv[1],O_RDONLY,0))<0)
die("Unable to open 'boot'");
***************
*** 72,77 ****
--- 103,110 ----
die("Boot block must be exactly 512 bytes");
if ((*(unsigned short *)(buf+510)) != 0xAA55)
die("Boot block hasn't got boot flag (0xAA55)");
+ buf[508] = (char) minor_root;
+ buf[509] = (char) major_root;
i=write(1,buf,512);
if (i!=512)
die("Write call failed");

195
Linux-0.11/patchs/cons.cdif Normal file
View File

@@ -0,0 +1,195 @@
*** cons.11 Tue Dec 24 09:16:31 1991
--- console.c Tue Dec 24 08:20:11 1991
***************
*** 76,81 ****
--- 76,82 ----
unsigned char vc_def_attr;
unsigned long vc_ques;
unsigned long vc_state;
+ unsigned long vc_restate;
unsigned long vc_origin; /* Used for EGA/VGA fast scroll */
unsigned long vc_scr_end; /* Used for EGA/VGA fast scroll */
unsigned long vc_pos;
***************
*** 101,106 ****
--- 102,108 ----
#define x (vc_cons[currcons].vc_x)
#define y (vc_cons[currcons].vc_y)
#define state (vc_cons[currcons].vc_state)
+ #define restate (vc_cons[currcons].vc_restate)
#define npar (vc_cons[currcons].vc_npar)
#define par (vc_cons[currcons].vc_par)
#define ques (vc_cons[currcons].vc_ques)
***************
*** 370,375 ****
--- 372,387 ----
}
}
+ static char csi_graph(int currcons, char ch )
+ {
+ char *val, *ac=
+ "0\333a\261h\040I\017`\004f\370g\361j\331k\277l\332m\300n\305q\304t\303u\264v\301w\302x\263~\025";
+ if (val = strchr(ac,ch))
+ return(*(val+1));
+ return(0);
+
+ }
+
static inline void set_cursor(int currcons)
{
if (currcons != fg_console)
***************
*** 505,511 ****
void con_write(struct tty_struct * tty)
{
int nr;
! char c;
int currcons;
--- 517,523 ----
void con_write(struct tty_struct * tty)
{
int nr;
! char c, ch = 0;
int currcons;
***************
*** 564,570 ****
sysbeep();
break;
case 1:
! state=0;
if (c=='[')
state=2;
else if (c=='E')
--- 576,582 ----
sysbeep();
break;
case 1:
! state=restate;
if (c=='[')
state=2;
else if (c=='E')
***************
*** 575,584 ****
lf(currcons);
else if (c=='Z')
respond(currcons,tty);
! else if (x=='7')
save_cur(currcons);
! else if (x=='8')
restore_cur(currcons);
break;
case 2:
for(npar=0;npar<NPAR;npar++)
--- 587,598 ----
lf(currcons);
else if (c=='Z')
respond(currcons,tty);
! else if (c=='7')
save_cur(currcons);
! else if (c=='8')
restore_cur(currcons);
+ else if (c == '(' || c == ')')
+ state = 6;
break;
case 2:
for(npar=0;npar<NPAR;npar++)
***************
*** 600,606 ****
break;
} else state=4;
case 4:
! state=0;
switch(c) {
case 'G': case '`':
if (par[0]) par[0]--;
--- 614,620 ----
break;
} else state=4;
case 4:
! state=restate;
switch(c) {
case 'G': case '`':
if (par[0]) par[0]--;
***************
*** 680,685 ****
--- 694,751 ----
case 5:
/* Function Key */
break;
+ case 6:
+ if (c == '0')
+ { state =
+ restate = 7;
+ }
+ else
+ if (c == 'B')
+ { state =
+ restate = 0;
+ }
+ break;
+ case 7:
+ if (c == 15)
+ { state =
+ restate = 9;
+ break;
+ }
+ else
+ ch = csi_graph(currcons,c);
+ case 9:
+ if (c == 14)
+ { state =
+ restate = 7;
+ break;
+ }
+ else if (c == 27)
+ { state = 1;
+ break;
+ }
+ else
+ if (state == 9)
+ { if (c>31 && c<127)
+ ch = c;
+ else
+ break;
+ }
+ case 10:
+ if (ch)
+ if (x>=video_num_columns) {
+ x -= video_num_columns;
+ pos -= video_size_row;
+ lf(currcons);
+ }
+ __asm__("movb _myattr,%%ah\n\t"
+ "movw %%ax,%1\n\t"
+ ::"a" (ch),"m" (*(short *)pos)
+ :"ax");
+ pos += 2;
+ x++;
+ break;
+
+
}
}
set_cursor(currcons);
***************
*** 765,771 ****
bottom = video_num_lines;
attr=0x07;
def_attr=0x07;
! state=0;
ques = 0;
iscolor = 0;
--- 831,837 ----
bottom = video_num_lines;
attr=0x07;
def_attr=0x07;
! restate = state=0;
ques = 0;
iscolor = 0;

View File

@@ -0,0 +1,329 @@
*** 1.1 1991/12/11 16:13:13
--- Makefile 1991/12/11 17:07:11
***************
*** 64,71 ****
# MISSING = -DSPRINTF_INT -DBLKSIZE_MISSING -DSTRERROR_MISSING -DRANDOM_MISSING
# VAX running Ultrix 3.x
- MISSING = -DSTRERROR_MISSING
# A generic 4.2 BSD machine
# (eliminate GETOPT_MISSING for 4.3 release)
# (eliminate STRCASE_MISSING and TMPNAM_MISSING for Tahoe release)
--- 64,75 ----
# MISSING = -DSPRINTF_INT -DBLKSIZE_MISSING -DSTRERROR_MISSING -DRANDOM_MISSING
# VAX running Ultrix 3.x
+ # LINUX
+ MISSING = -DSPRINTF_INT -DTMPNAM_MISSING -DBLKSIZE_MISSING -DSTRCASE_MISSING \
+ -Dalloca=__builtin_alloca -DGCVT_MISSING -DRANDOM_MISSING \
+ -DBCOPY_MISSING -DSTRTOD_MISSING
+
# A generic 4.2 BSD machine
# (eliminate GETOPT_MISSING for 4.3 release)
# (eliminate STRCASE_MISSING and TMPNAM_MISSING for Tahoe release)
***************
*** 80,92 ****
# Comment out the next line if you don't have gcc.
# Also choose just one of -g and -O.
! #CC= gcc
! #OPTIMIZE= -O -g
PROFILE= #-pg
DEBUG= #-DDEBUG #-DMEMDEBUG #-DFUNC_TRACE #-DMPROF
DEBUGGER= #-g -Bstatic
! WARN= #-W -Wunused -Wimplicit -Wreturn-type -Wcomment # for gcc only
# Parser to use on grammar -- if you don't have bison use the first one
#PARSER = yacc
--- 84,96 ----
# Comment out the next line if you don't have gcc.
# Also choose just one of -g and -O.
! CC= gcc
! OPTIMIZE= -O #-g
PROFILE= #-pg
DEBUG= #-DDEBUG #-DMEMDEBUG #-DFUNC_TRACE #-DMPROF
DEBUGGER= #-g -Bstatic
! WARN= -W -Wunused -Wimplicit -Wreturn-type -Wcomment # for gcc only
# Parser to use on grammar -- if you don't have bison use the first one
#PARSER = yacc
***************
*** 154,160 ****
# rules to build gawk
gawk: $(ALLOBJS) $(GNUOBJS)
! $(CC) -o gawk $(CFLAGS) $(ALLOBJS) $(GNUOBJS) -lm
$(AWKOBJS): awk.h
--- 158,164 ----
# rules to build gawk
gawk: $(ALLOBJS) $(GNUOBJS)
! $(CC) -o gawk $(CFLAGS) $(ALLOBJS) $(GNUOBJS) #-lm
$(AWKOBJS): awk.h
*** 1.1 1991/12/11 16:18:17
--- awk.h 1991/12/11 17:07:45
***************
*** 42,51 ****
extern char *alloca();
#endif
#else
extern char *alloca();
#endif
#ifdef SPRINTF_INT
! extern int sprintf();
#else /* not USG */
/* nasty nasty berkelixm */
#define setjmp _setjmp
--- 42,53 ----
extern char *alloca();
#endif
#else
+ #ifndef alloca
extern char *alloca();
#endif
+ #endif
#ifdef SPRINTF_INT
! /* extern int sprintf(); XXX LINUX */
#else /* not USG */
/* nasty nasty berkelixm */
#define setjmp _setjmp
***************
*** 78,99 ****
extern char *memset(char *, int, int);
/* extern int fprintf(FILE *, char *, ...); */
! extern int fprintf();
extern int vfprintf();
#ifndef MSDOS
! extern int fwrite(char *, int, int, FILE *);
#endif
extern int fflush(FILE *);
extern int fclose(FILE *);
extern int pclose(FILE *);
#ifndef MSDOS
! extern int fputs(char *, FILE *);
#endif
extern void abort();
extern int isatty(int);
extern void exit(int);
extern int system(char *);
extern int sscanf(/* char *, char *, ... */);
extern double atof(char *);
extern int fstat(int, struct stat *);
--- 80,104 ----
extern char *memset(char *, int, int);
/* extern int fprintf(FILE *, char *, ...); */
! /* extern int fprintf(); XXXL */
extern int vfprintf();
#ifndef MSDOS
! /* extern int fwrite(char *, int, int, FILE *); XXXL */
#endif
extern int fflush(FILE *);
extern int fclose(FILE *);
extern int pclose(FILE *);
#ifndef MSDOS
! /* extern int fputs(char *, FILE *); XXXL */
#endif
extern void abort();
extern int isatty(int);
extern void exit(int);
extern int system(char *);
+ #if 0
+ /* XXXL */
extern int sscanf(/* char *, char *, ... */);
+ #endif
extern double atof(char *);
extern int fstat(int, struct stat *);
***************
*** 100,110 ****
extern off_t lseek(int, off_t, int);
extern int fseek(FILE *, long, int);
extern int close(int);
! extern int open();
extern int pipe(int *);
extern int dup2(int, int);
#ifndef MSDOS
! extern int unlink(char *);
#endif
extern int fork();
extern int execl(/* char *, char *, ... */);
--- 105,115 ----
extern off_t lseek(int, off_t, int);
extern int fseek(FILE *, long, int);
extern int close(int);
! /* extern int open(); XXXL */
extern int pipe(int *);
extern int dup2(int, int);
#ifndef MSDOS
! /* extern int unlink(char *); XXXL */
#endif
extern int fork();
extern int execl(/* char *, char *, ... */);
*** 1.1 1991/12/11 16:29:17
--- awk.y 1991/12/11 17:08:04
***************
*** 96,102 ****
%type <sval> func_name
%token <sval> FUNC_CALL NAME REGEXP
! %token <lval> ERROR
%token <nodeval> NUMBER YSTRING
%token <nodetypeval> RELOP APPEND_OP
%token <nodetypeval> ASSIGNOP MATCHOP NEWLINE CONCAT_OP
--- 96,102 ----
%type <sval> func_name
%token <sval> FUNC_CALL NAME REGEXP
! %token <lval> ERROR_TOK
%token <nodeval> NUMBER YSTRING
%token <nodetypeval> RELOP APPEND_OP
%token <nodetypeval> ASSIGNOP MATCHOP NEWLINE CONCAT_OP
***************
*** 386,401 ****
nls
: NEWLINE
! { $<nodetypeval>$ = NULL; }
| nls NEWLINE
! { $<nodetypeval>$ = NULL; }
;
opt_nls
: /* empty */
! { $<nodetypeval>$ = NULL; }
| nls
! { $<nodetypeval>$ = NULL; }
;
input_redir
--- 386,401 ----
nls
: NEWLINE
! { $<nodetypeval>$ = (NODETYPE) NULL; }
| nls NEWLINE
! { $<nodetypeval>$ = (NODETYPE) NULL; }
;
opt_nls
: /* empty */
! { $<nodetypeval>$ = (NODETYPE) NULL; }
| nls
! { $<nodetypeval>$ = (NODETYPE) NULL; }
;
input_redir
***************
*** 953,959 ****
case '\\':
if (*lexptr++ == '\0') {
yyerror("unterminated regexp ends with \\");
! return ERROR;
} else if (lexptr[-1] == '\n')
goto retry;
break;
--- 953,959 ----
case '\\':
if (*lexptr++ == '\0') {
yyerror("unterminated regexp ends with \\");
! return ERROR_TOK;
} else if (lexptr[-1] == '\n')
goto retry;
break;
***************
*** 969,975 ****
case '\0':
lexptr--; /* so error messages work */
yyerror("unterminated regexp");
! return ERROR;
}
}
}
--- 969,975 ----
case '\0':
lexptr--; /* so error messages work */
yyerror("unterminated regexp");
! return ERROR_TOK;
}
}
}
***************
*** 1163,1169 ****
case '\n':
lexptr--;
yyerror("unterminated string");
! return ERROR;
case '"':
yylval.nodeval = make_str_node(tokstart + 1,
lexptr-tokstart-2, esc_seen);
--- 1163,1169 ----
case '\n':
lexptr--;
yyerror("unterminated string");
! return ERROR_TOK;
case '"':
yylval.nodeval = make_str_node(tokstart + 1,
lexptr-tokstart-2, esc_seen);
***************
*** 1171,1177 ****
return YSTRING;
}
}
! return ERROR;
case '-':
if (*lexptr == '=') {
--- 1171,1177 ----
return YSTRING;
}
}
! return ERROR_TOK;
case '-':
if (*lexptr == '=') {
***************
*** 1256,1262 ****
}
return LEX_AND;
}
! return ERROR;
case '|':
if (*lexptr == '|') {
--- 1256,1262 ----
}
return LEX_AND;
}
! return ERROR_TOK;
case '|':
if (*lexptr == '|') {
***************
*** 1279,1285 ****
if (c != '_' && ! isalpha(c)) {
yyerror("Invalid char '%c' in expression\n", c);
! return ERROR;
}
/* it's some type of name-type-thing. Find its length */
--- 1279,1285 ----
if (c != '_' && ! isalpha(c)) {
yyerror("Invalid char '%c' in expression\n", c);
! return ERROR_TOK;
}
/* it's some type of name-type-thing. Find its length */

73
Linux-0.11/patchs/hosts.h Normal file
View File

@@ -0,0 +1,73 @@
#ifndef __HOST_H__
#define __HOSTS_H__
/*
File hosts.h
SCSI host adapter include file.
*/
#define MAX_SCSI_HOSTS 1
/*
The Scsi_Host type has all that is needed to interface with a SCSI
host in a device independant matter.
*/
typedef struct
{
/*
The name pointer is a pointer to the name of the SCSI
device detected.
*/
char *name;
/*
The detect function shall return non zero on detection,
and initialize all data necessary for this particular
SCSI driver.
*/
int (* detect)(void);
/*
The info function will return whatever useful
information the developer sees fit.
*/
char * (* info)(void);
/*
The command function shall return the SCSI return
code in the low 8 bits, a driver error in the high 8
bits. Target is the target ID, IN normal numbers - not a
bit. The cmnd is the variable length command to
be sent,
buff a pointer to the buffer which will be read from /
written to, and bufflen the length of that buffer
*/
int (* command)(unsigned char target, const void *cmnd,
void *buff, int bufflen);
/*
present contains a flag as to weather we are present -
so we don't have to call detect multiple times.
*/
unsigned char present;
} Scsi_Host;
/*
The scsi_hosts array is the array containing the data for all
possible <supported> scsi hosts.
*/
extern Scsi_Host scsi_hosts[MAX_SCSI_HOSTS];
/*
scsi_init initializes the scsi hosts.
*/
void scsi_init(void);
#endif

View File

@@ -0,0 +1,71 @@
*** cons.c.bad Wed Dec 25 02:12:18 1991
--- console.c Wed Dec 25 02:06:44 1991
***************
*** 530,535 ****
--- 530,537 ----
}
+ static int in_conwrite = 0;
+
void con_write(struct tty_struct * tty)
{
int nr;
***************
*** 537,542 ****
--- 539,546 ----
int currcons;
+ in_conwrite++;
+
for (currcons = 0; currcons<=NR_CONSOLES; currcons++)
if (tty == TTY_TABLE(currcons))
break;
***************
*** 772,777 ****
--- 776,782 ----
}
}
set_cursor(currcons);
+ in_conwrite--;
}
/*
***************
*** 1004,1009 ****
--- 1009,1018 ----
void blank_screen()
{
+ if (in_conwrite)
+ { blankcount = HZ*20;
+ return;
+ }
if (blanked_fg > -1)
return;
blanked_fg = fg_console;
***************
*** 1015,1020 ****
--- 1024,1033 ----
void unblank_screen()
{
+ if (in_conwrite)
+ { blankcount = HZ*20;
+ return;
+ }
if (blanked_fg <= -1)
return;
fg_console = blanked_fg;
***************
*** 1051,1056 ****
--- 1064,1071 ----
*/
int new_console, old_console;
+ if (in_conwrite)
+ return;
if (num >= NR_CONSOLES) return;

Binary file not shown.

BIN
Linux-0.11/patchs/lp.tar.Z Normal file

Binary file not shown.

BIN
Linux-0.11/patchs/lvc.tar.Z Normal file

Binary file not shown.

Binary file not shown.

132
Linux-0.11/patchs/scsi.h Normal file
View File

@@ -0,0 +1,132 @@
#ifndef __SCSI_H__
#define __SCSI_H__
/*
For documentation on the OPCODES, MESSAGES, and SENSE values,
please consult the SCSI standard.
*/
/*
SCSI opcodes
*/
#define TEST_UNIT_READY 0x00
#define REZERO_UNIT 0x01
#define REQUEST_SENSE 0x03
#define FORMAT_UNIT 0x04
#define REASSIGN_BLOCKS 0x07
#define READ_6 0x08
#define WRITE_6 0x0a
#define SEEK 0x0b
#define INQUIRY 0x12
#define MODE_SELECT 0x15
#define RESERVE 0x16
#define RELEASE 0x17
#define COPY 0x18
#define MODE_SENSE 0x1a
#define START_STOP 0x1b
#define RECIEVE_DAIGNOSTIC 0x1c
#define SEND_DIAGNOSTIC 0x1d
#define ALLOW_MEDIUM_REMOVAL 0x1e
#define READ_CAPACITY 0x25
#define READ_10 0x28
#define WRITE_10 0x2a
#define SEEK_10 0x2b
#define WRITE_VERIFY 0x2e
#define VERIFY 0x2f
#define SEARCH_HIGH 0x30
#define SEARCH_EQUAL 0x31
#define SEARCH_LOW 0x32
#define SET_LIMITS 0x33
#define COMPARE 0x39
#define COPY_VERIFY 0x3a
/*
MESSAGE CODES
*/
#define COMMAND_COMPLETE 0x00
#define EXTENDED_MESSAGE 0x01
#define SAVE_POINTERS 0x02
#define RESTORE_POINTERS 0x03
#define DISCONNECT 0x04
#define INITIATOR_ERROR 0x05
#define ABORT 0x06
#define MESAGE_REJECT 0x07
#define NOP 0x08
#define MSG_PARITY_ERROR 0x09
#define LINKED_CMD_COMPLETE 0x0a
#define LINKED_FLG_CMD_COMPLETE 0x0b
#define BUS_DEVICE_RESET 0x0c
#define IDENTIFY 0x80
/*
Our errors returned by OUR driver, NOT SCSI message. Orr'd with
SCSI message passed back to driver <IF any>.
*/
/* NO error */
#define DID_OK 0x0000
/* Couldn't connect before timeout period */
#define DID_NO_CONNECT 0x0100
/* BUS stayed busy through time out period */
#define DID_BUS_BUSY 0x0200
/* TIMED OUT for other reason */
#define DID_TIME_OUT 0x0300
/* ERROR from TARGET */
#define DID_TERROR 0x0400
/* TARGET was busy */
#define DID_TBUSY 0x0500
/* TARGET disconnected prematurely */
#define DID_TDISCONNECT 0x0600
/* TARGET was off line */
#define DID_TOFFLINE 0x0700
/* TARGET wants US to send IT a message */
#defibe DID_TREQ_MSG_OUT 0x0800
/* TARGET parity error */
#define DID_TPARITY 0x0900
/* TARGET requested reselect */
#define DID_TRESELECT 0x0A00
/* TARGET was not in the range 0-6 inlclusive */
#define DID_BAD_TARGET 0x0B00
/*
SENSE KEYS
*/
#define NO_SENSE 0x00
#define RECOVERED_ERROR 0x01
#define NOT_READY 0x02
#define MEDIUM_ERROR 0x03
#define HARDWARE_ERROR 0x04
#define ILLEGAL_REQUEST 0x05
#define UNIT_ATTENTION 0x06
#define DATA_PROTECT 0x07
#define BLANK_CHECK 0x08
#define COPY_ABORTED 0x0a
#define ABORTED_COMMAND 0x0b
#define VOLUME_OVERFLOW 0x0d
#define MISCOMPARE 0x0e
/*
DEVICE TYPES
*/
#define TYPE_DISK 0x00
#define TYPE_TAPE 0x01
#define TYPE_WORM 0x04 /* Treated as ROM by our system */
#define TYPE_ROM 0x05
#define TYPE_NO_LUN 0x7f
/*
Every SCSI command starts with a one byte OP-code.
The next byte's high three bits are the LUN of the
device. Any multi-byte quantities are stored high byte
first, and may have a 5 bit MSB in the same byte
as the LUN.
*/
#endif

BIN
Linux-0.11/patchs/sel.tar.Z Normal file

Binary file not shown.

BIN
Linux-0.11/patchs/slpat.Z Normal file

Binary file not shown.

Binary file not shown.

39
Linux-0.11/patchs/tcapdif Normal file
View File

@@ -0,0 +1,39 @@
*** /A/etc/termcap Sun Dec 8 13:58:19 1991
--- termcap Fri Dec 20 06:10:07 1991
***************
*** 52,54 ****
--- 52,85 ----
:it#8:ku=\E[A:kd=\E[B:kr=\E[C:kl=\E[D:kb=^H:\
:ho=\E[H:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:pt:sr=\EM:vt#3:xn:\
:sc=\E7:rc=\E8:cs=\E[%i%d;%dr:
+
+ #
+ # Now - like console, but with function keys
+ #
+ # Standard key code definitions:
+ # ku,kd,kl,kr sent by up-, down-, left-, right-arrow
+ # kb sent by backspace
+ # k1..k9,k0 sent by function key 1..10
+ # K1..5 sent by keypad upper left,upper right,centre,lower left,lower right
+ # ka,kt,kB sent by clear-all-tabs,clear-tab,backtab
+ # kT sent by set-tab-stop
+ # kC,kE,kS sent by clear-screen,clear-to-eol,clear-to-eos
+ # kD,kL sent by delete-character,delete-line
+ # kh,kH sent by home,home-down
+ # kI,kA sent by insert char/enter-insert-mode,insert-line
+ # kM sent by exit-insert-mode
+ # kN,kP sent by next-page,previous-page
+ # kF,kR sent by scroll-forward,scroll-backwards
+ memacs:\
+ :do=^J:co#80:li#25:cl=\E[H\E[J:sf=\ED:\
+ :le=^H:bs:am:cm=\E[%i%d;%dH:nd=\E[C:up=\E[A:\
+ :ce=\E[K:cd=\E[J:so=\E[7m:se=\E[m:us=\E[4m:ue=\E[m:\
+ :md=\E[1m:mr=\E[7m:mb=\E[5m:me=\E[m:is=\E[1;25r\E[25;1H:\
+ :it#8:ku=\E[A:kd=\E[B:kr=\E[C:kl=\E[D:kb=^H:\
+ :ho=\E[H:kP=\E[5~:kN=\E[6~:kH=\E[Y:kh=\E[H:kD=\E[3~:kI=\E[2~:\
+ :k1=\E[[A:k2=\E[[B:k3=\E[[C:k4=\E[[D:k5=\E[[E:k6=\E[[F:\
+ :k7=\E[[G:k8=\E[[H:k9=\E[[I:k0=\E[[J:\
+ :K1=\E[[K:K2=\E[[L:\
+ :pt:sr=\EM:vt#3:xn:\
+ :sc=\E7:rc=\E8:cs=\E[%i%d;%dr:\
+ #

View File

@@ -0,0 +1,39 @@
*** /A/etc/termcap Sun Dec 8 13:58:19 1991
--- termcap Fri Dec 20 06:10:07 1991
***************
*** 52,54 ****
--- 52,85 ----
:it#8:ku=\E[A:kd=\E[B:kr=\E[C:kl=\E[D:kb=^H:\
:ho=\E[H:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:pt:sr=\EM:vt#3:xn:\
:sc=\E7:rc=\E8:cs=\E[%i%d;%dr:
+
+ #
+ # Now - like console, but with function keys
+ #
+ # Standard key code definitions:
+ # ku,kd,kl,kr sent by up-, down-, left-, right-arrow
+ # kb sent by backspace
+ # k1..k9,k0 sent by function key 1..10
+ # K1..5 sent by keypad upper left,upper right,centre,lower left,lower right
+ # ka,kt,kB sent by clear-all-tabs,clear-tab,backtab
+ # kT sent by set-tab-stop
+ # kC,kE,kS sent by clear-screen,clear-to-eol,clear-to-eos
+ # kD,kL sent by delete-character,delete-line
+ # kh,kH sent by home,home-down
+ # kI,kA sent by insert char/enter-insert-mode,insert-line
+ # kM sent by exit-insert-mode
+ # kN,kP sent by next-page,previous-page
+ # kF,kR sent by scroll-forward,scroll-backwards
+ memacs:\
+ :do=^J:co#80:li#25:cl=\E[H\E[J:sf=\ED:\
+ :le=^H:bs:am:cm=\E[%i%d;%dH:nd=\E[C:up=\E[A:\
+ :ce=\E[K:cd=\E[J:so=\E[7m:se=\E[m:us=\E[4m:ue=\E[m:\
+ :md=\E[1m:mr=\E[7m:mb=\E[5m:me=\E[m:is=\E[1;25r\E[25;1H:\
+ :it#8:ku=\E[A:kd=\E[B:kr=\E[C:kl=\E[D:kb=^H:\
+ :ho=\E[H:kP=\E[5~:kN=\E[6~:kH=\E[Y:kh=\E[H:kD=\E[3~:kI=\E[2~:\
+ :k1=\E[[A:k2=\E[[B:k3=\E[[C:k4=\E[[D:k5=\E[[E:k6=\E[[F:\
+ :k7=\E[[G:k8=\E[[H:k9=\E[[I:k0=\E[[J:\
+ :K1=\E[[K:K2=\E[[L:\
+ :pt:sr=\EM:vt#3:xn:\
+ :sc=\E7:rc=\E8:cs=\E[%i%d;%dr:\
+ #

2281
Linux-0.11/patchs/vc.shar Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,8 @@
70c70
< DEFS = -DDIRENT -DST_BLOCKS_MISSING -DSTDC_HEADERS -DPOSIX -DUSG
---
> DEFS = -DDIRENT -DST_BLOCKS_MISSING -DSTDC_HEADERS -DPOSIX -DUSG -D_POSIX_SOURCE
80c80
< bindir = $(prefix)/gnubin
---
> bindir = $(prefix)/bin

329
Linux-0.11/ports/gawk-diffs Normal file
View File

@@ -0,0 +1,329 @@
*** 1.1 1991/12/11 16:13:13
--- Makefile 1991/12/11 17:07:11
***************
*** 64,71 ****
# MISSING = -DSPRINTF_INT -DBLKSIZE_MISSING -DSTRERROR_MISSING -DRANDOM_MISSING
# VAX running Ultrix 3.x
- MISSING = -DSTRERROR_MISSING
# A generic 4.2 BSD machine
# (eliminate GETOPT_MISSING for 4.3 release)
# (eliminate STRCASE_MISSING and TMPNAM_MISSING for Tahoe release)
--- 64,75 ----
# MISSING = -DSPRINTF_INT -DBLKSIZE_MISSING -DSTRERROR_MISSING -DRANDOM_MISSING
# VAX running Ultrix 3.x
+ # LINUX
+ MISSING = -DSPRINTF_INT -DTMPNAM_MISSING -DBLKSIZE_MISSING -DSTRCASE_MISSING \
+ -Dalloca=__builtin_alloca -DGCVT_MISSING -DRANDOM_MISSING \
+ -DBCOPY_MISSING -DSTRTOD_MISSING
+
# A generic 4.2 BSD machine
# (eliminate GETOPT_MISSING for 4.3 release)
# (eliminate STRCASE_MISSING and TMPNAM_MISSING for Tahoe release)
***************
*** 80,92 ****
# Comment out the next line if you don't have gcc.
# Also choose just one of -g and -O.
! #CC= gcc
! #OPTIMIZE= -O -g
PROFILE= #-pg
DEBUG= #-DDEBUG #-DMEMDEBUG #-DFUNC_TRACE #-DMPROF
DEBUGGER= #-g -Bstatic
! WARN= #-W -Wunused -Wimplicit -Wreturn-type -Wcomment # for gcc only
# Parser to use on grammar -- if you don't have bison use the first one
#PARSER = yacc
--- 84,96 ----
# Comment out the next line if you don't have gcc.
# Also choose just one of -g and -O.
! CC= gcc
! OPTIMIZE= -O #-g
PROFILE= #-pg
DEBUG= #-DDEBUG #-DMEMDEBUG #-DFUNC_TRACE #-DMPROF
DEBUGGER= #-g -Bstatic
! WARN= -W -Wunused -Wimplicit -Wreturn-type -Wcomment # for gcc only
# Parser to use on grammar -- if you don't have bison use the first one
#PARSER = yacc
***************
*** 154,160 ****
# rules to build gawk
gawk: $(ALLOBJS) $(GNUOBJS)
! $(CC) -o gawk $(CFLAGS) $(ALLOBJS) $(GNUOBJS) -lm
$(AWKOBJS): awk.h
--- 158,164 ----
# rules to build gawk
gawk: $(ALLOBJS) $(GNUOBJS)
! $(CC) -o gawk $(CFLAGS) $(ALLOBJS) $(GNUOBJS) #-lm
$(AWKOBJS): awk.h
*** 1.1 1991/12/11 16:18:17
--- awk.h 1991/12/11 17:07:45
***************
*** 42,51 ****
extern char *alloca();
#endif
#else
extern char *alloca();
#endif
#ifdef SPRINTF_INT
! extern int sprintf();
#else /* not USG */
/* nasty nasty berkelixm */
#define setjmp _setjmp
--- 42,53 ----
extern char *alloca();
#endif
#else
+ #ifndef alloca
extern char *alloca();
#endif
+ #endif
#ifdef SPRINTF_INT
! /* extern int sprintf(); XXX LINUX */
#else /* not USG */
/* nasty nasty berkelixm */
#define setjmp _setjmp
***************
*** 78,99 ****
extern char *memset(char *, int, int);
/* extern int fprintf(FILE *, char *, ...); */
! extern int fprintf();
extern int vfprintf();
#ifndef MSDOS
! extern int fwrite(char *, int, int, FILE *);
#endif
extern int fflush(FILE *);
extern int fclose(FILE *);
extern int pclose(FILE *);
#ifndef MSDOS
! extern int fputs(char *, FILE *);
#endif
extern void abort();
extern int isatty(int);
extern void exit(int);
extern int system(char *);
extern int sscanf(/* char *, char *, ... */);
extern double atof(char *);
extern int fstat(int, struct stat *);
--- 80,104 ----
extern char *memset(char *, int, int);
/* extern int fprintf(FILE *, char *, ...); */
! /* extern int fprintf(); XXXL */
extern int vfprintf();
#ifndef MSDOS
! /* extern int fwrite(char *, int, int, FILE *); XXXL */
#endif
extern int fflush(FILE *);
extern int fclose(FILE *);
extern int pclose(FILE *);
#ifndef MSDOS
! /* extern int fputs(char *, FILE *); XXXL */
#endif
extern void abort();
extern int isatty(int);
extern void exit(int);
extern int system(char *);
+ #if 0
+ /* XXXL */
extern int sscanf(/* char *, char *, ... */);
+ #endif
extern double atof(char *);
extern int fstat(int, struct stat *);
***************
*** 100,110 ****
extern off_t lseek(int, off_t, int);
extern int fseek(FILE *, long, int);
extern int close(int);
! extern int open();
extern int pipe(int *);
extern int dup2(int, int);
#ifndef MSDOS
! extern int unlink(char *);
#endif
extern int fork();
extern int execl(/* char *, char *, ... */);
--- 105,115 ----
extern off_t lseek(int, off_t, int);
extern int fseek(FILE *, long, int);
extern int close(int);
! /* extern int open(); XXXL */
extern int pipe(int *);
extern int dup2(int, int);
#ifndef MSDOS
! /* extern int unlink(char *); XXXL */
#endif
extern int fork();
extern int execl(/* char *, char *, ... */);
*** 1.1 1991/12/11 16:29:17
--- awk.y 1991/12/11 17:08:04
***************
*** 96,102 ****
%type <sval> func_name
%token <sval> FUNC_CALL NAME REGEXP
! %token <lval> ERROR
%token <nodeval> NUMBER YSTRING
%token <nodetypeval> RELOP APPEND_OP
%token <nodetypeval> ASSIGNOP MATCHOP NEWLINE CONCAT_OP
--- 96,102 ----
%type <sval> func_name
%token <sval> FUNC_CALL NAME REGEXP
! %token <lval> ERROR_TOK
%token <nodeval> NUMBER YSTRING
%token <nodetypeval> RELOP APPEND_OP
%token <nodetypeval> ASSIGNOP MATCHOP NEWLINE CONCAT_OP
***************
*** 386,401 ****
nls
: NEWLINE
! { $<nodetypeval>$ = NULL; }
| nls NEWLINE
! { $<nodetypeval>$ = NULL; }
;
opt_nls
: /* empty */
! { $<nodetypeval>$ = NULL; }
| nls
! { $<nodetypeval>$ = NULL; }
;
input_redir
--- 386,401 ----
nls
: NEWLINE
! { $<nodetypeval>$ = (NODETYPE) NULL; }
| nls NEWLINE
! { $<nodetypeval>$ = (NODETYPE) NULL; }
;
opt_nls
: /* empty */
! { $<nodetypeval>$ = (NODETYPE) NULL; }
| nls
! { $<nodetypeval>$ = (NODETYPE) NULL; }
;
input_redir
***************
*** 953,959 ****
case '\\':
if (*lexptr++ == '\0') {
yyerror("unterminated regexp ends with \\");
! return ERROR;
} else if (lexptr[-1] == '\n')
goto retry;
break;
--- 953,959 ----
case '\\':
if (*lexptr++ == '\0') {
yyerror("unterminated regexp ends with \\");
! return ERROR_TOK;
} else if (lexptr[-1] == '\n')
goto retry;
break;
***************
*** 969,975 ****
case '\0':
lexptr--; /* so error messages work */
yyerror("unterminated regexp");
! return ERROR;
}
}
}
--- 969,975 ----
case '\0':
lexptr--; /* so error messages work */
yyerror("unterminated regexp");
! return ERROR_TOK;
}
}
}
***************
*** 1163,1169 ****
case '\n':
lexptr--;
yyerror("unterminated string");
! return ERROR;
case '"':
yylval.nodeval = make_str_node(tokstart + 1,
lexptr-tokstart-2, esc_seen);
--- 1163,1169 ----
case '\n':
lexptr--;
yyerror("unterminated string");
! return ERROR_TOK;
case '"':
yylval.nodeval = make_str_node(tokstart + 1,
lexptr-tokstart-2, esc_seen);
***************
*** 1171,1177 ****
return YSTRING;
}
}
! return ERROR;
case '-':
if (*lexptr == '=') {
--- 1171,1177 ----
return YSTRING;
}
}
! return ERROR_TOK;
case '-':
if (*lexptr == '=') {
***************
*** 1256,1262 ****
}
return LEX_AND;
}
! return ERROR;
case '|':
if (*lexptr == '|') {
--- 1256,1262 ----
}
return LEX_AND;
}
! return ERROR_TOK;
case '|':
if (*lexptr == '|') {
***************
*** 1279,1285 ****
if (c != '_' && ! isalpha(c)) {
yyerror("Invalid char '%c' in expression\n", c);
! return ERROR;
}
/* it's some type of name-type-thing. Find its length */
--- 1279,1285 ----
if (c != '_' && ! isalpha(c)) {
yyerror("Invalid char '%c' in expression\n", c);
! return ERROR_TOK;
}
/* it's some type of name-type-thing. Find its length */

Binary file not shown.

View File

@@ -0,0 +1,332 @@
[0029] daemon@ATHENA.MIT.EDU (Peter MacDonald) Linux_Activists 11/10/91 19:38 (329 lines)
Subject: patch to use shoelace with linux + fsck and mkfs
Date: Sun, 10 Nov 91 16:21:27 PST
From: pmacdona@sol.UVic.CA (Peter MacDonald)
To: linux-activists@joker.cs.hut.fi
Following are patches to shoelace to allow it to boot the Linux
image (sorry, no building by parts cause there are no parts).
This also means that the fsck function of shoelace is available,
including fsck -m, or mkfs, which I have not tested. Please note
that by using strip on the shoelace executable, I was able to fsck
a 20Meg partition. 64Meg partitions, I doubt it can handle.
In this way, both minix and linux can be run from the same partition,
with a bit of mv'ing of directories like bin.
You will need minix to build these because of the 16bit assembler.
I also have not tried compiling laceup under linux yet (no disk space).
Perhaps some kind soul can do this and post executables for non-minixers.
If you are not already familiar with and using shoelace, please install
and learn it first!!! The following assumes this.
To use:
- Get shoelace from plains or wherever.
- Apply the mxvid50 patches (may not have to, but my diffs are against them)
- Copy makefile.bcc to makefile and then apply the patches in shoelace.pat.
- Put the bootsect.x file in the shoelace dir.
- Type make and cross fingers.
- Use strip, ie: strip shoelace
- Copy new shoelace to your root. (Might wish to try floppy first).
- Reboot, hit enter when shoelace prompt appears and type "load /bootimage" or
- If you want an automatic boot, edit /etc/config and set "load /bootimage"
You must also ensure config doesn't allow shoelace to find system,
fs, mm and init or it will boot from them by default. Either
move the executables or set them to a bogus path.
Why Use Shoelace:
1) has fsck and mkfs.
2) doesn't require a seperate boot partition.
3) allows passing environment variables to kernel (like video mode).
4) doesn't require kernel patch (byte 508) to indicate root device.
5) allow you to dynamically boot different partitions and different
images in the same partition.
Disclaimer:
This patch is a bit of a hack. You can set your rootdev in the config
file and it should work. But I didn't implement the bootdev.
I also did not try to pass on the environment to linux.
Acknowledgment:
Earl Chew for shoelace.
pmacdona@sol.uvic.ca
table
!"#$%&'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
begin 644 slpat.Z
M'YV09<:@>0,"#X@6(,2\>4-G3D Z+O H<$@&Q(D77K"\F/.BXPD0/A(N;/@Pz
M(@@>/"R^.*$ "Y^6?!(H9.AP#,0Y"1*@&)("1(P<.6* 8)+&39TY(*B\D6,Gy
M#!LR<V#"%$FS)-(T2-F\"4.F3,4P=$# P'-C# P8"?. H(.F3,(T;^:TF$,Gx
MC!PZ=>" D/.F#IVB9>:P !'&3<4V;^P$GHJU#!LS(/J&?0.9K=L[8=32(<B5w
MC)S 2,?F.'MV<.&*:NJT@8/4\F<74EV"2!+6LAL06KDB/>$0+YR/9-)\MLE&v
M;1@S=,K( 9&&Y&,0*$3#D'$VA6G#:]N"F).';IDV4\&*Q1.#-(S!1XN> 2$Du
MR9,IS-TDER,G;T,7(&+S >'D"94B(8 P1AWTE2%?<=MUEUP;S"$E'F)T@8"#t
M"C;44,,,-J257%9ON'$&?E2@@=5V ]7Q5$)NN?'&5'#P)08;WPU6AF*W%96=s
M6V;X16 9^"4! F;RK470&F64H5=SVZ6Q&HP@BHA4#3'( ,(:0DQ%I!QN.):Dr
M'F[-4>*)8KAE8%]GH"'C'' $E(93"(;1FI,@D/%&8&Z<$-88'=9EHV53B5&'q
M&68H)V 8 KGE9GP@M%%4&A*Y-%6(;N76U7)H'!JF@8ER92A2<R@)!XR$(05'p
M7)V^6,9U%>$I7U%UQ#759UR!H!Q?<B!U1QILL+%78":&96,8(-3AAABPKA&&o
MJ;@M! =^4I0Q4UABJ%6I83W2,96DHGY&!QUJF>$FM&J=4<:VZOTX$*@U;58Kn
M86$!^U<;E[65I6++C3I'J4RVU)(+R>%A+18N=&4&8"!\09===+#!:J/\EN&Om
MOEA,400554#!1!%.@- #"#3DE--^;BQ'V7;CYC770TM%A8403_@G\1$@:#P>l
M#&7!X/%^2Z5Q1E%.$4:&9Z!%!MFS)]NT5$M).)$$%2_'O+%T9]W\HUN(*495k
M6&U]=E!D?@E]XX^9M20QQ5 T_30>HU$G=6]Y;5?774AE78;864S1M-/CE1?Uj
MQPEZQZ"D7K&;MWG057BA#2G AL544K1,Q1=$%&&%#@F,1=K6<X0![UIYI.FUi
M&5K! 8=Q2#VK>$R5XS$##$(A-'"M8<&!<'-PW=8A"*]'Z%D:5H\[1DN-^P>Yh
MY#*/M;J4^QD/@PT0&_QVP@OKT!(("52=0!AXL# "RRX7<<3TU2>6 %0L8 ^^g
M]=AKG_32+Y\O?F#E-WK&&Y2CG_T8*H=OQ_B"F8^%_@F G__V X>N'6P,:Q"<f
M: !U%L4!\%[Q:\D#X:"]L1C!"'O;CUW$T!PYV$4M36%#'=SB Q] 2080>\,:e
MOB I@Y4,#M);G&R.,*XX826!N[.:[#P(K_D(9CMI&D,:!C8&-JDE9%Y+5\I>d
M0 </(A!B !1(!?%P%@DZ9#WX@\D#458K%HRA40!,WPC6QS3O2=!Z FP4Q*Q8c
M!BRJ+#S($11;Q(."&2DG#W_Q4+(T10;K3 T$J5F-D*9B&9+YI@5\\0O! %>1b
MX PG8<:)HQP(J9UGO>@-"(RA!-6PFC14C@5CJUC[9 BQ-LSA##&(80)<$*WDa
M^&0&+"B/!%W@)B&F 00B8,)6@J-'[O@-!"X(I@AFV4JWQ "6Y8DE,F$ L88]z
M# L&(D._Z!##@($E#"V))AFN64TQW"N;AO'F'*3W @4$9" %V5H;\&"'-)"Ay
M!LRDB$HRLI&.K 0DB6*G.^%YDI1<A"58, )?&)2E.\S!!56P0AK&X((A!"$$x
M=1##&%J OQ 45"X.88IR7( _.:2!7TO)TQM<X)4ZA$ A;G!#&GBD*CS)(3AAw
MX&@8("JL<86@#6!!@PMRU((PR4%A;@A8&2"J4CF%P%LCQ%((G% &@TY!.78(v
MP4#AI:LFW.ZI>@%!#GR22@OI8'4@@ (1J. 3H,2@)4&XRT)AI .N8FBK(\/3u
M:EP0%Q<H2J6-@D).VSJ'-[ !H0IEJ$,MVM2#)G2A#7UH1"=:T8N>3*-RX.@<t
M/ I2OLAGI"4]:8=4RM(.N12F,J5IENAPTYSNM X]50Y0A4I4=[[AJ&%(JAN6s
M6MBG,D6J;V@#55LBT-RV=:J. 4(2W&"&I>#T+VMP <5:T(01NJ%008T<=)80r
MAC2TH IW<(L4<DO5%+2$J08]0R)9TU:Y+JNN=V64V"*JAH>4MT,#.P.!CH6Nq
M,7P&4YWB$NZ6 H(F+,H@*)@!#A#7DB: )@SB:D$2B-!6'OPD*%C%@0NB=);Rp
MN& &,[C!#(1+7..")0W)76YS#01=%T3.!RTA EC*T%8<@ "K6A5*E'1P%AV4o
M!P1': (5Q!9-Y;3UHAPNKAR."V+E5H&YSBVQ=%$ 7J1,04'?\2X6GB"',Q0Fn
M#7KX<(?:2H5SJG0.A0)!%51*KT[5I88C?JZ\!D/#(1<F#RTA2I;&R3$8S !Bm
M/@)2<BJR&1!\*C.$221V;L46&P)*.08*"YCO>QO$= 4I0N[O^K! &.P45UADl
M: F2BJ(J&JTT2$[!3'>$)*!IB0L$*E (6U1 HCFQ@5"&PLZ5LL2&%ZBJKTP:k
M PM:,IS<P@%7L:X(4!/H.\6)C2 ^JI35!%(8<57$2ZZ&-:EAY*MVC6$,1FH7j
M" HJ(.Z>1I4B:&=7<ON&KIS$T64(R1:*&Z2VZ P-=.C",+&@:C0@JI"JBB_Ni
M@%WIBA1E/H3ZBV*:-"*YXA0[O7$0>]PSA9:(P4V!$W<9"(+N4$TM5Q8OY#3Wh
M&Z0^XV P,:!!9)83@PS]&@^.B=N[%0<ICF.M#._V%5+> (>_=,@I^ D"&_HZg
M&!\5L#9W($AO#&2';NOV-%>Y3;YU!NZANZ'HB_X"GG9^$CS@P0<BN)YA)"@"f
MIT/=OE_@BT%/DH<\8+TE=Q"10 +M%MG=*W!]+N2LM12M5CL&UOBI0J?TR):"e
M>QL[>>C+H-R0S>9DS9"$ 8'$*5YNMP@K#7%P2Y\#3R#%NW/B(K$+&08SASJLd
MW4U<7WS%,33O2%/!(7JDP>44HGFDH."8,L"##'#0$_X6\F"&T3P(K'"$(*S%c
M86&I.*'MC4TL!.?0GPD2NU\><\Y[GOA(P0$>/LX<DN('!V/A)[K!+?K&@V &b
M$IIW2R!U&Q\QVT.!FWNM;^U7ED+G,Z\6N.0)4L@.7<;PEK]+'9S2$O;#: X]a
MT6='X19-X5'T%1@O-@12\ 5#\ 1,, 6#,04*^ 6-<P7P<1H)N(!#@ 1!( 7Pz
M413>$2N4T7^B$R=E,#!SUB2!08!VL2:F8BN(YC-=P6=#HART]@)GH!4N0'S8y
M81==,BZ:=AOJ9VL'<Q<<Q1R5H1W')1#E0G3"T2'P$B0%Z(+_QW;[A6F*\P2Nx
M<2L.<2/&H34P@AR"8QG"88)(Q08- 1W8)WLUD#@0TW(<M![!D3EDT!3R@6!Nw
M@16#,4=A(8$:R($>V"#!(D^_XC;U81/]IG@M>( MT15C\&H>9'.W$6F%U$[Zv
MUS.+5B2WX2?(=U!)(3="YA;)%BL"V(7 4E"->(($XQKW5VB%$2RB(R@*@6F1u
M<1NW9U^:N"4\\HDL*$((:'X#$1=S@P64J(38HR2JL1VXB%]8YA:O-P-28A#Pt
MU!-%-(!?LTUUH8M>(W<VZ!@MT6?B]09WD!;?9P,)E':8DAYZ=&G+88EXT3/^s
MAX HD ,N4 ,)E";+D8D&LFM8\(Q2PFK\A!#8AVH@( -M2)!24DQ(L3%^0(_Vr
MF#B\^!FA" *4ER@Q!S8=1Q #^(UMT86R0P>%,G-N@"##EWC0^!:*!F4,@@(?q
MM8O^A5<M(& 9PE\M\@8/]R)J<3O%9P/8=Q9"\@8_,!MQTB%V,B4J,HY#E'_Op
MJ"OQ:"M+D4"W4T@\21J\\9-NB 60HA9R4B=A$71R<([X9QE=B%,&D5\(6)(Eo
MAY)A-03]]5_&A@5!(#H( FUWAVT!DY1]1I>OAFT^X0(P "P8J'YW61D$\0)'n
M(0<;(0=C\ +JUQ(8V&N=!"KJEXAZB7<@, 2FUB4#49=E4)5+MQZ11GF31(QAm
M8 =]X5&NM'B)TG@Y9QB#X2E+41?R,1A;691")BZU01 N]4A?@R<CT&\MH3"_l
MV1MY= 9)!P(OX#M,I!QM4$1Z$9JG^7M#QC.ZPBUI\I;4=4O8I5W<Y8U8 %QLk
M 1%(61$EEQXT0)MD&3R(E00,P(A\ (<Y 8;@08M\9LA,B(C BQ>XABZ8A=,j
M:#4H4)-DX'F!4W=>8A??5X\S(&7V21# YT2UH1T#4X5F,%#9D9^**2**P7FEi
MF8>YF7@3>BJ[4C7#^)MV) =X)")Z="R)(7G:(0+O&9_S*0*X03 LNJ&):)UNh
MT77V%J)?X ::4P8BH#@C4)^98FXPD ,O ,X\ (/)F.I) ,94@54P)9U!YY g
M !6=TD;*00<T8*13<)I\Z4A<I!:&.5D;@1=D\ +@R42K49]&ZC!849S[5H6Wf
M@G']059A$AGT<@>HF1RW(2S_AQ04)8AHHB8#XQ5PB@7V"2<'NARJHB=N,$Y&e
M"B,>4FBK:6XQLZG;%J1&V@*@&JH'$:JD"JJC6JJHFJJJNJJE:J0Q0QT#B4AWd
M(*NT"@)24 1!0 1-4 2N^GW+ WZT*@>S*JP((9C'UZL"]A,'0:S,.JMVMY<\c
M<JR,:J0]4*W6>JW6:JNXJJM%H#'8^JW5JFF5$1AAT0*0<0*WFJN[^A$M "Q8b
M( (D$ ,T&@(;\ZX4)0([<".$]S_G1! G8! (,0=KD :B4R[IRJW0803\YA2Pa
M0@9J(:=T 8 E7+#V*\6 ;"RXB\0:K#;NJO0T67^D@( )4^\@1$:<4\H81%3z
M (A?4 1/8 0?$1+HVK%%\!$F8 )(@Y%[1FI_]H5],6CX=WR!DGR*MHR-UGB0y
MQE]-,&F)>&E;AP6;]EP=XFF)1AAL(&JMH9N9B6KUQFJ5R9>!V8WKUR&XQE+\x
M")F_!BH8.&RR I**(T-A*I3*YA;GYVS/*FU]1FW,86W85G.)QVT&]VTM\3_Aw
M=GGD9FX\@&[JMGP@X&YE$F_S5F_WIAV?6:?!%A\ 9Q.\LXOWB12!BW#CHG#Mv
M\1X.!W$5H9H5=RC9A7&'HG' YW*D1GTA-W(^87*,DG*-NW+C)Z%YTK@P][B"u
M2'.2B',@H',\)Y0_MQ9!9TA$9W0'!Q6(\IDQ1+A>IXQR('5^A10\8'58IW69t
MA@74.R[-&W5BI[UE=W98D'8+17Q:XW;R%'?:,9D&NIG0FG=[MQY]Y[E_5Q$5s
M643["G.N@7C @KK>]WB11VJB:7GCEGDOY7R?IS*$VWWF1GHM87JHMQZJYY.Lr
M]U*N!WNR1WNT>WNRN4TOM7N]]WO^DJFM2'R-.$1#6[6,Z[CPYL#0)R'3]YK6q
M)R'9AQ;;-[@)4+CC-GKA-[B[BRG V&SI)[:V1K;M=X0H '\?9C7PZQ;V]R/Xp
MYX[[QP;]Q\3_%X :V853>(!.-H$-^( 1.($5>('8X8<,"(@?.*G)(8)F0()Zo
M(3" X8F0 L:+^()3HS6= 7<UB"6.@8,ZR(-?H36]$813HL3X\SQ'B)?&")(Jn
MNAY.:%E1&!9AS,<^>(74TA):F#5<Z*)E\(61<H+M$J$PMQP"$UMHZ'IK:)!7m
M*4-PJ#,V1(=V6!>GIH?9(1YLO($=^(%(,8#^=AOZV42>UR[8D<DPDHJ/:!=:l
M-HFVIQU8C(E&FQ!_,K1X#(I+(8J-2XI?;"C;UE2IB(*BK#4E^8IY@8\B08M1k
MJ1WZ>!MFJ8**Z(M( 8P+X1 5',U4<XSIR2#OK(W^F$[3."C66$C8J)_-N(WQj
M*[;?2!#A.(YUAR'G*"^#6"[LJ)19W&V3VGZNYY#W*"COS(\!#9!H(9!HP6JPi
MC) :@H ,Z=$0"2D2N<T4*7B* KQZ1FH;B05BV79@$9*U2)+X!RPGR4$I^4LLh
MF<,OR2@Q.6"T6Y,WB2 ZV1)3Z9.; 91"69MAL09'B808#8]<?)9/68M?,]4Pg
M4)55?959.91<^2-A79([G2EEV8RV@G]I2=1KV99X];9H)9=J\;71BI="1[_2f
M%@-^"9BR)K:#26IGBIB3M9B-B06/&1"^QF^3B8%^C1^8B<1WBVV>"5^T#)T$e
M4L&E>9K-08"&J\*MN7G,L1JQ61AT0)M$&1:W64-]MIL/T9MO\)NG$9QI,)SCd
M4IS'F9P@N9Q#YIS[M1P)/!]WU3,ZJM=8D)UBEEVVVIU:_)W4+9X=YF;(Q2^Hc
ME9XDMIY=(38LZ[)&T']HX&AB80/JK:WJVJU\\!+0)!#^^AET(=,C<[ >ZRW b
M1@8 =05C('4]( )@< =C<! %[D_X7;-@,&\;$A:P6M)E$ >X1 +^+74T^MX2a
M9+$SV]YME3,[ Z2Z8I8%R:3G(2 $0K2Z^!'P6N%C4'II0*W@BJV++,A_=7S>z
M&N/7*JZ_%R'F:A'&.D3LZJ[P*J\@0*\@8*\MGJ^VD>'R?;&8,[ %JT<_#ADHy
MH+!JRP8-^[!X,*<2FTT[5[%-_J];\Z !5RY3_K' )[(M0;(<04\HZT\KVX$Mx
M^[(QZ^.(?7PVB[-8H )\#@(Y.%)HX <)0 4C! )*8"(%"7XU1@,W8&,W4%9!w
MT1*B^N<[..B%?NBZ(@/@]Q,Z( ,Y0&,B]Z0MP>>D7NJFK@*CWN<T( ,LP.BHv
M1NJ2;JJKS@(!&:J#&S-%@)5%( 49\V^R8F4[X#$OP&HJX@9<PA=<'8^"Z#V^u
MIP+E!+ZXKNN\CKG*6!C8VQ7!G@##7NU*YWTC0R1JT2*@ <AN@S 6B5>H]NR4t
M!@*Y_A_3[NMS<)39ONW%?NP$D93_G"5>P2E;_1E5TS/.WA(K (C,$0",QM.s
M\!],\ 70V!Y,(_ 9.Q\U$B2][( 0F($4^ 06>,9_^,L[ /$C$$U#1,30CIRLr
M9F"(@:*ZZ(D!7_+MONL9(RR=<@994A' ]P7P8DK-&.S;OBA_X13-6!%UYR8.q
MT0:FDH_/TS9X8FXM3^H"4H00,0:"3NAN@>F)+A8PT.DSH ,7 NEGA06BVL@(p
MPU&67O6(KNEEU>DXH ,TX&*BON>G'O>H#O>LE@.PE ,N5NJQCA!V'TO+<ZHMo
M<.O4DY1U]'1Z8>1*L_!00 52T!-B8! ;\RQ?L$-!ZD.L! <&X[]+[Q8;LT)@n
M\09I4/AV <I\/$E'T"&+S,KA)M$AP(B4)/8=B]+(0*E+_@)0/A$=_@;D_A?m
ML/B-?S63[\P]I!P')0:8#_N@P5^=_P6?'_JY7_M8,/ %;P8'GS0*S_ RX/ -l
M%_W4L^V] 8L*C'F?.5^2F.X0C_JCK_I?P/I/Y_I1-W5S0/NF/_"W3^6Y7^2[k
MGP2*S_@]4?$/J/[-3_21OOE'/>[?\F-_=L#]@9WR)?_.'^Y+?8A/__4^_H?Qj
MTA@ W S.S_!!/_K7R]R8S/!_\('5L+$T1@!#GF$8>24O9O0!P1<SP(RUVWPRi
MX_&9/AGB].(11YEZE^[L;;I/-P-2R=][>V'OJY$]JF?H=&#:FSU:S^NE.KEGh
MZI8@"+ !L(0GO3H^M_>>("R)5;:NY!6\YR)"S,WKXPO)P2;LH'FS[K;@(ZH#g
M7G!;Y($Q2/*DG\$[00CO^C4\]@'Q8@84J )"@ DD ;;DZT"@S.!4V(< VD$\f
MJ ?Y(,5#8QH//FP,3F60!&%8(81[D-IUP%_V!V/&0$)I-< 1C@ [EB4P7A,(e
M O^#4_DC%3"-0![%JH,$CQ.Z!3_(J5HA]M%VK.8W,1L(1?S$&K *FZAY0V\d
MF+$)55$G'(&)L!6V0H,$"PE>C9HS8NT6,1KSQ_UXH2K$>+XL$ G#F($"_* (c
M1(06* 440UE8*6CANFAG7:*:Z<)-U0O)F2<$A0F 4TU"#V0*3^ <BWZ";]L-b
M ;(EF]*0,"-'^.:KQ0F/0B_P0\LK@\]P"'P!*[!@OL 42 ):H%MMJK% ':+&a
MMILZ2V$PX(!SM!0JPLA035(@"#0!9@@0?:%;: (#L2 >Q(3(J2Q'3RJ&B$%%z
M"(2!(J)D $4L81?QM&7$C=CTF& 3I'L@X ;$ !9P [:*WM."SS!R&($O8 28y
M0!5860SH/5"!=.@39$ Q7&6] G>($"_1;2+$/W2&'I$],($@, 260$Y8B,7Px
M11"*!+(Q(.)R0 LHX'9(KI0X4A*16>P)5S$59L4K@ 261A'XBC'C!A1#]>5*w
MRJ)?X2^/+BUN(H9@;]@B?L! ;Y$9(H1R2#!8X3348=NPU#@SFU +==(QS(7/v
M;C$^0V!H@1[CJZH!D1$7BJ2O\<]:GF;,BNL0/CS&:DC&+!Y!XHQ30!MN.VXXu
M&7U(,G1GXE#=845S> 2> %%\ E+@"G0@(N 9;8;WLR]^15<(&<Q0PN(B8^R$t
MO?$+" &NN 2$HQ0@CM,P!A3#19,<$\)89(X5P3D^PT^(!5J6!.I]':@)J,9-s
M51Z*H5$P>H)B9 0&Y_2#XD"2X6D\Q$'D"G$4.$RCJ<(!5]#%D*HE:!.I($Z,r
M 3?@!L02 #D%Y]ZZBQG;#@EH'N:('RL?\?.'NG%3^;JE< :R73&T%[3C=HR,q
MW'$GNB%^L!%C( \\HH5BS9 /1^14OFY U(JEX"&W'64P ]\OKA"(OK(<*E1Np
M&3GKH>4%B!8X$.Y"9.!$6R U=@&>QVJF68BK9IQH:+W(305MC*18= -K8 YLo
M@3P8!)S $I".56 HCL0BL"3#XC43%)&JNJ@4/7(E$\@L9'D9L@_,P"H8 P9,n
M+,D!4F) ID"3!P(DY$NAD'Y&^(FO6H$A62"UXY UDM6 R/(W(H5#A)B%)U+Im
MJ$B%4>"BI*"(BS$C1NY(&BGL6,V-S)&004;R2-QAH3@D,QR2K<9(VJ0_D20Gl
M$'DLD]O.25JO7&0IEP.F3)70XM5@22W));TDF!23")%,,LD6*273Y*)@D[K2k
M379#."GXY"3)BW,+B+R9-_2V/-;;F<-P\0V=G #ZIBZH&&0X<_H-1O"WEL#Bj
M MR *W"%RI],N1.PX+X1N?)54/ @1+@)Q^(N''P+(&%NRG4XC_+A,%%"6QU0i
M<##(2!1GEE0<A?MO+:Z"O3A&=>-PW,:X;#;.8>8XJ#6N>-RY@IA [B (N7@Uh
MK^J5"+A72DY>,#EMB;$$%L'Z-;U$L-DE&U?E%A:6*P-<0<MQ.34'3;Y<-@ESg
M&(O,::Z4&6U6)N$#672 9K(YD^41^HG*&F]T#I_P!I7YU\Q GFMA@,+ B0$Af
M,(X\W'R:$ROR"+F JQD0% 9'<8)6DRYES3&0 *: L'@Q1L(2OA(;DTIH0 U0e
M@F#/5&U-L>DUR:;9O TP1D*L34]'8S+$VRN0/]'IN4U:=])@7=Q$"(,32@ ^d
MP7<P_D*!,TWN9"^<32B EC2;)*,ME(%I #HM^X:)XN$G,]F7'2%HD,Y+>=Kc
MPYRO;G/.P!98%QRGX@%]H1-0D<[*^6\$9C=,G1NPW+E.T&E([$#%*9VU$W7Rb
M.=7).%LGBRP*C>='Y:.!< <<25BIG+42U1#/DN<Y'R?L#!:32GP]G>=I.FTGa
M@AJ>G)- %D@G: -R $\4.3]15-V \W #,H2>?) @8 ]T'=$Y(T3 8! !0&ISz
MC,Z%XA:H9 VI9%"H:M$%C[*BD,+^Q#;V\S'VAM'9!_@1_)2?,D][VH$$BC^#y
ME&?L"M1&3#R=)^0&+IDA4@\)U#-NJ@@J.QNHH92?+>+?$!T**D(W50H-$@"Tx
M@PK0)J(>XM]@:*%^AH"64'ZT"^,G$)LXZ(:"5IQU(Q^Z0 NL(02L*[P QK4%w
MFE3(<5(V0-[<T&G8&WQGXS&A>W(/E+@MN@)+GK,$7^+3)CI!&I #:D"KPWL-v
ML@J2404));;*^Q2&711^QE%.I2T(Q&V 02PBZX B#?LZJ#70J*G#=WXT6>Wu
M1[E?]7R=D;.*5APC( .Z9Z Y [I&>*H TU!E[("4&7A[P &VF]\%;^:? Z1Rt
MC[3 A02A<$FI1P+H#5_ BG8%%! [<(9L -;( 9T@>E92.D?X0NE^$1*E-($s
MD$FY7TZ086%A8[322KH%9, L)8 YX98"4V^E-]^;[[I(U<HGB!QGNDRC:5K:r
MI3D!E=J!Y8,"JNG&<#%!:2Q$"1#05KRI- 4!X90\"(6V(DYI0.Y, ',4!'11q
MH24UJ>;(T1E<,]]HS7P*7[XF3@R;FTF?VLVSF3?=WM:+ 6WS;0)!N<E/B0O9p
MNYMH,ZL8U$[WZ7Z@60FC3- ))D@6@ /^D>%4GPJ20;Y1W7D\@X1#\$_RP@X@o
MA=*),:P JO&>MO(U!0G-R3E9YX<I</!.@J[4RME27ZKPA*G2LZ:25.L9.4DHn
MT=FI**"G3E+A24N'*B*-G:K4+0#/RSD+<>><I)[&L\"-OTA4.U#-&" N<&#>m
ML9JM^LS\#.B3#Y=2W6%4N><$\20+R &/+GV:JKX'%!9G%IV?LC.$<BK\(4&Ql
MZ /%JZ-3KVXJODH'&*@#Y53RLSZX <':"A4K%NVA\E."":DIJDBOZ&'=5%HTk
MGGY1&@@X#:33@X(?QP;0 *$@5Q&":#T/ZBU/9D'X2?A0P&UXF# S0QU5T3<8j
M\J>(,IW24RQL3I#P-*0,_(P9=11+&**5*/I:@ \XJG!@"[B!+C 83D /. $]i
M8>#%@-6YJ8+K;4 !555SBH4\*O#XZ-S;A7\4DP72QC-(NZLAS:I/M7<NTD8:h
M/%UI),VN2]656E*(UTMMZ2:-.9[4E]Y2]XI/2.GY.Z7C(I6B&U:* 5DI,96Eg
MM/230@=<&A)TZ?FKKZ:TFK(+T&=@7VDQ/:;_59ERTF#Z34$ -=VPS'1V?5AHf
MNC&NZ7\%L'0@E7)3<PI.\X:4**<@UIJ*G'2*4,EIWG"GR%2S0DW(0%&F9M7De
MEURS?MF;N<DT=Q#8!+*7#0V438*:-O7F,;$Q6\]MPDU1161[)H]0LA"UH*[-d
M&5,#MLK?[*QS3W#N1,7Y$\N@&2(8.$5@?0&BAA30S1?X%V9V/(+"+Z 'O21\c
MJ+-?DCP*OM_T#)V 1BP"!C%8\H<_^P7T+!8($+^)TW3!';78$M-BPI%+#(ZQb
MP4-K#!4M&F2TA\G1+E&.T-S0P+Q!M/'A#'K!1MO8-BU\^A.3%M1:VE&;:4LMa
MI$6>72'55EHN>&EQ":E53*:V\^"C25L&*9;'R G;+JD9!,)& PR;T',,XFA*z
M)EI:B[@4AJ*X#V@ Q6C!4+MHS\U_B;1T80=)6U$U6FE=ZUBMO/#,=L(TNT+8y
MK I[LWM6W'[$.8MG[VS2R+.@,-WV64([)@?MKBJT\9;2+EM1NZ."B:F]-1#!x
MT[8$5<ML^^W6A+2=]M/.6GZ+2_PMI.5$LG;?5MLA=7 Y JR]L@I7XM9:BIMKw
M\\)&$;A:T-?^VF#[7_I2L4U$84(KC"/G2&UK+0]PMLWAH$3;=+MJW4+BNK8 v
M5]ONV'KZ8_'I93,(598S180CZW.++!Y8LGBSR4Y4A,KV0MU%/9S ),CBG:.;u
M997NWK0!7V4'1CJZ!SC'J!GE)Z658WQ=U0JJ;)\S@;,Q8Y4\0YRG)LVN*DP t
MJ=2=^+SS)U3,H0M)L5&5[JY=;;I\W&Y67'_C@H?X7;O;&P3OZ:N[@ 'NVKN<s
MMQ3@#-<=GP>RHR[(N/I1356=I $L0 ;4V)&: /# 4A@?V8,,-(IU=_OD0^J0r
M)24/OM$_3@('$@ N^A>UM&!HTQX&#WVIYY4#UR-[^ _Z5T1RA>N= W; O-(_q
M^]'J4(#QVZ7_YO0RD]J[>E>#Z]46PE?V!MAMFB=B2.SMO)\W?>Q>ZM%[V<#Op
M#;[,EWH07QI@?$G?^4,?9F($B-.O-WS%Q^.;(N9!D](!Y6M>22_K?;Y "(RFo
MW@1 0]H%8A 6DP$R&%YH.>?*&Q80"-12O64(C D9L*6&XY;V#3(P8-Q17<1En
M?T.8YI+ &;B38!$8,+MD<.\R6;G1>;GB$*:]')G^B@'O2YU!G;21"!:8)TZ m
M-B.#62\59C;9<F%A^;8$Z+:=IIMN\4XM8=OQ8.FV77XP&Q@,S46EK)U2M1>Nl
MVWCR,-OM/'DW-6,@A HS3#'O 9@$$T/U%UC7KN@9%:=#((ABAT@T41-Q;9AKk
M5MB'EC MR ",D .HPFIA+2N&<<($?L"AFZH%2(&CX! PSA7 %0I#<[R1Q5%.j
M+%;)++(?:2($CHM 3SA"T0P)E^TC&<U_X@3%9C]E*!YNT*&!.L ?$D->% N-i
MKN1P/:W[]425)7:H9#-$<&(GX(ESHEC8>EV6[;F]IPMFPVR?6Y\\D?(:2)NZh
M.Z^G>;$_0:)T#M!C)B""GY%<JL$3ODY/7OPYK^>SL*W<,QG?3O!I^I@Q4:T(g
MBC4:4]5I3%--7X XI#)/9]0\$U<@Y,/HY)Z@<WI^8_0:CFE>X,!-Y[AT9M=Ef
M[%1Y)V%M7E/U="ICZ&>-TRMAC<>T<QM_SVX\/9QJ3D6I1Y5[*E6@BHQGZO14e
MG^SST>G)?FR/?0TP#@O"V)@AHO^V0\)"0];'W)@>'U+>^8PM:#YFR 2Y<Z)7d
MWIF-3[(D5<?8<^:-XX&9: R"DC'T"] M.-Q#(]G!/><Q_RX'OOBZN62]W$Uc
M%LJ1\Q_[Y*(<DH/R(3W(LO7I(-6%_%.I74JNQ6,T!IC154=:#>>F8C7S\.ETb
MJ5JV!C:?#G@6'9G4 (L#FB)4@T\IR,PP9@Q<I[J3 P=--L<^&8.@ "DCE]==a
M+X615&X.E67O8P+ZY'"$'$E@"BP!*<-MM7*KT[QV]2M?IJDUE@6S64;+YJ[/z
MK.49P3^WC5M6#G"YY?5EG3RIQ+%=CL%XN>CH9;Z<'_PR7.9J*, R$V;#?!T1y
MLV*6,E@9)ZXZ\TD#9L#;_(F2>4\Y+3XC-P9#-TP5C:<BO$>?XB"TAC!3'%_Yx
MV8UFNER:W7%%Z,FJ.09@UVE,FV:$;67-!?DO:\@@,3K?HX<LAO)EW#42SLR7w
MEG-:5:.>KM7YYL@<,UB-</Y9Q!G1&&?=L_F4\V=>%YOL.8=FZ=R:2;-,?L?Tv
M,SMOY^_9G>W =R[(X?DU^[KRK!K.\[9+SV]G/;>3]OR?F:'3HTL<A:[PRP1Pu
M!0('*RXZ3U LK#UH]%5DS-,UQ9MI"&[B3HRB'QV3LC%8=]7!S=SL],J##8@Et
M-3;L^F@@378#GTJ^J<6+"!"!6V4WAL(N@0)GE0Z(57,1@_+6+OD:(2HN.]5<s
MM:2+0)-F M]"EW"%*?UJ(L0!(1(5(4N+9J=:5<4T&9@"SR-1[A%_@Q12@YE^r
M'N5B'#[E("%GZ@#DVZX0^DB[3@.1C'YQEI /2$'8ZI6[,"S5U]I)RU8Z5JSIq
M0SJ,-[(Q]LC"=@B8@; *;,>J9Y,O[2LS$P1)X:'!K!/4= I2!NCHL*OI/HZJp
M%CD3N3X3Z"[:EP<>62U_*F *=*BP'%^@0!,YRGWT0;*:)_!<1)E%$B]EM5*4o
MCEQT@@(%951MD8HOZ KWA8#@%U8(S;A#6&BN#D%P((VV+G]AXL.]";< *W2%n
M5X)*D$%2E MAJSAX=)\S2*S.(.GBN2>J#!+FE5(E+0O&#/$<,ZKJ9U(A<OI6m
M=]4LK4*T=+_^U.2OJWY5,Q"P$397O1WC,&;H:L7 JW6&KUX.&\,$+.RC7)#El
M85M (.4.9*,):;.F,R654]<=)DDB@2=0!+;B$""3+N!,,U,8T!-ZJ;MF-39@k
M>; &Q"D*Z]I35([NT[29X(4/!Y'TG@"T@4#A2@11]@&=*"6?IMQ8H@2[S$>j
MTL;R'7C QP:E5Z@'5/ST7B: =?DZ)^BO#?$*\IY.GB&C(#>LR60$M'/T7*K'i
M-U#?["<H Q2D:.W*N[@U"\-;B@*T@H?H"2B U:" L&V5 ;<)J)SS."&0OBW@h
M)W %&5BS$&>6@@#IRIH]HP@L D. "@#'0$L2C=S2;D8U>RX+PQ=*!\R ZRL!g
M^HNX4$HZ)>*>L':K'5Q@L0Z&$/6=O?$T]-MG@/76$?K >D%.3FZ%731 B.Y-f
MA2,1R!> 7AM#<!-N7Z==4<#A7M"VTO$M[L;]%""W0U@!QO1W<ZKBO4+@0(%+e
MWM!A>3MDZ/"\$_?Q9=QUP'%;[S*P F@ AJ6TVQO,K!#\(3.4=W4>Q\S;<"/Nd
M:2R]4P#Z5M\/YWI'T=\]O&.&\2L*?UIB9.[-/2:/L@H,U)S*^(FXA]F,*$/@c
M/KY;XX"[ 3Q@^D05%,2\ZDTBZVN]W0KY-NX&W/;[0 \SCZR_H7=N/=_4^W$'b
M\#(@N2GW:YZ&EWN!+Z!ZZ[F!C5D*W?";3[I0'6JZ10#JUFB@8Z&P[H3FNHE,a
MAXC="91V!RGMW0IQM^Z>%;W;)Y0^(3D-";<*: .=HXG(C,%]OP-'_B;?^_M[z
M]N\M $]PP/M&E7MU&H-QOL 09 8"G /5<%=_ZHO- D0 '2^L]9.* V;H,$#'y
MP&I 7-\)/3Q9Q%8-V<!;X5?/(QC[ D;^A(Y0Q#DF^H4!G%A&,EKSB3'HX_<x
M9$.'3B[&HRG-#N7Q$S;+YJX@9> X#@?CGEQF1 XK\ 60 !% "P,/,S-J5!XSw
M-+DKW]M4S@VX$*.Q+DIL&^+ED!R6E_+Q *MLMPCUY7B8E']RV1,#QH S!]ZHv
MO$__Z>F:S9]TE"X>:,,\7/,(CC+_-"C?Y/+TD5.L^(G*N??Q7D@$B8RK\,*-u
MQEVX=H7AZ;MZSW#L_<:GH3OWWO4[?)?Q%9Y;G7<:C]Z*VW_'\/7=OONY,'3Gt
M]!M\RW/33-";=_GFWPG]?^MSB+,"!O@XWU0:/(%C;LV]PX/E1P_>)/R!K[O7s
M+,$3&@7G$A8\U9"^#%[.3=_<%JT@O :@3Y_]!'$Q3Q+A9?>W=IO1L1D.^@O7r
M"[F\G \&-PVE@V=+YQ)!>7O[\(1V$"(?:]AY-]Q)<X6F'B16@%4W2XY0E*, q
M;0X";A9T8.I1NEI)AR%0'4HI8FW-/72OTAP\\@:,^CU'ZB]FI#/P8#D84 "7p
M9M*Q49R:APBDUTMZ0LR=PA"M^[JS41X:8EA/YT+=N@)J.0K!!^M<+^KV7'I/o
M;L6-P)>Z-P^>$]TZ8ZZ>\+FAN@.W7!/<)SA"PJ?-W3J5?!Y=&P^0;?@IV8OVn
M%SC:D>,HT^K6_*&-KHCV)"6Z(ISHF)$A-"_7:W0&:<J:JI^KB5=Q*[;1H9@&m
M=#JT\&4[ZQB] 1^G[?UFKTS" >P9"" J(^T2WYDX)OD&#]%&-F(-B(&Y?$HCl
M2NZ=(JJ';W@&FO,$18YZ9^^GX;V/@!8P%N)[ M@/@J:1B*-])=[%QQ?1'D.@k
M$"Z!*0 %=MT2J!*D-SUYWR\B-<Y[ZU8ZE#)+%F0 DD:DQJ/)(V7UBEPR-8K=j
M6QT.>)NQ>L-?$?"^X<>[1BSO_WTO: [T+H36.Z5M[V) OX^%5QCCY[M>B!(Ni
MYK[?^/PN1OC[]+$9,3[ #Z4[0.#%KX'/'B,@P>_!!=_@I<"#;_$FPO4>7?,^h
MXR^\@,CPX=W)[X\.+]_)%<\H?R(^T53B@%HW?_MW5\4T^A/3#!NSHF?QUH71g
M6+-N-O<X[XIA@'3W*EVONG==G'@#,&]/3*-0M]!SU'P=U!'K%AT,,&"W?]%:f
M'?&TML"&V!.[#%3L,W"QCS+H--ML_I:L9KEMJG$B@.2H>8^GXP#,.QJ&-NI4e
M[V0 22:-.T@%A$"8- *[;DR6R6(([C:8T#N3MI) 9\H@D08L-*LI"EW!(*QId
M5)CI-_W%EAD:^U.?=JB(AK9J&7#>GRFJI_3C!AU^SBQ$ 2<@=D/7?)6O@+C3c
MPRE$(D2QDFM#HDUT*\X0-YH&2/>3M% 1 KI713"BW0OW=Y_HFJZ-D1*"'O(Zb
M/8/$ GH@HD^[IW0SR8F#4I9B=(&C2V( 1QXA+K#A$WZ>_R@//Z!>8KLC\0L<a
MQ2>]%O\$R>\C1)?^G!@@^9LIYTU\]A[R%0680?ES0KGYT[X<,Z!57K!):J 'z
M) ";?UX*\JU0*<\"Y^M\NM06N )=L6) ?R30E2I(\ U^K,ZF"K^N-/PY ?.=y
M1<<' 1\?X=--C&]W!"K'/R@>O^+3)>Y=]4U^U5?Y8?_&MWRLP% R?LQG3D?Hx
M6:2+H;O2UQW/%_H['];DA:6_[GY^&@CZ8B#GA_RB3P:.OM\W'2OB\8I1G.B;w
M6QW>GGM:/^H?E,!&]2F_U9_\6%_LA_JC?XK- .??3!*?(&1]4SKV1[[E-_N6v
M7^6+?I9/EUP^)K8[,C_QTWQ@,@5N?1+ EZ:<AQ]DS#S@0D>H"LQ1%0U_M%*u
MGZ'^G%CXG[_RVYV(C_E'O_'OFA_%\NM3RQ_Z,S_(+_T()/FW$:UP\E/_=SCZt
G'S] /'_7K_UC_]68^[*?A+N VG]!;G_N7R4$@??_CG47$8"_ B@Gs
r
end
--[0029]--

View File

@@ -0,0 +1,42 @@
[0030] daemon@ATHENA.MIT.EDU (Peter MacDonald) Linux_Activists 11/10/91 20:34 (39 lines)
Subject: shoelace patch #2
Date: Sun, 10 Nov 91 16:57:48 PST
From: pmacdona@sol.UVic.CA (Peter MacDonald)
To: linux-activists@joker.cs.hut.fi
There is a big difference between floppy the device numbers on linux and
on minix. In particular linux has fd0 as 0x208 while minix uses 0x200.
ie. linux /dev/fd0 == minix /dev/fd0-dshd5in
The following patch will keep linux from using 0x200, which it doesn't
know about and instead use 0x208 and 0x21c.
Apply this after all other patches.
pmacdona@sol.uvic.ca
*** shoe.c.bad Thu Nov 7 08:43:30 1991
--- shoe.c Thu Nov 7 08:52:27 1991
***************
*** 638,646 ****
longjmp(errjmp, 1);*/
unsigned *myptr = (unsigned int *) (&((char *) bp)[508]);
char *myroot = getenvs(SaveConfigPtr,"rootdev");
! if (strcmp(myroot,"bootdev"))
! *myptr = atoi(myroot);
! else
*myptr = 0;
if (*myptr == 0)
{ if (diskcode)
--- 638,645 ----
longjmp(errjmp, 1);*/
unsigned *myptr = (unsigned int *) (&((char *) bp)[508]);
char *myroot = getenvs(SaveConfigPtr,"rootdev");
! *myptr = atoi(myroot);
! if (0x200 == *myptr)
*myptr = 0;
if (*myptr == 0)
{ if (diskcode)
--[0030]--

View File

@@ -0,0 +1,38 @@
[0043] daemon@ATHENA.MIT.EDU (Peter MacDonald) Linux_Activists 11/11/91 14:06 (35 lines)
Subject: shoelace patch#3: put environment ptr where linux can find it.
Date: Mon, 11 Nov 91 10:58:22 PST
From: pmacdona@sol.UVic.CA (Peter MacDonald)
To: linux-activists@joker.cs.hut.fi
I know, I know. Three patches in 24 hours... I plead end of term
instability. The following one line patch puts the environment
offset relative to the shoelace corpse which is located at segment 0x80000.
Thus, an offset of 0x1234 would put the address of the env at 0x81234.
This offset is stored at location 0x90506: ie. in the word before the
root device word (508) in the bootsect.s corpse.
By including the shoelace header file shoeconf.h, the linux kernel
could now read in any of the environment variables it wanted (including
scr_cols and scr_rows ;-)
BTW: Given Bruce Evans comments about shoelace:fsck ties to minix,
we may wish to remove it from the code. Who wants a facility that
only works with ~20Meg or less partitions anyways :-)
pmacdona@sol.uvic.ca
--PULL_TAB_HERE -------------------------------
*** shoe.c.bad2 Thu Nov 7 09:33:34 1991
--- shoe.c Thu Nov 7 09:45:28 1991
***************
*** 650,655 ****
--- 650,656 ----
else
*myptr = 0x21c;
}
+ *--myptr=(unsigned int)SaveConfigPtr;
Linux = 1;
LoadPoint = 0x90000;
bpinx = 0;
--[0043]--

Binary file not shown.

View File

@@ -0,0 +1,10 @@
curses.tar.Z contains the curses library from bsd-net-2, with
pre-installed diffs & RCS files for linux changes.
You'll need to use 'pmake' to build it, or reconstruct the Makefile.
I'm not completely certain that I got all of the raw(), crmode() etc
stuff right. If you have applications that use curses, try them out and
send back patches if you find bugs.
John Kohl <jtkohl@cs.berkeley.edu>

Binary file not shown.

View File

@@ -0,0 +1,103 @@
/* df.c: Copywrite (92) Peter MacDonald: distribute freely, don't restrict. */
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <linux/fs.h>
char *hdr1="\n inodes inodes inodes blocks blocks blocks mount";
char *hdr2= "device total used free total used free point";
char *hdr3= "--------------------------------------------------------------------";
char *fmt = "%-9s %-7d %-7d %-7d %-7d %-7d %-7d %s\n";
void do_df(char *dev, char *dir);
int main(int argc, char *argv[])
{ int i;
sync();
puts(hdr1);
puts(hdr2);
puts(hdr3);
if (argc != 1)
for (i=1; i<argc; i++)
do_df(argv[i],"");
else
{ FILE *F = fopen("/etc/mtab","r");
if (!F)
{ fprintf(stderr,"/etc/mtab not found\n");
exit(1);
}
do
{ char buf[200], dev[40], dir[150];
fgets(buf,200,F);
if (feof(F) || (strlen(buf)<6))
break;
sscanf(buf,"%s %s",dev,dir);
do_df(dev,dir);
} while (1);
}
exit(0);
}
#define oops(str,arg) { fprintf(stderr,str,arg); close(fd); return; }
int fd;
int nibblemap[] = { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4 };
ino_t count(unsigned numblocks, unsigned numbits)
{ unsigned i, j, end, sum = 0;
char buf[BLOCK_SIZE];
for (i=0; (i<numblocks) && numbits; i++)
{
if (read(fd,buf,sizeof(buf))<0)
return(0);
if (numbits >= (8*BLOCK_SIZE))
{
end = BLOCK_SIZE;
numbits -= 8*BLOCK_SIZE;
}
else
{ int tmp;
end = numbits >> 3;
numbits &= 0x7;
tmp = buf[end] & ((1<<numbits)-1);
sum += nibblemap[tmp&0xf] + nibblemap[(tmp>>4)&0xf];
numbits = 0;
}
for (j=0; j<end; j++)
sum += nibblemap[buf[j] & 0xf] + nibblemap[(buf[j]>>4)&0xf];
}
return(sum);
}
void do_df(char *dev, char *dir)
{ int it,iu,bt,bu;
struct super_block supstruct;
if ((fd=open(dev,O_RDONLY))<0)
oops("df can't open device: %s",dev);
lseek(fd,BLOCK_SIZE,SEEK_SET);
if (read(fd,(char*)&supstruct,sizeof(struct super_block))
!= sizeof(struct super_block))
oops("super block unreadable: %s",dev);
lseek(fd,BLOCK_SIZE*2,SEEK_SET);
if (supstruct.s_magic != SUPER_MAGIC)
oops("not a valid file system: %s",dev);
it = supstruct.s_ninodes;
iu = count(supstruct.s_imap_blocks,supstruct.s_ninodes+1);
bt = supstruct.s_nzones << supstruct.s_log_zone_size;
bu = count(supstruct.s_zmap_blocks,supstruct.s_nzones) <<
supstruct.s_log_zone_size;
printf(fmt,dev,it,iu,it-iu,bt,bu,bt-bu,dir);
}

View File

@@ -0,0 +1,645 @@
/*
* fsck.c - a file system consistency checker for Linux.
*
* (C) 1991 Linus Torvalds. This file may be redistributed as per
* the Linux copyright.
*/
/*
* 09.11.91 - made the first rudimetary functions
*
* 10.11.91 - updated, does checking, no repairs yet.
* Sent out to the mailing-list for testing.
*
* 14.11.91 - Testing seems to have gone well. Added some
* correction-code, and changed some functions.
*
* 15.11.91 - More correction code. Hopefully it notices most
* cases now, and tries to do something about them.
*
* 16.11.91 - More corrections (thanks to Matti Jalava). Most
* things seem to work now.
*
* I've had no time to add comments - hopefully the function names
* are comments enough. As with all file system checkers, this assumes
* the file system is quiescent - don't use it on a mounted device
* unless you can be sure nobody is writing to it (and remember that the
* kernel can write to it when it searches for files).
*
* Usuage: fsck [-larvsm] device
* -l for a listing of all the filenames
* -a for automatic repairs (not implemented)
* -r for repairs (interactive) (not implemented)
* -v for verbose (tells how many files)
* -s for super-block info
* -m for minix-like "mode not cleared" warnings
*
* The device may be a block device or a image of one, but this isn't
* enforced (but it's not much fun on a character device :-).
*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <ctype.h>
#include <stdlib.h>
#include <termios.h>
#include <sys/stat.h>
#include <linux/fs.h>
#ifndef __GNUC__
#error "needs gcc for the bitop-__asm__'s"
#endif
#ifndef __linux__
#define volatile
#endif
#define ROOT_INO 1
#define UPPER(size,n) ((size+((n)-1))/(n))
#define INODE_SIZE (sizeof(struct d_inode))
#define INODE_BLOCKS UPPER(INODES,INODES_PER_BLOCK)
#define INODE_BUFFER_SIZE (INODE_BLOCKS * BLOCK_SIZE)
#define BITS_PER_BLOCK (BLOCK_SIZE<<3)
static char * program_name = "fsck";
static char * device_name = NULL;
static int IN;
static int repair=0, automatic=0, verbose=0, list=0, show=0, warn_mode=0;
static int directory=0, regular=0, blockdev=0, chardev=0, links=0, total=0;
/* this is used to implement the (coming) two-pass zone checking. */
static int trust_zone_bit_map=0;
static int changed = 0; /* flags if the filesystem has been changed */
/* File-name data */
#define MAX_DEPTH 50
static int name_depth = 0;
static char name_list[MAX_DEPTH][NAME_LEN+1];
static char * inode_buffer = NULL;
#define Inode (((struct d_inode *) inode_buffer)-1)
static char super_block_buffer[BLOCK_SIZE];
#define Super (*(struct super_block *)super_block_buffer)
#define INODES ((unsigned long)Super.s_ninodes)
#define ZONES ((unsigned long)Super.s_nzones)
#define IMAPS ((unsigned long)Super.s_imap_blocks)
#define ZMAPS ((unsigned long)Super.s_zmap_blocks)
#define FIRSTZONE ((unsigned long)Super.s_firstdatazone)
#define ZONESIZE ((unsigned long)Super.s_log_zone_size)
#define MAXSIZE ((unsigned long)Super.s_max_size)
#define MAGIC (Super.s_magic)
#define NORM_FIRSTZONE (2+IMAPS+ZMAPS+INODE_BLOCKS)
static char inode_map[BLOCK_SIZE * I_MAP_SLOTS];
static char zone_map[BLOCK_SIZE * Z_MAP_SLOTS];
static unsigned char * inode_count = NULL;
static unsigned char * zone_count = NULL;
void recursive_check(unsigned int ino);
#define bitop(name,op) \
static inline int name(char * addr,unsigned int nr) \
{ \
int __res; \
__asm__("bt" op " %1,%2; adcl $0,%0" \
:"=g" (__res) \
:"r" (nr),"m" (*(addr)),"0" (0)); \
return __res; \
}
bitop(bit,"")
bitop(setbit,"s")
bitop(clrbit,"c")
#define inode_in_use(x) (bit(inode_map,(x)))
#define zone_in_use(x) (bit(zone_map,(x)-FIRSTZONE+1))
#define mark_inode(x) (setbit(inode_map,(x)),changed=1)
#define unmark_inode(x) (clrbit(inode_map,(x)),changed=1)
#define mark_zone(x) (setbit(zone_map,(x)-FIRSTZONE+1),changed=1)
#define unmark_zone(x) (clrbit(zone_map,(x)-FIRSTZONE+1),changed=1)
/*
* Volatile to let gcc know that this doesn't return. When trying
* to compile this under minix, volatile gives a warning, as
* exit() isn't defined as volatile under minix.
*/
volatile void fatal_error(const char * fmt_string)
{
fprintf(stderr,fmt_string,program_name,device_name);
exit(1);
}
#define usage() fatal_error("Usage: %s [-larvsm] /dev/name\n")
#define die(str) fatal_error("%s: " str "\n")
/*
* This simply goes through the file-name data and prints out the
* current file.
*/
void print_current_name(void)
{
int i=0;
while (i<name_depth)
printf("/%.14s",name_list[i++]);
}
int ask(const char * string,int def)
{
int c;
if (!repair) {
printf("\n");
return 0;
}
if (automatic) {
printf("\n");
return def;
}
printf(def?"%s (y/n)? ":"%s (n/y)? ",string);
for (;;) {
fflush(stdout);
if ((c=getchar())==EOF)
return def;
c=toupper(c);
if (c == 'Y') {
def = 1;
break;
} else if (c == 'N') {
def = 0;
break;
} else if (c == ' ' || c == '\n')
break;
}
if (def)
printf("y\n");
else
printf("n\n");
return def;
}
/*
* check_zone_nr checks to see that *nr is a valid zone nr. If it
* isn't, it will possibly be repaired. Check_zone_nr returns != 0
* if it changed the nr.
*/
int check_zone_nr(unsigned short * nr)
{
if (!*nr)
return 0;
if (*nr < FIRSTZONE)
printf("Zone nr < FIRSTZONE in file `");
else if (*nr >= ZONES)
printf("Zone nr > ZONES in file `");
else
return 0;
print_current_name();
printf("'.");
if (ask("Remove block",1)) {
*nr=0;
changed = 1;
return 1;
}
return 0;
}
/*
* read-block reads block *nr into the buffer at addr. It returns
* 0 if the *nr is unchanged, 1 if it was changed.
*/
int read_block(unsigned short * nr, char * addr)
{
int blk_chg = check_zone_nr(nr);
if (!*nr || *nr >= ZONES) {
memset(addr,0,BLOCK_SIZE);
return changed;
}
if (BLOCK_SIZE*(*nr) != lseek(IN, BLOCK_SIZE*(*nr), SEEK_SET))
die("seek failed in read_block");
if (BLOCK_SIZE != read(IN, addr, BLOCK_SIZE)) {
printf("Read error: bad block in file '");
print_current_name();
printf("'\n");
memset(addr,0,BLOCK_SIZE);
}
return blk_chg;
}
/*
* write_block writes block nr to disk.
*/
inline void write_block(unsigned int nr, char * addr)
{
if (!nr)
return;
if (nr < FIRSTZONE || nr >= ZONES) {
printf("Internal error: trying to write bad block\n"
"Write request ignored\n");
return;
}
if (BLOCK_SIZE*nr != lseek(IN, BLOCK_SIZE*nr, SEEK_SET))
die("seek failed in write_block");
if (BLOCK_SIZE != write(IN, addr, BLOCK_SIZE)) {
printf("Write error: bad block in file '");
print_current_name();
printf("'\n");
}
}
/*
* mapped-read-block reads block nr blknr from the specified file.
* it returns 1 if the inode has been changed due to bad zone nrs
*/
inline int mapped_read_block(struct d_inode * inode,
unsigned int blknr, char * addr)
{
unsigned short ind[BLOCK_SIZE>>1];
unsigned short dind[BLOCK_SIZE>>1];
int result;
if (blknr<7)
return read_block(blknr + inode->i_zone,addr);
blknr -= 7;
if (blknr<512) {
result = read_block(7 + inode->i_zone, (char *) ind);
if (read_block(blknr + ind,addr))
write_block(inode->i_zone[7], (char *) ind);
return result;
}
blknr -= 512;
result = read_block(8 + inode->i_zone, (char *) dind);
if (read_block(blknr/512 + dind, (char *) ind))
write_block(inode->i_zone[8], (char *) dind);
if (read_block(blknr%512 + ind,addr))
write_block(dind[blknr/512], (char *) ind);
return result;
}
void write_tables(void)
{
if (BLOCK_SIZE != lseek(IN, BLOCK_SIZE, SEEK_SET))
die("seek failed in write_tables");
if (BLOCK_SIZE != write(IN, super_block_buffer, BLOCK_SIZE))
die("unable to write super-block");
if (IMAPS*BLOCK_SIZE != write(IN,inode_map,IMAPS*BLOCK_SIZE))
die("Unable to write inode map");
if (ZMAPS*BLOCK_SIZE != write(IN,zone_map,ZMAPS*BLOCK_SIZE))
die("Unable to write zone map");
if (INODE_BUFFER_SIZE != write(IN,inode_buffer,INODE_BUFFER_SIZE))
die("Unable to write inodes");
}
void read_tables(void)
{
memset(inode_map,0,sizeof(inode_map));
memset(zone_map,0,sizeof(zone_map));
if (BLOCK_SIZE != lseek(IN, BLOCK_SIZE, SEEK_SET))
die("seek failed");
if (BLOCK_SIZE != read(IN, super_block_buffer, BLOCK_SIZE))
die("unable to read super block");
if (MAGIC != SUPER_MAGIC)
die("bad magic number in super-block");
if (ZONESIZE != 0 || BLOCK_SIZE != 1024)
die("Only 1k blocks/zones supported");
if (!IMAPS || IMAPS > I_MAP_SLOTS)
die("bad s_imap_blocks field in super-block");
if (!ZMAPS || ZMAPS > Z_MAP_SLOTS)
die("bad s_zmap_blocks field in super-block");
inode_buffer = malloc(INODE_BUFFER_SIZE);
if (!inode_buffer)
die("Unable to allocate buffer for inodes");
inode_count = malloc(INODES);
if (!inode_count)
die("Unable to allocate buffer for inode count");
zone_count = malloc(ZONES);
if (!zone_count)
die("Unable to allocate buffer for zone count");
if (IMAPS*BLOCK_SIZE != read(IN,inode_map,IMAPS*BLOCK_SIZE))
die("Unable to read inode map");
if (ZMAPS*BLOCK_SIZE != read(IN,zone_map,ZMAPS*BLOCK_SIZE))
die("Unable to read zone map");
if (INODE_BUFFER_SIZE != read(IN,inode_buffer,INODE_BUFFER_SIZE))
die("Unable to read inodes");
if (NORM_FIRSTZONE != FIRSTZONE)
printf("Warning: Firstzone != Norm_firstzone\n");
if (show) {
printf("%d inodes\n",INODES);
printf("%d blocks\n",ZONES);
printf("Firstdatazone=%d (%d)\n",FIRSTZONE,NORM_FIRSTZONE);
printf("Zonesize=%d\n",BLOCK_SIZE<<ZONESIZE);
printf("Maxsize=%d\n\n",MAXSIZE);
}
}
struct d_inode * get_inode(unsigned int nr)
{
struct d_inode * inode;
if (!nr || nr > INODES)
return NULL;
total++;
inode = Inode + nr;
if (!inode_count[nr]) {
if (!inode_in_use(nr)) {
printf("Inode %d marked not used, but used for file '",
nr);
print_current_name();
printf("'\n");
if (repair)
if (ask("Mark in use",1))
mark_inode(nr);
}
if (S_ISDIR(inode->i_mode))
directory++;
else if (S_ISREG(inode->i_mode))
regular++;
else if (S_ISCHR(inode->i_mode))
chardev++;
else if (S_ISBLK(inode->i_mode))
blockdev++;
} else
links++;
if (!++inode_count[nr]) {
printf("Warning: inode count too big.\n");
inode_count[nr]--;
}
return inode;
}
void check_root(void)
{
struct d_inode * inode = Inode + ROOT_INO;
if (!inode || !S_ISDIR(inode->i_mode))
die("root inode isn't a directory");
}
static int add_zone(unsigned short * znr)
{
int result;
result=check_zone_nr(znr);
if (!*znr || *znr >= ZONES)
return result;
if (zone_count[*znr]) {
printf("Block has been used before. Now in file `");
print_current_name();
printf("'.");
if (ask("Clear",1)) {
*znr = 0;
changed = 1;
}
}
if (!*znr || *znr >= ZONES)
return result;
if (!zone_in_use(*znr)) {
printf("Block %d in file `",*znr);
print_current_name();
printf("' is marked not in use.");
if (ask("Correct",1))
mark_zone(*znr);
}
if (!++zone_count[*znr])
zone_count[*znr]--;
return result;
}
static int add_zone_ind(unsigned short * znr)
{
static char blk[BLOCK_SIZE];
int i, result, chg_blk=0;
result = add_zone(znr);
if (!*znr || *znr>=ZONES)
return result;
read_block(znr,blk);
for (i=0 ; i < (BLOCK_SIZE>>1) ; i++)
chg_blk |= add_zone(i + (unsigned short *) blk);
if (chg_blk)
write_block(*znr,blk);
return result;
}
static int add_zone_dind(unsigned short * znr)
{
static char blk[BLOCK_SIZE];
int i, result, blk_chg=0;
result = add_zone(znr);
if (!*znr || *znr >= ZONES)
return result;
read_block(znr,blk);
for (i=0 ; i < (BLOCK_SIZE>>1) ; i++)
blk_chg |= add_zone_ind(i + (unsigned short *) blk);
if (blk_chg)
write_block(*znr,blk);
return result;
}
void check_zones(unsigned int i)
{
struct d_inode * inode;
if (!i || i >= INODES)
return;
if (inode_count[i] > 1) /* have we counted this file already? */
return;
inode = Inode + i;
if (!S_ISDIR(inode->i_mode) && !S_ISREG(inode->i_mode))
return;
for (i=0 ; i<7 ; i++)
add_zone(i + inode->i_zone);
add_zone_ind(7 + inode->i_zone);
add_zone_dind(8 + inode->i_zone);
}
void check_file(struct d_inode * dir, unsigned int offset)
{
static char blk[BLOCK_SIZE];
struct d_inode * inode;
int ino;
char * name;
changed |= mapped_read_block(dir,offset/BLOCK_SIZE,blk);
name = blk + (offset % BLOCK_SIZE) + 2;
ino = * (unsigned short *) (name-2);
inode = get_inode(ino);
if (!offset)
if (!inode || strcmp(".",name)) {
print_current_name();
printf(": bad directory: '.' isn't first\n");
} else return;
if (offset == 16)
if (!inode || strcmp("..",name)) {
print_current_name();
printf(": bad directory: '..' isn't second\n");
} else return;
if (!inode)
return;
if (name_depth < MAX_DEPTH)
strncpy(name_list[name_depth],name,14);
name_depth++;
if (list) {
if (verbose)
printf("%6d %07o ",ino,inode->i_mode);
print_current_name();
if (S_ISDIR(inode->i_mode))
printf(":\n");
else
printf("\n");
}
check_zones(ino);
if (inode && S_ISDIR(inode->i_mode))
recursive_check(ino);
name_depth--;
return;
}
void recursive_check(unsigned int ino)
{
struct d_inode * dir;
unsigned int offset;
dir = Inode + ino;
if (!S_ISDIR(dir->i_mode))
die("internal error");
for (offset = 0 ; offset < dir->i_size ; offset += 16)
check_file(dir,offset);
}
void check_counts(void)
{
int i;
for (i=1 ; i < INODES ; i++) {
if (!inode_in_use(i) && Inode[i].i_mode && warn_mode) {
printf("Inode %d mode not cleared.",i);
if (ask("Clear",1)) {
Inode[i].i_mode = 0;
changed = 1;
}
}
if (inode_in_use(i)*Inode[i].i_nlinks == inode_count[i])
continue;
if (!inode_count[i]) {
printf("Inode %d not used, marked used in the bitmap.",
i);
if (ask("Clear",1))
unmark_inode(i);
} else if (!inode_in_use(i)) {
printf("Inode %d used, marked unused in the bitmap.",
i);
if (ask("Set",1))
mark_inode(i);
}
if (inode_in_use(i) && Inode[i].i_nlinks != inode_count[i]) {
printf("Inode %d, i_nlinks=%d, counted=%d.",
i,Inode[i].i_nlinks,inode_count[i]);
if (ask("Set i_nlinks to count",1)) {
Inode[i].i_nlinks=inode_count[i];
changed=1;
}
}
}
for (i=FIRSTZONE ; i < ZONES ; i++) {
if (zone_in_use(i) == zone_count[i])
continue;
printf("Zone %d: %s in use, counted=%d\n",
i,zone_in_use(i)?"":"not",zone_count[i]);
}
}
void check(void)
{
memset(inode_count,0,INODES*sizeof(*inode_count));
memset(zone_count,0,ZONES*sizeof(*zone_count));
check_zones(ROOT_INO);
recursive_check(ROOT_INO);
check_counts();
}
int main(int argc, char ** argv)
{
struct termios termios,tmp;
if (argc && *argv)
program_name = *argv;
if (INODE_SIZE * INODES_PER_BLOCK != BLOCK_SIZE)
die("bad inode size");
while (argc-- > 1) {
argv++;
if (argv[0][0] != '-')
if (device_name)
usage();
else
device_name = argv[0];
else while (*++argv[0])
switch (argv[0][0]) {
case 'l': list=1; break;
case 'a': automatic=1; repair=1; break;
case 'r': automatic=0; repair=1; break;
case 'v': verbose=1; break;
case 's': show=1; break;
case 'm': warn_mode=1; break;
default: usage();
}
}
if (!device_name)
usage();
if (repair && !automatic) {
if (!isatty(0) || !isatty(1))
die("need terminal for interactive repairs");
tcgetattr(0,&termios);
tmp = termios;
tmp.c_lflag &= ~(ICANON|ECHO);
tcsetattr(0,TCSANOW,&tmp);
}
IN = open(device_name,repair?O_RDWR:O_RDONLY);
if (IN < 0)
die("unable to open '%s'");
read_tables();
check_root();
check();
if (verbose) {
int i, free;
for (i=1,free=0 ; i<INODES ; i++)
if (!inode_in_use(i))
free++;
printf("\n%6d inodes used (%d%%)\n",(INODES-free),
100*(INODES-free)/INODES);
for (i=FIRSTZONE,free=0 ; i<ZONES ; i++)
if (!zone_in_use(i))
free++;
printf("%6d zones used (%d%%)\n",(ZONES-free),
100*(ZONES-free)/ZONES);
printf("\n%6d regular files\n"
"%6d directories\n"
"%6d character device files\n"
"%6d block device files\n"
"%6d links\n"
"------\n"
"%6d files\n",
regular,directory,chardev,blockdev,
links-2*directory+1,total-2*directory+1);
}
if (changed) {
write_tables();
printf( "----------------------------\n"
"FILE SYSTEM HAS BEEN CHANGED\n"
"----------------------------\n");
}
if (repair && !automatic)
tcsetattr(0,TCSANOW,&termios);
return (0);
}

Binary file not shown.

View File

@@ -0,0 +1,96 @@
/* kill.c : copyright (92) Peter MacDonald: Distribute freely, don't restrict*/
#include <sys/types.h>
#include <signal.h>
#include <strings.h>
#define ERR 2
const char *usagestr = "usage: kill [-signal] pid ...\n";
void oops(void)
{ write(ERR,usagestr,strlen(usagestr));
exit(1);
}
void oops2(char *str1, char *str2)
{
write(ERR,str1,strlen(str1));
write(ERR,str2,strlen(str2));
write(ERR,"\n",1);
exit(1);
}
char *itoa(int num)
{ int sign = 0;
static char buf[15];
char *cp = buf+sizeof(buf)-1;
if (num<0)
{ sign = 1;
num = -num;
}
do
{
*cp-- = '0'+num%10;
num /= 10;
} while (num);
if (sign)
*cp-- = '-';
return(cp+1);
}
const char *signames[] = {
"HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT", "UNUSED",
"FPE", "KILL", "USR1", "SEGV", "USR2", "PIPE", "ALRM", "TERM",
"STKFLT", "CHLD", "CONT", "STOP", "TSTP", "TTIN", "TTOU", 0 };
int main(int argc, char *argv[])
{
int i, signum = SIGTERM;
if (argc < 2)
oops();
if ((argc>1) && ('-' == *argv[1]))
{
if ('?' == argv[1][1])
for (i=0; i<NSIG; i++)
if (!signames[i])
{ write(ERR,"\n",1);
exit(0);
}
else
{ write(ERR,signames[i],strlen(signames[i]));
write(ERR," ", 1);
if (i==10)
write(ERR,"\n",1);
}
for (i=0; i<NSIG; i++)
if (!signames[i])
{ i = NSIG;
break;
}
else
if (!strcmp(signames[i],argv[1]+1))
break;
if (i < NSIG)
signum = i+1;
else
if ((!(signum = atoi(argv[1]+1))) || (signum<=0) || (signum>NSIG))
oops();
argc--;
argv++;
}
while (--argc)
{
argv++;
if ((i = atoi(*argv)) <= 3)
oops();
if (kill(i,signum))
oops2( "kill: no such process ", itoa(i));
}
return(0);
}

View File

@@ -0,0 +1,365 @@
/*
* mkfs.c - make a linux (minix) file-system.
*
* (C) 1991 Linus Torvalds. This file may be redistributed as per
* the Linux copyright.
*/
/*
* 24.11.91 - time began. Used the fsck sources to get started.
*
* 25.11.91 - corrected some bugs. Added support for ".badblocks"
* The algorithm for ".badblocks" is a bit weird, but
* it should work. Oh, well.
*
* Usuage: mkfs [-c] device size-in-blocks
*
* -c for readablility checking (SLOW!)
*
* The device may be a block device or a image of one, but this isn't
* enforced (but it's not much fun on a character device :-).
*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <ctype.h>
#include <stdlib.h>
#include <termios.h>
#include <sys/stat.h>
#include <linux/fs.h>
#ifndef __GNUC__
#error "needs gcc for the bitop-__asm__'s"
#endif
#ifndef __linux__
#define volatile
#endif
#define ROOT_INO 1
#define BAD_INO 2
#define TEST_BUFFER_BLOCKS 32
#define MAX_GOOD_BLOCKS 512
#define UPPER(size,n) ((size+((n)-1))/(n))
#define INODE_SIZE (sizeof(struct d_inode))
#define INODE_BLOCKS UPPER(INODES,INODES_PER_BLOCK)
#define INODE_BUFFER_SIZE (INODE_BLOCKS * BLOCK_SIZE)
#define BITS_PER_BLOCK (BLOCK_SIZE<<3)
static char * program_name = "mkfs";
static char * device_name = NULL;
static int DEV = -1;
static long BLOCKS = 0;
static int check = 0;
static int badblocks = 0;
#define ROOT_INO_STRING "\001\000"
#define BAD_INO_STRING "\002\000"
static char root_block[BLOCK_SIZE] =
ROOT_INO_STRING ".\0\0\0\0\0\0\0\0\0\0\0\0\0"
ROOT_INO_STRING "..\0\0\0\0\0\0\0\0\0\0\0\0"
BAD_INO_STRING ".badblocks\0\0\0\0";
static char * inode_buffer = NULL;
#define Inode (((struct d_inode *) inode_buffer)-1)
static char super_block_buffer[BLOCK_SIZE];
#define Super (*(struct super_block *)super_block_buffer)
#define INODES ((unsigned long)Super.s_ninodes)
#define ZONES ((unsigned long)Super.s_nzones)
#define IMAPS ((unsigned long)Super.s_imap_blocks)
#define ZMAPS ((unsigned long)Super.s_zmap_blocks)
#define FIRSTZONE ((unsigned long)Super.s_firstdatazone)
#define ZONESIZE ((unsigned long)Super.s_log_zone_size)
#define MAXSIZE ((unsigned long)Super.s_max_size)
#define MAGIC (Super.s_magic)
#define NORM_FIRSTZONE (2+IMAPS+ZMAPS+INODE_BLOCKS)
static char inode_map[BLOCK_SIZE * I_MAP_SLOTS];
static char zone_map[BLOCK_SIZE * Z_MAP_SLOTS];
static unsigned short good_blocks_table[MAX_GOOD_BLOCKS];
static int used_good_blocks = 0;
#define bitop(name,op) \
static inline int name(char * addr,unsigned int nr) \
{ \
int __res; \
__asm__ __volatile__("bt" op " %1,%2; adcl $0,%0" \
:"=g" (__res) \
:"r" (nr),"m" (*(addr)),"0" (0)); \
return __res; \
}
bitop(bit,"")
bitop(setbit,"s")
bitop(clrbit,"r")
#define inode_in_use(x) (bit(inode_map,(x)))
#define zone_in_use(x) (bit(zone_map,(x)-FIRSTZONE+1))
#define mark_inode(x) (setbit(inode_map,(x)))
#define unmark_inode(x) (clrbit(inode_map,(x)))
#define mark_zone(x) (setbit(zone_map,(x)-FIRSTZONE+1))
#define unmark_zone(x) (clrbit(zone_map,(x)-FIRSTZONE+1))
/*
* Volatile to let gcc know that this doesn't return. When trying
* to compile this under minix, volatile gives a warning, as
* exit() isn't defined as volatile under minix.
*/
volatile void fatal_error(const char * fmt_string)
{
fprintf(stderr,fmt_string,program_name,device_name);
exit(1);
}
#define usage() fatal_error("Usage: %s [-c] /dev/name blocks\n")
#define die(str) fatal_error("%s: " str "\n")
void write_tables(void)
{
if (BLOCK_SIZE != lseek(DEV, BLOCK_SIZE, SEEK_SET))
die("seek failed in write_tables");
if (BLOCK_SIZE != write(DEV, super_block_buffer, BLOCK_SIZE))
die("unable to write super-block");
if (IMAPS*BLOCK_SIZE != write(DEV,inode_map,IMAPS*BLOCK_SIZE))
die("Unable to write inode map");
if (ZMAPS*BLOCK_SIZE != write(DEV,zone_map,ZMAPS*BLOCK_SIZE))
die("Unable to write zone map");
if (INODE_BUFFER_SIZE != write(DEV,inode_buffer,INODE_BUFFER_SIZE))
die("Unable to write inodes");
}
void write_block(int blk, char * buffer)
{
if (blk*BLOCK_SIZE != lseek(DEV, blk*BLOCK_SIZE, SEEK_SET))
die("seek failed in write_block");
if (BLOCK_SIZE != write(DEV, buffer, BLOCK_SIZE))
die("write failed in write_block");
}
int get_free_block(void)
{
int blk;
if (used_good_blocks+1 >= MAX_GOOD_BLOCKS)
die("too many bad blocks");
if (used_good_blocks)
blk = good_blocks_table[used_good_blocks-1]+1;
else
blk = FIRSTZONE;
while (blk < ZONES && zone_in_use(blk))
blk++;
if (blk >= ZONES)
die("not enough good blocks");
good_blocks_table[used_good_blocks] = blk;
used_good_blocks++;
return blk;
}
void mark_good_blocks(void)
{
int blk;
for (blk=0 ; blk < used_good_blocks ; blk++)
mark_zone(good_blocks_table[blk]);
}
inline int next(int zone)
{
if (!zone)
zone = FIRSTZONE-1;
while (++zone < ZONES)
if (zone_in_use(zone))
return zone;
return 0;
}
void make_bad_inode(void)
{
struct d_inode * inode = &Inode[BAD_INO];
int i,j,zone;
int ind=0,dind=0;
unsigned short ind_block[BLOCK_SIZE>>1];
unsigned short dind_block[BLOCK_SIZE>>1];
#define NEXT_BAD (zone = next(zone))
if (!badblocks)
return;
mark_inode(BAD_INO);
inode->i_nlinks = 1;
inode->i_time = time(NULL);
inode->i_mode = S_IFREG + 0000;
inode->i_size = badblocks*BLOCK_SIZE;
zone = next(0);
for (i=0 ; i<7 ; i++) {
inode->i_zone[i] = zone;
if (!NEXT_BAD)
goto end_bad;
}
inode->i_zone[7] = ind = get_free_block();
memset(ind_block,0,BLOCK_SIZE);
for (i=0 ; i<512 ; i++) {
ind_block[i] = zone;
if (!NEXT_BAD)
goto end_bad;
}
inode->i_zone[8] = dind = get_free_block();
memset(dind_block,0,BLOCK_SIZE);
for (i=0 ; i<512 ; i++) {
write_block(ind,(char *) ind_block);
dind_block[i] = ind = get_free_block();
memset(ind_block,0,BLOCK_SIZE);
for (j=0 ; j<512 ; j++) {
ind_block[j] = zone;
if (!NEXT_BAD)
goto end_bad;
}
}
die("too many bad blocks");
end_bad:
if (ind)
write_block(ind, (char *) ind_block);
if (dind)
write_block(dind, (char *) dind_block);
}
void make_root_inode(void)
{
struct d_inode * inode = &Inode[ROOT_INO];
mark_inode(ROOT_INO);
inode->i_zone[0] = get_free_block();
inode->i_nlinks = 2;
inode->i_time = time(NULL);
if (badblocks)
inode->i_size = 48;
else
inode->i_size = 32;
inode->i_mode = S_IFDIR + 0755;
write_block(inode->i_zone[0],root_block);
}
void setup_tables(void)
{
int i;
memset(inode_map,0xff,sizeof(inode_map));
memset(zone_map,0xff,sizeof(zone_map));
memset(super_block_buffer,0,BLOCK_SIZE);
MAGIC = SUPER_MAGIC;
ZONESIZE = 0;
MAXSIZE = (7+512+512*512)*1024;
ZONES = BLOCKS;
/* some magic nrs: 1 inode / 3 blocks */
INODES = BLOCKS/3;
/* I don't want some off-by-one errors, so this hack... */
if ((INODES & 8191) > 8188)
INODES -= 5;
if ((INODES & 8191) < 10)
INODES -= 20;
IMAPS = UPPER(INODES,BITS_PER_BLOCK);
ZMAPS = 0;
while (ZMAPS != UPPER(BLOCKS - NORM_FIRSTZONE,BITS_PER_BLOCK))
ZMAPS = UPPER(BLOCKS - NORM_FIRSTZONE,BITS_PER_BLOCK);
FIRSTZONE = NORM_FIRSTZONE;
for (i = FIRSTZONE ; i<ZONES ; i++)
unmark_zone(i);
for (i = ROOT_INO ; i<INODES ; i++)
unmark_inode(i);
inode_buffer = malloc(INODE_BUFFER_SIZE);
if (!inode_buffer)
die("Unable to allocate buffer for inodes");
memset(inode_buffer,0,INODE_BUFFER_SIZE);
printf("%d inodes\n",INODES);
printf("%d blocks\n",ZONES);
printf("Firstdatazone=%d (%d)\n",FIRSTZONE,NORM_FIRSTZONE);
printf("Zonesize=%d\n",BLOCK_SIZE<<ZONESIZE);
printf("Maxsize=%d\n\n",MAXSIZE);
}
void check_blocks(void)
{
unsigned int current_block=0;
int try,got;
static char buffer[BLOCK_SIZE * TEST_BUFFER_BLOCKS];
while (current_block < ZONES) {
if (lseek(DEV,current_block*BLOCK_SIZE,SEEK_SET) !=
current_block*BLOCK_SIZE)
die("seek failed in check_blocks");
try = TEST_BUFFER_BLOCKS;
if (current_block + try > ZONES)
try = ZONES-current_block;
got = read(DEV, buffer, try * BLOCK_SIZE);
if (got<0)
got = 0;
if (got & (BLOCK_SIZE-1))
printf("Weird values in check_blocks: probably bugs\n");
got /= BLOCK_SIZE;
current_block += got;
if (got == try)
continue;
if (current_block < FIRSTZONE)
die("bad blocks before data-area: cannot make fs");
mark_zone(current_block);
badblocks++;
current_block++;
}
if (badblocks)
printf("%d bad block%s\n",badblocks,(badblocks>1)?"s":"");
}
int main(int argc, char ** argv)
{
char * tmp;
struct stat statbuf;
if (argc && *argv)
program_name = *argv;
if (INODE_SIZE * INODES_PER_BLOCK != BLOCK_SIZE)
die("bad inode size");
while (argc-- > 1) {
argv++;
if (argv[0][0] != '-')
if (device_name) {
BLOCKS = strtol(argv[0],&tmp,0);
if (*tmp)
usage();
} else
device_name = argv[0];
else while (*++argv[0])
switch (argv[0][0]) {
case 'c': check=1; break;
default: usage();
}
}
if (!device_name || BLOCKS<10 || BLOCKS > 65536)
usage();
DEV = open(device_name,O_RDWR);
if (DEV<0)
die("unable to open %s");
if (fstat(DEV,&statbuf)<0)
die("unable to stat %s");
if (!S_ISBLK(statbuf.st_mode))
check=0;
else if (statbuf.st_rdev == 0x0300 || statbuf.st_rdev == 0x0305)
die("Will not try to make filesystem on '%s'");
setup_tables();
if (check)
check_blocks();
make_root_inode();
make_bad_inode();
mark_good_blocks();
write_tables();
return 0;
}

Binary file not shown.

View File

@@ -0,0 +1,54 @@
/* nice.c: copywrite (92) Peter MacDonald: Distribute freely, don't restrict */
#include <sys/types.h>
#include <signal.h>
#include <string.h>
/* link nice to renice to change running processes priorities. */
int is_nice;
void usage()
{
if (is_nice)
puts("usage: nice [-n] command");
else
puts("usage: renice [-n] pid");
exit(-1);
}
int renice(int priority, int pid)
{
puts("renice system call not yet implemented");
return(0);
}
int main(int argc, char *argv[])
{
int priority = 10;
is_nice = (strcmp(*argv+strlen(*argv)-6,"renice"));
if ((argc>1) && (argv[1][0] == '-'))
{ priority = atoi(argv[1]+1);
if ((priority>19) || (priority<-20))
usage();
argc--;
argv++;
}
if (argc<2)
usage();
if (!is_nice)
if (renice(priority,atoi(argv[1])))
usage();
else
return(0);
if (nice(priority))
usage();
execvp(argv[1], argv+1);
puts("can not execute");
exit(-1);
}

View File

@@ -0,0 +1,481 @@
From: hns@regent.e-technik.tu-muenchen.dbp.de (Henning Spruth)
Newsgroups: alt.os.linux
Subject: DOS program to set root device
Date: 25 Mar 92 09:06:28 GMT
Here is a small DOS program I hacked using Turbo C to be able to
conveniently set the root partition. It is quite primitive, as it
requires major/minor device numbers and can only access a boot disk in
drive A:, but it works. Using it, installing Linux can be done in
these steps:
1. boot the Linux boot disk
2. make HD file system
3. run install script
4. sync
5. boot DOS
6. run setroot.exe to set root file system to HD
7. boot the Linux boot disk again
Here's the source:
------------------------- begin setroot.c ------------------------------
#include <stdio.h>
#include <bios.h>
#include <conio.h>
char buffer[512];
void check(int res)
{
if(res==0) return;
printf("Disk error status: %x\n",res);
exit(1);
}
main()
{
int result,x;
char in[80];
unsigned int major, minor;
printf("\n\nInsert Linux boot disk into drive A: and hit a key ...");
getch();
printf("\n");
printf("Resetting controller ...\n");
result=biosdisk(0,0,0,0,1,1,buffer);
check(result);
printf("Loading boot sector ...\n");
result=biosdisk(2,0,0,0,1,1,buffer);
if(result==6) result=biosdisk(2,0,0,0,1,1,buffer);
check(result);
printf("Current major boot device: %d\n",buffer[509]);
printf("Current minor boot device: %d\n",buffer[508]);
printf("\n");
printf("New device values:\n");
printf("Enter new major device: ");
gets(in);
sscanf(in,"%d",&major);
printf("Enter new minor device: ");
gets(in);
sscanf(in,"%d",&minor);
printf("\nCheck: changing root disk to major %d, minor %d\n",major,minor);
printf("Is this OK (y/n)? ");
x=getch(); printf("\n");
if(x!='y')
{ printf("Aborting ...\n");
exit(0);
}
buffer[508]=minor;
buffer[509]=major;
printf("Writing boot sector ...\n");
result=biosdisk(3,0,0,0,1,1,buffer);
check(result);
printf("Root device changed!\n");
}
------------------------- end setroot.c ------------------------------
Here is the uuencoded executable:
------------------------- begin setroot.uue ----------------------------
begin 664 setroot.exe
M35KP 1D P @ ___W H /@ $ ^S!J<@
M ! W@ ! !
M
M
M
M
M
M
M
M
M
M "Z;0(NB18U K0PS2&++@( BQXL ([:HY C :.
M (D>B@")+J8 Z#T!Q#Z( (O'B]BY_W_\\J[C84,F. 5U]H#-@/?9B0Z( +D!
M -/C@\,(@^/XB1Z, (S:*^J+/K@$@?\ G,'OP "B3ZX!(''G@AR* ,^L 1R
M(K$$T^]'.^]R&8,^N 0 = >#/K $ '4.OP 0.^]W!XO]ZP/IA &+WP/:B1Z>
M (D>H@"AC@ KV([ M$I7S2%?T^?ZCM*+Y_LSP"Z.!C4"OUH&N9X(*\_\\ZJT
M ,T:B1:4 (D.E@ S[;AL H[8O@ OPP Z.H +HX>-0+_-H8 _S:$ /\V@@#H
M6P$NQ@;G 7(NQ@;6 0!0Z$8$N&P"CMB^# "_# #HN NCAXU O\60@/_%D0#
M_Q9& RZ.'C4"Z'( ,\"+\+DM ($@-0 1N+X+:4,= FY&0"Z+0#HQ0"+[+1,
MBD8"S2&Y#@"Z1@#IP0 >N US2&)'G( C 9T +@$-<TAB1YV (P&> "X!37-
M(8D>>@",!GP N 8US2&)'GX C : +@ )8S*CMJZ7 '-(1_#'K@ )<46<@#-
M(1\>N 0EQ19V ,TA'QZX!27%%GH S2$?'K@&)<46?@#-(1_#M/^+UXO>.]]T
M%( __W0*.&<!=P6*9P&+TX/#!NOH.]=T((O:'@<&@#\ Q@?_+HX>-0)T!R;_
M7P(?Z\4F_U<"'^N^P[1 NP( S2'#N1X NE0 +HX>-0+HZO^X P!0Z/G^ !
M %6+[(-^! !U NL4_W8$N*@ 4.A_!EE9N $ 4.C^ EE=PU6+[(/L5%97N+\
M4.AD!EGH"!.X^ !0Z%D&6;CZ %#H4099N%H&4+@! %"X 0!0,\!0,\!0,\!0
M,\!0Z-L.@\0.B_!6Z)C_6;@4 5#H) 99N%H&4+@! %"X 0!0,\!0,\!0,\!0
MN ( 4.BM#H/$#HOP@_X&=2&X6@90N $ 4+@! % SP% SP% SP%"X @!0Z(<.
M@\0.B_!6Z$3_6:!7")A0N"T!4.C+!5E9H%8(F%"X3 %0Z+T%65FX:P%0Z+0%
M6;AM 5#HK 59N($!4.BD!5F-1JQ0Z @$68U&_E"XF@%0C4:L4.BC#(/$!KB=
M 5#H@@59C4:L4.CF UF-1OQ0N+8!4(U&K%#H@0R#Q ;_=OS_=OZXN0%0Z%H%
M@\0&N.L!4.A0!5GH]!&+^+C^ 5#H0P59@_]Y= ^X )0Z#8%63/ 4.BW 5F*
M1ORB5@B*1OZB5PBX#@)0Z!L%6;A:!E"X 0!0N $ 4#/ 4#/ 4#/ 4+@# %#H
MI V#Q Z+\%;H8?Y9N"<"4.CM!%E?7HOE7<-5B^R#/CX"('4%N $ ZQ.+'CX"
MT>.+1@2)AUH(_P8^ C/ 7<-5B^R#[ C&1OL Z!\,M ")1O[H%PRQ"-/HM ")
M1OSIWP"+7@C_1@B*!XA&^[0 +0< B]B#^P9W+M'C+O^G, 6T#K 'Z .ZW:@
MO 2T #M&_GUL_T[^ZV>@O 2T (E&_NM=_T;\ZUB@Q02T O =2Z#/LL$ '0G
MBB; !(I&^XE&^(M&_D!0BT;\0%#HDAY24!:-1OA0N $ 4.BJ'NL>BE;^BG;\
MM *W .B<#8H>P 2*1ONT";< N0$ Z(L-_T;^H+X$M [1OY]$J"\!+0 B4;^
MBT;\ P:Z!(E&_*"_!+0 .T;\?1RP!E"@O 10H+T$4*"^!%"@OP10L %0Z!@(
M_T[\BT8&_TX&"\!T ^D4_XI6_HIV_+0"MP#H+ V*1ONT (OE7<(& $H$4P1Q
M!&P$<01Q!&($58OLN L$4#/ 4/]V!(U&!E#H%!E=P\-5B^SK"HL>/@+1X_^7
M6@BA/@+_#CX""\!UZ_]V!.B:^UE=PU6+[%97BW8$"_9U!>AS .MK.70.= 6X
M___K8X,\ 'PI]T0"" !U"HO&!04 .40*=1;'! B\8%!0 Y1 IU"(M$"(E$
M"NLUZS.+1 8#!$"+^(L$*\>)!%>+1 B)1 I0BD0$F%#HA J#Q 8[QW0.]T0"
M )U!X%, A ZYHSP%]>7<-5B^Q,3%97QT;^ "_% "^2 /K$O=$ @, = A6
MZ%__6?]&_H/&$(O'3PO =>>+1OY?7HOE7<-5B^Q65XM>!(,_ 'T(BT<& P=
MZPJ+7@2+!YDSPBO"B_"+R(M>!/=' D = +K+XM>!(M_"H,_ 'T=ZPE/B]^
M/PIU 4&+QDX+P'7PZQ"+WT> /PIU 4&+QDX+P'7PB\%?7EW" @!5B^Q6BW8$
M5NC7_ED+P'0%N/__ZTJ#?@H!=1"#/ !^"U;H=O^9*48&&58(@60"7_['!
MBT0(B40*_W8*_W8(_W8&BD0$F%#H- ^#Q B#^O]U"CW__W4%N/__ZP(SP%Y=
MPU6+[(/L!%:+=@2*1 284.@5"5F)1OR)5OZ#/ !]#5;H%O^9 4;\$5;^ZPM6
MZ G_F2E&_!E6_HM6_HM&_%Z+Y5W#58OL3$Q65XM^!(OWZP:*1OZ(!$:A2 -(
MHT@#"\!\#HL>4@/_!E(#B@>T .L(N$@#4.A(#5F)1OX]__]T!3T* '7,@W[^
M_W4(._=U!#/ ZQ'&! #W!DH#$ !T!#/ ZP*+QU]>B^5=PU6+[%97_W8$_W8&
M_W8(_W8*Z L%"\!U!#/ ZR^+1@@K1@1 B_B+=@;K&1[_=@S_=@16Z%4;4E!7
MZ*<$B\?1X %&#$8[=@I^XK@! %]>7<-5B^Q65XM&""M&!$"+^(MV!NL9_W8$
M5N@A&U)0'O]V#%?H;P2+Q]'@ 48,1CMV"G[BN $ 7UY=PU6+[(/L!E97BWX&
M_W8$5_]V"/]V"NB ! O ="3_=@S_=@Z+1@@K1@2+5@P#T%*+1@HKQXM6#@/0
M4NA<! O =00SP.M<B7[^BT8*B4;\QT;Z 0 [?@Y]#HM&"HE&_HE^_,=&^O__
MBW;^ZRG_=@R+QBO'BU8. ]!2Z(D:4E#_=@16Z( :4E"+1@@K1@1 4.C+ P-V
M^HM&_ -&^CO&=<VX 0!?7HOE7<-5B^RX% I0N%@#4/]V!(U&!E#HA!5=PU6+
M[%:+=@:+!$B)!%:*1@284.@% %E97EW#58OL5HMV!HI&!**:"(,\_WTWBP1
MB02+7 K_1 J@F@B(!_=$ @@ =!V /IH("G0'@#Z:" UU#U;H/_Q9"\!T!KC_
M_^FY .FQ /=$ I =0?W1 (" '4'@4P"$ #KXH%, @ !@WP& '1$@SP = M6
MZ C\60O = +KQXM$!O?8B02+7 K_1 J@F@B(!_=$ @@ =!F /IH("G0'@#Z:
M" UU"U;HUOM9"\!T NN5ZTV /IH("G4?]T0"0 !U&+@! %"XL@10BD0$F%#H
M !J#Q 8] 0!U&+@! %"XF@A0BD0$F%#HZ!F#Q 8] 0!T#_=$ @ "=0B!3 (0
M .E&_Z":"+0 7EW#58OL5HMV!+A8 U!6Z._^65E>7<-5B^Q,3%97BWX&BW8$
MB7[^]T0"" !T)NL:5HM>"/]&"(H'F%#HP_Y963W__W4%,\#I]P"+QT\+P'7?
MZ>H ]T0"0 !U ^F# (-\!@!T93E\!G,H@SP = M6Z G[60O = +KS%?_=@B*
M1 284.A'&8/$!CO'<P+KM^FM (L$ \=\&H,\ '4*N/__*T0&B03K"U;HT?I9
M"\!T NN45_]V"/]T"NAI#(/$!HL$ \>)! %\"NMU5_]V"(I$!)A0Z/<8@\0&
M.\=S ^EF_^M=@WP& '1!ZS:+!$")! O ?1:+7 K_1 I3BUX(_T8(B@=;B >T
M .L/5HM>"/]&"(H'4.C2_5E9/?__=0/I)O^+QT\+P'7#ZQ97_W8(BD0$F%#H
M,@6#Q 8[QW,#Z0?_BT;^7UZ+Y5W"!@!5B^R-1@10N $ 4#/ 4.BT^%W#58OL
M3$R+1@31Z(O(H,0$M !0B\$STEOW\XA&_[0 BA;$!+8 ]^J*T2K0B%;^BF;_
MBL*+Y5W"! !5B^Q65XM^!HMV!(L5.Q1T";< M +HJ :)%/[".A;$!'($_L:R
M (D57UY=P@0 58OL@^P*5E?H;02)1OB)1OJ+1@P[!LD$=06X 0#K C/ B4;V
M"\!T#/]V#/]V"NAI_XE&_HM&"#L&R01U!;@! .L",\"+^ O =%W_=@C_=@;H
M1_^)1OSK3PO_=!:-1OQ0C4;Z4.AK_[< M CH) :+\.L*Q%X&)HLW@T8& H-^
M]@!T&XU&_E"-1OI0Z$7_B\:*W+D! +< M GH]P7K"L1>"B:)-X-&"@*+1@3_
M3@0+P'6GBU;XMP"T NC7!5]>B^5=P@H 58OLH,4$M +P'4;@S[+! !T%/]V
M#/]V"O]V"/]V!O]V!.BI%NL2_W8,_W8*_W8(_W8&_W8$Z 3_7<(* %6+[*#$
M!+0 B\B@PP2T (O0.4X*=R0Y3@9W'XM&"CM&!G\7.58(=Q(Y5@1W#8M&"#M&
M!'\%N $ ZP(SP%W"" !5B^Q65XMV"(M^!HL,L2#K!8D,1D9'.WX$?O9?7EW"
M!@!5B^R![* H,4$M +P'0#Z3@!@S[+! !U ^DN 8!^! %T ^DE ?Y&#/Y&
M"OY&"/Y&!H!^#@9T ^F( (I&"K0 4(I&#+0 4(I&!K0 4(I&"+0 4(I&"K0
M0%"*1@RT %#HI/J#Q R-AF#_4(I&!K0 4(I&#+0 4(I&!K0 4(I&#+0 4.CZ
M^8/$"HV&8/]0BD8,M !0BD8(M !0Z$+_C89@_U"*1@:T %"*1@BT %"*1@:T
M %"*1@RT %#H$OJ#Q KIH0"*1@JT $!0BD8,M !0BD8&M !(4(I&"+0 4(I&
M"K0 4(I&#+0 4.@;^H/$#(V&8/]0BD8*M !0BD8,M !0BD8*M !0BD8,M !0
MZ''Y@\0*C89@_U"*1@RT %"*1@BT %#HN?Z-AF#_4(I&"K0 4(I&"+0 4(I&
M"K0 4(I&#+0 4.B)^8/$"NL9BC[ !(IF#HI&!(IN"HI.#(IV!HI6".C- XOE
M7<(, *!, YA0Z'('60O =0:!)DH#__VX )0A09* W0%N $ ZP(SP% SP%"X
M2 -0Z#8 @\0(H%P#F%#H0 =9"\!U!H$F6@/__;@ E"%!EH#= 6X @#K C/
M4#/ 4+A8 U#H! "#Q C#58OL5E>+=@2+?@HY= YU#(-^" )_!H'__W]V!KC_
M_^FF (,^M@0 =0Z!_E@#=0C'!K8$ 0#K$X,^M 0 =0R!_D@#=0;'!K0$ 0"#
M/ !T$;@! % SP#/24%)6Z$KW@\0(]T0"! !T!_]T".CD%%F!9 +S_\=$!@
MB\8%!0")1 B)1 J#?@@"=#T+_W8YQP9" U(1@WX& '465^B#%5F)1@8+P'0'
M@4P"! #K ^EM_XM&!HE$"HE$"(E\!H-^" %U!8%, @@ ,\!?7EW#58OL5HM>
M!(LW_P>*!(K0"L!U!;C__^L$BL*T %Y=PU6+[(M>!O\/7<-5B^R-1@A0_W8&
MC48$4+C:#U"XNP]0Z!0(@\0*7<-5B^S_=@C_=@:-1@10N-H/4+B[#U#H]P>#
MQ I=PU6+[+@! % SP#/24%+_=@3HXP6#Q A=P[0#MP#H$P*+PL/H\_^T (H6
MO 2V "O"0,/HY/^Q"-/HM "*%KT$M@ KPD##58OL@>R* %97BT8(0#T" ',%
M,\#IT@"+7@31X_>'B 0 @'02_W8(_W8&_W8$Z#83@\0&Z;, BUX$T>.!IX@$
M__V+1@:)1OB+1@B)1OSK5?]._(M>^/]&^(H'B$;[/ IU!,8$#4:*1ON(!$:-
MAG;_B]8KT('Z@ !\,8O6*]"+^E)0_W8$Z-\2@\0&B4;^.\=T$PO <P6X___K
M2HM&""M&_.L]ZT"-AG;_B_"#?OP =9^-AG;_B]8KT(OZB\(+P'8F4HV&=O]0
M_W8$Z)H2@\0&B4;^.\=T$ O <P+KN8M&" -&_BO'ZP.+1@A?7HOE7<-65[\$
M +Y( ^L0]T0" P!T!5;H$?193X/&$ O_=>Q?7L-5B^P>!XIF!(I&#HM>$(M.
M"M'IT>F X< "3@R*;@J*=@B*5@;-$X!^! AU!8D/B5<"BL2T %W#58OLBT8$
MB]2!Z@ ".\)S!Z.: #/ ZPG'!I( " "X__]=PU6+[(M&!(M6!@,&F@"#T@"+
MR O2=1"!P0 "<@H[S',&AP:: .L)QP:2 @ N/__7<-5B^S_=@3HI/]97<-5
MB^R+1@294E#HM_]965W#58OL5HMV!.L4Q%X&_T8&)HH'B]Y&.@=T!#/ ZPB
M/ !UY[@! %Y=P@8 M!*S$.@' (K#!/"T ,-5'E&Y0 ".V5F _ !T"8#\#W16
MS1#K:CP#=1JX !K-$#P:= 6 )H< _K0!N0<&S1"X P#KWCQ ==JS$+02S1"
M^Q!T/;@2$3+;S1"X !*S(,T0N :S1 \&G0F@ Z' &T ;D !LT0ZQC-$#P#
M=1)0Z'__"L!8= F /H0 &'0"L$ ?7<.T#^AW_U#H%P!9M BW .AK_XK$)'^*
MX(@FP02()L $PU6+[(I&!*+"!+0/Z$[_B";$!#H&P@1T+:#"!+0 Z#S_M _H
M-_^BP@2()L0$@#["! -U$KA ([ )H ^A 8?@7&!L($0( ^P@0#=A. /L($
M0',,@#["! =T!;@! .L",\"BQ02 /L($0'0$L!GK"[A ([ )J"$ /[ HL,$
M@#["! =T'[@ \+KJ_U!2N,T$4.B1_@O =0SHM/X+P'4%N $ ZP(SP*+&!( ^
MP@0'=06X +#K [@ N*/)!,<&QP0 + HKT$HKP$H,0$!/^BO@2@PP0$_Z*_
M!%W#58OL@^P$BUX$T>/WAX@$ )T!;@! .M,N !$BUX$S2%R/O;"@'4UN %"
M,\F+T<TA<BY24+@"0C/)B]'-(8E&_(E6_EI9<AFX $+-(7(2.U;^<@EW!3M&
M_'("Z[<SP.L$4.B4 8OE7<-65[\4 +Y( ^L3BT0")0 #/0 #=056Z"CQ68/&
M$(O'3PO =>9?7L-5B^Q6BW8$]T0" )T ^C(__]T!HM$"(E$"E"*1 284.C!
M H/$!HD$"\!^"(-D M\SP.L>@SP =0Z+1 (E?_X-( ")1 +K",<$ "#3 (0
MN/__7EW" @!5B^Q6BW8$BP1 B016Z 0 65Y=PU6+[%:+=@2#/ !^$(L$2(D$
MBUP*_T0*B@?I@@"#/ !\!_=$ A != F#3 (0N/__ZV^!3 * (-\!@!T#%;H
M5?\+P'0"Z^;KQ/=$ @ "= /H'/^X 0!0N)P(4(I$!)A0Z,P"@\0&"\!U((I$
M!)A0Z)7^63T! '0"ZZ^+1 (E?_X-( ")1 +KI>NC@#Z<" UU!_=$ D =+&#
M9 +?H)P(M !>7<.X2 -0Z%;_6<. /M0$ '0*Q@;4! "@U03K!;@ !\TAM ##
M5H ^U 0 = ?HW/^+\.L*Z-7_B_!0Z*#U68O&7L-5B^R /M0$ '0%N/__ZPO&
M!M0$ 8M&!*+5!%W#58OL5HMV! OV?!6#_EA^ [Y7 (DVU@2*A-@$F(OPZQ&+
MQO?8B_ ](P!_Y<<&U@3__XDVD@"X__]>7<(" %6+[+@ 1(M>!,TADB6 %W#
M58OLBUX$T>.!IX@$__VT0HI&"HM>!(M."(M6!LTA<@+K!5#HC/^97<-5B^R#
M[")65P:+?@H>!XM>"(/[)'=8@/L"<E.+1@R+3@X+R7T1@'X& '0+Q@4M1_?9
M]]B#V0"-=M[C#Y$KTO?SD??SB!1&XPGK\2O2]_.(%$8+P'7UC4[>]]D#SOQ.
MB@0L"G,$!#KK P)&!*KB[[ J@>+1@I?7HOE7<(, %6+[(-^" IU!HM&!)GK
M!8M&!#/24E#_=@;_=@BP 5"P85#H7O]=PU6+[/]V!O]V!/]V"/]V"K 4+!A
M4.A$_UW#58OL_W8&_W8$_W8(_W8*@WX*"G4%N $ ZP(SP%"P85#H'_]=PU6+
M[%97C-B.P(M^!(MV!HM."-'I_/.E<P&DBT8$7UY=PU6+[(/L!%97BT8(0#T"
M '(-BUX$T>/WAX@$ )T!3/ Z8P _W8(_W8&_W8$Z(8 @\0&B4;^0#T" '(-
MBUX$T>/WAX@$ (!T!8M&_NMBBT[^BW8&'@>+_HO>_*P\&G0M/ UT!:KB].L<
MXO &4[@! %"-1OU0_W8$Z#L @\0&6P?\BD;]JCO[=0+KF>L@4[@! %#WV1O
M4%'_=@3H-OZ#Q B+7@31XX&/B 0 ELK^Y=?7HOE7<-5B^RT/XM>!(M."(M6
M!LTA<@+K!%#HN/U=PU6+[(/L*E97QT;\ #'1OH .L9BWX,]D;_('0'Q#V#
M1@P$PXL]'@>#1@P"PP;\BW8*K K =%T\)71<F)?_1OK_=@C_5@19"\!\)0O_
M>#* O3(% 74KDPK;>!B OS(% 741_T;Z_W8(_U8$60O ?^;I30/_=@A3_U8&
M65G_3OKKL3O'=*W_=@A0_U8&65G_3OKI0 /I/0/'1O;__\9&_P"LF(EV"I<+
M_WP9BITR!3+_@_L5=@/I" /1XR[_IW@<E^EX_^D. X!._P'KU(/O,(=^]@O_
M?,JX"@#WYP%&]NO @$[_".NZ@$[_!.NT@$[_ NNN@&;_W^NH@$[_(.NBBT;Z
M*]+V1O\!=$_KE;X( .L,O@H ZP>^$ #K C/V]\<@ '4(BD;_# 2(1O^-1OA0
MC4;Z4(M&]B7_?U!6_W8(_W8&_W8$Z'@#@\0.@W[X 'X8]D;_ 74/_T;\Z+G^
MJ_9&_P1T I*KZ<C^? /I: +I40+H #I9@+_=@A0_U8&65G_3OJ!9O;_?^@
M .EU E(\.G05"\!^#/]V"%#_5@996?].^EJ,V^L;Z Z54"6PO ?A!24_]V
M"%#_5@996?].^EM:]D;_ 740Z$K^_T;\DJOV1O\@= *3J^E5_NGC 8U&^%"-
M1OI0N/]_(T;V4/]V"/]V!O]V!.@J"H/$#(-^^ !^.(I&_YBI 0!U*>@'_O]&
M_/9&_P1T!;@$ .L-]D;_"'0%N @ ZP(SP%!7Z/D)@\0$Z?S]Z/0)Z?;]Z.X)
M?)SIDP'H #IE 'V1O\!=0;HQ/W_1OR!9O;_?W0I]D;_ 74!JO]&^@;_=@C_
M5@19!PO ?A(*P'@)DX"_,@4!DWX%_T[V?]<&_W8(4/]6!EE9!_].^O9&_P%U
M [ JNF2_?9&_P%U ^AN_8MV]@OV?0.^ 0!T&O]&^@;_=@C_5@19!PO ?!;V
M1O\!=0&J3G_F]D;_ 74#_T;\Z5?]Z>4 *\#\%@>-?M:Y$ #SJZR 9O_O/%YU
M!8!._Q"LM "*T(OXL0/3[[D' 2+*TN4(:]:L/ !T)CQ=="4\+77A.A1WW8 \
M7738K"K"=.4"T-#%@]< "&O6_LAU].O5Z9P B78*@6;V_W^+=O;V1O\!=0/H
MR/Q.?%#_1OH&_W8(_U8$60<+P'Q/EHO>L0/3[KD' 2++TN6$:M:6DW0(]D;_
M$'0(ZP_V1O\0= GV1O\!=<2JZ\$&_W8(4/]6!EE9!_].^D8[=O9]"?9&_P%U
M!O]&_+ JNF!_$8[=O9]#/9&_P%U!K JO]&_/]V"+C__U#_5@9968-^_ &#
M7OP !XM&_.F& /]&^O]V"/]6!%D+P'X3"L!X"9. OS(% 9-TY5F#P0/_X73X
M6>N_*]*Y! #_3O9\15)1_T;Z_W8(_U8$65E:"\!^-?[)?#&*Z(#M,'(J@/T*
M<A> [1%R((#]!G(*@.T@<A: _09S$8#%"M'BT>+1XM'B M7KMBO @/D$= 99
M@\$#_^%9Z5__7UZ+Y5W#Y1OE&^4;T!C7&-T8KAHA&2$9*QGN&?$8_1CW&!P9
M4AKL&@\9)AF &0,9"1E3@.LP<B* ^PEV$H#[*G<%@.L'ZP. ZR> ^PEV"SK9
M<P=$1/BW .L"6_G#58OL@^P&5E?&1O\ QT;\ #'1OH! /]&_/]V"/]6!%D+
MP'QHF)/VPX!U"+]! O8! 77CD_].#'Q:/"MT!SPM=1;^1O__3@Q\2O]&_/]V
M"/]6!%D+P'PU*_:+_HM."N--@_DD=RZ ^0)R*3PP=6N ^1!U9/].#'PR_T;\
M_W8(_U8$63QX=%$\6'1-ZW/'1OK__^L%QT;Z #_=@A0_U8&65G_3OPKP)GI
MIP#IE \,,=&"@H =2/_3@Q\[_]&_/]V"/]6!%G'1@H( #QX= 0\6'4MQT8*
M$ #K%XM."I/H]?Z3<K"6ZPJ6]V8* _ 3^G4L_TX,?$S_1OS_=@C_5@19BTX*
MD^C/_I-SW>LJEO?AEX?*]^(#]Q/!EQ+6=4?_3@Q\(/]&_/]V"/]6!%F+3@J3
MZ*/^DW/6_W8(4/]6!EE9_T[\B]>6@'[_ '0']]KWV(/: (M^#HM>_ $=BWX0
MBU[ZB1WK%KC__[K_?P)&_X#4 (/2 ,=&^@( Z]A?7HOE7<.*QN@" (K"U!"&
MX.@" (;@!) G%$ GJL-5B^R![)8 5E?'1NX ,=&[% QT;J #K1E>Y__\R
MP/*N]]%)7\,VB 5'_D[L?B]345(&C89J_ROXC89J_U!7_W8(_U8*"\!U!<=&
MZ@$ QT;L4 !?NZ-OFK_!UI96\,&_(V^:O^)?OR+?OR+=@:L"L!T$CPE=!$V
MB 5'_D[L?^[HK/_KZ>GK XEV\*P\)73GB7[\,\F)3O*)3OZ(3O7'1OC__\=&
M]O__ZP&L,N2+T(O8@.L@@/M@<Q.*G[D%@_L7=@/IG@/1XR[_I_HBZ90#@/T
M=_B#3OX!Z]" _0!W[8-._@+KQ8#] '?B@'[U*W0#B%;UZ[6#9O[?ZP2#3OX@
MM07KIX#] '=*]T;^ @!U*8-._@BU >N3Z4D#BWX$-HL%@T8$ H#] G,2"\!Y
M!O?8@T[^ HE&^+4#Z6__@/T$==>)1O;^Q>EB_X#]!'/*M03I6/^2+#"8@/T"
M=QFU H=&^ O ?-31X(O0T>#1X /" 4;XZ3;_@/T$=9Z'1O8+P'RXT>"+T-'@
MT> #P@%&]ND:_X-._A#I:/^!3OX 8-F_N_I7/^W".L*MPKK"K<0L^D"VL9&
M]0"(5OLSTHA6^HM^!#:+!>L0MPK&1OH!B%;[BWX$-HL%F4='B78&]T;^$ !T
M!3:+%4='B7X$C7Z["\!U+PO2=2N#?O8 =2F+?OR+3OCC&H/Y_W05BT;^)0@
M= 2R,.L"LB"*PN@,_N+YZ4S^@T[^!%)05XK'F%"*1OI04^BE]18'BU;V"])_
M ^GQ .G\ (A6^XEV!HU^NHM>!#;_-T-#B5X$]T;^( !T$#:+%T-#B5X$%@?H
M?OVP.JH6!UKH=?TVQ@4 QD;Z (-F_ON-3KHK^8?/BU;V.]%_ HO1Z9X B78&
MB%;[BWX$-HL%@T8$ A8'C7Z[,N0VB06Y 0#IN0")=@:(5ON+?@3W1OX@ '4-
M-HL]@T8$ AX'"__K"S;$/8-&! 2,P O'=04>![^R!>@V_3M.]G8#BT[VZWV)
M=@:(5ON+?@2+3O8+R7T#N08 5U&-7KM34K@! "-&_E"+1OZI %T";@( (-&
M! KK!X-&! BX!@!0Z)X"%@>-?KOW1OX( '08BU;X"])^$>C9_": /2UU 4DK
MT7X#B5;RBD;U"L!T$B: /2UT#(-N\@&#5O( 3R:(!>BO_(OWBW[\BU[XN 4
M(T;^/04 =1.*9ON _&]U#8-^\@!_!<=&\@$ ZQN _'AT!8#\6'41@T[^0$M+
M@V[R GT%QT;R #3O+W1OX" '4,ZP:P(.AH_$L[V7_V]T;^0 !T"[ PZ%?\
MBD;[Z%'\BU;R"])^)RO**]HFB@0\+70(/"!T!#PK=0<FK.@R_$E+A\KC![ P
MZ"?\XOF'RN,2*]DFK#:(!4?^3NQ_ ^@:_.+P"]M^"8O+L"#H!/SB^>E$_(EV
M!HM^!/=&_B =0LVBSV#1@0"'@?K!S;$/8-&! 2X4 J1NP#1NXFB07W1OX0
M '0'1T<FQP4 .D%_(MV\(M^_+ EZ+C[K K =?B ?NQ0?0/HL_L'@W[J '0%
MN/__ZP.+1NY?7HOE7<(( $P?-A^!'T$?KQ^Y'_<?_A\#(&H?+" *( X@$B"H
M(%0A^" 8(8XBRB+*(LHB7!]B'U6+[(M&!$B*%L0$M@#WZE"AQP1: \*+5@9*
M \+1X(L6R01=P@0 58OL3$Q65Z#&!+0 B4;^'HM.!.-:Q'X*Q78&_#OW<PJ+
MP4C1X /P _C]@W[^ '4$\Z7K.[K: XS C-L[PW01^NS0R'+[[-#(<_NE^^+Q
MZQ_Z[-#(<OOLT,AS^ZW[B]CLT,AR^^S0R'/[B\.K^^+A_!]?7HOE7<(* %6+
M[(M>!-'C]X>(! (=!.X @!0,\ STE!2_W8$Z"SR@\0(M$"+7@2+3@B+5@;-
M(7(/4(M>!-'C@8^(! 06.L$4.BY\5W#NAH&ZP.Z'P:Y!0"T0+L" ,TAN2<
MNB0&M$#-(>GQW?\F4@;_)E0&_R96!O\F6 8 5E>+](M<!H/K!'(..QY.!G0%
MZ$( ZP/H P!?7L,Y'DP&=".+=P+V! %T!HDV3@;K(#LV3 9T#8O>Z%0 BT<"
MHTX&ZPV+WC/ HTP&HTX&HU &4^@5[5O#_P\['DP&=!B+=P*+!*@!=0\#!XD$
MBS\#^XEU HO>ZP/H,@"+/P/[BP6H 70!PP$'B_<#\(E< HO?BW\&.]]T#HD^
M4 :+=P2)=02)? ;#QP90!@ PXLV4 8+]G00BWP&B5P&B5T$B7\&B7<$PXD>
M4 :)7P2)7P;#5E>+](M$!@O =%(%!0!R-B7^_ST( ',#N @ @SY,!@!T'XL>
M4 8+VW0-B],Y!W,:BU\&.]IU]>AF .LAZ(H ZQSH' #K%S/ ZQ.+\(/&"#DW
M<^GH:___!XO#!00 7U[#4#/ 4%#H5>Q;6R4! '0),])24.A'[%M;6% SVU-0
MZ#SL6UL]__]T%(O8B1Y,!HD>3@980(D'@\,$B\/#6S/ PU SVU-0Z!7L6UL]
M__]T%HO8H4X&B4<"B1Y.!EA B0>#PP2+P\-8,\##*0>+\P,WB_X#^$")!(E<
M HEU H/&!(O&PXOL4U!14.@5_UN+V O =!\>!_R+^(MV_HL,@\8$5H/I!='I
M\Z6)1O[H)/Y;BU[^@\0&PXO"@\((.]%W-8O1.QY.!G4/B0?_!P/#4U#H:NM;
M6^L>B_L#^(E= BO0*1>+]P/RB7P"0HD5B\N+W^@W_HO9@\,$PU9758OLBUX(
MBT8*"\!T-PO;="V#ZP2+#TF+T(/"!8/B_H/Z"',#N@@ .\IR#'<%@\,$ZPCH
MA__K ^A/_XO#ZPU0Z&7^ZP93Z)#],\!;75]>PP "B@X 0
MU1( 5'5R8F\@0RLK("T@0V]P>7)I9VAT(#$Y.3 @0F]R;&%N
M9"!);G1L+@!.=6QL('!O:6YT97(@87-S:6=N;65N= T*1&EV:61E(&5R<F]R
M#0I!8FYO<FUA;"!P<F]G<F%M('1E<FUI;F%T:6]N#0H
M )X(G@@ !$:7-K
M(&5R<F]R('-T871U<SH@)7@* H*26YS97)T($QI;G5X(&)O;W0@9&ES:R!I
M;G1O(&1R:79E($$Z(&%N9"!H:70@82!K97D@+BXN H 4F5S971T:6YG(&-O
M;G1R;VQL97(@+BXN"@!,;V%D:6YG(&)O;W0@<V5C=&]R("XN+@H 0W5R<F5N
M="!M86IO<B!B;V]T(&1E=FEC93H@)60* $-U<G)E;G0@;6EN;W(@8F]O="!D
M979I8V4Z("5D"@ * $YE=R!D979I8V4@=F%L=65S.@H 16YT97(@;F5W(&UA
M:F]R(&1E=FEC93H@ "5D $5N=&5R(&YE=R!M:6YO<B!D979I8V4Z( E9 *
M0VAE8VLZ(&-H86YG:6YG(')O;W0@9&ES:R!T;R!M86IO<B E9"P@;6EN;W(@
M)60* $ES('1H:7,@3TL@*'DO;BD_( * $%B;W)T:6YG("XN+@H 5W)I=&EN
M9R!B;V]T('-E8W1O<B N+BX* %)O;W0@9&5V:6-E(&-H86YG960A"@
M(" @(" @(" @(2$A(2$@(" @(" @(" @(" @(" @(" !0$! 0$! 0$! 0$!
M0$! @(" @(" @(" D! 0$! 0$ 4%!04%!0$! 0$! 0$! 0$! 0$! 0$! 0$
M!$! 0$! 0!@8&!@8& @(" @(" @(" @(" @(" @(" @(0$! 0"
M
M
M !4!50%5 4 D"
M $@# * @$ !8 P @(" : , $,"
M P '@# !" @0 "( P #_ F ,
M _P *@# /\ "X P #_
MR , _P -@# /\ #H P #_
M ^ , _P @$ /\ 8! #_
M * 0 _P #@$ /\ !(! #_
M 6 0 _P &@$ /\ !X! $@
M B "( 2@ J#_______________________________________\ T
M 0 0 ! $-/35!!40 !," @0%!@@("!05
M!1/_%@41 O________________\%!?____________________\/_R,"_P__
M____$___ @(%#P+___\3__________\C_____R/_$_\ (" @(" @(" 0$!
M 0$" @(" @(" @(" @(" @(" @(! @(" @," @("! (" @("!04%!04%!04%
M!0(" @(" @(" @('"A4*# D" @L"% X" @(" @@" A(" A "$ (" @("!@<*
M"@H,"0("#0(1#A," @\"" ("$@(" @(" @(H;G5L;"D !04 105%!04% (
M% ,$% D%!04%!04%!044%!04%!04%!04% \7#P@4%!0'%!84%!04%!04%!0-
M%!04%!04%!04%! *#P\/" H4% 84$@L.%!01% P4% T4%!04%!04 '!R:6YT
M('-C86YF(#H@9FQO871I;F<@<&]I;G0@9F]R;6%T<R!N;W0@;&EN:V5D#0H
M $"05)!4D%20
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M
M /M2"0(E!@ O B B !_ #, $ "< 0 ! $ \#$ !
M $ / 0 ( N 0 , "H 0 0 @ @ 4
M U @ 8 W @ < (@ Y @ & @ (0!: @ & D #G P H
M +! L ^!0 P '@!5!0 T !X!0 X #Z!0 \
M "6!@ ! #X!@ !$ &P Y!P !( "@!P !, #O!P !0
M G" !4 &0#-" !8 #D" !< #^" !@ "@ !D
M 4"@ !H !&"P !L ""# !P "_# !T @#0 !X
M "*#@ !\ #O#@ " 'P#D#P "$ "$ "( ?$ ",
M W$ "0 !!$ "4 !0$ "8 !C$ "< !2$0 "@
M&@!S$0 "D "J$0 "H #,$0 "L #]$0 "P )$@ "T
M !1$@ "X #5$@ "\ #U$@ # #/$P #$ "U% #(
M #)% #, #)% #0 !L%0 #4 '0!U%0 #8 ".%0 #<
M ".%0 #@ "K%0 #D "K%0 #H #'%0 #L $%@ #P
M 5%@ #T ^%@ #X "[%@ #\ #B%@ $ #\%@ $$
M A%P $( !"%P $, #W%P $0 1& $4 #/' $8
M !F'@ $< J(P $@ !0(P $D #)(P $H O) $L
M S) $P W) $T [) $X ! ) $\ /)0 %
M !F)@ %$ &T" %( !R &T" %, !V &T" %0 !Z &T" %4
M !^ &T" %8 "" &T" %< "$ &T" %@ "& &T" %D "( &T" %H
M "* &T" %L ", &T" %P ". &T" %T "0 &T" %X "0 &T" %\
M "1 &T" & "2 &T" &$ "4 &T" &( "8 &T" &, ": &T" &0
M "< &T" &4 "@ &T" &8 "D &T" &< ^ FT" &@ ! FT" &D
M !" VT" &H !$ VT" &L !& VT" &P !( VT" &T "(!&T" &X
M "P!&T" &\ "X!&T" ' "Z!&T" '$ "\!&T" '( #+!&T" ',
M #6!&T" '0 #8!&T" '4 !,!FT" '8 !.!FT" '< !0!FT" '@
M !2!FT" 'D !4!FT" 'H ( !:!FT" 'L !:"&T" 'P !7T
M !7X , !7\ $ !80 ! $ "H0 ! $ "H4
M"@#\_P H8 "@#^_P H< & "L_P H@ ! ' !(D ! & !(H
M"@ $ !HL !@ $ !H$ "# $)AP " $ 0 !
M $ C (T ".
M CP ) "1
M D@ ), "4
M E0 )8 "7
M F )D
M ": FP )P
M "= G@ )\
M "@ H0 *(
M "C I *4
M "F IP
M *@ "I J@
M *L "L K0
M *X "O L
M +$ "R LP
M +0 "U
MM@ +< "X
M N0 +H "[
M O (( JAIR& < .0() #P""@!$ @L 4 (,
M %@"#@!: A, 8@(4 &H"%0!M A8 =0(7 'T"& "= AD H@(: *H"&P#+ AP
M\0(= /8"'@ $ Q\ $@,@ !H#(0 B R( *@,C #(#) !$ R4 3 ,F %0#)P!F
M R@ =@,I 'X#*@"+ RL D ,L )@#+@"? R\ I0,P *L#,0"S S( U ,S -D#
M- #A X 0 .0(A ($ 0 ! / (> 6@*- 8( !0 #
M 8@*% 0( Y JX! 0 $ $ 0 ! $ 0 G ! 0
M @" ____?P 4 ( 0 (#___]_ & $ & (#___]_"
M 0 " _P D ( H /__ * $ , #_____
M#0 ! / ( ! H #@ !@ H ! P $
M !, /\ ' ( L @ *P "@ : !0 " ",
M @ 0 (P ! C < !4 ( ! ( (P ! C $
M ", @ 0 &@ ( @ C $ ", $ 7U]E>&ET8VQE86X
M7U]E>&ET %]?<F5S=&]R97IE<F\ 7V%B;W)T $1'4D]54$ 7U]-34]$14P
M7V-H96-K %]M86EN %]A=&5X:70 7U]#4%543@!?8W!R:6YT9@!?97AI= !?
M9F9L=7-H %]F;'5S:&%L; !?9G-E96L 7V9T96QL %]G971S %]G971T97AT
M %]P=71T97AT %]M;W9E=&5X= !?<')I;G1F %]?9G!U=&, 7V9P=71C %]F
M<'5T8VAA<@!?7T90551. %]P=71C: !?7U-#4D5%3DE/ %]?5D%,241!5$58
M60!?7U-#4D],3 !?7W-E='5P:6\ 7W-E='9B=68 7W-S8V%N9@!?=G-S8V%N
M9@!?=&5L; !?7W=H97)E>'D 7W=H97)E> !?=VAE<F5Y %]W<FET90!?7WAF
M9FQU<V@ 7V)I;W-D:7-K %]?7V)R:P!?7U]S8G)K %]B<FL 7W-B<FL 7U]6
M:61E;TEN= !?7V,P8W)T:6YI= !?7V-R=&EN:70 7V5O9@!?7V9G971C %]?
M3F9G971C %]F9V5T8P!?9F=E=&-H87( 7V=E=&-H %]?3F=E=&-H90!?9V5T
M8VAE %]?3G5N9V5T8V@ 7W5N9V5T8V@ 7U])3T524D]2 %]I<V%T='D 7VQS
M965K %]?3$].1U1/00!?:71O80!?=6QT;V$ 7VQT;V$ 7VUE;6-P>0!?<F5A
M9 !?7W)E860 7U]S8V%N;F5R %]?<V-A;G1O; !?7U904DE.5$52 %]?5E!4
M4@!?7U9204T 7U]W<FET90!?7U)%04Q#5E0 7U]S8V%N=&]D %]?<V-A;G)S
M;'0 7U]S8V%N<&]P %]F<F5E %]M86QL;V, 7W)E86QL;V, 1$%405-%1T
M7U]);G0P5F5C=&]R %]?26YT-%9E8W1O<@!?7TEN=#5696-T;W( 7U]);G0V
M5F5C=&]R %]?0S!A<F=C %]?0S!A<F=V %]?0S!E;G9I<F]N %]?96YV3&YG
M %]?96YV<V5G %]?96YV4VEZ90!?7W!S< !?7V]S;6%J;W( 7U]V97)S:6]N
M %]?;W-M:6YO<@!?97)R;F\ 7U]3=&%R=%1I;64 7U]?:&5A<&)A<V4 7U]?
M8G)K;'9L %]?:&5A<&)A<V4 7U]B<FML=FP 7U]H96%P=&]P %]?871E>&ET
M8VYT %]?8W1Y<&4 7U]E>&ET8G5F %]?97AI=&9O<&5N %]?97AI=&]P96X
M7U]S=')E86US %]?;W!E;F9D %]?:&5A<&QE;@!?7W-T:VQE;@!?7W=S8W)O
M;&P 7U]V:61E;P!?9&ER96-T=FED96\ 7U]D;W-E<G)N;P!?7V1O<T5R<F]R
M5&]35@!?7V9I<G-T %]?;&%S= !?7W)O=F5R %]?4F5A;$-V=%9E8W1O<@!?
M7U-C86Y4;V1696-T;W( 7V)U9F9E<@!?7V%T97AI='1B; !?7W1U<F)O0W)T
M %]?8W9T9F%K %]?04A32$E&5 !?7T%(24Y#4@!#,"Y!4TT 0S!3 %-%5%)/
M3U0N0P!315123T]4 ')E<P!M:6YO<@!M86IO<@!I;@!X ')E<W5L= !S:7IE
M7W0 9G!O<U]T $%415A)5 !#4%))3E1& $-465!% $58250 1D9,55-( $9)
M3$53 $9)3$53,@!&3%532$%,3 !&4T5%2P!'1513 $=05$585 !(14%03$5.
M $U/5D5415A4 %!224Y41@!0551# %!55$-( %-#4D5%3@!30U)/3$P 4T54
M55!)3P!315160E5& %-30T%.1@!35$M,14X 5$5,3 !72$5215A9 %=2251%
M %=30U)/3$P 6$9&3%532 !"24]31$E32P!"4DL 0U)424Y)5 !%3T8 1T54
M0P!'151#2 !)3T524D]2 $E3051460!,4T5%2P!,5$]! $U%34-060!214%$
M %)%041! %-#04Y.15( 4T-!3E1/3 !64%))3E1%4@!64D%- %=2251%00!#
?5E1&04L 4D5!3$-65 !30T%.5$]$ $Y%05)(14%0 !6
end
------------------------- end setroot.uue ----------------------------
If there is some demand, I can extend the program to use
standard HD device names instead of major/minor device numbers.
Enjoy,
Henning
------------------------------------------------------------------------
Henning Spruth spruth@regent.e-technik.tu-muenchen.de
Institute of Electronic Design Automation
Technical University of Munich, Germany
--
------------------------------------------------------------------------
Henning Spruth spruth@regent.e-technik.tu-muenchen.de
Institute of Electronic Design Automation
Technical University of Munich, Germany

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.