add directory Linux-0.95

This commit is contained in:
gohigh
2024-02-19 00:21:03 -05:00
parent 059f8848b1
commit b6d98600bf
139 changed files with 25302 additions and 0 deletions

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,34 @@
If you are running a Cache program, and do not have it set to write
through, then (if you have Autocon set for a Warm or Cold boot -- and
probably External) you must configure Autocon to "Flush" your cache.
Hit the <F4> key, and put in the command string that causes your cache
to flush. The command should be listed in the documentation for your
Cache program. Autocon will then save the information, and perform a
"Flush" before each reboot.
If you are not sure if your Cache is set to "write through", please
configure Autocon to do the "Flush", just to be on the safe side.
The symptoms of a cache problem is that the Autoexec and Config files do
not get updated, and/or any edited Autocon configurations do not get
saved. In the worst case, the Autocon.Dat file will get corrupted, and
your screen colors will disappear (screen will be blank when you start
AutoCon).
Setting Autocon up to do the "Flush" will remove the problems.
Some Flush commands that I know are:
PC-KWIK - SUPERPCK /F
PC-CACHE - PC-CACHE /FLUSH
FLASH - FLASH /F?
HYPERDISK - HYPERDK W
SMARTDRV - SMARTDRV /C (new ver with WINDOWS 3.1)
Sorry for any inconvenience,
-Larry Weaver

View File

@@ -0,0 +1,61 @@
CHANGES
I don't know if you read the changes file in the previous version,
so I will summarize it. I sold my home in Santa Barbara, and moved
to a small town in Northern California to concentrate on writing
shareware full time. Well (you may ask), how's it going.
Since my program was reviewed on page 50 in the Nov. 13, 1990 issue
of PC Magazine, registrations have increased significantly.
Appearantly a lot of people read (and pay attention to) PC
Magazine. Site registrations have really increased, and I now have
some Fortune 50 customers. Banks, however, make up the bulk of
the Site Licensees.
I ran into a few tax problems (it was either pay Uncle a lot of
money, or put a lot of money into my house), so I've been
consulting pretty heavily the last year and doing major
reconstruction to my house. I think I am finally through with any
big consulting jobs (and with rebuilding my house), so now AutoCon
will be getting a lot more attention.
This is still not the release I had planned (it will probably show
up some time around July), but one of my competitors was on
Compuserve saying how much better he was than I because his program
could handle DOS 5.0's HIGH and UMB flags. I decided I needed to
add this capability to AutoCon and get out a new release before he
could cause any more problems. So with this release, AutoCon will
handle both MSDOS 5.0's HIGH and UMB flags, and it is compatible
with DRDOS which is one up on my competitor.
The 2.1 release of AutoCon will have a lot more editor
enhancements. I'm planning pull down menus (similar to the front
screen), and a split screen capability. I also intend to allow
Search/Replace operations to go automatically through all
configurations. I will also be able to use the screen size in
effect when AutoCon is started, instead of switching everything to
the 80X25 mode.
I have a support BBS online and functional. The number is (916)
623 4455, and it is in operation 24 hours a day. It has a 9600+
BAUD modem that is CompuCom CSP, V32, and V42 compatible (of course
it connects just fine at 2400 <or less> BAUD). The main function
of the BBS is (of course ) AutoCon support. If it gets busy
enough, it will grow into a full multi-line BBS. As a consequence
there are several megabytes of downloadable files on it, always
including the latest shareware release of AutoCon. I will also set
up a section for a group of Beta testers, so let me know if you are
interested in becomming one. I see several enhancements in
AutoCons future, as well as a few other programs that I have in
mind.
This is my first BBS and I'm sure there will be will be some
growing pains, so please bear with me.
I love the place I've moved to and I thank you very much for the
support you have given to AUTOCON, and for giving me the incentive
to change careers.
-Larry Weaver

View File

@@ -0,0 +1,8 @@
AutoCon V2.0g is a database manager for
Autoexec and Config Files. Allows up to
50 configurations, and makes switching
between them easy. Run full interactive
(editor, mouse, menus, context sensitive
help, etc.) or command line. MENU.CTL
device driver can setup menu of
configurations during boot. (ASP)

View File

@@ -0,0 +1,175 @@
The following is a list of the all of the editor functions, and the
default key assignments.
CURSOR MOVEMENT:
<Left>, <CtrlS>
Cursor left one character.
<Right>, <CtrlD>
Cursor right one character.
<CtrlLeft>, <CtrlA>
Cursor left one word. A 'word' is a series of non-separator
characters followed by one or more of the following :
' ', ';', '/', '='
<CtrlRight>, <CtrlF>
Cursor right one word.
<Home>, <CtrlQ><S>
Cursor to beginning of line.
<End>, <CtrlQ><D>
Cursor to end of line.
<Up>, <CtrlE>
Cursor up one line.
<Down>, <CtrlX>
Cursor down one line.
<CtrlW>
Scroll display up one line.
<CtrlZ>
Scroll display down one line.
<PgUp>, <CtrlR>
Scroll display up one page.
<PgDn>, <CtrlC>
Scroll display down one page.
<CtrlHome>, <CtrlQ><E>
Move cursor to top of edit window.
<CtrlEnd>, <CtrlQ><X>
Move cursor to bottom of edit window.
<CtrlPgUp>, <CtrlQ><R>
Move cursor to beginning of field.
<CtrlPgDn>, <CtrlQ><C>
Move cursor to end of field.
<Tab>, <CtrlI>
Move the cursor to the next tab stop.
<ClickLeft>
Move the cursor to the position indicated by the mouse.
DELETE FUNCTIONS:
<Del>, <CtrlG>
Delete character at cursor.
<Bksp>, <CtrlH>, <CtrlBksp>
Delete character to left of cursor.
<CtrlY>
Delete current line.
<CtrlQ><Y>
Delete from cursor to end of line.
<CtrlT>
Delete word to right of cursor.
NEW LINE:
<Enter>, <CtrlM>
Start a new line.
<CtrlN>
Split the current line at the cursor.
DEFAULT CONTROLS:
<CtrlP>
Insert control character. For example, to insert a ^G, you
would enter <CtrlP><CtrlG>.
<Ins>
Toggle insert mode on and off. Fat cursor indicates insert
mode; thin cursor indicates overtype mode.
<CtrlO><I>
Toggle auto-indent mode. In auto-indent mode, pressing
<Enter> in insert mode causes the new line to have the same
indentation as the previous line. Auto-indent also affects
the way that text is formatted when word wrap occurs.
<CtrlB>
Reformat the current paragraph. Use with caution.
<AltR>
Reformat the entire field. Use this command with caution.
<CtrlQ><L>
Restore original contents of the line and continue editing.
SAVE COMMANDS:
<Esc>, <CtrlBreak>, <ClickRight>, <CtrlK><Q>,
<AltF2>
Quit editing and abandon changes (With Question).
<F2>, <CtrlK><S>
Save the data, but continue editing.
<CtrlF2>, <CtrlK><X>, <CtrlK><D>, <AltX>
Save the data (if modified), and quit editing.
BLOCK COMMANDS:
<CtrlK><B>, <F7> <CtrlK><K>, <F8>
Begin a block mark. End a block mark.
<CtrlK><C> <CtrlK><V>
Copy a marked block. Move a marked block.
<CtrlK><Y> <F5>
Delete a marked block. Delete Contents of Entire field.
<CtrlK><U> <CtrlK><P>
Put marked block in buffer. Copy cUt buffer to Fieeld.
Allows moving data between records.
<CtrlK><W>
Write the Marked Block to the selected file name.
<CtrlK><R>
Read the selected file name into the edit field. You can
popup a file list and use a point and shoot select
SEARCH COMMANDS:
<CtrlQ><CtrlF>
Pops up a window for you to enter a string of text to search for.
The string remains valid across all records until it is changed with
another search function.
<CtrlQ><CtrlA>
Pops up a window for you to enter a string of text to search for,
then pops up a window for you to enter a string of text to replace
the search string with. You will be asked to confirm the
replacement. The strings remain valid across all records until it
is changed with another search function.
<CtrlL>
Repeats the last Search(/Replace) function without going through the
exercise of entering new strings.
MISCELLANEOUS COMMANDS:
<F1>, <ClickBoth>
Help. This command invokes the help routine for this topic
if it exists. Otherwise it does nothing.
<F6>
Pops up a key edit window to allow chaging all of the editor key
assignments.
<AltE>
Creates a "SET AUTOCON=<configuration name>" command for the
Autoexec field. If each Autoexec has the correct one, the name of
the boot configuration will be in the environment.
<AltF6>, <AltF7>, <AltF8>
Changes the keys assigned to change the colors used in the editor.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,94 @@
------------------- REGISTRATION ----------------------
Please support AutoCon!
Thank you for your support.
Remit To: Larry Weaver
P.O. Box 2639
Weaverville CA 96093-2639
---------------------------
You must check one registration option, and one disk option!
---------------------------
_
|_| AutoCon Standard registration ($15.00 -- no disk sent) $______
_
|_| AutoCon Site License and Registration (no disk sent)
$120.00 for the first 100 (or fewer) users or machines
100.00 for each additional 100 (or fewer) users or machines $______
---------------------------
_
|_| AutoCon Upgrade to the newest version ($8.00; $10.00 foreign) $______
Registered users only
_
|_| Subscription plan for REGISTERED users ($21.00; $26.00 foreign) $______
(Receive the next three updates of AutoCon, as they
become available. This fee is in addition to the
$15.00 or $120.00 registration.)
---------------------------
_
|_| Printed Manual ($8.00) $______
If you desire, I will print out the AUTOCON.DOC file and
send it to you. You can achieve the same results by printing
it out yourself, but several people seem to want this.
---------------------------
"Foreign" means outside the USA and Canada; the extra charge covers postage.
_ _
Payment by: |_| Check or |_| Money Order enclosed.
TOTAL in USA Funds. $______
Foreign checks are acceptable if they have the US Federal Reserve
Routing Number on them, use the current exchange rate.
_ _
Disk Type: |_| 5 1/4" (normally sent); |_| 3 1/2" required
Name ___________________________________________________________________
Address ___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
Day Phone: _________________________ Eve: ______________________
Compuserve ID: _____________________
_
Invoice Required |_| P. O. Number: ______________________
------------------------ User comments -------------------------
I acquired AutoCon V2.0g from
[ ] - Friend [ ] - Software product
[ ] - Computer Club [ ] - Computer Store
[ ] - Data Base Service [ ] - Support BBS
[ ] - Electronic BBS - Please give phone no. _____________
[ ] - Other (please specify) ___________________________
I would also appreciate any input you would care to provide
concerning AutoCon. If you have any ideas or comments which would
make AutoCon a better program, please let me know.
I value your comments!
Comments and/or suggestions:
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________

View File

@@ -0,0 +1,441 @@
Version 2.0g
I still had complaints about people seeing Echo Off in the Autoexec
Bat file, so now if you have a DOS higher than 3.2, it will start
with @Echo off.
If you are using DOS 5.0, A DOS=HIGH,NOUMB line will be appended to
the bottom of the Autoexec.bat file, and you will have to put a
DOS=LOW (and/ or a DOS=UMB) in the configurations you need them in.
Menu.Ctl will control the flags.
If you are using DRDOS, Menu.Ctl will now work with it as well as
MSDOS.
I've changed the way I load configurations, so you will be able to
run AutoCon with less memory, and there is no longer a 6K or 2K
limit on the Autoexec and Config fields.
Each configuration now has the names of the files that the field is
written to. (I've had several requests for this one.)
The help screen colors are now installable.
The MENU.CTL interface has been rewritten to show up more distinctly
when booting. I had several complaints that it was easy to miss.
It will now put up some distinctive boxex, and show up in color if
you have a color monitor. The colors are installable from AutoCon.
Each configuration now has the names of the files that the field is written
to. (I've had several requests for this one.)
You can tell AutoCon not to restore the screen on exit (eliminates the
need for AutoConx.exe.
Version 2.0e (mainly bug fix)
In Single mode if the Enviornment name wasn't set (AltE in the
editor) AutoCon could get the wrong cache 'Flush' information. This
is fixed, but I highly reccommend setting the Autocon Environment
variable if you are using Single mode.
If an external editor were being used, and the Autocon or Config
field size got too large, the AutoCon.Dat file could get messed up -
fixed.
Several people have complained that 4K and 2K is not large enough
for the Autoexec and Config fields, so I'm pushing the size up to 6K
and 4K. Please note that this adds 4K/configuration to AutoCon's
memory requirements.
There are two extra EXE files on the BBS. AutoCons.exe will still
use 4K and 2K for those needing the smaller memory requirements.
AutoConx.exe will not restore the screen when it exits. Try this if
you lose the cursor or the screen blanks out when you exit (I've had
two complaints about this).
Version 2.0d (bug fix)
If AutoCon followed an "ECHO OFF" and a "CLS" statement in a batch
file, the screen could get slightly messed up - fixed.
Version 2.0c (bug fix)
The user modified colors were getting lost if a reboot was performed
from the command line - fixed.
Version 2.0b (bug fix)
MENU.CTL had a problem with the name of the eighth configuration,
which is now fixed. It also had a tendency to leave menu choice 2
in the hi-lite mode, also fixed.
Several people complained about seeing the Errorlevel statements in
the AUTOEXEC.BAT during the boot process. AUTOEXEC.BAT files will
now start with ECHO OFF as the first statement if you choose the
MENU.CTL option.
Version 2.0 would allow you to choose more than the eight default
configurations. This is no longer allowed.
Version 2.0 had a problem writing the AUTOEXEC.BAT file for the Menu
mode if the Autoexec fields didn't end in a Carriage Return. This
is now fixed.
Version 2.0
I'm jumping the version number from 1.4 to 2.0 for this release.
The reason is that AutoCon's capability has changed so much in this
release that I think it warrants a Major revision number change.
The major change is the inclusion of two new files. These are
MENU.CTL and MENUNUM.COM. Menu.Ctl is a device driver that can
disable commands in the CONFIG.SYS file. MenuNum.Com is a file that
will ask the portion of Menu.Ctl that stays resident which
configuration was chosen, and set the DOS ERRORLEVEL to that number.
This allows setting up menu choices in the AUTOEXEC.BAT file to
match the choice made from the CONFIG.SYS file. Together these two
files allow you to choose a system configuration from a menu of
configurations during the boot process itself.
AutoCon will handle all of the interface details to these two
commands for you, and allow you to return to a "Normal" system
configuration in just a couple of keystrokes. This will allow you
to run programs like "Optimize" from Quarterdeck.
There is a pull-down menu system available on the main screen. Each
item on the menu has a context sensitive help entry. This should
make it very easy to get AutoCon up and running the first time, and
allow you to look up those commands you can't remember the
keystrokes for.
There are two new command line options. If you enter
AutoCon /<return>
on the command line, a window of your configurations will pop up
asking you to choose which configuration you wish to use to reboot
the system. This is equivalent to the "AutoCon <configuraion name>,
except that AutoCon lets you choose the name from a pick list.
The second new command is
AutoCon /@<configuration name>
where <configuration name> is the name shown on the main screen for
each configuration. If the name matches the configuration that was
used for the boot process, the DOS errorlevel will be set to 1. It
will be set to 0 otherwise. For this function to work correctly,
you need to boot up with Menu.Ctl, or assure that each Autoexec
field has the correct name assigned with a SET command. See the new
"Put Name in Environment" editor function defined below.
The internal editor has a few new capabilities. In order to access
most them you will have to edit your keystrokes (using the F6 key).
The block operations are no longer constrained to full lines. The
default keys for reformating were removed. You may reassign them.
"Search Function" (default assigned to ^Q^F) allows you to search
the text for a specified string of text. The string is active for
the entire AutoCon session, and will be the same across records.
"Search/Replace Function" (default assigned to ^Q^A) allows you to
search the text for a specified string of text, and relpace it
with another string of text. You will be asked to confirm the
replacement.
"Repeat Search Function" (default assigned to ^L) This will
repeat the last Search, or Search/Replace that was performed. The
informations is retained during the AutoCon session, and will be
the same across records.
"Install Editor Keys" (default assigned to F6) allows you to
change the editor keys during an edit session.
"Put Name in Environment" (default assigned to AltE) will put a
SET command in your edit field. This will guarantee that the
configuration you are editing has its name placed correctly in the
environment. AutoCon will use this name for various command line
functions.
"Change (Text - AltF6, Block - AltF7, Control Char - AltF8)
Attribute" will allow you to change the keys that call up the
editor color installation windows.
"View Last Dos Screen" (default assigned to AltV) allows you to
see the DOS screen as it was when AutoCOn was started. Could be
useful if the reason your changing a configuration is shown there.
By March 1, 1991 I will have a support BBS in place operating 24
hours a day. The number will be (916) 623 4455.
Version 1.4
One of the WhatsNews has to do with me, I am now a member of the ASP
(Association of ShareWare Professionals). The rest of the WhatsNews
all concern changes (and additions) to the program.
You now have the option to use the built in editor to edit the
Autoexec and Config fields, or to install an external editor to do
the job. <CtrlF6> will pop up a window for you to enter an external
editor's file name. The Path will be checked for the entered file
name, and if found, it will be used to edit the Autoexec and Config
fields in the future. For more info, see the "Installing External
Editor" section of AUTOCON.DOC.
From the command line, typing <AUTOCON /=> will check the Autoexec
and Config fields of the current configuration record against the
file contents of the current Configuration files (usually
C:\AUTOEXEC.BAT and C:\CONFIG.SYS). The results of the comparison
will be shown on the screen. SPECIAL NOTE! - the configuration will
need to have been saved with the 1.4 version of AUTOCON.
From the command line, typing <AUTOCON /*> will update the Autoexec
and Config fields of the current configuration record from the file
contents of the current Configuration files (usually C:\AUTOEXEC.BAT
and C:\CONFIG.SYS). You might want to be a little careful with this
one.
The internal editor has a few new capabilities. In order to access
them, you will probably have to edit your keystrokes (using the <F6>
key). The new commands are "Split Line", "Cut the marked block",
and "Paste the last Cut block". These commands will be a little
more convenient than the current "Write marked block" and "Read
marked block" file commands.
"Split Line" (default assigned to <CtrlN> key) splits the current
line at the cursor, leaving the cursor where it is, and moving the
rest of the line down to the next line.
"Cut the marked block" (default assigned to <CtrlK> <U> key
combination) will put the current marked block into a text buffer.
"Paste the last Cut block" (default assigned to <CtrlK> <P> key
combination) will paste the contents of the cut buffer to the
current cursor location. This command can be used to move the
data in the same record, or across records. After a cUt, the data
will stay in the buffer until a new cUt is performed, or AUTOCON
is exited.
Formerly the editor only recognized a ' ' (space) as a word mark
(for <CtrlF>, <CtrlA>, <CtrlRarw>, etc.). This has been enhanced
to also recognize the following characters as word marks :
'/', ';', and '='.
Line length was increased to 254 for those long path names (and
any other long lines needed). This necessitated removing the
word-wrap capability while editing the Autoexec and Config
fields (I don't think this will be a hardship, you probably don't
want to word-wrap the lines in your Autoexec and Config files
anyway). Word-wrap is still used in the Notes field, but please
don't enter a line longer than 127 characters in there.
A couple of functions were also added to the Interactive Mode.
<AltC> will pop-up a pick list of the current configuration
records, and allow you to select one. The contents of the
Autoexec and Config fields of the selected configuration record
will be copied to the current configuration record. Be careful
with this one, there is NO "Undo" command. You can always
use ESC to get out of the pick list without doing a copy.
<AltV> will now show the Dos screen as it was when Autocon was
started.
<Alt=> will check the Autoexec and Config fields of the current
configuration record against the contents of the current
configuration files (C:\AUTOEXEC.BAT and C:\CONFIG.SYS, unless you
have changed them with <F8> or <F9> keys). SPECIAL NOTE! - the
configuration will need to have been saved with the 1.4 version of
AUTOCON.
All of the color changes now show up instantly (you previously had
to wait till the next time Autocon was executed to see some of the
color changes).
ESC is no longer accepted as a "Yes" answer (there were a lot of
complaints on this one). A "Yes" answer now requires a <Y> or
<Enter> key (accept default).
There are a few cosmetic changes on the screens (all in response to
comments by users). I won't take the space to list each one.
There are a couple more entrys on the help screen, and (I hope) the
entries are arranged in a little more logical fashion.
UltraVision : Autocon is now UltraVision "Aware". Autocon will
detect if UltraVision is installed and active. If it is, Autocon
will use UltraVision to switch modes, and restore screens (in other
words, Autocon won't mess up your screen).
Windows Problems : After spending a very unproductive day on the
phone with Microsoft, I decided to add another boot type option to
Autocon. Several people use Autocon to reconfigure in and out of
Windows. When Windows is running in 386 enhanced mode, a software
boot (usually) doesn't work. Microsoft's recommendation : "Never
reboot while running Windows". They say that this may trash hard
disks and worse (I'm not sure what could be "worse" than trashing a
hard disk). I don't know about you, but I've had to reboot out of
Windows several times. I know it's probably not a good idea, but
there are times it should be quite safe (and times when it is forced
upon us). Anyway, they say that is no way they are aware of to
ensure that a software reboot will work.
Therefore :
You may now select (N)one as an alternate boot type (using the
<F5> key). If you select (N)one, Autocon will now reconfigure the
files, but will not attempt a reboot. Now you may run Autocon
under Windows, and after the system files are reconfigured, you
can hit the dreaded CtrlAltDel key combination.
By the way, I'm not much of an artist, so if someone (out of the
goodness of their hearts) designs a nice Icon for Autocon, I would
appreciate them sending me a copy.
A potentially nasty bug was squashed. Since I never received a
complaint on this one, I assume that I was the only one "bit". If
your current configuration record was the last one, and you deleted
it, Autocon tried to find it again the next time it was started.
This could lead to bizarre behavior (a messed up pointer for those
technical people). If the current record number is larger than the
max record number, it will now be adjusted (with appropriate warning
message). It will still be pointing to the wrong record, but it
will behave in a known fashion.
______________________________________________________________________
Version 1.3a
There are a few bug fixes, and a couple of enhancements in this
version. If you used F2 to save changes in the previous versions,
when you hit ESC to exit it would issue a warning that the changes
were about to be lost, this has been corrected.
AUTOCON will now attempt to detect and restore the EGA/VGA (45/50)
small character mode upon exit.
After updating the configuration with 1.3a, when AUTOCON is started
in the interactive mode, it will default to the configuration used
in the last update.
On the command line if you type <AUTOCON /?> the name of the current
configuration will be displayed (Note: you must have saved a
configuration with V1.3a first).
If you are in the full screen entry mode, hitting <F7> will update
the Autoexec and Config fields in the current record from the
current AUTOEXEC.BAT and CONFIG.SYS files. This saves going into
each of the two fields and doing a <F5> <^KR> <AltX>.
From the command line, typing AUTOCON followed by a / and the name
of a configuration (e.g. <AUTOCON /NoTSRs>) will cause that
configuration to have it's Autoexec and Config fields updated from
the current AUTOEXEC.BAT and CONFIG.SYS files.
There was a bug in V1.3 that caused AUTOCON to have a problem with
reading files that were not terminated with ^Z. If you got an
"Edit Buffer Full" message when you tried to edit a field that you
know wasn't too big, then you were bitten by this bug. This is
fixed in 1.3a.
If you were in one of the fields and issued an <^KW> (block save)
and didn't have a marked block, you were not given an error message
in previous versions. This is fixed in 1.3a.
The help screen displayed in a color change window was the one for
changing the editor keystrokes. This is fixed in 1.3a.
______________________________________________________________________
Version 1.3
There are several changes in this version. If you have added
several extra configurations that you no longer need, the <CtrlF3>
key will delete the current configuration (you can't delete record
one, nor can you go below five records).
You can change the keystrokes used by the built in editor. Hitting
the <F6> key in the main menu will pop up a key editor which will
allow changing the actions of all of the control keys used in the
editor.
You can change the colors used by AUTOCON. Hitting the <Alt> key in
combination with the function keys will allow customization of most
of the colors. The use of each key is detailed in the pop-up help.
The DAT file format for 1.3 is quite different than the one for 1.2.
The white space has been eliminated, and as a consequence it is
significantly smaller (mine are about 1/4 the previous size). The
first time you run 1.3 it will change the format, and the DAT file
will no longer be compatible with 1.2. You may want to make a copy
of AUTOCON.DAT (just to be on the safe side) before running 1.3.
______________________________________________________________________
Version 1.2d keeps current file attributes
A request was made to update the Autoexec and Config files, but to
not change their current attributes (system, read only, hidden,
etc.). Therefore AUTOCON now reads the current file attributes of
Autoexec.Bat and Config.Sys before updating them, and restores the
attributes after the update.
______________________________________________________________________
Version 1.2c adds a boot type select.
Some computers have trouble with the warm boot that AUTOCON was
originally configured with. These seem to mainly be machines with
large hard disks, and a large hard disk manager. The <F5> key now
allows you to change the boot type from warm to cold to get around
this problem.
______________________________________________________________________
Version 1.2a is a bug fix.
AUTOCON didn't recognize more than three configurations from the
command line.
Version 1.2 is a bug fix.
When you attempted to read in your old configuration files to the
AUTOEXEC and CONFIG fields, it always defaulted to C:\AUTOEXEC.BAT
an C:\CONFIG.SYS no matter what files you had selected. The read
file option now works correctly.
______________________________________________________________________
Version 1.1 charges are as follows.
1. AUTOCON now does a Reboot when a reconfiguration is done from the
command line.
2. AUTOCON now handles up to 50 configurations (originally only 5).
3. You can now read any file into an AUTOEXEC or CONFIG edit field
(allows you to use your old configurations).
4. The On-line Help has been updated/enhanced.
5. The Doc file has been enhanced (left out a few things the first
time).
6. Allows you the choice of a Reboot when reconfiguring in the data
entry mode.
7. Hopefully a better choice of colors on an LCD screen. If you have
an LCD, you need to have your mode set to BW80 (2).

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,3 @@
@echo This batch file uses Turbo C to build pfdisk.exe
@echo Note that only SMALL model has been tested...
tcc -v- -epfdisk.exe pfdiskaz.c syscodes.c s_msdos.c

View File

@@ -0,0 +1,264 @@
PFDISK(8) MAINTENANCE COMMANDS PFDISK(8)
NAME
pfdisk - partition fixed disk
SYNOPSIS
pfdisk device
DESCRIPTION
pfdisk partitions the fixed disk identified as device into (at
most) four parts, each of which may be independently loaded with
an operating system. The actual name of device depends on the
operating system in use. For ESIX (System V/386) the device
name is either "/dev/rdsk/0s0" or "/dev/rdsk/1s0". For Minix,
it is "/dev/hd0" or "/dev/hd5". For MS-DOS it is a single digit
(zero or one).
pfdisk reads the hard disk partition table from block zero of
device into memory and allows the user to examine, modify, or
save the partition table. A regular file may be used instead of
a real device for testing purposes, though the device geometry
must be specified manually, and some systems will requrire a
file-name argument with the "R" and "W" commands (DOS, ESIX).
The partition table on device is NOT modified unless the write
command (W) is used with no argument.
USAGE
Commands
All pfdisk commands consist of a command word followed by
optional blank-separated command arguments. Note that only the
first letter of a command word is significant (except for "wq"
and "q!"). All command letters are accepted in either upper or
lower case. Numeric arguments are specified using C syntax.
Extra arguments are silently ignored.
The commands are:
? Prints a command summary (help).
1 sys_id first last sys_name
Set the partition table entry for part one, using:
sys_id as its system ID code, first as the lowest num-
bered cylinder it uses, last as the highest numbered
cylinder it uses, and sys_name (optional) as the system
name (in the menu name table).
2|3|4 sys-id first last sys-name
Similar to 1 but sets partition two, three, or four,
respectively.
Release 1.3 Last change: Oct 1990 1
PFDISK(8) MAINTENANCE COMMANDS PFDISK(8)
A number
Mark partition number as active (so it will be used for
booting). If number is zero, no partition will be
active.
G cylinders heads sectors
Inform pfdisk what the geometry of the device is.
I Print a summary of the known ID codes.
L List the partition table. See Output Format below.
Q Quit without saving. If the memory copy of the parti-
tion table was modified, a warning will be issued and
the command ignored.
Q! Quit, even if the memory copy of the partition table was
not saved.
R file-name
Read boot sector from file-name (if given) otherwise
read from device.
W file-name
Write boot sector to file-name. (if given) otherwise
write to device.
WQ Same as "write" followed by "quit".
# This line is a comment (to be ignored).
Output Format
Here is a sample of the output from the L command:
# Partition table on device: /dev/rdsk/0s0
geometry 1222 15 34 (cyls heads sectors)
# ID First(cyl) Last(cyl) Name # start, length (sectors)
1 4 0 127 MS-LOSS # 34, 65246
2 129 128 255 Minix # 65280, 65280
3 0 0 0 # 0, 0
4 99 256 1220 ESIX # 130560, 492150
# note: last(4): phys=(1023,14,34) logical=(1220,14,34)
active: 4
This output format is carefully constructed so that it may be
saved in a file (by redirecting standard output) and later used
as input (by redirecting standard input). On a UNIX system, one
can save this output using the command:
Release 1.3 Last change: Oct 1990 2
PFDISK(8) MAINTENANCE COMMANDS PFDISK(8)
(echo L) | pfdisk device-name > save-file
save-file is a complete record of the partition table. On a
UNIX system, one could use save-file to re-initialize the parti-
tion table using the command:
(cat save-file ; echo wq) | pfdisk device-name
Consistency of each partition table entry is checked while the
table is listed. Any inconsistencies discovered are reported in
a commentary note as shown above.
Physical vs. Logical
Each partition table entry has both "physical" and a "logical"
fields. The physical fields specify the lowest and highest
cylinder,head,sector combinations to be used in that partition.
The logical start field has the total number of sectors which
precede this partition, and the logical length field has the
total number of sectors contained in this partition. These
fields should be self consistent unless the disk has more than
1024 cylinders.
The physical cylinder fields are only ten-bits wide so the con-
tents are limited to 1023. The logical sector fields are 32 bits
wide and always show the true logical beginning and length of
the partition. Generally, the physical start field is used only
to locate the secondary boot sector, and the logical start and
length fields are used to actually delimit the partition used by
a particular system.
Partition Names
The Name field in the partition table is treated specially if
the bootmenu program is installed in the primary boot sector.
(See the file bootmenu.doc for more information.) pfdisk can
recognize the name table used by bootmenu and will show the
actual names present in that name table. If any other boot pro-
gram is used then the Name field reflects the result of a
table-lookup of the system ID.
If you provide a name when setting any partition entry, the
boot-sector is marked as using a name table, so that on subse-
quent uses of pfdisk you will see the partition names you have
specified.
Boot program replacement
You can replace the boot program in your boot sector without
affecting the partition table by using pfdisk as follows.
First, (as always) save a copy of the current boot sector (on a
Release 1.3 Last change: Oct 1990 3
PFDISK(8) MAINTENANCE COMMANDS PFDISK(8)
floppy) using the "W file" command. Then, use the "R file" com-
mand to read the new boot program. If the boot program read in
is less than 446 bytes long, the partition table will be
unchanged.
Unlike the DOS or UNIX fdisk programs, pfdisk has NO boot pro-
gram compiled into its executable image. If you wish to use
pfdisk to partition a newly formatted hard disk, you must have a
boot program image available to read in using the "r file" com-
mand. Two boot programs, "bootmenu.bin" and "bootauto.bin" are
distributed with pfdisk and should be found with its source
files. See the file bootmenu.doc for further information about
these boot programs.
AUTHOR
Gordon W. Ross
Release 1.3 Last change: Oct 1990 4

Binary file not shown.

View File

@@ -0,0 +1,605 @@
/*
* pfdisk - Partition a Fixed DISK
* by Gordon W. Ross, Jan. 1990
*
* See the file "pfdisk.doc" for user instructions.
*
* This program uses a simple, line-oriented interpreter,
* designed for both interactive and non-interactive use.
* To facilitate non-interactive use, the output from the
* 'L' (list partitions) command is carefully arranged so it
* can be used directly as command input. Neat trick, eh?
*/
char *versionString =
"# pfdisk version 1.2.1 by Gordon W. Ross Aug. 1990\nModified by S. Lubkin Oct. 1991\n";
/* These don't really matter. The user is asked to set them. */
#define DEFAULT_CYLS 306
#define DEFAULT_HEADS 4
#define DEFAULT_SECTORS 17
#define PROMPT_STRING "pfdisk> "
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "sysdep.h"
#include "syscodes.h"
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
struct part { /* An entry in the partition table */
uchar active; /* active flag (0x80 or 0) */
uchar b_head; /* begin head */
uchar b_sec; /* sector */
uchar b_cyl; /* cylinder */
uchar sysid; /* system id (see sysid.c) */
uchar e_head; /* end head */
uchar e_sec; /* end sector */
uchar e_cyl; /* end cylinder */
/* These two are just longs, but this way is machine independent. */
/* uchar lsBeg[4]; /* logical sectors, beginning Saul */
ulong lsBeg; /* logical sectors, beginning Saul */
/* uchar lsLen[4]; /* logical sectors, length Saul */
ulong lsLen; /* logical sectors, length Saul */
};
#define LOC_PT 0x1BE
#define LOC_NT 0x1AA /* Saul */
/* #define LOC_NT 0x180 Saul */
/* #define LOC_GWR 0x1A0 Saul */
#define LOC_GWR 0x1A9 /* Saul */
#define MAGIC_LOC 0x1FE
#define MAGIC_0 0x55
#define MAGIC_1 0xAA
#define MAX_LINE 80
#define NT_ENTRY_SIZE 5 /* Saul */
/* Note: Entry in "printf" command, should be manually changed, to
"%-NT_ENTRY_SIZE.NT_ENTRY_SIZEs" Saul */
/* And header printf line should have blanks adjusted Saul */
char s[22]; /* For holding error string */
char buffer[SECSIZE]; /* The boot block buffer */
int bufmod=0; /* buffer modified... */
/* (zero means buffer is unmodified) */
int useNTable; /* boot sector uses name table */
/* device parameters (force someone to set them!) */
unsigned cyls = DEFAULT_CYLS;
unsigned heads = DEFAULT_HEADS;
unsigned sectors = DEFAULT_SECTORS;
char *devname; /* device name */
char cmdline[MAX_LINE];
char filename[80]; /* used by r/w commands */
char *prompt; /* null if no tty input */
/* Some of these strings are used in more than one place.
* For consistency, I put a newline on all of them.
*/
char h_h[] = "? <enter> : Help summary\n";
char h_l[] = "L : List partition table\n";
char h_1[] = "1 id first last [name]: set partition 1\n";
char h_2[] = "2,3,4 ... (like 1) : set respective partition\n";
char h_a[] = "A n [m, ...] : Activate partition(s) n [m, ...]\n";
char h_g[] = "G cyls heads sectors : set disk Geometry\n";
char h_i[] = "I : list known ID numbers\n";
char h_r[] = "R [optional-file] : Read device (or specified file)\n";
char h_w[] = "W [optional-file] : Write device (or specified file)\n";
char h_q[] = "Q[!] : Quit (! means force)\n";
char * helpTable[] = {
h_h, h_l, h_1, h_2, h_a, h_g, h_i, h_r, h_w, h_q,
"# (All command letters have lower-case equivalents.)\n",
(char *) 0 }; /* This MUST have a zero as the last element */
char *BadArg="Error: bad argument: %s\n";
char *WarnNotSaved =
"Warning, modified partition table not saved.\n";
help()
{
char ** p;
for (p = helpTable; *p; p++)
printf(*p);
}
/* forward declarations */
void checkValidity();
char * setPartition();
char * makeActive();
char * setGeometry();
ulong chs2long();
char * nameID();
int printIDs();
main(argc,argv)
int argc;
char *argv[];
{
char *cmdp; /* points to command word */
char *argp; /* points to command args */
/* check command line args (device name) */
if (argc != 2) {
usage(argv[0]); /* See s-sysname.c */
exit(1);
}
devname = argv[1];
/* Should we prompt? */
prompt = (isatty(fileno(stdin))) ? PROMPT_STRING : (char *) 0;
/* Print version name. */
fputs(versionString, stderr);
/* get disk parameters */
getGeometry(devname,&cyls,&heads,&sectors);
/* Get the boot block. */
if (getBBlk(devname, buffer) < 0)
fprintf(stderr,"%s: read failed\n", devname);
checkValidity();
if (prompt) fprintf(stderr,"For help, enter: '?'\n");
/* Read and process commands a line at a time. */
while (1) {
if (prompt) fputs(prompt,stdout);
if (! fgets(cmdline, MAX_LINE, stdin)) break;
/* Find beginning of command word */
cmdp = cmdline;
while (isspace(*cmdp)) cmdp++;
/* find beginning of args */
argp = cmdp;
while (*argp && !isspace(*argp)) argp++;
while (isspace(*argp) || *argp=='=') argp++;
switch (*cmdp) {
case '\0': /* blank line */
case '#': /* line comment */
break;
case '?': case 'h': case 'H':
help();
break;
case '1': /* set partition entry */
case '2': case '3': case '4':
argp = setPartition(cmdp, argp);
if (argp) { /* arg list error */
fprintf(stderr,BadArg,argp);
fprintf(stderr,h_1);
fprintf(stderr,h_2);
break;
}
bufmod = 1;
break;
case 'a': case 'A': /* activate partition */
argp = makeActive(argp);
if (argp) {
fprintf(stderr,BadArg,argp);
fprintf(stderr,h_a);
break;
}
bufmod = 1;
break;
case 'g': case 'G': /* set disk parameters (Geometry) */
argp = setGeometry(argp);
if (argp) { /* arg list error */
fprintf(stderr,BadArg,argp);
fprintf(stderr,h_g);
}
break;
case 'i': case 'I': /* List known ID numbers */
printIDs();
break;
case 'l': case 'L': /* List the partition table */
listPTable();
break;
case 'q': case 'Q': /* Quit */
if (bufmod && (cmdp[1] != '!')) {
fprintf(stderr,"\007%s%s\n", WarnNotSaved,
"Use 'wq' or 'q!' (enter ? for help).");
break;
}
exit(0);
/*NOTREACHED*/
case 'r': case 'R': /* read from device or file */
if (sscanf(argp,"%80s",filename) == 1) {
/* Arg specified, read from filename */
if (getFile(filename, buffer, SECSIZE) < 0)
fprintf(stderr,"%s: read failed\n", filename);
bufmod = 1;
} else {
/* No arg, use device. */
if (getBBlk(devname, buffer) < 0)
fprintf(stderr,"%s: read failed\n", devname);
bufmod = 0;
}
checkValidity();
break;
case 'w': case 'W': /* Write to file or device */
if (sscanf(argp,"%80s",filename) == 1) {
/* Arg specified, write to filename */
if (putFile(filename, buffer, SECSIZE) < 0)
fprintf(stderr, "%s: write failed\n", filename);
} else { /* No arg, use device. */
if (putBBlk(devname, buffer) < 0)
fprintf(stderr, "%s: write failed\n", devname);
bufmod = 0;
}
if (cmdp[1] == 'q' || cmdp[1] == 'Q') exit(0);
break;
default:
fprintf(stderr,"'%c': unrecognized. Enter '?' for help.\n", *cmdp);
break;
} /* switch */
} /* while */
if (bufmod) fprintf(stderr, WarnNotSaved);
exit(0);
} /* main */
/* Check for valid boot block (magic number in last two bytes).
* Also, check for presence of partition name table.
*/
void checkValidity()
{
/* Check the magic number. */
if ((buffer[MAGIC_LOC] & 0xFF) != MAGIC_0 ||
(buffer[MAGIC_LOC+1] & 0xFF) != MAGIC_1 ) {
/* The boot sector is not valid -- Fix it. */
buffer[MAGIC_LOC] = MAGIC_0;
buffer[MAGIC_LOC+1] = MAGIC_1;
bufmod = 1;
fprintf(stderr,
"\n\tWarning: The boot sector has an invalid magic number.\n\
\tThe magic number has been fixed, but the other contents\n\
\tare probably garbage. Initialize using the command:\n\
\t\tR boot-program-file (i.e. bootmenu.bin)\n\
\tthen set each partition entry if necessary.\n");
}
/* Does it use a name table (for a boot menu)?
* My boot program does, and can be identified by
* finding my name in a particular (unused) area.
*/
useNTable = ( buffer[LOC_GWR] == (char)0x3A ); /* Saul */
/* useNTable = !strcmp(&buffer[LOC_GWR], "Gordon W. Ross"); Saul */
}
char * setPartition(cmdp,argp) /* return string on error */
char *cmdp,*argp;
{
struct part *pp; /* partition entry */
char * np; /* name table pointer */
char tmpname[20];
char * newname = tmpname; /* name field */
int index; /* partition index (0..3) */
uint id; /* ID code (see syscodes.c) */
uint first,last; /* user supplied cylinders */
uint c,h,s; /* working cyl,head,sect, */
int i; /* returned by sscanf */
ulong lsbeg, lslen; /* logical begin, length */
/* Value check the index */
index = *cmdp - '1';
if (index < 0 || index > 3)
return("index");
pp = (struct part *) &buffer[LOC_PT + index * 16];
np = &buffer[LOC_NT + index * NT_ENTRY_SIZE]; /* Saul */
/* np = &buffer[LOC_NT + index * 8]; Saul */
/* Read System ID */
if ((i=sscanf(argp,"%d%d%d%s", &id, &first, &last, newname)) < 1)
return("id");
/* If ID==0, just clear out the entry and return. */
if (id == 0) {
strncpy( (char *) pp, "", 16);
if (useNTable) strncpy( np, "", NT_ENTRY_SIZE); /* Saul */
/* if (useNTable) strncpy( np, "", 8); Saul */
return((char *)0);
}
/* Read first and last cylinder */
if (i < 3)
return("first last (missing)");
/* Reasonable start,end cylinder numbers? */
if (first > last) return("first > last");
if (first > 1023) return("first > 1023");
if (last >= cyls) return("last >= cyls");
/* Get (optional) system name. */
if (i == 3) { /* no name given, use default */
newname = nameID(id);
}
else useNTable = 1;
/* Set the ID and name. */
pp->sysid = id;
if (useNTable) {
strncpy(np, newname, NT_ENTRY_SIZE); /* Saul */
/* strncpy(np, newname, 8); Saul */
/* strcpy(&buffer[LOC_GWR], "Gordon W. Ross"); Saul */
buffer[LOC_GWR] = (char)0x3A; /* Saul */
}
/* set beginning c,h,s */
c = first;
/* if c == 0, head == 1 (reserve track 0) */
h = (first) ? 0 : 1;
s = 1;
pp->b_cyl = c & 0xFF;
pp->b_head = h;
pp->b_sec = s | ((c >> 2) & 0xC0);
/* Set the logical sector begin field */
lsbeg = lslen = chs2long(c,h,s); /* using lslen as temp. */
/* pp->lsBeg[0] = lslen & 0xff; lslen >>= 8;
pp->lsBeg[1] = lslen & 0xff; lslen >>= 8;
pp->lsBeg[2] = lslen & 0xff; lslen >>= 8;
pp->lsBeg[3] = lslen & 0xff; lslen >>= 8; Saul */
pp->lsBeg = lslen; /* Saul */
/* set ending c,h,s (last may be larger than 1023) */
c = (last>1023) ? 1023 : last; /* limit c to 1023 */
h = heads - 1; s = sectors;
pp->e_cyl = c & 0xFF;
pp->e_head = h;
pp->e_sec = s | ((c >> 2) & 0xC0);
/* Set the logical sector length field (using REAL end cylinder) */
lslen = chs2long(last,h,s) + 1 - lsbeg;
/* pp->lsLen[0] = lslen & 0xff; lslen >>= 8;
pp->lsLen[1] = lslen & 0xff; lslen >>= 8;
pp->lsLen[2] = lslen & 0xff; lslen >>= 8;
pp->lsLen[3] = lslen & 0xff; lslen >>= 8; Saul */
pp->lsLen = lslen; /* Saul */
return((char *)0); /* success */
} /* setPartition() */
char * makeActive(argp) /* return error string or zero */
char *argp;
{
struct part *pp; /* partition entry */
int i,act1,act2,act3,act4,act5; /* which one becomes active */
act1=0;
act2=0;
act3=0;
act4=0;
if ((i=sscanf(argp,"%d%d%d%d%d", &act1, &act2, &act3, &act4, &act5)) < 1)
return("missing partition number");
if ( i > 4)
return("at most four partition numbers");
act1--; /* make it zero-origin */
act2--; /* make it zero-origin */
act3--; /* make it zero-origin */
act4--; /* make it zero-origin */
i=0; pp = (struct part *) &buffer[LOC_PT];
while (i<4) {
if (pp->sysid == 0 && (i == act1|| i == act2 || i == act3 || i == act4)) {
sprintf(s, "partition %d empty", i+1);
return(s);
}
i++; pp++;
}
i=0; pp -= 4;
while (i<4) {
if (i == act1|| i == act2 || i == act3 || i == act4)
pp->active = 0x80;
else
pp->active = 0;
i++; pp++;
}
return((char *)0);
}
char * setGeometry(argp) /* return string on error */
char *argp;
{
int c,h,s;
if (sscanf(argp,"%d%d%d", &c, &h, &s) < 3)
return("(missing)");
if (c<1) return("cyls");
if (h<1) return("heads");
if (s<1) return("sectors");
cyls=c; heads=h; sectors=s;
return((char *)0);
}
listPTable() /* print out partition table */
{
struct part * pp; /* partition table entry */
char *name;
int i; /* partition number */
/* int numActive=0; /* active partition [1-4], 0==none */
char Active[20]; /* active partitions [1-4], 0==none */
uint pbc,pbh,pbs; /* physical beginning c,h,s */
uint pec,peh,pes; /* physical ending c,h,s */
uint lbc,lbh,lbs; /* logical beginning c,h,s */
uint lec,leh,les; /* logical ending c,h,s */
ulong lsbeg,lslen; /* logical sectors: begin, length */
strcpy(Active, "active:");
printf("# Partition table on device: %s\n", devname);
printf("geometry %d %d %d (cyls heads sectors)\n",
cyls, heads, sectors);
/* printf("# ID First(cyl) Last(cyl) Name "); Saul */
printf("# ID First(cyl) Last(cyl) Name "); /* Saul */
printf("# start, length (sectors)\n");
for (i=0; i<4; i++) {
pp = (struct part *) &buffer[LOC_PT + i * 16];
if (pp->active) {
char s[3];
sprintf(s, " %d", i+1);
strcat(Active,s);
if (pp->active != 0x80)
fprintf(stderr, "Warning: Partition %d is active, with the illegal activity byte %d.\nCorrect with the \"A\" command.\n", i+1, pp->active);
/* if(numActive)
fprintf(stderr,"Error: multiple active partitions.\n");
else numActive = i+1; */
}
/* physical beginning c,h,s */
pbc = pp->b_cyl & 0xff | (pp->b_sec << 2) & 0x300;
pbh = pp->b_head;
pbs = pp->b_sec & 0x3F;
/* physical ending c,h,s */
pec = pp->e_cyl & 0xff | (pp->e_sec << 2) & 0x300;
peh = pp->e_head;
pes = pp->e_sec & 0x3F;
/* compute logical beginning (c,h,s) */
/* lsbeg = ((((((pp->lsBeg[3] ) << 8 )
| pp->lsBeg[2] ) << 8 )
| pp->lsBeg[1] ) << 8 )
| pp->lsBeg[0] ; Saul */
lsbeg = pp->lsBeg; /* Saul */
long2chs(lsbeg, &lbc, &lbh, &lbs);
/* compute logical ending (c,h,s) */
/* lslen = ((((((pp->lsLen[3]) << 8 )
| pp->lsLen[2]) << 8 )
| pp->lsLen[1]) << 8 )
| pp->lsLen[0] ; Saul */
lslen = pp->lsLen; /* Saul*/
/* keep beginning <= end ... */
if (lslen > 0) long2chs(lsbeg+lslen-1, &lec, &leh, &les);
else long2chs(lsbeg, &lec, &leh, &les);
if (useNTable)
name = &buffer[LOC_NT + i * NT_ENTRY_SIZE ]; /* Saul */
/* name = &buffer[LOC_NT + i * 8]; Saul */
else
name = nameID((uint) pp->sysid);
/* show physical begin, logical end (works for cyl>1023) */
/* # ID First(cyl) Last(cyl) Name... # ... */
/* printf("%d %3d %4d %4d %-8.8s # %ld, %ld\n", Saul */
printf("%d %3d %4d %4d %-5.5s # %ld, %ld\n", /* Saul */
i+1, pp->sysid, pbc, lec, name, lsbeg, lslen );
/* That's all, for an empty partition. */
if (pp->sysid == 0) continue;
/*
* Now do some consistency checks...
*/
/* Same physical / logical beginning? */
if (pbc != lbc || pbh != lbh || pbs != lbs ) {
printf("# note: first(%d): ", i+1);
printf("phys=(%d,%d,%d) ", pbc, pbh, pbs);
printf("logical=(%d,%d,%d)\n",lbc, lbh, lbs);
}
/* Same physical / logical ending? */
if (pec != lec || peh != leh || pes != les ) {
printf("# note: last(%d): ", i+1);
printf("phys=(%d,%d,%d) ", pec, peh, pes);
printf("logical=(%d,%d,%d)\n",lec, leh, les);
}
/* Beginning on cylinder boundary? */
if (pbc == 0) { /* exception: start on head 1 */
if (pbh != 1 || pbs != 1) {
printf("# note: first(%i): ", i+1);
printf("phys=(%d,%d,%d) ", pbc, pbh, pbs);
printf("should be (%d,1,1)\n", pbc);
}
} else { /* not on cyl 0 */
if (pbh != 0 || pbs != 1) {
printf("# note: first(%i): ", i+1);
printf("phys=(%d,%d,%d) ", pbc, pbh, pbs);
printf("should be (%d,0,1)\n", pbc);
}
}
/* Ending on cylinder boundary? */
if (peh != (heads-1) || pes != sectors) {
printf("# note: last(%i): ", i+1);
printf("phys=(%d,%d,%d) ", pec, peh, pes);
printf("should be (%d,%d,%d)\n",
pec, heads-1, sectors);
}
} /* for */
if ( !Active[7] ) /* No active partitions */
strcat(Active, " 0 (none)");
strcat(Active, "\n");
printf(Active);
/* printf("active: %d %s\n", numActive,
(numActive) ? "" : "(none)"); */
} /* listPTable() */
ulong chs2long(c,h,s)
uint c,h,s;
{
ulong l;
if (s<1) s=1;
l = c; l *= heads;
l += h; l *= sectors;
l += (s - 1);
return(l);
}
long2chs(ls, c, h, s) /* convert logical sec-num to c,h,s */
ulong ls; /* Logical Sector number */
uint *c,*h,*s; /* cyl, head, sector */
{
int spc = heads * sectors;
*c = ls / spc;
ls = ls % spc;
*h = ls / sectors;
*s = ls % sectors + 1; /* sectors count from 1 */
}
char * nameID(n)
unsigned int n;
{
struct intString *is;
is = sysCodes;
while (is->i) {
if (is->i == n) return(is->s);
is++;
}
if (!n) return(is->s);
return("unknown");
}
int printIDs() /* print the known system IDs */
{
struct intString * is = sysCodes;
/* This might need to do more processing eventually, i.e.
* if (prompt) { ... do more processing ... }
*/
printf("_ID_\t__Name__ ____Description____\n");
while (is->i) {
printf("%3d\t%s\n", is->i, is->s);
is++;
}
}

View File

@@ -0,0 +1,43 @@
/* This file holds all knowledge of partition ID codes.
* Thanks to leendert@cs.vu.nl (Leendert van Doorn) for
* collecting most of this information.
*/
#define extern
#include "syscodes.h"
#undef extern
/* Note that my boot program menu can only use the first 8 characters
* of these names. The colon in the nineth position shows where the
* first truncated char is. (There's not much room in the bootblock!)
* changed sysCodes[] below, adding SIZE tms */
struct intString sysCodes[SIZE] = {
{ 0x01, "DOS12 :12-bit FAT" },
{ 0x02, "XENIX :root" },
{ 0x03, "XENIX :usr" },
{ 0x04, "DOS16 :16-bit FAT" },
{ 0x05, "DOSex :DOS 3.3 extended volume" },
{ 0x06, "DOSbi :DOS 4.0 large volume" },
{ 0x07, "OS/2 :OS/2 (or QNX or Adv. UNIX...)" },
{ 0x08, "AIX :file system" },
{ 0x09, "AIXbt:boot partition" },
{ 0x10, "OPUS :?" },
{ 0x40, "VENIX :Venix 80286" },
{ 0x51, "NOVEL :?" },
{ 0x52, "CPM :?" },
{ 0x63, "UNIX :System V/386" },
{ 0x64, "NOVEL :?" },
{ 0x75, "PC/IX :?" },
{ 0x80, "Minix :Minix (ver. 1.4a and earlier)" },
{ 0x81, "Minix :Minix (ver. 1.4b and later)" },
{ 0x93, "Ameba :Amoeba file system" },
{ 0x94, "Ameba :Amoeba bad block table?" },
{ 0xDB, "C.DOS :Concurrent DOS" },
/* { 0xF2, "DOS-2nd :DOS 3.3+ second partition" }, */
/* { 0xFF, "BAD-TRK :Bad track table?" }, */
/* Make sure this is last! */
{ 0, "empty" }
};

View File

@@ -0,0 +1,4 @@
#define SIZE 40 /* added tms */
struct intString { unsigned int i; char * s; };
extern struct intString sysCodes[SIZE]; /* was sysCodes[] modified tms */

View File

@@ -0,0 +1,22 @@
/* communicate declarations from the files: s_*.c */
#define SECSIZE 0x200
extern int usage(); /* print a usage message */
/* (char *progname) */
extern void getGeometry(); /* determine disk parameters */
/* (char *dev, uint *cyls, uint *heads, uint *sectors) */
extern int getFile(); /* open, read, close, return(num-read) */
/* (char *name, char *buf, int len) */
extern int putFile(); /* open, write, close, return(num-writen) */
/* (char *name, char *buf, int len) */
extern int getBBlk(); /* open, read, close, return(num-read) */
/* (char *dev, char *buf) */
extern int putBBlk(); /* open, write, close, return(num-writen) */
/* (char *dev, char *buf) */

View File

@@ -0,0 +1,163 @@
/* This file contains system-specific functions for MS-DOS.
* The program pfdisk.c calls these routines.
*/
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dos.h>
#define extern
#include "sysdep.h"
#undef extern
int usage(prog) /* print a usage message */
char *prog; /* program name */
{
fprintf(stderr,"Usage: %s <disk>\n", prog);
fprintf(stderr,"\twhere <disk> is a digit [0-9]\n");
}
void getGeometry(name, c, h, s)
char *name; /* device name */
unsigned *c,*h,*s; /* cyls, heads, sectors */
{
int dev; /* hard disk number */
union REGS regs;
struct SREGS sregs;
if (name[0] < '0' ||
name[0] > '9' ||
name[1] != 0 )
{
fprintf(stderr,"%s: device name must be a digit\n", name);
return;
}
dev = (name[0] - '0');
regs.h.ah = 8; /* get param. */
regs.h.dl = dev | 0x80;
int86x(0x13,&regs,&regs,&sregs);
/* Are that many drives responding? */
if (regs.h.dl <= dev ) {
fprintf(stderr,"%s: drive not found\n", name);
return;
}
if (regs.x.cflag) {
fprintf(stderr,"%s: can't get disk parameters\n", name);
return;
}
*c = ((((int) regs.h.cl << 2) & 0x300) | regs.h.ch) + 1;
*h = regs.h.dh + 1;
*s = regs.h.cl & 0x3F;
}
int getFile(name, buf, len) /* read file into buffer */
char *name, *buf;
int len;
{ /* (open, read, close) */
int devfd, retval;
devfd = open(name, O_RDONLY|O_BINARY, 0);
if (devfd < 0) {
fprintf(stderr,"%s: can't open for reading\n", name);
return(devfd);
}
retval = read(devfd, buf, len);
if (retval < 0)
fprintf(stderr,"%s: read failed\n", name);
close(devfd);
return(retval);
}
int putFile(name, buf, len) /* write buffer to file */
char *name, *buf;
int len;
{ /* (open, write, close) */
int devfd, retval;
devfd = open(name,
O_WRONLY|O_CREAT|O_BINARY,
S_IREAD|S_IWRITE ); /* stupid DOS... */
if (devfd < 0) {
fprintf(stderr,"%s: can't open for writing\n", name);
return(devfd);
}
retval = write(devfd, buf, len);
if (retval < 0)
fprintf(stderr,"%s: write failed\n", name);
close(devfd);
return(retval);
}
int getBBlk(name, buf) /* read boot block into buffer */
char *name, *buf;
{ /* BIOS absolute disk read */
int dev;
union REGS regs;
struct SREGS sregs;
if (name[0] < '0' ||
name[0] > '9' ||
name[1] != 0 )
{
fprintf(stderr,"%s: device name must be a digit\n",name);
return(-1);
}
dev = (name[0] - '0');
segread(&sregs); /* get ds */
sregs.es = sregs.ds; /* buffer address */
regs.x.bx = (int) buf;
regs.h.ah = 2; /* read */
regs.h.al = 1; /* sector count */
regs.h.ch = 0; /* track */
regs.h.cl = 1; /* start sector */
regs.h.dh = 0; /* head */
regs.h.dl = dev|0x80; /* drive */
int86x(0x13,&regs,&regs,&sregs);
if (regs.x.cflag) {
fprintf(stderr,"%s: read failed\n", name);
return(-1);
}
return(SECSIZE);
}
int putBBlk(name, buf) /* write buffer to boot block */
char *name, *buf;
{ /* BIOS absolute disk write */
int dev;
union REGS regs;
struct SREGS sregs;
if (name[0] < '0' ||
name[0] > '9' ||
name[1] != 0 )
{
fprintf(stderr,"%s: device name must be a digit\n", name);
return(-1);
}
dev = (name[0] - '0');
segread(&sregs); /* get ds */
sregs.es = sregs.ds; /* buffer address */
regs.x.bx = (int) buf;
regs.h.ah = 3; /* write */
regs.h.al = 1; /* sector count */
regs.h.ch = 0; /* track */
regs.h.cl = 1; /* start sector */
regs.h.dh = 0; /* head */
regs.h.dl = dev|0x80; /* drive */
int86x(0x13,&regs,&regs,&sregs);
if (regs.x.cflag) {
fprintf(stderr,"%s: write failed\n",name);
return(-1);
}
return(SECSIZE);
}

Binary file not shown.

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.

View File

@@ -0,0 +1,312 @@
From: simonm@dcs.glasgow.ac.uk (Simon Marlow)
Newsgroups: alt.os.linux
Subject: Re: Various Problems..
Message-ID: <1992Mar24.120332.14976@dcs.glasgow.ac.uk>
Date: 24 Mar 92 12:03:32 GMT
References: <gdmXwmq00VB5I6v0QZ@andrew.cmu.edu> <IJW11.92Mar23191240@manea.cl.cam.ac.uk>
Organization: Glasgow University Computing Science Dept.
Lines: 301
ijw11@phx.cam.ac.uk (Ian Wells) writes:
>I have problems with make too. Mine reports
>(null): situid: not owner
>or something similar, if I'm not root. I've tried u+s on the binary to no
>effect, so what's the problem?
>Ian.
Here are the diffs I made when I compiled gmake-3.62 (as far as I know
there are none of the common bugs ascociated with these diffs - eg
setuid problems, Ctrl-C not working etc.)
Unfortunately I compiled with gcc2 & shared libs so I can't really
upload the binary, although I could upload the .o file ready for
linking. Mail me if this would be useful.
Simon.
diff -cr gmake-3.62//Makefile gmake-linux//Makefile
*** gmake-3.62//Makefile Thu Nov 21 15:58:00 1991
--- gmake-linux//Makefile Mon Mar 23 20:27:39 1992
***************
*** 22,30 ****
#CC line is new (WDP)
CC=gcc
# CFLAGS = $(defines) -g
! CFLAGS = $(defines) -O
# LDFLAGS = -g
! LDFLAGS =
# Define these for your system as follows:
# -DUSG System V
--- 22,30 ----
#CC line is new (WDP)
CC=gcc
# CFLAGS = $(defines) -g
! CFLAGS = $(defines) -O2
# LDFLAGS = -g
! LDFLAGS = -s
# Define these for your system as follows:
# -DUSG System V
***************
*** 42,48 ****
# without complaint but produce losing code,
# so beware.
# NeXT 1.0a uses an old version of GCC, which required -D__inline=inline.
! defines =
# Define these for your system as follows:
# -DUMAX Encore UMAX
--- 42,48 ----
# without complaint but produce losing code,
# so beware.
# NeXT 1.0a uses an old version of GCC, which required -D__inline=inline.
! defines = -DPOSIX -DLINUX -DHAVE_DUP2
# Define these for your system as follows:
# -DUMAX Encore UMAX
***************
*** 56,62 ****
# Define:
# -DNLIST_NAME_UNION If `struct nlist' has a n_un member.
# -DNLIST_NAME_ARRAY If `n_name' is an array.
! LOAD_AVG =
# If you don't want archive support, comment these out.
ARCHIVES = arscan.o ar.o
--- 56,62 ----
# Define:
# -DNLIST_NAME_UNION If `struct nlist' has a n_un member.
# -DNLIST_NAME_ARRAY If `n_name' is an array.
! LOAD_AVG = -DNO_LDAV
# If you don't want archive support, comment these out.
ARCHIVES = arscan.o ar.o
***************
*** 84,102 ****
# Comment this out if POSIX.2 glob is installed on your system
# (it's in the GNU C Library, so if you're using that, this is
# not needed at all.)
! globdep = glob/libglob.a
# Library containing POSIX.2 `glob' function.
# Comment this line out if it's in the C library (which is the case if you
# are using the GNU C Library), or change it to the appropriate file name
# or -l switch.
! globlib = $(globdep)
# Name under which to install GNU make.
instname = make
# WDP:
! prefix = /usr/local/gnu
! ARCH:sh = /bin/arch
# Directory to install `make' in.
bindir = $(prefix)/bin/$(ARCH)
--- 84,102 ----
# Comment this out if POSIX.2 glob is installed on your system
# (it's in the GNU C Library, so if you're using that, this is
# not needed at all.)
! #globdep = glob/libglob.a
# Library containing POSIX.2 `glob' function.
# Comment this line out if it's in the C library (which is the case if you
# are using the GNU C Library), or change it to the appropriate file name
# or -l switch.
! #globlib = $(globdep)
# Name under which to install GNU make.
instname = make
# WDP:
! prefix = /usr/local
! #ARCH:sh = /bin/arch
# Directory to install `make' in.
bindir = $(prefix)/bin/$(ARCH)
diff -cr gmake-3.62//commands.c gmake-linux//commands.c
*** gmake-3.62//commands.c Tue Oct 8 20:20:30 1991
--- gmake-linux//commands.c Mon Mar 23 20:22:12 1992
***************
*** 342,348 ****
int sig;
{
signal (sig, SIG_DFL);
! #ifndef USG
(void) sigsetmask (0);
#endif
--- 342,348 ----
int sig;
{
signal (sig, SIG_DFL);
! #if !defined(USG) && !defined(LINUX)
(void) sigsetmask (0);
#endif
diff -cr gmake-3.62//job.c gmake-linux//job.c
*** gmake-3.62//job.c Thu Oct 24 21:58:34 1991
--- gmake-linux//job.c Mon Mar 23 20:10:34 1992
***************
*** 117,122 ****
--- 117,123 ----
extern int setgid (), getgid ();
#endif /* GNU C library. */
+ #ifndef LINUX
#ifndef USG
extern int getdtablesize ();
#else
***************
*** 123,128 ****
--- 124,130 ----
#include <sys/param.h>
#define getdtablesize() NOFILE
#endif
+ #endif
extern void wait_to_start_job ();
extern int start_remote_job_p ();
***************
*** 180,186 ****
extern int fatal_signal_mask;
! #ifdef USG
/* Set nonzero in the interval when it's possible that we may see a dead
child that's not in the `children' chain. */
static int unknown_children_possible = 0;
--- 182,188 ----
extern int fatal_signal_mask;
! #if defined(USG) || defined(LINUX)
/* Set nonzero in the interval when it's possible that we may see a dead
child that's not in the `children' chain. */
static int unknown_children_possible = 0;
***************
*** 192,198 ****
static void
block_signals ()
{
! #ifdef USG
/* Tell child_handler that it might see children that aren't yet
in the `children' chain. */
--- 194,200 ----
static void
block_signals ()
{
! #if defined(USG) || defined(LINUX)
/* Tell child_handler that it might see children that aren't yet
in the `children' chain. */
***************
*** 216,222 ****
static void
unblock_signals ()
{
! #ifdef USG
(void) SIGNAL (SIGCLD, child_handler);
--- 218,224 ----
static void
unblock_signals ()
{
! #if defined(USG) || defined(LINUX)
(void) SIGNAL (SIGCLD, child_handler);
***************
*** 396,402 ****
if (c == 0)
{
/* An unknown child died. */
! #ifdef USG
if (!unknown_children_possible)
{
#endif
--- 398,404 ----
if (c == 0)
{
/* An unknown child died. */
! #if defined(USG) || defined(LINUX)
if (!unknown_children_possible)
{
#endif
***************
*** 407,413 ****
ignore_errors_flag);
else
error ("%s finished.", buf);
! #ifdef USG
}
#endif
}
--- 409,415 ----
ignore_errors_flag);
else
error ("%s finished.", buf);
! #if defined(USG) || defined(LINUX)
}
#endif
}
diff -cr gmake-3.62//main.c gmake-linux//main.c
*** gmake-3.62//main.c Mon Sep 9 23:36:15 1991
--- gmake-linux//main.c Mon Mar 23 19:50:35 1992
***************
*** 321,329 ****
--- 321,333 ----
FATAL_SIG (SIGDANGER);
#endif
FATAL_SIG (SIGFPE);
+ #ifdef SIGBUS
FATAL_SIG (SIGBUS);
+ #endif
FATAL_SIG (SIGSEGV);
+ #ifdef SIGSYS
FATAL_SIG (SIGSYS);
+ #endif
FATAL_SIG (SIGTERM);
#ifdef SIGXCPU
FATAL_SIG (SIGXCPU);
diff -cr gmake-3.62//make.h gmake-linux//make.h
*** gmake-3.62//make.h Sat Oct 26 21:19:59 1991
--- gmake-linux//make.h Mon Mar 23 20:18:30 1992
***************
*** 205,211 ****
extern void user_access (), make_access (), child_access ();
! #if defined(USG) && !defined(HAVE_VFORK)
#define vfork fork
#define VFORK_NAME "fork"
#else /* Have vfork or not USG. */
--- 205,211 ----
extern void user_access (), make_access (), child_access ();
! #if (defined(USG) || defined(LINUX)) && !defined(HAVE_VFORK)
#define vfork fork
#define VFORK_NAME "fork"
#else /* Have vfork or not USG. */
***************
*** 232,238 ****
extern char *ctime ();
#endif /* GNU C library or POSIX. */
! #if defined(USG) || defined(POSIX) && !defined(__GNU_LIBRARY__)
extern char *getcwd ();
#ifdef PATH_MAX
#define getwd(buf) getcwd (buf, PATH_MAX - 2)
--- 232,238 ----
extern char *ctime ();
#endif /* GNU C library or POSIX. */
! #if defined(USG) || defined(LINUX) || defined(POSIX) && !defined(__GNU_LIBRARY__)
extern char *getcwd ();
#ifdef PATH_MAX
#define getwd(buf) getcwd (buf, PATH_MAX - 2)

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.

View File

@@ -0,0 +1,140 @@
CHANGES IN THE LINUX v0.95a ROOT DISKETTE
Jim Winstead Jr. - March 17, 1992
This file mostly contains info about the changes in the root diskette
from Linux v0.95/0.12 to Linux v0.95a.
CHANGES
With the release of Linux v0.95a, the maintenance of the root diskette
has been assumed by Jim Winstead Jr. (jwinstea@jarthur.Claremont.EDU).
This means there are a few large changes between the Linux 0.95 and
0.12 root floppies and the Linux 0.95a root floppy. These are
detailed (as much as I remember them) below:
- 'bash' has been replaced with 'ash', the BSD 4.3 /bin/sh. This
freed up nearly 200k on the root floppy. However, there are
some problems with 'ash' that haven't been resolved:
- sometimes the backspace key will not work on a virtual
console. I've found that it usually works on all _but_ one
console, so this is only a minor hinderance.
- 'ash 'supports BSD-style job control, and this has not yet been
adapted to Linux's more POSIXish job control. This means
that 'ash' does not yet support job control, but it's being
worked upon.
- 'tar' and 'compress' are back on the root floppy. 'tar' is
compressed, and both utilities are in /bin.
- 'pfdisk', a disk partitioner, was added to the root floppy.
This makes it (almost) possible to install Linux on a machine
without looking at another OS.
- the file pager 'more' has been added to the floppy. This was
added because of the addition of some documentation files on
the root floppy.
- 'cat' has been added to /bin.
- many utilities have been moved from /usr/bin to /bin, to
conform to the Linux Directory Structure Standard (v1.0).
These utilities are ones that are 'vital to the restoration of
other file systems in the case of a corrupting crash.'
- 'init' and 'update' have been moved to /etc from /bin. This
was done because neither program should be executed from the
command line by any user, including root. (That means don't
put /etc in your PATH!) This has been a matter of some
controversy, but this is how it will stand until the Linux
Standards mailing list/committee decides otherwise.
- tty64, tty65, etc, have been renamed to ttys1, ttys2, etc.
- the directory /INSTALL was added, which contains some
documentation, and three simple shell scripts to make
installing Linux on a hard drive partition easier. These are:
- 'mktree', which makes a directory tree on the specified
mounted device.
- 'mkdev' which creates the standard devices in the dev
directory of the specified mounted device
- 'install' which installs the programs on the root diskette
to the specified mounted device
These programs will normally be called with '<name> /mnt'.
- rootdev is different than the one on v0.95. A couple of days
after the release of 0.95, a program called 'rdev' was posted
to alt.os.linux that duplicated and extended the functionality
of rootdev. This was renamed to rootdev and replaces the old
rootdev.
- agetty was renamed to getty, to be consistent with common Unix
practice.
- an improved fdisk was added that correctly reports extended
partitions, (Thanks to Linus!)
- /dev is complete, or at least more complete than the last few
releases of the root diskette, which always seemed to be a
major complaint. :)
- /etc/issue and /etc/motd have been expanded to be a little
more informative. (Yeah, I know, big deal! :)
- chgrp was removed. You can use chown to get the same effect,
but you just have to specify an owner, too.
Many of these changes were discussed on alt.os.linux, or the Linux
Standards group, so they may look familiar.
If you have questions, problems, or complaints about the root
diskette, either post to alt.os.linux, or send mail to me at
jwinstea@jarthur.Claremont.EDU.
If you have questions, problems, or complaints about the boot diskette
or the kernel itself, post to alt.os.linux or send mail to Linus
Torvalds at torvalds@cc.helsinki.fi.
Remember, the only stupid questions are the ones you don't ask.
FUTURE CHANGES
I'm already anticipating some changes for the next release, so here's
a sneak preview:
- shared libraries. These are currently in alpha testing, and
will hopefully free up some more room on the root floppy for
more goodies.
- a generic mtools might be added to the root floppy.
- a better fdisk to replace the current fdisk/pfdisk pair. You
won't need to know your drive's geometry for this, and it will
know about Linux extended partitions.
- an improved sh. I'm working on the backspace problem, and
adding job control. I'm also going to look at using the GNU
readline library for input, as long as it doesn't add
substantially to the size of sh.
- init/getty/login may be removed from the root floppy. The
main reason they'll still on there is the backspace problem
with ash.
- improved installation documentation. People have started work
on this already - read alt.os.linux for previews.
- more robust installation scripts. The current ones are quick
and dirty, and work well, but I'd like to add better ones.
- miscellaneous utilities added. I'd really like to add an
editor to the root disk, but I haven't found one small enough.
Any suggestions?
- various other things that I can't remember right now.
Again, mail your questions, comments and suggestions about the root
diskette to me at jwinstea@jarthur.Claremont.EDU.

1302
Linux-0.95/docs/FAQ-0.95a Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,123 @@
LINUX INFORMATION SHEET
(last updated 13 Jan 1992 (with changes by Linus 4.4.92))
1. WHAT IS LINUX 0.95a
LINUX 0.95a is a freely distributable UNIX clone. It implements a
subset of System V and POSIX functionality. 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 complete source code by
anonymous FTP. LINUX runs only on 386/486 AT-bus machines; porting to
non-Intel architectures is likely to be difficult, as the kernel makes
extensive use of 386 memory management and task primitives.
Version 0.95a is still a beta release, but it already provides much
of the functionality of a System V.3 kernel. For example, various
users have been able to port programs such as bison/flex without having
to modify code at all. Another indication of its maturity is that
it is now possible to do LINUX kernel development using LINUX itself
and freely-available programming tools.
2. LINUX features
- System call compatible with a subset of System V and POSIX
- Full multiprogramming (multiple programs can run at once)
- Memory paging with copy-on-write
- Demand loading of executables
- Page sharing of executables
- Virtual memory: swapping to disk when out of RAM
- POSIX job control
- virtual consoles
- pty's
- some 387-emulation
- ANSI compliant C compiler (gcc)
- A complete set of compiler writing tools
(bison as yacc-replacement, flex as lex replacement)
- The GNU 'Bourne again' shell (bash) (as well as 'ash', 'rc' etc)
- 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 6 national keyboards: Finnish/US/German/French/British/Danish
- 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
(Almost the entire suite of GNU programs has been ported to Linux.)
- 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 with an AT-bus. (EISA will probably work, also,
but you will need an AT-bus hard disk controller.) Both DX and SX
processors will work.
- A hard disk implementing the standard AT hard disk interface -- for
example, an IDE drive. In addition, some SCSI drives are supported
with additional kernel patches.
- A high-density disk drive--either 5.25" (1.2MB) or 3.5" (1.44MB).
- At least 2 megabytes of RAM. (LINUX will boot in 2 Mb. To use gcc
4 MB is a good idea.)
- Any video card of the following: Hercules,CGA,EGA,VGA
In addition, LINUX supports
- Up to four serial lines (2 active at a time)
- A real time clock
4. PARTIAL LIST OF UTILITIES INCLUDED IN OR AVAILABLE FOR LINUX 0.95a
- The MTOOLS package (reading/writing to DOS filesystems)
- The complete GNU filetools (ls, cat, cp, mv, ...)
- The GNU C and C++ compiler with GNU assembler, linker, ar, ...
- bison
- flex
- rcs
- pmake (BSD 4.3 Reno/BSD 4.4 make)
- kermit
- Micro emacs
- less
- mkfs
- fsck
- mount/umount
- TeX, dvips
- and lots more...
5. LINUX BINARIES
The LINUX binaries and sources are available at several different
anonymous FTP sites. The biggest are:
nic.funet.fi:/pub/OS/Linux
tsx-11.mit.edu:/pub/linux
6. LEGAL STATUS OF LINUX
Although LINUX is supplied with the complete source code, it is
copyrighted software. Unlike MINIX, however, it is available for free,
provided you obey to the rules specified in the LINUX copyright.
Linux is (C) Linus Torvalds, but the copyright is the GNU copyleft:
get a copy of the copyleft at your nearest ftp-archive..
7. NEWS ABOUT LINUX
There are now two newsgroups devoted to linux articles: an older
alt.os.linux and the new comp.os.linux group. The alt-group will be
phased out as the comp-group gets a wider propagation. Additionally,
there are a couple of mailing-lists: linux-activists@niksula.hut.fi is
the original mailing-list, and it now supports sub-threads (notably the
gcc-2 beta-testing list). There is also a linux-standards mailing list
as well as a newsgroup-service for those that can get mail but are
unable to read the newsgroups. For the current status of LINUX, do a
"finger torvalds@kruuna.helsinki.fi".
8. FUTURE PLANS
Work is underway on LINUX version 1.0, which will close some of the
gaps in the present implementation. Various people are currently working
on:
- A more complete virtual filesystem layer
- STREAMS
- Interprocess communication
- IEEE POSIX P1003.1 / P1003.2 compatibility
- more complete SCSI support
If you want to help, mail the various activists or post to the newsgroups.
--------------------------------------------------------------------------------

View File

@@ -0,0 +1,157 @@
INSTALL NOTES FOR LINUX v0.95a
Jim Winstead Jr. - March 17, 1992
This file contains basic instructions for installing Linux v0.95a.
More detailed instructions are being written by others. Read
alt.os.linux for details on this, and to see preliminary drafts.
COPYRIGHT
Linux 0.95a is NOT public domain software, but is copyrighted by Linus
Torvalds (torvalds@cc.helsinki.fi). The copyright terms follow the
GNU Copyleft. See the file COPYING from any GNU software package for
the finer points. Note that the unistd library functions and all
library functions written by Linus Torvalds are exempt from this
copyright, and you may use them as you wish.
INSTALLATION
1) First, and absolutely the most important step, MAKE BACKUPS OF YOUR
SYSTEM! This system won't do anything nearly as nasty as coredump all
over your harddrive (see 386BSD v0.0), but it is quite easy to
accidently screw something up while installing.
2) Test out the Linux v0.95a boot disk with the Linux v0.95a root
disk. If you are unable to get the boot disk to work properly on
your system, try posting to alt.os.linux, or contacting Linus.
Notice that Linux (as of v0.95) contains an init/getty/login suite,
and this will start up 'login' on the first four virtual consoles,
accessed by Left-Alt-F[1234]. If you experience problems on one
virtual console, it should be possible to switch to another one.
(There is a good chance the backspace key will not work with
/bin/sh on your first virtual console, as this how it often behaves
on my machine. I've noticed that it usually works in the other
virtual consoles, however.)
3) Run the 'fdisk' program on the root floppy. This will tell you how
each of your harddrives is partitioned. Note that the names of the
hard drive partitions has changed from v0.12, and 'fdisk' now
properly reports the new device names (unlike the fdisk with v0.95).
If 'fdisk' tells you about any partitions at all, Linux can
successfully read at least part of your harddisk, and you will most
likely be able to install Linux on your harddrive.
If you have used previous versions of Linux, you will notice that
'fdisk' now recognizes extended partitions. Support for this in
the kernel, however, is largely untested. If you're feeling brave,
go ahead and try, and report any problems to Linus.
4) Make sure you have a free (preferably primary) partition on your
hard drive. If you want to repartition your harddrive, you can use
the pfdisk program on the root floppy. See pfdisk.man in the
/INSTALL directory for more details on using this program. (NOTE:
you will need to know your hard drives disk geometry to use pfdisk.
You can find this out by examining your CMOS setup on most computers.)
5) If you have used pfdisk to change your partition table, be sure to
reboot Linux now, so the new partition table will be recognized by
Linux.
6) Use 'fdisk' again to check the partitions on your hard drive, and
use 'mkfs' to make a Linux (minix) filesystem on the partition you
want to be using for Linux. The proper command is "mkfs
/dev/hdX nnn" where X is the partition (i.e. a1, a2, b3, etc.) and
nnn is the size in blocks (kilobytes) of the partition as reported
by fdisk. You should be able to use the size of the partitions to
tell them apart.
7) Mount the new filesystem. This can be done by using "mount
/dev/hdX /mnt", which will mount the partition into the directory
/mnt.
8) Run the script in /INSTALL called 'mktree'. This will create a
bare directory tree built down from the specified directory. So,
for a standard installation, you would use "mktree /mnt", which
would build the bare directory tree starting from /mnt.
9) Run the script in /INSTALL called 'mkdev'. This will create the
standard Linux devices in the directory 'dev' in the specified
directory. For a standard installtion, this would mean typing
'mkdev /mnt' to create the devices in /mnt/dev.
NOTE: This step is really optional, since the 'install' script
(next step) will do this if it sees you haven't.
10) Run the script in /INSTALL called 'install'. This will copy over
the binary programs from the root disk to the directory tree on
the specified directory. This means typing 'install /mnt' for a
standard installation.
NOTE: (for those upgrading from previous versions of Linux)
The 'install' script uses the +interactive switch for copying
files from /etc, which means you can tell it whether or not to
overwrite any of these files. 'install' will also go through
your /usr/bin and /bin directories and ask you if it should
remove any incorrectly placed files. (Such as /bin/update and
/bin/init, which have both been moved to /etc.)
11) You should now have a complete (but very basic) root filesystem on
your harddrive. To be able to boot from floppy with this as your
root filesystem, you will have to edit the boot diskette. This is
done by modifying the word at offset 508 (decimal) with a program
such as Norton's Disk Editor, or use pboot.exe (available where
you got this file, the boot disk and the root disk, hopefully.)
This word is in 386-order (that is, least-significant byte first),
which means it should look like one of the following:
LSB MSB - device
--------------------------
01 03 - /dev/hda1 LSB = Least-Significant Byte
02 03 - /dev/hda2 MSB = Most-Significant Byte
03 03 - /dev/hda3
04 03 - /dev/hda4
41 03 - /dev/hdb1
42 03 - /dev/hdb2
43 03 - /dev/hdb3
44 03 - /dev/hdb4
The numbers are in hex, and if you're editing the boot diskette by
hand, these two bytes should initially be 00 00 (and are followed
by two non-zero bytes).
Note that pboot.exe predates Linux 0.95a, so some of the
information it presents is inaccurate (it refers to the old hd*
naming scheme). The codes to use are as above, but with the most-
significant byte first. (So /dev/hda1 = 0301, /dev/hda2 = 0302,
etc.)
12) You should now be able to boot from this diskette and it will use
your new Linux partition as the root partition. You'll notice,
however, that you can't do a whole lot with just the programs on
the root diskette. You'll need to get further packages from
whereever you got the root and boot diskettes, and read these from
a floppy using tar and compress. (Simple instructions: Download
the file to DOS, use rawrite to write the tar file to diskette.
Use 'tar zxvf /dev/<floppy>' to read the file from floppy, where
<floppy> is the appropriate floppy device. (PS0 is a 1.44 meg
3.5" as A:, PS1 is a 1.44 meg as B:, at0 is a 1.2 meg as A:, at1
is a 1.2 meg as B:.)
13) Before you ever reboot your machine when it's running Linux, you
should run 'sync'. This flushes Linux's disk buffers, making sure
everything has been written to disk. Failing to do this could
result in badly corrupted filesystems.
----------------------------------------------------------------------------
These instructions are not the best, but should be enough to get you
going. If you have more questions, either post on alt.os.linux, or
send mail to me (jwinstea@jarthur.Claremont.EDU), or to Linus
(torvalds@cc.helsinki.fi). Remember, the only stupid questions are
the ones that you don't ask.

View File

@@ -0,0 +1,59 @@
This is release 0.95c+ of the linux kernel - it contains some
enhancements and bugfixes to the 0.95a kernel, as well as some minor
fixes relative to the last alpha-patch (0.95c). The release is
available as
- binary (bootimage-0.95c+.Z)
- full source (linux-0.95c+.tar.Z)
- patches rel. to 0.95c (diff-0.95c.c+.Z)
- patches rel. to 0.95a (diff-0.95a.c+.Z)
NOTE TO PATCHERS!! Before patching, do this:
- make an empty include-file linux/include/checkpoint.h
- rename linux/kernel/math/math_emulate.c as just emulate.c
That is, from the linux source directory do:
$ > include/checkpoint.h
$ mv kernel/math/math_emulate.c kernel/math/emulate.c
Also note that patching from the 0.95a version is probably not worth it
as it's easier to get the complete new sources.
Although I'm making binaries and the full source available, this isn't
really a major release: there is no new rootdisk, and this is more "my
current kernel" and not really tested (I put in the last changes 5
minutes before packing all this up).
The reason I'm making this available is that with the advent of gcc-2.1
and the VFS-library the old kernel doesn't really do everything the new
libraries want: the readdir system call is needed to get things working.
The default compiler after this release is considered to be gcc-2.0 or
higher (although 1.40 still works - you don't /have/ to change). People
who are unable or unwilling to patch a new kernel shouldn't be unable to
run the new binaries.
This kernel should be totally backwards compatible, so no binaries
should break. I resisted adding the changed mount() system call into
this release: the next major release will have a third parameter for
mount() - the filesystem type name (ie mount /dev/xxx /mnt minix).
Fixes relative to 0.95c:
- corrected two minor bugs in readdir() (thanks to R Card)
- lp-patches are in. I've edited them a bit, and will probably do some
more editing in the future, but they seem to work fine.
- 8-bit ISO latin output to the console (ie part of Johan Myreens
general latin-1 patches: the keyboard patches aren't there)
- other minor bug-fixes (thanks to HH Bergman for noticing the
timer-table bug)
Things I haven't had time to look into yet:
- select still has some problems
- reports that VC-output sometimes isdiscarded (never seen it myself)
- probably other things I've simply forgot...
Linus

View File

@@ -0,0 +1,265 @@
RELEASE NOTES FOR LINUX v0.95
Linus Torvalds, March 7, 1992
This is file mostly contains info on changed features of Linux, and
using old versions as a help-reference might be a good idea.
COPYRIGHT
Linux-0.95 is NOT public domain software, but is copyrighted by me. The
copyright conditions are the same as those imposed by the GNU copyleft:
get a copy of the GNU copyleft at any major ftp-site (if it carries
linux, it probably carries a lot of GNU software anyway, and they all
contain the copyright).
The copyleft is pretty detailed, but it mostly just means that you may
freely copy linux for your own use, and redistribute all/parts of it, as
long as you make source available (not necessarily in the same
distribution, but you make it clear how people can get it for nothing
more than copying costs). Any changes you make that you distribute will
also automatically fall under the GNU copyleft.
NOTE! The linux unistd library-functions (the low-level interface to
linux: system calls etc) are excempt from the copyright - you may use
them as you wish, and using those in your binary files won't mean that
your files are automatically under the GNU copyleft. This concerns
/only/ the unistd-library and those (few) other library functions I have
written: most of the rest of the library has it's own copyrights (or is
public domain). See the library sources for details of those.
INSTALLATION
This is a SHORT install-note. The installation is very similar to 0.11
and 0.12, so you should read INSTALL-0.11 too. There are a couple of
programs you will need to install linux: something that writes disk
images (rawrite.exe or NU or...) and something that can create harddisk
partitions (fdisk under xenix or older versions of dos, edpart.exe or
something like that).
NOTE! Repartitioning your harddisk will destroy all data on it (well,
not exactly, but if you know enough to get back the data you probably
didn't need this warning). So be careful.
READ THIS THROUGH, THEN READ INSTALL-0.11, AND IF YOU ARE SURE YOU KNOW
WHAT YOU ARE DOING, CONTINUE. OTHERWISE, PANIC. OR WRITE ME FOR
EXPLANATIONS. OR DO ANYTHING BUT INSTALL LINUX - IT'S VERY SIMPLE, BUT
IF YOU DON'T KNOW WHAT YOU ARE DOING YOU'LL PROBABLY BE SORRY. I'D
RATHER ANSWER A FEW UNNECESSARY MAILS THAN GET MAIL SAYING "YOU KILLED
MY HARDDISK, BASTARD. I'M GOING TO FIND YOU, AND YOU'LL BE SORRY WHEN I
DO".
Minumum files needed:
RELNOTES-0.95 (this file)
INSTALL-0.11 (+ any other docs you might find: the FAQ etc)
bootimage-0.96.Z
rootimage-0.95.Z
rootimage-0.12.Z (for tar+compress)
rawrite.exe
some disk partitioner
1) back up everything you have on your harddisk - linux-0.95 is still in
beta and might do weird things. The only thing I guarantee is that
it has worked fine on /my/ machine - for all I know it might eat your
harddisk and spit it out in small pieces on any other hardware.
2) Test out the linux boot-disk with the root file system. If it
doesn't work, check the hardware requirements, and mail me if you
still think it should work. I might not be able to help you, but
your bug-report would still be appreciated.
Linux-0.95 now has an init/login: there should be 4 logins started on
the first 4 virtual consoles. Log in as root (no password), and test
it out. Change to the other logins by pressing left-alt + FN[1-4].
Note that booting up with a floppy as root is S..L..O..W.. - the
floppy driver has been optimized for sequential access (backups etc),
and trashes somewhat with demand-loading.
Test that linux can read your harddisk at least partly: run the fdisk
program on the root-disk, and see if it barfs. If it tells you about
any partitions at all, linux can successfully read at least part of
your harddisk.
NOTE! Harddisk device names and numbers have changed between versions
0.12 and 0.95: the new numbering system was needed for the extended
partitions, and a new naming scheme was in order so that people
wouldn't cunfuse the old devices with the new ones.
The new harddisk device names are: /dev/hd followed by an 'a' for the
first drive, or a 'b' for the second one. After that comes the
partition number, 1-4 for the primary partitions, 5- for possible
extended partitions. No number means the complete disk. Like this:
/dev/hda the whole first harddisk (old: /dev/hd0)
/dev/hdb3 partition nr 3 on the second disk (old: /dev/hd8)
3) Make sure that you have a free /primary/ partition. There can be 4
primary partitions per drive: newer DOS fdisks seem to be able to
create only 2 (one primary and one extended). In that case use some
other partitioning software: edpart.exe etc. Linux fdisk currently
only tells you the partition info - it doesn't write to the disk.
Remember to check how big your partition was, as that can be used to
tell which device Linux thinks it is.
NOTE! Linux-0.95 /might/ recognize extended partitions: but the code
for this is utterly untested, as I don't have any of those. Do NOT
use the extended partitions unless you can verify that they are
indeed correctly set up - if my routines are wrong, writing to the
extended partitions might just overwrite some other partition
instead. Not nice.
4) Boot up linux again, fdisk to make sure you now have the new
partition, and use mkfs to make a filesystem on one of the partitions
fdisk reports. Write "mkfs -c /dev/hdX nnn" where X is the device
number reported by linux fdisk, and nnn is the size - also reported
by fdisk. nnn is the size in /blocks/, ie kilobytes. You should be
able to use the size info to determine which partition is represented
by which device name.
5) Mount the new disk partition: "mount /dev/hdX /mnt". Copy over the
root filesystem to the harddisk, eg like this:
# for i in bin dev etc usr tmp
# do
# cp +recursive /$i /mnt
# done
You caanot use just "cp +recursive / /mnt", as that will result in a
loop.
6) Sync the filesystem after you have played around enough, and reboot.
# sync
# lo
(none) login: sync
<wait for it to sync>
ctrl-alt-del
THIS IS IMPORTANT! NEVER EVER FORGET TO SYNC BEFORE KILLING THE MACHINE.
7) Change the bootdisk to understand which partition it should use as a
root filesystem. See INSTALL-0.11: it's still the word at offset
508 into the image. You should be up and running.
8) When you've successfully started up with your harddisk as root, you
can mount the older rootimage (rootimage-0.12) from a floppy, and
copy over any files you find there that weren't on the newer
root-image.
Mounting a floppy is easy: make the directory /floppy, and write:
# mount /dev/PS0 /floppy (if you have a 3.5" drive)
or
# mount /dev/at0 /floppy (for 5.25" floppies)
After that the files can be copied to your harddisk, eg:
# cp /floppy/usr/bin/compress /usr/bin
# ln -s /usr/bin/compress /usr/bin/compress
# cp /floppy/usr/bin/tar.Z /usr/bin
# uncompress /usr/bin/tar.Z
That's it. Now go back and read the INSTALL-0.11, until you are sure you
know what you are doing.
New features of 0.95, in order of appearance
(ie in the order you see them)
Init/login
Yeah, thanks to poe (Peter Orbaeck (sp?)), linux now boots up like a
real unix with a login-prompt. Login as root (no passwd), and change
your /etc/passwd to your hearts delight (and add other logins in
/etc/inittab etc).
Bash is even bigger
It's really a bummer to boot up from floppies: bash takes a long time to
load. Bash is also now so big that I couldn't fit compress and tar onto
the root-floppy: You'll probably want the old rootimage-0.12 just in
order to get tar+compress onto your harddisk. If anybody has pointers
to a simple shell that is freely distributable, it might be a good idea
to use that for the root-diskette.
Especially with a small buffer-cache, things aren't fun. Don't worry:
linux runs much better on a harddisk.
Virtual consoles on any (?) hardware.
You can select one of several consoles by pressing the left alt-key and
a function key at the same time. Linux should report the number of
virtual consoles available upon bootup. /dev/tty0 is now "the current"
screen, /dev/tty1 is the main console, and /dev/tty2-8 can exist
depending on your text-mode or card.
The virtual consoles also have some new screen-handling commands: they
confirm even better to vt200 control codes than 0.11. Special graphic
characters etc: you can well use them as terminals to VMS (although
that's a shameful waste of resources), and the PF1-4 keys work somewhat
in the application-key mode.
Symbolic links.
0.95 now allows symlinks to point to other symlinks etc (the maximum
depth is a rather arbitrary 5 links). 0.12 didn't like more than one
level of indirection.
Virtual memory.
VM under 0.95 should be better than under 0.12: no more lockups (as far
as I have seen), and you can now swap to the filesystem as well as to a
special partition. There are two programs to handle this: mkswap to set
up a swap-file/partition and swapon to start up swapping.
mkswap needs either a partition or a file that already exists to make a
swap-area. To make a swap-file, do this:
# dd bs=1024 count=NN if=/dev/hda of=swapfile
# mkswap swapfile NN
The first command just makes a file that is NN blocks long (initializing
it from /dev/hda, but that could be anything). The second command then
writes the necessary setup-info into the file. To start swapping, write
# swapon swapfile
NOTE! 'dd' isn't on the rootdisk: you have to install some things onto
the harddisk before you can get up and running.
NOTE2! When linux runs totally out of virtual memory, things slow down
dramatically. It tries to keep on running as long as it can, but at
least it shouldn't lock up any more. ^C should work, although you might
have to wait a while for it..
Faster floppies
Ok, you don't notice this much when booting up from a floppy: bash has
grown, so it takes longer to load, and the optimizations work mostly
with sequential accesses. When you start un-taring floppies to get the
programs onto your harddisk, you'll notice that it's much faster now.
That should be about the only use for floppies under a unix: nobody in
their right mind uses floppies as filesystems.
Better FS-independence
Hopefully you'll never even notice this, but the filesystem has been
partly rewritten to make it less minix-fs-specific. I haven't
implemented all the VFS-patches I got, so it's still not ready, but it's
getting there, slowly.
And that's it, I think.
Happy hacking.
Linus (torvalds@kruuna.helsinki.fi)

View File

@@ -0,0 +1,163 @@
RELEASE NOTES FOR LINUX v0.95a
Linus Torvalds, March 17, 1992
This is file mostly contains info on changed features of Linux, and
using old versions as a help-reference might be a good idea.
COPYRIGHT
Linux-0.95a is NOT public domain software, but is copyrighted by me. The
copyright conditions are the same as those imposed by the GNU copyleft:
get a copy of the GNU copyleft at any major ftp-site (if it carries
linux, it probably carries a lot of GNU software anyway, and they all
contain the copyright).
The copyleft is pretty detailed, but it mostly just means that you may
freely copy linux for your own use, and redistribute all/parts of it, as
long as you make source available (not necessarily in the same
distribution, but you make it clear how people can get it for nothing
more than copying costs). Any changes you make that you distribute will
also automatically fall under the GNU copyleft.
NOTE! The linux unistd library-functions (the low-level interface to
linux: system calls etc) are excempt from the copyright - you may use
them as you wish, and using those in your binary files won't mean that
your files are automatically under the GNU copyleft. This concerns
/only/ the unistd-library and those (few) other library functions I have
written: most of the rest of the library has it's own copyrights (or is
public domain). See the library sources for details of those.
NEW FEATURES OF 0.95a
0.95a is mainly a bug-fix release: it didn't even get it's own version
number. Plain 0.95 fixed a lot of bugs in 0.12, but also introduced
totally new bugs: 0.95a tries to correct these. The bugs corrected
(knock wood) are:
- floppy and harddisk drivers should now once more work with most
hardware: I'd be interested in reports of "unexpected HD interrupt"
and "reset-floppy called" with the new kernel.
- A rather serious tty-bug corrected: this one messed up the screen
under 0.95, and switched characters over the serial lines. Under
extreme circumstances it could even crash the machine.
- ptrace had a bug: hopefully it works now.
- The extended partitions didn't work under 0.95, although most of the
code was there. Please somebody tell me it works under 0.95a.
- the 0.95 fdisk was broken: a new one with the new root-floppy should
clear up the confusion.
- select() and the sleep-wakeup code had fundamental (but relatively
benign) problems under 0.95 (and all earlier versions). The sleeping
code is totally redesigned, and select should work better even under
load.
One actual new feature, not just a bug-fix:
- ser3-4 support is there, although I've been unable to test it (as I
haven't got more than ser2). NOTE! Due to AT hardware limitations,
ser1 cannot be active at the same time as ser3, and likewise ser2 and
ser4 are mutually exclusive. The interrupt-handlers should have no
problems with shared interrupts, but the actual hardware probably has,
so the kernel disables interrupts from one serial line when the other
one is opened.
- faster default keyrepeat rate: this is going to need some getting used
to, but is extremely practical especially with bigger screen sizes.
- VGA cards that aren't recognized at bootup are put into the 80x50
character mode if <enter> was pressed when asking about SVGA modes.
NEW FEATURES OF 0.95
Init/login
Yeah, thanks to poe (Peter Orbaeck (sp?)), linux now boots up like a
real unix with a login-prompt. Login as root (no passwd), and change
your /etc/passwd to your hearts delight (and add other logins in
/etc/inittab etc).
Virtual consoles on any (?) hardware.
You can select one of several consoles by pressing the left alt-key and
a function key at the same time. Linux should report the number of
virtual consoles available upon bootup. /dev/tty0 is now "the current"
screen, /dev/tty1 is the main console, and /dev/tty2-8 can exist
depending on your text-mode or card.
The virtual consoles also have some new screen-handling commands: they
confirm even better to vt200 control codes than 0.11. Special graphic
characters etc: you can well use them as terminals to VMS (although
that's a shameful waste of resources), and the PF1-4 keys work somewhat
in the application-key mode.
Extended vt200 emulation
0.95 contains code to handle a vt200 application keymap mode: the cursor
keys send slightly different codes when in application mode, and the
numeric keyboard tries to emulate the vt200 application keys. This
probably isn't complete yet.
Symbolic links.
0.95 now allows symlinks to point to other symlinks etc (the maximum
depth is a rather arbitrary 5 links). 0.12 didn't like more than one
level of indirection.
Virtual memory.
VM under 0.95 should be better than under 0.12: no more lockups (as far
as I have seen), and you can now swap to the filesystem as well as to a
special partition. There are two programs to handle this: mkswap to set
up a swap-file/partition and swapon to start up swapping.
mkswap needs either a partition or a file that already exists to make a
swap-area. To make a swap-file, do this:
# dd bs=1024 count=NN if=/dev/hda of=swapfile
# mkswap swapfile NN
The first command just makes a file that is NN blocks long (initializing
it from /dev/hda, but that could be anything). The second command then
writes the necessary setup-info into the file. To start swapping, write
# swapon swapfile
NOTE! 'dd' isn't on the rootdisk: you have to install some things onto
the harddisk before you can get up and running.
NOTE2! When linux runs totally out of virtual memory, things slow down
dramatically. It tries to keep on running as long as it can, but at
least it shouldn't lock up any more. ^C should work, although you might
have to wait a while for it..
Faster floppies
Ok, you don't notice this much when booting up from a floppy: bash has
grown, so it takes longer to load, and the optimizations work mostly
with sequential accesses. When you start un-taring floppies to get the
programs onto your harddisk, you'll notice that it's much faster now.
That should be about the only use for floppies under a unix: nobody in
their right mind uses floppies as filesystems.
Better FS-independence
Hopefully you'll never even notice this, but the filesystem has been
partly rewritten to make it less minix-fs-specific. I haven't
implemented all the VFS-patches I got, so it's still not ready, but it's
getting there, slowly.
And that's it, I think.
Happy hacking.
Linus (torvalds@kruuna.helsinki.fi)

View File

@@ -0,0 +1,59 @@
This is release 0.95c+ of the linux kernel - it contains some
enhancements and bugfixes to the 0.95a kernel, as well as some minor
fixes relative to the last alpha-patch (0.95c). The release is
available as
- binary (bootimage-0.95c+.Z)
- full source (linux-0.95c+.tar.Z)
- patches rel. to 0.95c (diff-0.95c.c+.Z)
- patches rel. to 0.95a (diff-0.95a.c+.Z)
NOTE TO PATCHERS!! Before patching, do this:
- make an empty include-file linux/include/checkpoint.h
- rename linux/kernel/math/math_emulate.c as just emulate.c
That is, from the linux source directory do:
$ > include/checkpoint.h
$ mv kernel/math/math_emulate.c kernel/math/emulate.c
Also note that patching from the 0.95a version is probably not worth it
as it's easier to get the complete new sources.
Although I'm making binaries and the full source available, this isn't
really a major release: there is no new rootdisk, and this is more "my
current kernel" and not really tested (I put in the last changes 5
minutes before packing all this up).
The reason I'm making this available is that with the advent of gcc-2.1
and the VFS-library the old kernel doesn't really do everything the new
libraries want: the readdir system call is needed to get things working.
The default compiler after this release is considered to be gcc-2.0 or
higher (although 1.40 still works - you don't /have/ to change). People
who are unable or unwilling to patch a new kernel shouldn't be unable to
run the new binaries.
This kernel should be totally backwards compatible, so no binaries
should break. I resisted adding the changed mount() system call into
this release: the next major release will have a third parameter for
mount() - the filesystem type name (ie mount /dev/xxx /mnt minix).
Fixes relative to 0.95c:
- corrected two minor bugs in readdir() (thanks to R Card)
- lp-patches are in. I've edited them a bit, and will probably do some
more editing in the future, but they seem to work fine.
- 8-bit ISO latin output to the console (ie part of Johan Myreens
general latin-1 patches: the keyboard patches aren't there)
- other minor bug-fixes (thanks to HH Bergman for noticing the
timer-table bug)
Things I haven't had time to look into yet:
- select still has some problems
- reports that VC-output sometimes isdiscarded (never seen it myself)
- probably other things I've simply forgot...
Linus

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,279 @@
From: abc@banjo.concert.net (Alan B Clegg)
Subject: Linux File System Document Revision 1.0
Date: 9 Mar 92 14:33:45 GMT
Before I get a flamefull response, let me tell everyone that this document has
been through several revisions, and is currently at a point that has pleased
most people. Please note that it is a *GUIDELINE* and is not *REQUIRED*, but
if most people follow the guidelines, we all get along a lot better.
If you have comments/questions about this document, and you are not on the
linux-standards mailing list, I would ask that you join the list. The request
address is: linux-standards-request@banjo.concert.net. Please try to keep
debate off the news group, and on the mailing list.
For those of you on the linux-standards list, the verticle bars in column one
represent the only changes from draft 2.
==== SNIP HERE ====
The following is being submitted by Alan Clegg [abc@concert.net] on behalf
of the Linux-Standards list as the standard for directory file structure
under Linux.
Revision 1.0
Complete implementation of this file structure is completely voluntary,
and will not be enforced, but will be recommended. This specification
is released as guidelines for people porting and writing software for
the Linux Operating System to allow easy software installation, upgrade, and
tailoring on already installed systems.
Root Directory:
Files:
{none defined by spec}
Directories:
bin dev etc home lib mnt usr
Rationale:
The root directory should not be cluttered with files or
directories, and should contain no user programs.
/bin Directory:
Files:
sh init mount umount dd cat ls fsck {and as needed}
Directories:
{none defined by spec}
Rationale:
The /bin directory should contain programs that are vital
to the restoration of other file systems in the case of
a corrupting crash. No executable in /bin should require
any other file system to be mounted to execute correctly.
/dev Directory:
Files:
{device files}
Directories:
{none define by spec}
Rationale:
Standard UNIX device files. This directory should contain
device entries for all devices that are supported in the
standard kernel, even if the hardware device does not exist
on the system.
/etc Directory:
Files:
mtab passwd rc ttytab {and as needed}
Directories:
{none defined by spec}
Rationale:
Standard location of files required during system boot. Files
in this directory are usually system specific. Most will
| require human intervention during system upgrade. /etc will
| also contain administrative binaries that should not be in
| the normal users PATH.
/home Directory:
Files:
NONE
Directories:
{one per user excepting root}
Rationale:
Standard location of users home directories. Will most likely
be a mounted file system once the system is up. root's home
directory should be /.
/lib Directory:
Files:
{libraries required for system initialization}
Directories:
{none defined by spec}
Rationale:
To keep the size of the root partition small (if separate from
/usr), the files in this directory should only be ones required
by files in the root partition.
/mnt Directory:
Files:
NONE
Directories:
NONE
Rationale:
Standard mount point for external (transient) file systems.
Must be available for sub-system installation. Should remain
as an empty directory.
/tmp Directory:
Files:
NONE
Directories:
NONE
Rationale:
Temporary file space available for general program use. May
become a mounted partition upon system boot.
/usr Directory:
Files:
{none defined by spec}
Directories:
adm bin spool local lib etc man include src tmp
Rationale:
/usr is the mount point for the second major (after root)
hierarchy of file structure and is discussed in the next
section.
/usr/adm Directory:
Files:
{none defined in spec}
Directories:
{none defined in spec}
Rationale:
Location of log files and accounting information.
/usr/bin Directory:
Files:
{all executable files from standard distribution not contined
in /bin}
Directories:
{none defined in spec}
Rationale:
contains 'drop-in' executables that are considered to be
standard to the UNIX system. These files should NOT be
Linux specific, but should have the same function as their
UNIX equivalents.
/usr/etc Directory:
Files:
{none defined in spec}
Directories:
{none defined in spec}
Rationale:
contains configuration files for any files in /usr/bin. helps
to keep /etc clean and small.
/usr/spool Directory:
Files:
{none defined in spec}
Directories:
uucp mail
Rationale:
containes spool files for mail, printing, uucp transfer, etc.
May be a mount point for another volume.
/usr/local Directory:
Files:
NONE
Directories:
bin lib etc man src
Rationale:
contains files local to the specific system. will not be
modified by upgrade process.
/usr/lib Directory:
Files:
libc.a crt0.s {and as needed}
Directories:
{none defined in spec}
Rationale:
location for library files required for multi-user system
operation. This is the directory where program libraries
| should reside. /usr/lib will also contain binaries required
| to support programs residing in /usr/bin.
/usr/man Directory:
Files:
NONE
Directories:
man1 man2 man3 man4 man5 man6 man7 man8
Rationale:
Contains manual pages for programs that are standard with
Linux.
/usr/include Directory:
Files:
{programmers include files}
Directories:
{as needed}
Rationale:
Standard place for system include files.
/usr/src Directory:
Files:
NONE
Directories:
bin lib linux usr.bin usr.lib
Rationale:
Contains source code for all applications in the release.
/usr/src/linux contains directories required for kernel builds.
/usr/tmp Directory:
Files:
NONE
Directories:
NONE
Rationale:
Used as additional scratch space for programs. If /tmp is
a mounted file system, /usr/tmp may be a symbolic link to
/tmp.
--
abc@concert.net Alan Clegg - Network Programmer
KD4JML (just my luck!) MCNC -- Center for Communications

View File

@@ -0,0 +1,21 @@
alt.os.linux #309 [1]
From: abc@banjo.concert.net (Alan B Clegg)
[1] Announcing: linux-standards mailing list.
Organization: Concert Network -- Internet Operations Group
Date: Tue Jan 28 10:42:51 EST 1992
I am happy to announce the creation of the Linux Standards (linux-standards)
mailing list. The list is chartered as follows:
linux-standards: Discussion of distribution and directory standards for
the Linux Operating System, including directory structure,
file location, and release disk format.
Requests to be added to the mailing list should be sent to:
linux-standards-request@banjo.concert.net
-abc
--
abc@concert.net Alan Clegg - Network Programmer
KD4JML (just my luck!) MCNC -- Center for Communications

View File

@@ -0,0 +1,254 @@
The following is being submitted by Alan Clegg [abc@concert.net] on behalf of
the linux-standards group as the recommended standard for directory file
structure under Linux.
Complete implementation of this file structure is completely voluntary,
and will not be enforced, but will be recommended. This specification
is released as guidelines for people porting and writing software for
the Linux Operating System to allow easy software installation, upgrade, and
tailoring on already installed systems.
Root Directory:
Files:
{none defined by spec}
Directories:
bin dev etc home lib mnt usr
Rationale:
The root directory should not be cluttered with files or
directories, and should contain no user programs.
/bin Directory:
Files:
sh init mount umount dd cat ls fsck mkfs {and as needed}
Directories:
{none defined by spec}
Rationale:
The /bin directory should contain programs that are vital
to the restoration of other file systems in the case of
a corrupting crash. No executable in /bin should require
any other file system to be mounted to execute correctly.
/dev Directory:
Files:
{device files}
Directories:
{none define by spec}
Rationale:
Standard UNIX device files. This directory should contain
device entries for all devices that are supported in the
standard kernel, even if the hardware device does not exist
on the system. Note that the distribution will have all
device files, but they may be removed by the user upon
system installation.
/etc Directory:
Files:
mtab passwd rc ttytab {and as needed}
Directories:
{none defined by spec}
Rationale:
Standard location of files required during system boot. Files
in this directory are usually system specific. Most will
require human intervention during system upgrade.
/home Directory:
Files:
NONE
Directories:
{one per user excepting root}
Rationale:
Standard location of users home directories. Will most likely
be a mounted file system once the system is up. root's home
directory should be /.
/lib Directory:
Files:
{libraries required for system initialization}
Directories:
{none defined by spec}
Rationale:
To keep the size of the root partition small (if separate from
/usr), the files in this directory should only be ones required
by files in the root partition.
/mnt Directory:
Files:
NONE
Directories:
NONE
Rationale:
Standard mount point for external (transient) file systems.
Must be available for sub-system installation. Should remain
as an empty directory.
/tmp Directory:
Files:
NONE
Directories:
NONE
Rationale:
Temporary file space available for general program use. May
become a mounted partition upon system boot.
/usr Directory:
Files:
{none defined by spec}
Directories:
adm bin spool local lib etc man include src tmp
Rationale:
/usr is the mount point for the second major (after root)
hierarchy of file structure and is discussed in the next
section.
/usr/adm Directory:
Files:
{none defined in spec}
Directories:
{none defined in spec}
Rationale:
Location of log files and accounting information.
/usr/bin Directory:
Files:
{all executable files from standard distribution not contined
in /bin}
Directories:
{none defined in spec}
Rationale:
contains 'drop-in' executables that are considered to be
standard to the UNIX system. These files should NOT be
Linux specific, but should have the same function as their
UNIX equivalents.
/usr/etc Directory:
Files:
{none defined in spec}
Directories:
{none defined in spec}
Rationale:
contains configuration files for any files in /usr/bin. helps
to keep /etc clean and small.
/usr/spool Directory:
Files:
{none defined in spec}
Directories:
uucp mail
Rationale:
containes spool files for mail, printing, uucp transfer, etc.
May be a mount point for another volume.
/usr/local Directory:
Files:
NONE
Directories:
bin lib etc man src
Rationale:
contains files local to the specific system. will not be
modified by upgrade process.
/usr/lib Directory:
Files:
libc.a crt0.s {and as needed}
Directories:
{none defined in spec}
Rationale:
location for library files required for multi-user system
operation. This is the directory where program libraries
should reside.
/usr/man Directory:
Files:
NONE
Directories:
man1 man2 man3 man4 man5 man6 man7 man8
cat1 cat2 cat3 cat4 cat5 cat6 cat7 cat8
Rationale:
Contains manual pages for programs that are standard with
Linux.
/usr/include Directory:
Files:
{programmers include files}
Directories:
{as needed}
Rationale:
Standard place for system include files.
/usr/src Directory:
Files:
NONE
Directories:
bin lib linux usr.bin usr.lib
Rationale:
Contains source code for all applications in the release.
/usr/src/linux contains directories required for kernel builds.
/usr/tmp Directory:
Files:
NONE
Directories:
NONE
Rationale:
Used as additional scratch space for programs. If /tmp is
a mounted file system, /usr/tmp may be a symbolic link to
/tmp.

View File

@@ -0,0 +1,62 @@
Please comment on the following document.
[available as /pub/Linux/linux-standards/draft]
Tommy Thorn (tthorn@daimi.aau.dk) writes (with my comments in [* ... *]):
We need to make installation REAL SIMPLE AND FAST. I suggest the
following standard for distributing ported programs.
Everything should be contained in a [compressed] tar file with a:
- README, a short explanations of how this version differs from
the original, if it does, and how it was compiled.
- PREREQUIST, again which kernel, but also which version of the
original.
[* Let's call this PREREQ so we can all spell it *]
- Makefile, not for compilation, but for installation!! After having
checked that you agree with paths and so, you just type 'make install'
perhaps as root.
- Patches, context diff against the original.
- Binaries
- Optionally, manual pages, also with full path.
Kernel patches should also be a [compressed] tar file containing:
- README, describing what the patch does/is.
- PREREQUIST, a precise statement of which version of the
kernel the patches applies, and which, if any, patches that
was already applied.
[* Begin Soap Box:
I don't think we should distribute kernel patches in the standard
release trees, unless there is a DEFINITE (fatal) bug fixed by the
patch. Most people are looking for an easy-to-build system with
binaries and sources that they can get up-and-running without much
trouble. Yes, we have to put together kernel patch kits, but we
need to have them coordinated (all patches in one common patchfile).
End Soap Box *]
Sources belong in /usr/src, linux sources in /usr/src/linux, etc.
Maybe we should split patches and binaries, but I don't like that, as you
would properbly end up having only one of either.
[* It is my feeling that we should not distribute patches without the source
that the patches apply to. Often, someone will grab the wrong
"official" source, and the patches won't take. Then they make noises
about the patch not working. I feel that we should provide FULL
SOURCE to all programs, *WITH PATCHES APPLIED*. Leave the patches
in a _common_ directory under each source tree, ie:
/usr/src/gcc/LINPAT/*
^^^^^^ name subject to discussion
to allow someone to see exactly what was changed, but also allow them
to compile without applying the patches themselves. *]

File diff suppressed because it is too large Load Diff

BIN
Linux-0.95/docs/make.tex.Z Normal file

Binary file not shown.

155
Linux-0.95/docs/mcc-interim Normal file
View File

@@ -0,0 +1,155 @@
To: Linux-Activists@BLOOM-PICAYUNE.MIT.EDU
From: zlsiial@uts.mcc.ac.uk (A. V. Le Blanc)
Subject: MCC 'interim' version of Linux (was Re: two questions)
Date: 23 Apr 92 13:21:07 GMT
In article <1992Apr22.195030.8492@muddcs.claremont.edu> jwinstea@jarthur.claremont.edu (Jim Winstead Jr.) writes:
>In article <EdxN7bq00awDMEveIn@andrew.cmu.edu> aw2t+@andrew.cmu.edu (Alex R.N. Wetmore) writes:
>>2) What is the MCC release of Linux?
>
>It's the Manchester Computing Center (?) release, which serves as a
>sort of extended-release, as I see it. It includes many more
>utilities than the basic release from Linus and myself, and as a
>result comes on three (four?) floppies.
It comes on two floppies, but there are a few others available.
The Manchester ComputING CentRE was once Manchester University Regional
Computer Centre (pronounced 'murk') and later UMRCC. The change from
'computer' to 'computing' was made (supposedly) to mark a shift in
emphasis from supporting machines to supporting the people who use
them. (Some of the people who use them complain that the shift in
emphasis has not yet been implemented.) The University of Manchester
has been known to claim that computers were invented here, which they
were if you define 'computer' properly. We are a Centre, not a
Center, because (as someone pointed out in a recent note) that is
how it is spelled in 'proper' English (English + Irish + Australian +
Indian + Canadian + ...) as opposed to the American dialects. I try
to mention MCC from time to time, since they pay me and supply me
with equipment. I am in fact supposed to be doing other things for
MCC, and, also in fact, I do.
The MCC 'interim' releases of Linux are unofficial experiments.
They vary depending on my whims and on the time I have to give them,
usually not enough, I am afraid. The latest so far, 0.95c+,
had (or has?) the following goals:
(a) To provide a simple installation procedure.
(b) To provide a more complete installation procedure.
(c) To provide a backup/recovery service.
(d) To backup my (then) current system!
When I first put Linux on a PC, back at 0.11, I got the standard
boot and root floppies, found there was no working fdisk, tried
edpart, which made a mess of my partition table by sorting it,
used the MINIX fdisk, and finally got a system going. Then I
started trying to get other bits to it. I decided this was a
bit awkward, and hoped someone would do something about it.
I also hate having to search through 3 ftp sites for useful bits,
the fragmented nature of a system which, I believe, was one of
the serious problems with MINIX, and having to compile everything
again and again because it was originally linked with some
defective version of the library, as happens often enough even
with 'mature' commercial Unixes.
Theodore Ts'o wrote the ramdisk code in the Linux kernel. As he
remarked, it was originally designed to make it possible to store
some files on the ramdisk, and so free the disk drive for other
purposes, for example, for creating or modifying a boot floppy
so that it boots using a hard disk partition as the root device.
Both Ted and Linus warned me that the ramdisk code was inefficient,
but I thought this was no problem for an installation/backup/
recovery system. Both also pointed out that the ramdisk uses
much more memory than it should, and this has in fact proven to
be a problem on systems with only 2mb of RAM.
Nevertheless, the latest 'interim' release from MCC does manage to
squeeze quite a lot onto TWO disks: one of which combines the boot
and root disk, and one of which I called the 'utilities' disk.
The boot disk boots, loads its root device from the same disk, and
then starts executing /etc/rc. This runs a little script which
asks for the drive size, and mounts the utilities disk (which you
will of course have placed in the drive when you were instructed to).
The commands available on the combined boot/util combination are
approximately equivalent to those on Jim Winstead's root disk.
Of course, I have a lot more space than he does -- about 500k more --
so I use a lot of this space for tar.Z files which contain all the
usual Unix commands I can find, excluding 'man' and the compilers,
but including, for example, awk (gawk), all of the GNU shell/file/text
utilities, grep and its cousins, sed, vi, more, less, tar, compress,
uuencoding/decoding, the mtools package for reading/writing DOS
files, and make. I also added the joe editor, for those who find
vi too alien. The format was a bit to cramped to try to include
emacs or tex or any other monster utilities, and almost everything
I wanted fit except Kermit, shoelace (which is awful, I admit, but
works if you know how to do it), and man pages.
All of this fit on two disks, the boot disk and the utilities disk,
as I have said before. Now I tried this out on some of my unsuspecting
friends, who made interesting suggestions and complaints. One in
particular asked if I could add a disk containing the C compiler.
So my first additional disk (comp) contains gcc 2.1 plus the include
files and the libraries. I couldn't fit g++ on the same disk, so I
added shoelace and a bit of g++. (I supplied a new README file for
shoelace, explaining how to test it out from a floppy before you
overwrite your primary boot sector). Later I added another disk
(comp2) containing the rest of g++ (include files, binaries, libraries)
and Kermit, which is too big to fit on the utilities disk. When
I released this version (which did not include Kermit at first),
I received some favourable comments, but most people felt that
man pages should be included. I therefore project another disk,
which should include groff, man, and man pages. Note that these
additional disks (comp, comp2, and man) are not really part of the
'interim' version proper, though it is convenient to lump them
together. Not also that the man disk does not yet exist, though
the binaries and patches for groff are in fact available; the
binaries are not really usable, since they include only unlinked
executables, not the groff library stuff. When the man disk comes
out, it will probably include only preformatted man pages, with the
unformatted pages available for ftp in another format. The pages
are collected from the GNU sources and from elsewhere, including,
of course, those from the excellent Linux-man contributors.
The man-1.0 program does not do QUITE what I would like, and so I
am messing with it -- I hate distributing things that don't do what
they should.
Contrary to my expectations, I did in fact create a sixth image,
which is called xdisk, and which -- in an awkward way -- allows
people with less than 4mb of RAM to install the 'interim' version
without using the ramdisk; they don't need my boot disk, but they
do need a standard 0.95c+ boot disk and my xdisk.
I hope this clarifies what the MCC 'interim' version of Linux 0.95c+
is, and why, when it consists of SIX disks, of which one does not
exists, while two come in two versions (US and UK keyboards), etc.,
I would still say that, properly speaking, it consists of TWO disks,
together with a number of optional extra disks.
The latest 'interim' version, while put together by me, is deeply
indebted to many other people, including Linus himself and Ted Ts'o,
who put up with a lot of hassle while I was working it up, and
Jim Winstead, some of whose bits are included. Also included are
poe-igl-1.2, lots of GNU code, HLU's C, C++, and libraries, all GNU
in origin, but with an awful lot of work involved in porting them,
the UU-, XX- and AtoB encoding/decoding utilities by Konrad Bernloehr,
and all the people who helped with testing and by reporting bugs
and even those who just said 'Thanks'.
I would hope that the 'interim' version would influence other
versions, from which I will of course get new ideas and code.
But it would be very awkward to do the standard distribution this
way. First of all, it is a pain producing a boot disk. If you want
to change a letter in a text file, you have to mount, edit, unmount,
copy the disk to a file, copy the file and the image to another disk,
and then reboot. The present system, with Linus providing boot disks
and Jim providing root disks, is more convenient in many respects --
but much harder for the end user. Perhaps it will change eventually
when Linux becomes stable -- but can you ever believe it will stop
changing?
-- Owen
LeBlanc@mcc.ac.uk
[ The MCC "interim" release can be found in ~ftp/pub/linux/mirrors/mcc-interim
on TSX-11.MIT.EDU. --- Ted]

104
Linux-0.95/docs/time.doc Normal file
View File

@@ -0,0 +1,104 @@
Setting up time and time zones
There are several things involved in getting time right under Linux:
- /usr/lib/zoneinfo contains files that define what time zone you
are in. If they are missing, no time zone calculations
are done, i.e. your internal clock is assumed to be on
local time rather than the Unix standard of GMT. The only
file that you absolutely need is /usr/lib/zoneinfo/localtime, but I
recommend also having /usr/lib/zoneinfo/posixrules. Posixrules
is typically a copy of or link to localtime. Localtime defines
your default zone. Posixrules is needed to interpret the TZ
variable, which is used if you want to specify a zone other than
the default.
- the "date" command can be used to set or display the date/time.
Note however that it does not set the hardware clock, so
next time you reboot, you'll be back to the old time.
I recommend that after changing the time with "date", you
use "clock -w" or "clock -u -w" to update the hardware clock
as well. (See below.)
- the "clock" command can be used to set or display the date/time
in the hardware (CMOS) clock. Typically your /etc/rc script
will contain
clock -s
which will cause the Unix date/time to be initialized from the
CMOS clock when you boot. If your CMOS clock is set to GMT
(which is what I recommend) the correct command is
clock -u -s
The binary time distribution should be untarred under /usr. It
contains lib/zoneinfo, bin/date, bin/clock, and doc/time.doc (this
file). Once you've installed these files, you'll want to do four
things:
1) set /usr/lib/zoneinfo/localtime and /usr/lib/zoneinfo/posixrules.
You should copy the file for your time zone. E.g. if you are in the
U.S. Eastern time zone, do
cd /usr/lib/zoneinfo
cp US/Eastern localtime
ln localtime posixrules
Localtime defines the local time zone. Posixrules defines the zone to
be used to interpret the TZ environment variable. Since it's far more
convenient simply to use the right time zone file, nothing more will
be said here about how the TZ variable is used. Unless you intend to
use TZ, you can ignore the next paragraph.
If you want exact POSIX behavior, posixrules should be a copy of or
link to one of the U.S. time zone files. (For non-U.S. daylight
rules, the TZ variable defines the daylight transition rules.)
However it may make more sense practically for it to be the same as
localtime, as shown in the instructions above.
2) Once you've set up localtime and posixrules, you can remove the
rest of the files in /usr/lib/zoneinfo, if you're sure you'll never
want to operate in any other time zone. Or you can keep just the few
time zones that you might need.
3) Put the correct "clock" command into /etc/rc. Which command to use
depends upon whether you want your hardware clock to keep local time
or GMT. I recommend using GMT, since that will allow daylight savings
transitions to be completely automatic. However the same clock is
used by DOS, and some people don't like the time in DOS being GMT. I
use Unix-compatible software under DOS. It uses the TZ environment
variable to do time zone conversion. Thus I prefer the clock being
GMT even under DOS. But some people may not like that. Anyway, if
your hardware clock is set to the local time, put the line
clock -s
in /etc/rc. This will set the Unix time from your hardware clock,
doing the necessary time conversion. If your hardware clock is set
to GMT, then you'll need the -u option:
clock -u -s
4) Now make sure that your hardware clock is set correctly. Try
"clock" with no arguments. It will print the current setting of the
hardware clock. Make sure it is right, and that it is either local or
GMT, as you decided. (If the hardware clock is supposed to be GMT,
you can use "clock -u". This will convert from GMT to local and
display it.) To set the clock, first use the "date" command to get
the date right in Unix. Then use "clock -w" to set the hardware
clock. Note that "clock -w" will set the hardware clock to the local
time, and "clock -u -w" will set it to GMT. Verify with "clock" that
the hardware clock is as you want it.
From now on, the time should be right. If your hardware clock loses
or gains time, you can update it at a future date by the same
procedure just described: first get the Unix time right using "date"
and then use "clock -w" or "clock -u -w" to set the hardware clock.
If your hardware clock is set using local time, make sure to reset it
when daylight time changes. If you're running Unix when daylight time
changes, the Unix time will adjust automatically. In that case, all
you need is "clock -w" to update the hardware clock. If you aren't
running Unix during the transition, then your time will be an hour off
the next time you boot. In that case, set the correct Unix time using
"date", and then use "clock -w" to update the hardware clock. If your
hardware clock is set using GMT time, none of this is necessary --
daylight time transitions will happen automatically.

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,569 @@
From: torvalds@klaava.Helsinki.FI (Linus Benedict Torvalds)
Subject: Second 0.95a alpha-patch, part 2/2
Date: 4 Apr 92 14:54:09 GMT
The second part of the patches: concatenate, uudecode, uncompress and
patch.
Linus
====================
M* ^3[DE^7?"*I$;"*:8 *=."7)XAI=*I2$F2.%)*=9Z42\HF)9<'4QFE/!ZZ
M'BN0LL<%99;R;@< XE)Z*>64;4HS94&,3.FF]$^F*3,::TI199GR[O.F3##%
M*4%8<\HF $:R3HFH?*!TO% L8$AP)[2"="G-$TB> "5@LH[)*&R-.F$.%2V
M)[62#ZJ.5O-+%R'Y"@;BL'I,!Q^6"F?"X7"=2'/LHC90-DKII)U2*TD@)%&&
MXB"2025V9)72'8FEK%4FF'R3Y3@$#\D((OGZ"C?Q$,F$'\DYUH%L6PFR\%9&
M27A1,J]P98&R5YFC-%>&>-"50YXU9*A20CFJC$/"*P&4"!Z(Y+=I#T>+ ]K%
M(:<(2T*#X7%R0(F=Y/L@)>65"HTU9<-RQ&:JK/*,6?B!_*BDEK=$_6/=(!-R
MTQ*%[ 07H7[2+=F?1%,N)S^681WB8*R28>FN[.24+)T])\N,0,IRR[2,Q$8.
M%\8%Q,4F9#]E HC#03]5(Y"0JL#K(=*2SW@RG(X](==SA<=BRA02N ,N4O^8
M '6/QJ5ED' @!I P= OPU"20<S=UI>41^UC5:$,"?U8 -PT>)0$*IR8<D &4
M+7-9:,LGE-K22IE]O(=%L%05<LMF%-V2+3 #N%N>+?,_B*.]);LR\_@X^5MZ
M&XA+<\O5DW" !F"XC#ZFL[YNBDNV9;NR<7G!F@D%+M& 7[S.H_)Q,@*"DL3P
ME>))?C$W$R32:VF?VTW=A :7;0"R)8#/<HDX4EA>($65?LO.)5P)<BFXE%RR
M!>R6L\N\Y:<R]GB[Y%ER+KE8@$O>Y>[1=]D&*%P&+Q&77S?;Y3$'=WF\%&-U
M 3^784O8)>7R>2E]G+M)+S&0N\G*8^>2H::\-"YI@T@&RR &I-MB-]840M)Q
MDE27J$!*4#,R8=!D3(+T4QX0KP+V#_>))4!/<=_M';5CY,-L9/W2"1D28$$0
M'A%=6LMQY'D,7#0:04>B*@.5WA\C3S_/!["L5-Q)=2"83 )IKBR5^F1S%>F
M*ZF4:\LK9>;Q#1"*(]5Q>4A&M2:W)#;1*)F7=&>8!1N8/CA;! 93@TG!C-IT
M)"V8,LQDY023/5F>%/C(K) 4WTO<)0ES1OBP/&%R>5*80<D5ID[R9NG"Y-GI
M#.M?TYRQV8@-]F1L.2?Y ?A-9:$7I!-NW>.@I#Y2'M>5FLL1I@1*-%:C5&+B
M*)N$\$F#Y2C+*))2C&$V#E\YUQHK)A9S+*/%//A@*Y-:#TI09?$R%<F@'&(V
MI,B8Z4DS9EZR8"F?W#P6+4^(5(;N&*%,(Q#S\3.5!"YO1S'_9;$0@ E<2&2J
M$+N1 )6C #"-*;"UW/D0TR216K%R8A[1N:+-T".J$_^(1;Q (A*/D.A1:>+Q
MQ]H$B40 F4F%D;@Y6*D<R+PNG05+XC8(DRC&<\MM$MUX\<1E7B!QJ/).!&;>
M$S5DHC*9XGE%GZA>T;5<\WZ*@ ,^7EW CU>B,#"85Y@&-X9,0C;OH5?0*U',
M)?@+",5EIC[O5.;,).CI\;B9U,Q/ CO/G0>GH#)\ 18#C8&VD B!]B%"$)6
M'N>9_Q:40<IHE"%"H*K8-^0H6AE19J,,G6C*%.:A,B4JP\Q?IG7EGBA/U)31
M$Q=D"TUH'HAE0Q;.I..A$AT)N0;:P)GA-I ;N..]5"2*VKQIYA\/Q&+-')5Q
M&[)VJ0%M9C13A)#._.#!%RJ:U#SU"IM!H_EFP V4!CR:G065IC8OFS?2C#*L
M,\,$^2W7PCN3,?"#VJ'1,U$&]DPZ!#Y3A+#/#+B@#/B).TBHT=LQM\!:<&?"
M,XN:@$>K)5$@GN+N(8UTGZ"6D(9$IE63J"G/M%_6[W*(FLS[!CVE*:# A,])
M,%Q769E'E]D' G2:JQ!Z"FYR-X"Z@3#Q(O WX.0M";YD,[G>$?7@0!<1*"Q:
MNLPY?QR+P'N@-? :B V4&6H#: :;IFZ $WC.P;QX@FX'<,T2E%C@07<#N!:.
MW/Q4Q@DVP+HRM.FA#"NTP%H('DAG#VXJP?1C&D8<%S(:,[PV H 49&B;!$N
M*QAJ+3"] J[*OU$F&&U.'79A,R/3I@D M5D6#/&L-A,\@([)A!B@P13;G&VB
M-FV;-05>1' 3#K#;#&WZ-LL$I<U9QG S15G<+/= 1(:6GJ)H3W(S!C &^)"T
M,@!>(P&5XI#'NFEY)&U.-T^;W$W*X'JSKH;@T?6X-IF;P@'G9FW3I'/;Y$70
M-E.;=2KZ9JZGM:G<Q&^R!?2;[R.<1'^3!?#?[&X>?,P W\U0W''3OCF9*&]R
MPS@@@3RMV(L0/L7N(7#>Y.J0$$Y-AC(JJ$3<Q"<M&5*4"4Z/0'\S>FC<%'"R
M-A4\LQ(U4+D'#_ M"!IM-Q])\,T4YSF)H4;_>DP&\LZ2 4X.9WW3PZD2\&Z*
M.'>;)<Y:!8HS[Q0]W'%*.%V<R,TT1.-MQEGCY$"5.'.<T$T>9\B0!VE"A#O:
M&4YBW,CNH7<NGM(W0>&,YR!ON\(OY\* &WG6]$:J3=::>,=.YOGG#M3.DDQ&
MOL:$_ UK#J!,,2 =H$J ?A0K^ZO8@\.!A#+5B%I$4%(2] (B0!.@F#'HY)/E
MY@9K_KER3OS$/X=U,&PJZ YRSD:#G$IMYQ#WR^?<HTR$8[/()?] ,D)%&A0<
M+E&"/BEH&ROB_C2=$ =NKUR74Z2?QV(K-"=^FU^$DG0_%SH."A* " #,X$,D
M!E813RHY2V,,O]$0XF^(.H4%I$Z[D:F3=IGJE"+1C98#K$Z^VK8KX:;JE'5Z
MJGP;S#<)AJV3,);KA![L.GN=:D3C +"3&-,!*TL2(RR6G$?W9:AMM<-NJQ8T
M.Y>75H+81Q%!T/G*DWFI.S\&B*.27;5@6Y"-BM(M?[@^5+J4A^Z'WDGHQ",Y
M,A9WKS4A6S*L+%CR>J_MN#Q<[!!&9[USFI2;8$N@"J@<)0#)"1[ 2G7%V&3A
M(R\(]BP; OF ]D0<:'=Z*GM-#*3)4@J05!*,6\2% ?AI$9ZGDM"$:,*FTWU=
ME(810@"B2BVI$!>K8U;YE&A6B$"C %J-!:!Z= VJBQ8&-*<5@,A3#F"(6E*@
M05IWNARG)T5A7^3'*F(&E9">-:>EIR%J\*2 J&^=!RT2:!!L7/Z-W;GTY"K-
M )1-H)S02=63,1FOS!A)=5);"QVB!$"I"( %<"'(*N2!LZ;,9)NBH\FW@SFA
MGDR>YQY<$Y]P8N)0JH:04&X1=(LY1]4@E<- 47KB7<)V(9[@))>G/DD3F#A&
M($HD7T"PY=SGWNG*,7FF=%!#50'5T)4 XG;Q_*#@1: 6X(*9@99+3$'PO!U!
M)Q!.11] I\23A$*7".(H-E2?=)79IUO.@O%1<"),P?9(31*^2E1BZO#>R-(-
M"Y 7HD\G0NMSUG'88!5$)>@ 2@WVA?\AB7@G^ZJX+0"#K+H"D<F@5A#:_ NP
MG72?LPX40( '7.!$>(0$0'Y0' ^4A*=@^?D;$GTV/Q\AIH_$1JV AYD_4'X^
M$OT3C CQQZ0$]SGP '^V/Y]RXL^H1/ES4G'^? S0-=9:B@'A!+#BSTD9L!*P
M/^5D09S2'&>+F;%VVQX=<2 "_D^N2KS)(C'Q/&S\.[Y'!2+KE09T>\0<Z%^<
M"4 4_L\9F6K(U ;K7 8Q0.4$A<]&I\/HWDDGFLCM <-IXC: 9VAMFC'PY( 6
M/ U/)!#BX?/@(G#]I(-P,-H[1M M'1$T2F $#0\@/4%3Z"50UM8384A1R.P\
M-9J@J($EZ!FD;;&E>S!1)),ZOZ3.9]F3I'3VI#"I/5EL=D UUDQG#%>I*\/U
MPAB>T#J'9X=K>!'Q9']2/#4?>H'2IT<@XTD#V'@2@3J>=H!_71H48P?4 <DU
M0( ;VTYJ5(D FQBST(-VM@@#98 3 +"">V0P"1&&%:02= D1TU-N"N!!. 9J
MCZ07T $RP"*"M(+X$/4H0N4%?(^MQ2$4.\0"K?]8UU GMDE7Z.+J&1&%: O%
M0C5 *4_FH4["S>0\['D2XXX&,<^YQ=!D53&ONWE.)G*>(26>I\M3"90:"NL$
M<: \,F^A:= "RK]]$J0B))D*< %D5G#4Q#:3!B9K[Z?[,],J(A)R>7VM DZ
MAN*>CHE\$MW3[KD[* ^@FEB3>\_2@$^'Q1:"0WJ*01^?3<\IPM33Z\FDU(<J
M(*B>WSHS",J@1[9;((GM0A=$*;Q1$O. '(JDL(>2/?&A,08J:-=3X>,K:()"
M"K^>OL<J*(OMO69&.&_U/P6=(( 2@)7 _"D2M4U@4$JB9BB1:'N*64 /Y67=
M0R\A'0PRP!;@)5HMF(*"/2D*+-$5T$C,(?KWU'IBHORAS $]1$O4EL43Q3Z8
M/&VB&=&N)\! )\K+*HJ6/'VB4L]_Z+^.)@H]Y-AMQ5Q629UFJ _B&1H-#6'\
M(LB3U5"X1%]EPK&3T(8R)7R?@2)OJ/JS5E O21%Y1%F?/E#?4$]C" !Q<R(L
M/=6B*;+YTU3.+?H\> MPVL %X(]NA_[37L+^5(NF7>2?28G'I_.S<7#_"!BA
M2O*B,I3R25(GHP,.C8L&!L2A"J=R*)80"O88DGL>F]:AMPN\YSL4-R#9G(<R
M16T0(R"9*%4T'_KTY(=&18.B2)VUDD!4\G$B*(CBFSY<P K^YU]EEN?JL8R^
M"ABB32#5Z$/T$H(4W8).1*V?3% *QT4T;'@354!TC*Z@%(XLZ"HB.4KC6(YR
M/9D#':.E6N*S#9'*H8IVC#YV(R/-'8MM-DH0U:_11LL UZ$E'+3*(Q<_.7;*
M.V.@]<[3Y<NHIO9U>P$>GQ2C)$\4R=*SWXD#E=+E?0*>/-".CAW4X'FDTX7Z
ME;2@25!YWLQJ.FH<G7^@!IZ@&BQ,3[&G.!KV='E1ZE)L"2HXZ.)+#DK=TAT=
M)^R@S4^+)_)@5< ']8->J6A4'\]/D4KKO6:%2'^*1'. ;H"LU)6J[%E.>ER^
M2H:CY ,6T_(-.0H4@#8U*/H$(@!F$/F@'-;)R85FE5:>G",1D"^4[03SQ"S-
M/(FA-L]SQ3%4YXF( \:E ):D4H*?IX*-"!&RX@'T (2>0M*J:+DNQU3T['L>
M/66B4%&@**6"2?@:G2MT,$V85T\T*43T.GH%0I J1_.$=%+9$D<4)%H2)8F.
M1/LG(=&4A6.B)+H2C4Z!F+:B35$Y*7$T(MH<90[$1+< :=*G)TLTJ+035936
M1!FE25%Z EH Z1DIG7J&XL*@.-*0 !D4[1EC.H-.[DR8V<JWYSFT,YH.10V
M1N^>[E"]IV33-<@(B7TV0.&CA\\LA>+SE!,F#<5)/A$\MXP'W?L'6V@/NFSA
M0N6C] (D:2_4Y2G!*BGUDA!*>(!5Q=!$#6<,C0$@0W>>5E(L:1A MH2QLM89
MIB /C4!2W%FG!? D''OV1!6CHU(S:*Z#+?G#[/6<JIRB^M''YPJ !D A/2HP
M">FD'<P;W)LC2 @O/8,L/>>EK-%]*)M43=JCJBM111^/0YY?:6])/$KS $M&
M)AU"QM(B*;)T)+J38'DJ29FE>(QGJ<Q36AH$H)9*2:VE5%++Y0-)6\HME=89
M*<1J=R >FY@D5(JFVL:-2\NE11ZJJ-F35(H:,)6NE3R8>*5353@P4PH4V/-4
M=]JD %&V))QTK=0O/8IB2AND5Z"=*=*47RH</9<N2H&FKE&":9"0(ZKH9'0&
M2E4_5]-\S]4T)5ILDY%>YLX6(S&JZ-<425$IG8F&2NNE"HA)Z5JI;+H:_8E*
M2E<=;-.SZ=$4#<*[@)LF2LVF3M-+*=#45VK$W!.)1Q]T6#']A[42P1,2&P2^
M ;8 ?XZMYW'42$I,JBVIE&@ C3AEA%W*ET&LTT?^I JG> )BDR%J#) '8 /D
M WT0;!\B0,5J)X5!,DB&3K-:U ,X2.X.Z-DE#9WRV :2P5&:4_K1!H VI2=T
MH\(Z6,_9:<#T'^H$[==E3H5."0=!A]B):.H[/9P"3RD**@#,J?%T<]HYW4E!
MD49<7)[2'#TR.6 O& (T ? >E%#\CLWD\5% HZ#,-WH2^@MEX,+BF$6:R!9^
M)24/[JL4H3EL^(,@H&JE%#!("![7Z:M3RU8IR@M^ 7:=*-.F0+@T7)4[Y0'0
M3N>F]M)R%>Y4)FJ8\I_N3H.B^D$O5<#JSV%CVWC\(1*![%-%U)^C9<KN"94N
MME8 Z VMQ^S4+O4>97\B/HLIGXX,*L=C@_K"C'9\#12,!Q_YJ??N?>HTBI]&
M4%^=.0Q,Q X#8,5?^T/=V&P1KJ;[*1%@@_HZY=MA/6NG72"?T@_5;2HP-1@:
MU]Q5-E1J72@G@MH(S #U3_^G4-,':?%4,Q4\I3J$/HFGSZ#?J>*4.9 \G:("
M3SFG; #F#L.)@3K!^G- 4'6H$E2M!P6UOFE!A5QA4,VH_E,.*N'3@ZHK#:'"
M4;T-V,'$8]0+2!G3,XK< %B6XSPN#P,2%W:^4'^\F3:/H,\"T1-@0$0;M0$A
MO:@5RL!34J/D^5DK X$(!40$AT(9&?"G3#K$*TD)5"?,K("$6# &A( R;3Q
M(2:$2@7W192D#0!^HQ#"+((%78\+@ICB<J*S>&P !61Y20#MY]H!J3B+>$FX
M"$@9@M&KAL#!$%'[[!TM@RRI-TA,:FRD</I\Q!;0+K]I<M!+*G. 7H _U58^
M(^Z1#1!#!0U2K@/%T0OH.%0.W8[>G4)AD!H;*:1R"@ZIW%35Z1.P!8I3@XU,
M1I2=[8MG*G&*R18"D'71[N97;3HAYT^*@F1/]78!C)(3\(\84PZU-0 I$";0
M=M1.YM0HP2.IB-5/M1?]4W\BV+>!*JT+O30%B%$J(YM?+;16A;4RF/(+]":@
M4,>IRT=":AF 'JE01:0:0I]R[Z9^QD_"6""HJ!70/O1#> C@0?4(K-4<D.6U
M"K ? ]%)ZI7A3E8@&A:T)^B:Y<]5*OAM+PK?&!7\/#82YD^/2JY$G' &J.45
M4\4YQTY<F+YHJ[,QREN>2\BI4+AOTTQHFE-UXRR 4Z] [M-J5D,5GYHB!2?I
MV?"GE$HZ $)-JL-/[78Y5)=. %4V%7@M"/!J(JA25 ^J=Z>$ZIO)YI92(*>>
M1TBJZ-11UDUM]>17U:O*4]5>]M&39TI(%YJD X2ZO;P)QJB@X;CDJSKK='F-
M51D%954NTUD5/)!6O4?:D6Z5^]05P&7UH6J?$*C253T#$U6#*I<'H3I2-:0N
M5+M@(=5R:FOUG)JRU$T=.PNKLU6%JO"29F?%4*P^A+)*C555VZ<S9A+7'$O>
M#NI"8;/Q7,[#$ $%*M3-+*I(B,]J1 K !(#'Z)[@ :2KS!WFZEJGN8KX# )4
M@*BK> QP-]($N%=!3_&(/6/NTX:I"'*#/ JD*+>+2]#&0>YCK/M1G<+\[OI
MPI!A":HYTR_LZ!,,TZQ5Z4@ZN+!<P2:/7:$" +#<?ZRDT8HSP):N3P1@R:>&
M>PH^F1UR%1140AKPP259%LQT?ZDV%?O4P6K;@; "2< 9>@):#ZPDG16LT_7L
M.DD#%L@H0'HT85>O(RHI3Q&G" -#E"R$0.2N*U]Y?0 LNAQ92/)M!309HSB]
M6%$%6U0'Q;?.QJKGP;$6*-,@_SJN6"@D-9I%/9P"65LKG5,:ZUK)ZE,Q39(6
M66D&,J?.*5$"Y"$(%=F%=:I,:-" EH?U#J@F.F1Z.84+U 2P(!6)B" 'PG,1
M!5H"X+FL43T%S<F,_'*J6>U&;%:SYAGHG?*T1!K .3D@<LX8!,D-"YF./%]H
M@5ZAI!)+I4&+HX2[L@/(G-B=>E5('*K@T?KWU*N&!\X7.RFRPD@JK-.J0NL
M5GDF!1[PYFI3@8K%4D3I%:*>DY+= J,5,1!60+4V*!B58$FS4_XK#G!H?;1U
M[[Z3IZI5ZZ153UAIS:T.HTI>N];.IZ45-8!II3OM6O6JH-84 !R0(+EI#6].
MO1A.IM96*Y,RU<IJO2B=6J>MK]:06]N1RSG5K#.@6;4+*L3TW=6H.H9W-(J!
M-9\+W]:$P26SS9G)%*CL$+5/_+C$8W=J;/8D&"(25@YYAQ6JXB+O@)? LR5>
M")^(N41*WBXQ3-9+K"+^$OV: (]A(@>OF.A%#.&!$<6)R94[XJ)LE+E'3"<:
M-(EYJ<Q(V2JSCX@?8^+MQPZ)L,S_F)Q BG<Y^.?5,@5Z"+(NGBX321#&,QEI
M$I%Y\$2&IC#3G;C&4VA6RB2:+LU28@+@E&@J2R6N5U:)=BV F2OQWFI$#+A2
MR6B)2T1''H:(LB+)&_5%\. <3P(J8D+"BO@NP2*FR82)6T11WIOLF A&'*LL
M$ZN?K3Q/X,2S1"#+<PBH"PD%U\0A4;G -\!-S+G9$&\?EP&(ZPY/H/G+*V7.
M$>8&?D2,*T*3Y@IS-68J\WXJS+Q-6=\UH@DJ0V;J7'FN^T0286EB<#K&F>DY
M7>L=%Y/2065QA# SD+RN7"JOE$=V(\ZORXAH]#?^:>",A1>D8W61[$@O _'=
M^=*.%A<HVM;1BT9"\SJ:T/"*(\=SBMW/Z'ASU"W2'!5\M%?(#(,/7,!F1<14
M*DR*O]<GRYI3RECII/))'1%TZ[)I8W3Q^#J'P3IJ_IAGOK[<:]5QR,=I/-+@
M%_-\6D?GGVAQ\W=]C3,6& ,SG<Z?*];D*B,V:UV&^@9F!#Q2'U@/\SIYC;QF
M7L$T[%?-*U@QY[= 4[[&7W2-K1FJX_XLS.AH+#G>8:2ODD:KHUVOR-=]+39F
M'+6O7,?6JXKQZ^AI[,',7DFON<4BXP7-SHAZ_;;4''FORX2RRYI3=%%U>,0,
M7X6.[L9.#)!1_SI:5*!Y_SROBL:+8USORUC[^S8"8<:,>#, ;"K0].KJD\%B
M7P^P>[[O*VTQWDBB.:'%7@LM?$6HYN:M09(5(+1>&1>.I<:&8^\URG!G74")
M]>H"35@VZR,F"IN!E3(.';6,$%AH(^>U8H:C4<%"7T>O)%C6(B4M4>-ZQ?QU
M%U>OOD:V'^@5Q=> !3<69Y:P+(.,@6-A#"&'[1A0;?P$<U@IXXN&^:J2&02.
M9K*PFU<^+(9O 9N 69PQ%PN-8-@C[/25!GMUM,$&' &."1S6*]*F#,O @;W6
M7V1F_DR)%%: )65Q/#OJ_1B.%]AXFE@O%T.%?<+6!$2;:]8,[!06%8MGK<*"
M8'%\84?2(B46(1-MS/618&N-O,86;*)Q4*-OK,;@&\]]SE?M(HN1NYA]S<$&
M8Z5[G$;OZS%V[0B')0O485\*=%@\K!WV$?.,/>M1TI2,#)D1K"*6N2<Z.\&>
M'#^OR=C0J\,O' N@X[]&'7^Q_U= K,N1^GIZW<:N&7&P%[_MJP+VXFA%N\0*
MT%!E44U'6)HSW4I<2#@0,$4"30'P7,MP_7-N'2+P8WNOMT#%&^<MAZ,22&:U
M-4> -049A"8EOI*B$RE\JU1-G,A65?* I.!^'3<N2E %EG@UQ= E*.1K1-@
MN*XX0H1.CF9 "8!>&LE* 0!*,P! GO'@Z&C(V;TCCJ!ED2/0$A6U;1],R^!
M $0 -%G' B0!"N@)U,E6"BZRV<"7+#GUBE.1/<J*9,%=3P":) @@O?I^9,H6
M9>,45@"DK I"E %F" ,"7"K@%6K;$X6*XN4)<GJ045 $]:2+'6!D.%M$,N2
M#':R0 )BY5E6XBB1?=OA9-^R3EF,K.1'+<N19;]N=509(-F\K$N6+VMHR&$T
M!*0Z*]F6K"@')BN3-?M4"1P+6+EA:O>H+M 2X&%^$^%:=]D6"ERV)TM4 <H^
M9CL&0]FR0%,V*RN210^8NR0?3Y]>2&;6*$N:535!9:6R5-D49(- -'N5?<U.
M"K0\75G+ EN$*#N6A<MN9;NR+034K$@U+,N;Q<NV9@>S9UD<:H24+\N6/=&-
M9I&R?,JYK+!4\D", 2I4]D>B4V] %S6-CN^6,V"+28%IEE,#QZ I-#)@<N&
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
MC':^?UN4[?4',0"7&OHR>@>X7\*C+W6WCQ19.*=%<\\]J%_FJ.\Q[Q3VZ6)
MU'@]BE[J+^76!_"6:JW( 88,M21:;T@ TLOC+1)8E+JY[R2B[S&I^]M>DB;5
M<U--LZ90+SZ5;^?_32SEEGQ*TB0QD[^VG$2,J/\^Z:@]Z=]>E?Z7HA19: X2
MM_R_GB< \#UW@B#JW><N'_NY#Z6; OSVW^M3FHV:?W\"]JP",&Y)E?%-XC)U
M<\5)_EI)KRHC+S;689S&DTI,%.!<@6"7=OMN2MHZ\LZ^?J4=5!%Q[1M*:ONZ
M(]Z^4(GGP?HSLA#9Y0[9?<E;>=^];UFT)R'EW?.6Y "_*"),$N'7TVOXS4HB
M?B487]S%;PHJ>0N\91$@?RT"O%3O1^7W/B3J\0&?B&BWG=^)R><7;WO[R5ZN
MGF9%T-^.3D70\*/^/>[>@*N[+Y#"[?6WZ-NR'01K=R<B_EIQ4OA7ZD/^K2J<
M@%<FJR3\K_HW]?O^#2G)?RVLYEP_KOT7G"0)M@%'E+*^B0P=</^7GIL!KC4%
M@#G ^!PE0KXU[180@"_@%L_"^#38*3WK/0 SG!U@DE,H.!.DG7R DP*!O6B
M@AD%'N!2KS]78!$()@$K-$S :144L$JKTZOB+ 6KFJ0 5X!1;U@'UEM-- /,
M>A6^U!YD,*9 &>SJY>9Z>LN/K. 6<"38TPL#_MG*@,T AB%/<*EIHA0*WG9Q
M?0^T-ZC!KNVS]]M"D7=R4*1)76#I &-E(V$%KA74:W&_S[EB@<!6>6L&'D^,
M(GBZ_H2>D;V.I. A+544DSBV5=YJIV0D#TS2V0-/?]NW?N!/\/, ?FO]Q>X6
M#TNIH@) PA.*Z)N5.(D\-KR_&J %<#L0&\BHNS7MJ#JL;UXFVR7X'&P"XAAJ
MGN!*P3H=D%?77H<1C@&O@+M)O20E$%Y# ??\O1)BA.6_N5Q-L&)I$SQGLT3Z
MA#FZ6;8HYXG'7:<#(F2@!G "#L=$(!V*$SFK7$(/MUU2[8XY(_)W?.MJPK'
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
MHW QBBOU/MJ"K<&K'S9KYYUBZ^4D?E@W,A: NB6M/*1=[#V[3VP-=A>6FVP
M"(K,XYV3LP.,#?;@D@2SEIT_KF6Q7:E MHEO7LXM!A8#U5IE(!'B%*H_H#:1
M#V0A_@F&&-8$)M!%J,XZA'C.I"^@<P8HY;S^Y2\K@?Z1EU"30OAW.N$QV/,H
MG?-)6KD]#XN-\>1X\@Y(C#B1DZ>X1]YY$DS!A-!L :0 C"?$U*0 ,XD ,D3)
M 2 T"HSQ[+=NOJPGJ"\3<8\ #EX$C]#9<4)T?B@9G<>&+DZ?\]^9ODM5HK(^
MG5E+4>>P@C0824%W#GG=#F5+%2%JCV^I]KQR]A3F#2VDJV6)4VOYH?1:SM,=
M.+O._CNP\_$6#3%V9D"5"+I</1&TL^4(^K2_TYJ$2!R8"L@PX+WV;B3;W*TN
M=Z-3:@ 6P(#H&>5PLHB8"LH$@*OOL].9K4&K\B_SB6-):!>9 77JO=8$6 P(
M @F!,=*ZE!CUJ]9 -4S1FM #LJ;+$R/0U[R+Z^P(K0!*3T-. UW(YL$2"*1F
MGRFFQC?)D?>9#<@""#^/G_<^Y>>30>LC_<R36C]GF4=-O6%C$OR9#B!_AM*!
M+A/&'H-K9P.$'[E=0_-"I.: K4= &X?S#M@ R0-F=B"2<A$]6_U98W #Y"^4
MF[5L BM$X/\9'9CWK#4-H$56!6A)SP$ZGY2 OJ@.8?^H\%H'IC?J6Q(ZP7SV
M34%C].>E<D4#AN).*(FB $2B*8"5Z#.J;N#!D!.8GUL?734U('%I:Y .>PB8
M">#':$T^[4J 6#A9IIY5;A*R=B <C@GG6=A'!M1^EKL"]3D2&796L:(7Z%2P
M$#8$;KC:77N -Y"B,T3'X"IPBN@F 3(M0N//>;;A.C$Z$2V)D@^B7_<&R.P<
M=C;1?UET<!!4%XHD!5A [ P:33KI "BZ6\>994QA 2A QI]F&VIM0[O#,+.F
M'FZ-J@-_;",36 B0370!TUZ&MVC_XO(!#[UX:]\=(1^R3TQB"@E*,JF,5A5;
MZ*ZRLZ8?06AR/3":5"'X('(CQ=D62C2:$8D$> )< 9P %L@6 @^!:2@/3 "X
M0=8>W=0+B$$4"\".SDG\YVPP)@7F1(4B$_*?F\Z8%,H$*(NO1(%(L:%RL&L:
M!\82,X<^V5^%!V4FF$>#\O@)]UYP0:# 3%!#*? \5=\Y]1Q<;'_N.NN?([WQ
M6T:ULD6,-(%QH ,X!075@Z#-^H]W$.KQ&3V6_0*X9).&*5DJAM/ +:N-/DF+
MD@(%K)30!TO:(V"2?NDH!X@*"0"<LW6@$7V2]NJL(G+2Y^C!&GN''8T%R$GP
M3):Z\A%3!"."*6&2QA/DBU-*->E13F2D]F$6I4F_=*;276/OK!(JZ3!.@ $8
M>3HL6*K5E>XE0_4>H5WJ7@1K F5 K2[BTH3NA!C 00RB)FG"\^-)8O0%\-3V
M#VUA@$'<B_>7&48C@$3('T-MS*5]"@QLVS3(V3;AC/C2S(&_M.[-,&;0.-C5
M#IAAC@'"0MYHGG"8G@H=/L*Z2!]FU=.C=H,S:E!!"?C.#ZZR@A1B<^1Q$*P0
M!RK3@&FUCCQF,4T<<S4?J<(^NB8T@,Y(,9T8$TRKP0C3.3>B4$*G@U)9H4T'
MIM<I,#"!T2 GDE<H8!;(G@8YD,&^ '53F1.;1DKYIE]VMNG7-&Z,LL&:\N/L
M"S@%%B1=4S?M.;U[BTY?B'#3?8BG$,[MN^!<)?"N#;#3S&F08'[F#\&=9DR[
MIB]$=R0PL/TAOQJ?9E_8 9;3N+%H4WO:<.1:@('5IP,/@=!3<<T#F:7>1,G*
M4/4"[)VX=.-I+FV2AG2!/D$ 1&GA4D&ZJ2J_Z!T]PT0_>NEX,(2Z'>T(P5J(
M*;HI+0 HP&>R*!U);LEY(C82(NK,$XDZD_B;V_.R"%J[^@3>!+U@*2T\6 Y$
MIND%\Q_A14^#K.(& !2,ATP%MZ,FQ>%V_D)QH-TR S70JY;F@;T 6!#3*"OT
M!0048P/[@P&-:1OD_4\H!Q8?!B?:+0(YZ8!4G)&-YK!)B&F_]&JZ-@V<ODW;
M/@K3"*$J5X3:$3*D1D*5?,4)- *HTY"7-<U[<TR/IT'3GFFU$XAB,TT),0(-
MI3G4GJ<1-92@[Z%D?AF5"109WUS*=&84,HVHKN,L!SK3P+C/]&6Z33N:'N2\
M#DS3_JOT=&K:H3.F_DTWIJ73N^EOP6RZ4PV=+E.7P<+3?)_<=$M(30VH5I9F
MJ&A(L>E(WGZZ3GVJ%DZO"RHKQ6D-2FP$*)"<UB>$=/_416DVM9LIX8PGWJ9)
M$XP'LVKO-&J:0()#R1OM!"@#R;=0]7::5-V=-E5_I\_4JNK"$*LZ6+T+)96\
MJHO56(^WF'7Z/)U\&T]'FYI"U&KWM'\ZHR2?/@/0I]G5]FG\M+EZ/3VKCG"@
M =;5?:-V=8":&^9^4G6]I%J\ ")N$$XMB%O' ;RX""#5Z,_<Q#+HG4E?+EC_
M! [6FFH5C>'!67V=_G?HFO:KQI7L-&''K,?LI.,<!M 2#\&.]6X:+2$P$ED?
M?= 2JB=650L0-OVQ5BK(GDS6Z=L*!02H8SV>/H:-JZ'5V+ 7BPM@6<T6?'!!
M@ 8Y']^(8$1F63T%2U9;JRG%Z>K6]'L$FL.R3A$9>F[6G.'##KK'D*.V)?!H
MK'-N2"]65=*:5GVMI@R@J8%C'X-!#HIT/(W FE5K\$02BYY";GLB,:;P.B[M
MNI;5S2:,'% @D+&L)L$8K3_5%R(_3JF069"QCEB+'.8%-&MH6,FF<VMV@58O
MJRUUA)V*M<MN]X8<DUJKL"+6^(3&8&009NUI4BHT!F?6#T&@]5LP<VUGECU=
MK8NJ)6M;]6\ U>FQ!J;2 5[6QVE>->GZ 6V+4 %<:R;32T'19>N:O:IL/3,5
M&L9,D&O R]WZ/<UB[D@!7J(^4<(34\3ZD/@3H%B3JWO7](1]"_"Z2RB\7E@$
MBD7++2K\3\):8+UZ(EA[F@S6Y>J]V_1:=LVP[CP[K/,)V6L_3@7&>(VSUJ]2
M=/K6507.=>(CC[.R3E__K'G5ENN9=?O:;2"Z)EG+KQ&789_Z==>C9#V_UE4C
MIUW6]VO2M=L@==TSDEFKK/'7N#&;=>+Z>&V^YEL3!'C6#4'U==#:TV1L(5H'
MBG;7[Q&D]9R:3(VW9EI7%:36X!WR==2:<(38.>]4K84E!9ZF-:P@:XW!-E-[
MK;/5(H/4E5PH0+V.;E5768G5*#?3U=;Z;.W645L#IE]V;>O'T=LZ8AVWSAO1
MK2/6=NNMM7<:<+3K<F#OK/W6H0+65/MZ/*V%(5P_J]'3E@%@=4# 81&H5E$/
MJ@5.+ML5TIL:<6V>+E\GQAK7)&SYTK(Z<@T9)(WUKQW5=(#+-:M*@KVY?E_'
MDE"=V^J<A*LZ20VKKESG$V;6HFN!D1$ICRVL]E:[J<'4?FS4M1W;<ZW56E-W
MJ^,"A^SD8^OZ=2VT9A8L@VQ)M.LQT^WZS)2[+EXKL:W5R.O_$!K"'16\CK(L
MJXG7;R:H];^#%?6[)F4SKTW93DSX8==2TO0[@S9#BQUB;SNRQ RFA7VJ%OSL
M'I@L\]J' \Y(?;W]"5G3L2&"_IV*@49JWP(79"/RR8;9=NSM#^':&[1O\5-+
M,(C26^R<1(HZ6_7%EA<L;L78X&I6@>E2E5T8S+V=L=](=28U=L1Z3@ 'D 'D
MC1BXRS#KVQCLC[.L!EF'K-O7MF@D"X+&'XMX:QZ9#FYI*@A=X%\NFU.''K+L
MLS<9>>220-]$/,?6[$,O, .UU=FM@ .#O>JAA34!"6B2]U,<1B,Z"'#1GA1,
M$,<X/.DC !?*,X %&%LPIH8 D((8W!?@F:;[23BQE,@"1-^^$_))O 4"$$M\
M4KEI.!YPM&8@>IRAD$L<A_K2(8S>$4Q;%]IW6E%HM1P:"(W)Q8FBR*%3PF%;
M'B9+?2>NKV8+J0TNL'BRG9C:3B:G=LP!JCWU*>!.M5'()8E;HPKJU7Q8^7Y"
MC'LB/6QN05-[6 N(#@7M%";:A.AHFT4[/OL%$&E7 >ZG)FF--C1ZKHW1MFOC
MM5?:G,"0]DB;[FG2U@R@M$T8>>VO13<UKFV2%D=7 9B&)&V3]A- @D#K2@+L
M#O+:4Z4U%$G'W%)5>&D7JM?!XH0FJU;+IMT\P&G7!73:N>,A0$_;M3*5 FIK
MM8?:6:6B]HGBJ W65FIW*& 6:VVA]F>[5.'S_&J+5$H2I6*U=E8;K@7;)B;U
MG6H4M.W?-EM"K&T[(FN7B,_:Y(.T]O6"4(##!IR"M(:-7.TC0KXGN?W08$N8
MK;3&KD_#Z6OHJHW;'F[WCOAR0MJ\0%P;M1T]UFN/9=G;WRH:2'Z&0V=N,7W(
MM(-D)[KK+ Y#O>VA90^FMK&=5P*3#E%"[ $)J6RH ;J>E!R-7ECA$RIU@E)C
M9E-T_NWH<4D@1W # '"KD' 2 VZ%<1^)P6UU.HRRM<^;15B+8W;;;=$_X6XG
MM4,H0@3P]JRC!SW>GE"4MZG;>SGO+RT:02W!:&R;NQ[;DP+"MJ* LLU#N&S7
MI=50@>-_=-F7!]7X#>6<M)$ L,=2SE=%B( 2JRJ\!:"4L0)(\8G@#>418"FE
MHR]T5@)! Y ;?"F<@+X=N@.30"3]!. RQWL:@J U[;<LXHR]V7.,"LFCCF$
MN<?<:6XO][DB*#?C?N?D08NR6>XP]]2- U+Q<7.;I/?<U=DS-Z#[I@#]2 S[
MN0?=BRTI:YU[G7/GSLGFN;\ >VYS;OXLS WICIS8M03=EFY"-V\@QD86T'-G
MNL,#F 7HQX':SOU,I!=HN9$[WH%AE]F&THWJ=B"$!\+<K6[5=J&[7>?GCG6'
M!ZXRHFX.K=D&T\82-!T@?T$$$PYX29W9#A$>$@+#$M<6P %@AF<7A[WJ_@+<
MY%H"D"M+Q&*M.RLQL$[AN6T1\.UA5Y3V*IOMEF\_JHL\]6VX$XO;/ Q(J'-O
MN]_;1^XD-YNRO@WN'G^4MDDKJ>H.B[)U Q3N[CNQN&/$]=\@K7<6'+U1\78_
M2S= _F[[=I,5$UP>/BN5NU-TX&AM*GK "/ $\'<?GX)D1PFP].=86#6FI7?/
MM\7=XNT&$/*)2XSV'-/R2@'>9Z:O-*8@WVTBIB2*F!B?&Z#1'<G[1PQ7.GAS
MN[N&DX*==GS;W/+PUG*9O"W>CVJ,-YZ@ZH/S[B7IO%$&YN$4T,>[N(7?GA([
MMS+;M%ETMS;5L(WDS@*4<AS>[V[-P\T[X/WS#@]XO'O> N\>M(5YI:%8LN6X
MZ,9,1.]O@=1[NJK2D/+<ZO"HS]Y]-\P;%9DX@'JKO'&96.^J-VK@ZDWUMG<;
M3L&K.N*EL-<;X/WVE@&;O;W"05H+MX!;AJKACA$8N!'<6Q4%=R9C =KA;KMT
M;+/1'H$(][=JPJVE$'QCN G?CX$--^-[.7!U^FQT;"%-HY&Y;=*;9. $D'D/
M 2;<")(=Z84;9L Q*'Q_"F)#@<ZJ%-&'\^WAGM5>9;4 IF_4]PWCB?.6OHT"
M!23?IV_!)ES;0PN.=NKLM&?21F[CM]R@2IL^.EL(7E W6XK[;$)^(TEBGYC
MG%PZIF\?1&YFSV/]7@WBOE/;K*M25E21)$WZSGU+3E+?!M'5-\6A]9WY%@XO
M!J8$@ +9=X/;\_W@OGV;OTN$U&Z]@+7;T8WM;L4=<W;:SMF7M_+[",#\#C$]
MO[O?T^_<-_>;O$:5E'YCOU/;VN^)PP+<],W\]GZ;OIW0 ^5U0RV[VM'_IH [
MP$MW"O!E!0+\ 1X]CH!;'B;@J>T*^+'I^QT]=C"<NTD&(UD=*J1@+VNE%>+>
M*<Q+MJZ.H2.D?\*60$#5MUW@@VCB]ZVK[LF)1'Z#HZD 1' :N$>S YX"M]+F
MDUC@D^_C8 Q\USD#-P)L@+BTC34>N$:KI3W?-N]IP6U47/!'=7Y[U*W8YF\K
M-L'11(#-0!$<\FWD3H/# Y7@_6\D^!O<"FZEK26-9^%.*XHQ.(>V#$[1/H/_
MNF #:_#1=POE""Y ZA[ P:'?&P(U.!S<#B[PSJRYI<G@Z>T^N%X #5X(#X2K
MO7<(@/!#."$\$TX'5S#;(N[@16T2]\M #[[#X(.OMPW1UU/)CQ$<%9Z1K8%3
MPCGA%7!&.-Q)NXT9,U#OP2/AIW!QM"4<X?T.K()7P!'AM(14>"<\I 0*5T*Q
M4DGA<9!/ GLG"$!OMFT_="DA, N%LC@A%M'JP0%!82D6/XLJ[V);""X'/^;L
M$%;AW7 BP ZA L[BJ',KA&X'9I3\QDH2-3D"!X&GMJO?#' 5. G\6V4"CSF@
MP*/'\G 0 !1\V*78;D2#HZG@K7 1$*Y.C_T%]X'/MX'@Z>C]]UT@RWT$3X(;
M 0+@Z&XY>$#\+8,(]X#/E?;A( I^#]\AY"197Y[PO,]/7#!#[O;G0 2WX)W
M='[@MO!2>"3<XW7M1H2[P3F1$''2=R)\#OX+;XC3Q.O@GW"!=QX\)9X,7XDK
MQ%]&B'!S%R<\)CX(_X,;PH?A+G%%^#!<%A[5MM\^PF_A^VW]-Y:[_XT)/XH3
MQ3T"K_"C>$W<*#X19XJC743A X:R@'Y[HLT2YW\#P[, PO"KN)$[&#X1=XE7
MPA?A.?%9.%@<&9[_+HLOQ/O?NG#)CUH\X6WN:HLGO-'B7?&X>-_I?;$OXHFG
M$Y;AS7!$Q*1DQ<LMD(;'0.@[UG!B!;E8&U[MGHH'Q>N>WG#X(S@<,RX.%\^2
M%,KA^FVVT1HMLR#ZCCF D_>\F%Y-&R/B1G1*NLI6*7#@D^??Q<0!DQ3EAG?'
M1UX?\DEZ@2>BIW&3E1A@N1U ]PH\Y6\<#0 '4'P*Q_'<#ZX\@./+O4TR>(W7
M[CJ&-F%>A6&\$92=!8D5Q]DBQ-J<+%VR.OR[2 #D"( ,J5-(>#?U7*!2" SX
M45:S/8$;^'.\.\X"J43PQ*M<G%!>!F^<@9BB @7-#ZLY9('3N#(P-9Y16(U3
M#%KC8UGG> Y<-F[+FG74QF5DHKS<N)5@-_[XQLZ6NE76P?&.UW#\.A[AN>7\
MQBF/R_$7> M%0!X;YU6T@YL\( VQN'@\+T >7SGP,F;2Z?$C &P<])3T4$R
MQ@_4\''S^'R<^&A_8[QZ9SGDH"=G,.C),-X/O\I&QXDJWW$; '-\0ZX>'Y![
MR'%UAB!_>-=015Z[@Q0$NX@ O_ KN"<<1ZX#OR=9,6W@3'(C^83LGN1@R!1)
M'O"3Y&\B>9:\0TY4^9'SR"/A'MJCPY#<(_ C]X[G@83D&G*/ )6\.XXD5R/H
MM]G@,7 <N9-<5A$ECX6#+<;D.?)6AEGI_#@G]Y +RAT,PM).W\DGOG(G-X@R
MPQ7-9@I)2!JW,:Z%?HSS>:_AI(H9^?#;#RX$R%1DQE?AG?(I0&9\*^X&'Y7C
MQ)G?LW"GN(B<0XOTWH;[P9T C"?/X%12-"! (@*8Y>@)@*+V!*YGJ'T[VI7'
M'.Y(X*#W"$CR,98*.R(WRA'CD'*]0(W"PPL-IY2[DJ?A@XG(>.M"4^X@_XF;
MNHO?GO+.^%Z\%9<M'X>[PF?BIG)/.*J\*9ZX?8K/4$$ #("HN%T<* Z.AI6O
M!_P*1%KO@#RPNB#XR94#!7SEM\99AZ]\J)A1"I9S'&+9/D1I8:-KCO+H>F3[
M) 0L20=E3G%[R1PC <%,GZ33#D<QE@\".X'?Y(; 5;A%O-PA;G<7^(JGX3#
MFCKEJ_#19)B )F+NIIA[S%T(=4]P^#JT*& 8WY1[S$OEJ_!2N66A96XR3WYG
M*D#EF8J>$\V\8V[D!D,V >((@G"L.".2/;CHC$!(S$?=+G,CMQ%@LADT5YJ;
M!JH@&_/\]RE\';H*7YE[25;EYW*>^1'<Z5T$ (=SS4L"K8J=N1G<8XZ9% *L
MPLOF8/,<P9G\\? V:E^MPWM9AUMP$+3Z2??4'@0[S 4:;4\QE)W\0&T0W7ZT
MRV/E\'):N3QP1LX'7Y=?R_$#LHJ'.,8\<:XQQYISS"OC+7%PM,A\6RXRKW&(
MS:7BD?-;USIT6XXR'Q+0 "[GAG.&.+A\6RXS%Y)'S<GBUG+1>:A\6QXJUYF?
MSJOEEG%^=YQA%;XTY[RMS5'GL7.2-F:5#0Z.MIJ#SE/G<7"N.>?\:UY,,9T[
MSM7EP'-@>/=Q6XXV+Z:HS:/F!)&29#H< S$HCC*$FE%098J,PUN#$8HV()PW
MS1/>0 HK@/)CHE+E@@*XD*VUW0["QOL#9H$"+0AW;%OE8W,C=R5<6"G9/%PP
MO"D%\?):^1AJ1_INNOI\0N?F9@6?:LQ"'GF@D*&TBPF=-.I6,\:7L !_LV4I
M-E84<8(#^NV(HA"DUN**BW,3_0R]$(VC6\OM2/YHCX2B7MQ%+I+,KU(ZH$I$
M=,D%BW$%A%QT? KU>ILD( VB*=7L>1R;),$])P)XS]7>A@KQ^3""?,[>,9\W
MDM'G<VL:1[C9K&T:?I^CRY'GN?/Y.9S!?N[KFI7+RQ70_',@[^OG?\XIX*:%
M&-HJM@DW06[BNTTWANLZC=TWO,\&NN7A@7ZBB*"KN%\%%/19!P>],)9!5Y]7
M3"SH[@/_N<HA*!=S4*I&-4I$XH02^B(" 8H82*&[7$LPW+!I834B7HNBFFO5
MA5+%,=^Z.7 UC<2P3@:M(!3F!E$C //CW']P$^T"<R(^P,Z\_(@?6"MJ U1
M"\0 !^[*SCIE-BYOB(Q#JU<1'5*D9F+.L&$<8"5T;!G=Q.\I &FD0F"VF2P]
MUC@BC_3\F2T=1K4<D2TOS%]&4P21 W4@P[;I;J%NM1FKC'1A.CTEG0H)1V_/
MN/OF* -PM!*]?K[P;J*/+03G-O0&.6)YYV"SF;V"QR9A]I\@"/HI:\0U 49O
M^[SIB+=0&!%B%/:.DRRST*(=?2IH,T)DC?;FN7<"3;5:!@\A"/R#6S @?2)]
M/IOF)U9?UU96RLD!L41W= *L98 !J[T 8\3+BMRZ)@0=S+:1F$-=GQY1;ZB3
MH@^W8-0MJ]M"OJK,J7/GLP.Q"&VTB7<N6,@&6D'0H>%W$0%#X\S02G!9YCZ]
M$(<[R&A9-D!6).DSG*E+.ZS0[N<CZ>%6]L0",&#+!'5/(&@5<UK5=Z+(0!Z^
MEF8P,D']A#L#J5XO#%E(??03F1VB+W_YX>U[QATN5D/0:H&I>E:=Y?Q[%GAV
M="[/-%ZP>AO@\1QY'LE&GK%V<)_^QKUS=$?3=M]8J9N!(8S170R;_STLT &5
MPPRWO%#UE@)#+A!5OZCS0M_-5:[QKG>;4T#7Y"1%%IC=U*5WRLP)!V#\>>!N
M54(+%(>=-Y%4.A(HHF'1-\IMZ@FMEHU -[3]4$]\/5ZZ3-WV!%,BJ_3?X6Q*
M'EQ2(&F65%BR4&LX@D^:"&P&75L30/V)[0*-5=F"PV[K72APF.Z%O7,P0@^%
M<]0=L)/@^DUAN,XLT+6$>B2SG*,7 '"=N,Y<#ZZ7;0RB_.7?>G/=&&%<7\Z-
M&(G5,0?!&BU(#2$A_ANE(6X W75;T*W'(=%=9Q:0UR7$XG5KGB9TNPY>EQ";
MU[GKZ'5F 7N]O/Y=#Z\7U_^4XW7X^E+XO=Y>7PJ+U^?K[O7Z.GI=O%Y=GWA+
MU^_K.U(JPX']N<[>R0_*,!( -HZZC:Z6+?!1>+"+ %[2[ILKU6X=I//6E:PK
MUV\*-@+826("LX!;UXB5V&]BU'4 =RSGM[Z%ZD(1V!,+:.EM>DI=:4;W6R&"
MTVL<SR*50*!IY5-';LO4V.UQ"ED,A"\:*193#YAS#; "0 ;)Y!""XOA1O5"/
MKL17A8D00\K2R6[R37.<E!U&PK!=$#&LRGZ31E8;@:CL30F&CHZ.I[8- ^N!
M@]JT87;O!RO("15FMRM\/18Z.KTW^V,HK"=G%[,'Y>PX'YPZ.U NS3XS&!?4
MV8O9<V([SMJMSBZ8$Y;>B1;EU0X[#CY!.2 PD@DN=!;M/O4V^Y="B@'VP$34
MV=4.7AD8P:7]3&9)6%"9_AY#B_818YT=+2%6UQ.,VE.I+H+(PJG]]S!,_>,0
M*EBB,3Y0>]&BU4XE@$O8<= 2O6I.Q*;]='T@7&4_VADWJQ)%>Q3L,1=F]R<
M7NKL* N>7)A]7N!AN+1?V5E@8?8N^^L#O0W@YH1NMHRZ"4)):A&Q*_%)U7N<
M"?0)$HK_@W$%K@7^&>6,?,<)BJ>2N-5GH:-F;SJM6%X&[ )/SIF]K-#C+%'I
M-Q+I;?94:LK:T2YK[X_QU"7M2P(7@5?FTOZER+1K"//M<H%.NR3JT_[T*"N(
MVL/LI/:'^ZT=U<[WR!6LVHN4KG:X!,,=GX!QK[6OVG/MOO9^.\A]T[Z+";8_
MVH?M@:++G!W'V/X30+8+.I3M=AQF>XC!V?YD" RXW(D*+O>&3DB VKXCM;:K
MM8"_=%#.%HB0VY[W,('F-,+MC8=Q^YOZI7-N-Q.DV[7@Z_;'4+M]ZO1N3ZB;
M >3M521Z^Y93JAEL\3/&''L"8LX"YO>0GL(L.JF#GV;LX%?@PS_6@%F!<%I:
M(UEH$EG1-YD9-_PXH4<.-%S7&4JOQ)A'QDVKQ4W*E#B3NA;.5HS]&B6/PF6J
MBS2/6B"&I'IV3$M>0+P_@1B2LT[U>N11O?Z'9&$V8C9*L$DP+:?5\=Z=G-:-
M:</$'@%GIJ8UVJMK4=L]F-:EXA8M.V'L'C;]J5X&?XP_+M_.G68S,M9Z'S?:
MW3\Z/$S$Y-X]'MS:76MYME#-E JEQKR7V@OQU/+)"_8)*P/B[>W]WY&Y%&&&
MUH^Z]XD\P=] IFO^90Y$=E^ZA0GO>FV",=">Z%C*AK%)WME8Y47K/Q(G+T?H
M,:>7X_>80*N\[[Z45#49+WV5@7>4P> =VAO2'=.")W65XLG*^Q*3[5:HY/9H
M(-OOK3B4UCE)_]Z=O!CA,AOON,?$^PH#0"M^1VD9:".6?$#*N^,=,/:(U+S;
M*@OOC'<"/.2]_.@':,"3LW"9:KLQ[>3=I6)ZET@>)@ ):W+S._%R>OE^IR0*
MWG&9+&@+_/U]5ZE_7U9&W/[O%DCTNP!^6:&!%T@NWA4:/7A[ 0/^_%X>X&M)
MWB/P=9MWY1<SA)E]K, _UR_PI/<,4!!^26M^#&(:X9/P(7@H'08>*H0D P"A
MWFUZL[?:>\\W+N!Z;T)MW?6Q48?Z65/,[DC_,$;3D=]W9_>F'C$:?7PT6$'0
M:<N=&P[)Y)THO*R5-@+$X#[:ETXICD0:(EW0 3,>8H8^[!T]J$ ZVE=\$Z*X
M$ZP^' >-A5+FL[ZX*&LTJ0-ENP3Q&R5'[G G&\D!*S"%Y(-E]\[:,3DNPLI(
MO3)%W2F_2<YCHG[@FEWEU!NG#B3J56S$>G7=A<6_4U!MJ)/,3IJY"H ,98@Z
MULPZA0(7[T_-K)/F:7;NYLXN;;F6W",'<$KG #,#Y&H>G;Z_G*:Y=0W>$0'Y
MWD+9A3$5@!P)2K3B6J (AJD.UGBWFV\,&V_965R#$[CQY39;T@<G' ]X&\?[
MZ-)0YGAMO&9BN^:-]TD[OL#@[?B/#CD>'L_MQ.AT?8KQ:B9Q/-\G&?^;6\:7
M))\9D(<^:E? AQ6!P+?SI&Q))!AV?)G9';^R2T,MC2[9@N'$W+A (D\.P@KM
MXX=CDRR!?! 'D]V8,[XMPO#Q$WE]/.T-*T2/KX3TB4\+'/FK4)-HV]95P\CK
MT&+R'*$'DBX>#&SRPT>L*ZJ/F=$$ $9>,T==8+V!$_9!#1",_*SHJ&.49XW9
MNZCMC37*VA2!(%\7B&AAY#]#RE;?&U)>H:"4SV3AIWIJTS7+VEQMVKT4?<=3
MHMQ0&:K-FE3^8P5.L"75MAQ?8/G*VD$J,<2@ L89IE/1=JA_.5E^L/8,J\B?
MY9\*5&YP@AR*REV^4M?%3_KR(ODP5O G@T4O@@4YPU3O?OD+>JJZ/?O222$4
M 1KK=VDT^EJ>&C6F:@6)UVJ0 ',J)#%-M4X*M'-2-W01^'8PN\K-T_PD2M)E
MV</P(GF&;AAL:VVO5M>1!1#S^?@@#AN@742;[T\[IM$"8/;O%VL>./9Z(_Q\
MV2'SL?EH&V]^@^VIYEVOY*MI"A,IZ_"M)&\WFH)EK\'L)!C;VRRJ-R\7@('I
MK=D)@*-MDV'.]^9U9I42A6[SJO>TD"LK.;\/>M 5LK04"Q4P^[?")_4,6[K!
MCR8CR.HIM@ 9S+Z6.[N@[&+S'WF5_!T)'0^&1[W9F75C__G<O#P^,G^.9TT3
MZ-'SL[?8M*@E09^2;] SZ.7Q _IY_&,^0N]R0\M0Z#OR,WFSO( ^H_2@W\^K
MWDMV1[FU"V#L&B^B;]!GZ#G9!7J\=&X,4\"^;,H'Z%WT)'H-?8Q^RZY[J]&S
MZ"_T\?@2O6H>*+2B!]"WZ#'T.7H8O>%$?IC,DF;(YV-<E0+Z?'J>[W:?=TZW
MKX'S4_K5DU&-O;:9_TTAU3+SLNOU6ES^L>:E'\M_$H+S"/HRW(]>.#:B[QL)
MZ4_TQNH)O9K>2 ^D=]#KZ"'T!OJ!6X#E0R^3I\BSZ7'T;OH[?>J=0W^@I]$7
MZ17T-WHD?: >1H^GE]%/C0[U%?H%_9]>46\Y>M,3ZO7T101(/8C>3W^,;]-7
MZG7T'W4A3;:L:O0J4!:M[YI%4#$X/-\1[2ZJ%Z#-X4=A[I[C8Y%=-&]9D$'\
M42634[?,PNQ]1W_TT;EUV]IN"OH>G6M^0Y^G)]0UY5MNF^:NT#^]/L]W.[WH
MT([U6WEF_>HI++13&].SY5W78WDL/6Q^'>534P'TW6A31[4N_5R^+J\L1A-K
MZXT^#+FA7---)\2>S\B!Z=/UF;F=Y$-N4]]Z<]?SZE'T"Y@0]G">5CBI!]+)
MD:;6JY)YD]6:6"^C[[M!Z[5"%WI_/9T:.1:S>VD1['GT82%-?9^^7@]T2]BW
M[!;VZ.R&?:::%@:G3[NIZ\?L!_N*?;_^8B^D\\?[)4[3<AW^O.#F9#>G1]0?
MZ8/T.OIS?<%^97]VD=CGY"7UG7I _:>>43^H-_I8VX#Q?#6W7%AH%425?]B+
MZ('VPOC^_$!>.,<G.\./#+GIBD7XPQK>.W=W_ HD!09-==KG@Y5/:I]H(@K0
M?-P]?E:ER*R>:PG1!B2S4SV/H4OMJA;I87XAPJN32JQ(PRB%E$D:[M"@EEX_
M!@! (@#F:DCTIE "B &$9GT0.@ =@ @@#! DK8S=X]GVO @1 +>BR..V/^'"
M[>6;MM7>Y6!'^L9<A:ZN[?'F&>%DZ>'V<2^WEQ+>'>KV &N\7=X^XV#_R7BR
M /KV5BK\N@B "T 'H)W$ ,P J7M2\EDR:0YKF@*$N5&L[8'R>^W^=N_KRMW[
MCJ3UDWN2@=K>@<2VS]Q#H-_V\$LI\]S^<U^7MML'K&T1HWL2]-[^=.^WY_($
M[@?WA?LZ%$D!<5^%6MQOF)"D%"75Y>9179&E#]ZW4"KWI+'+O2##>&\PY]PK
M[SWW;0#0_?;ZV:2W-]VC[HE JGO6O>L>=H^_?] 50K#/89WK/>$^9NK!V-[C
MS1/WWOM$=94U?$^'@-RSM*G,BUL'$M@69B &4.#S0MWW:J^)^A<@O< R6-['
M[YOWH7N\O4.@=(\5R'A"$AJFUVV'D _>]^<,> +,A#XV?O&/0/_UWH6(M_/
MWB;J$WR*0P6_<4\[:N!K?^-)6J0-OC+'@R^_O]NWCT0 (_R0: E_GL8-@WI)
M,64\0GS!:O,W@O].&>%#5WGX&/QTD :?@T\6(.*#\.?W2/R9A1+_= \#B-VO
ML[;+;QXH/A=_$_B[5[WC\/6VW%4L?O(^@T_%#PE$\;OX\/LB_O/^V93$[]N3
M\5/W_<3B*D#N)@<N@50B> 3W48/"_0:?1*>XC^'[U1OX/7P:?IKX57#'CVN5
MY3WJ H$V=&. @)'0ED/7@WKLM[]7_4D@)4!VWRP+!/[0K0QP%*22T<W8/JN[
M*3+:C&AHM"O_#]\D2-&A<LL#KB8!NV*I6)*(Q[8#;SO4&(,I@?^)!;J3OLH>
M(Q%W.O-8_EBV/:AKCE6XHO\CEWP2[3$?-&6+N&?XG)3YS?%I/ET5(%OACN9?
M91_;KLEGOJJK"B")SL[*M8_YP:XA[FN@/+#2QN:W4*;YZ %U]) VG)_+!^<;
M:5U-LVYM8HH.GF\:L/30\]$#Q?RQK#:_*.W/O^?357/=.PQO?H <"<":E W$
M\S=(I)$_ZC6_:<X>:.CG\B/Z,Z%:_C>_HA_SWN;/+K@FY'R%/LG -.O0-PUL
MD*H1C[%+2JOBD@+6\<Z2]'/Y*'VOT\CMIM'-AW2FZ*H +_UM_H9YVC$3"A?5
M $+Z-OVK;/> "$W-/^G7/&3Z*_V)OG=VJ"]K@ND?]57Z-'V-_E@V-% ::.KK
M],-%//W.9D( J)_%OJ)&0-$ KXAD8 =]-#V3(.SL:]T?MZ.Z^O3B.*A3*$=D
M :@ ["$6J%9ZF_UJBC4]\X/D=XLR5'Z&':2D3A#F"((&AH\3=X(5L3[7'U%S
MHV4)N/QM/EG@:<#>47YV11%[A(H$84O@7MPFR(P6]E74NF;T0 (HEQ]SP %4
MN9!#6Y7ZA;Q$ F&=M^PWHNGZKF@]);W(-*#JJG)I3=?HV(/ 0.[3(?#6N+V;
M]J'1J/T<*GJ@+EGC6%54N6Y$98T,E;\Z9R<3X?K(]4_[AOU6-&=?;?+9+XP]
M243[=Q&E"'&?''K9;["A YWDB(IG/FG$M1^CS@A00C;&N79U A&@*]= #@R(
M*:C[R'W,?FD'M5V4GODP]L' ;_4"85]?7H(42PXQD!>BQWW<OF$?U40;X.RW
M]AO[B8SN?"2^?N'FJ.7U]K\)T_W\?DD:M6\::]1%?N I'9!H4LGF*2&) :%4
M)<P2:VWN._3])R!]SXP&]$G? H*H;'9_N6]YV.YCVKK[7V>X@)@BO&_9%D@K
M(3 "U"WT_E76KD_BMSS@]:M<3X*U]NO6_A!?>@ND"D@%W)T)T5[_^?3A?^=#
M$- &S_R1V$L@I^ YMN_0>)U/M_VQ['H_R3\2P\?A^._[@AZ[AF,?K@[9]Q#>
M163\8UG&4_^QQF]Y4#=<^4O[H/W<!'0?J0'F)QGD4(65J_TJ_W_?'04HA>V?
MCII-8@K:/DG"MM_F;Z'H]IT O/V1V)S?)(H'3=YV6%H $ \+"-6GSX\5Y[Y1
M^7E9@_XG 7$?.N'<C\0S^C/ _7W%/B\+5W?EG_2_"@B_"(TGR:6_P1^ OR2-
<Q+[C-8 K_UH;.B%7F?OHY1@1RL^2C8=_TSWJ!O2_
end

View File

@@ -0,0 +1,856 @@
From: hedrick@dartagnan.rutgers.edu (Charles Hedrick)
Newsgroups: alt.os.linux
Subject: cdiffs for 0.95a from Linus for alpha testing
Message-ID: <Mar.21.19.15.22.1992.4251@dartagnan.rutgers.edu>
Date: 22 Mar 92 00:15:22 GMT
Organization: Rutgers Univ., New Brunswick, N.J.
Lines: 845
The following cdiffs come from Linus. He's had trouble getting
postings out. They are alpha -- only for people who like to test
things. They appear to fix some of the problems with multiple disks,
and some problems with serial lines. I can't be sure about that.
They do fix my problem with gdb getting "bad things happen".
If the posting from Linus shows up, the diffs in that posting
should be identical to these.
*** OLD/linux/kernel/chr_drv/console.c Fri Mar 13 00:37:07 1992
--- linux/kernel/chr_drv/console.c Thu Mar 19 21:15:03 1992
***************
*** 456,462 ****
p++;
}
sti();
! copy_to_cooked(tty);
}
static void insert_char(int currcons)
--- 456,462 ----
p++;
}
sti();
! TTY_READ_FLUSH(tty);
}
static void insert_char(int currcons)
***************
*** 823,829 ****
void do_keyboard_interrupt(void)
{
! copy_to_cooked(TTY_TABLE(0));
timer_active &= ~(1<<BLANK_TIMER);
if (console_blanked) {
timer_table[BLANK_TIMER].expires = 0;
--- 823,829 ----
void do_keyboard_interrupt(void)
{
! TTY_READ_FLUSH(TTY_TABLE(0));
timer_active &= ~(1<<BLANK_TIMER);
if (console_blanked) {
timer_table[BLANK_TIMER].expires = 0;
*** OLD/linux/kernel/chr_drv/tty_ioctl.c Thu Mar 12 23:51:41 1992
--- linux/kernel/chr_drv/tty_ioctl.c Thu Mar 19 21:27:07 1992
***************
*** 260,270 ****
switch (arg) {
case TCOOFF:
tty->stopped = 1;
! TTY_WRITE(tty);
return 0;
case TCOON:
tty->stopped = 0;
! TTY_WRITE(tty);
return 0;
case TCIOFF:
if (STOP_CHAR(tty))
--- 260,270 ----
switch (arg) {
case TCOOFF:
tty->stopped = 1;
! TTY_WRITE_FLUSH(tty);
return 0;
case TCOON:
tty->stopped = 0;
! TTY_WRITE_FLUSH(tty);
return 0;
case TCIOFF:
if (STOP_CHAR(tty))
*** OLD/linux/kernel/chr_drv/tty_io.c Tue Mar 17 22:46:46 1992
--- linux/kernel/chr_drv/tty_io.c Thu Mar 19 21:27:07 1992
***************
*** 129,141 ****
printk("copy_to_cooked: missing queues\n\r");
return;
}
- cli();
- if (tty->busy) {
- sti();
- return;
- }
- tty->busy = 1;
- sti();
while (1) {
if (EMPTY(tty->read_q))
break;
--- 129,134 ----
***************
*** 232,242 ****
PUTCH(c,tty->write_q);
}
PUTCH(c,tty->secondary);
}
- tty->write(tty);
- tty->busy = 0;
if (!EMPTY(tty->secondary))
wake_up(&tty->secondary->proc_list);
}
/*
--- 225,236 ----
PUTCH(c,tty->write_q);
}
PUTCH(c,tty->secondary);
+ TTY_WRITE_FLUSH(tty);
}
if (!EMPTY(tty->secondary))
wake_up(&tty->secondary->proc_list);
+ if (LEFT(tty->write_q) > TTY_BUF_SIZE/2)
+ wake_up(&tty->write_q->proc_list);
}
/*
***************
*** 305,314 ****
time = current->timeout = 0;
if (minimum>nr)
minimum = nr;
! copy_to_cooked(tty);
while (nr>0) {
if (other_tty && other_tty->write)
! TTY_WRITE(other_tty);
cli();
if (EMPTY(tty->secondary) || (L_CANON(tty) &&
!FULL(tty->read_q) && !tty->secondary->data)) {
--- 299,308 ----
time = current->timeout = 0;
if (minimum>nr)
minimum = nr;
! TTY_READ_FLUSH(tty);
while (nr>0) {
if (other_tty && other_tty->write)
! TTY_WRITE_FLUSH(other_tty);
cli();
if (EMPTY(tty->secondary) || (L_CANON(tty) &&
!FULL(tty->read_q) && !tty->secondary->data)) {
***************
*** 320,326 ****
break;
interruptible_sleep_on(&tty->secondary->proc_list);
sti();
! copy_to_cooked(tty);
continue;
}
sti();
--- 314,320 ----
break;
interruptible_sleep_on(&tty->secondary->proc_list);
sti();
! TTY_READ_FLUSH(tty);
continue;
}
sti();
***************
*** 398,404 ****
cr_flag = 0;
PUTCH(c,tty->write_q);
}
! TTY_WRITE(tty);
if (nr>0)
schedule();
}
--- 392,398 ----
cr_flag = 0;
PUTCH(c,tty->write_q);
}
! TTY_WRITE_FLUSH(tty);
if (nr>0)
schedule();
}
*** OLD/linux/kernel/chr_drv/serial.c Sat Mar 14 20:16:21 1992
--- linux/kernel/chr_drv/serial.c Thu Mar 19 21:15:03 1992
***************
*** 26,47 ****
static void com1_timer(void)
{
! copy_to_cooked(tty_table+64);
}
static void com2_timer(void)
{
! copy_to_cooked(tty_table+65);
}
static void com3_timer(void)
{
! copy_to_cooked(tty_table+66);
}
static void com4_timer(void)
{
! copy_to_cooked(tty_table+67);
}
static inline void do_rs_write(unsigned int port)
--- 26,47 ----
static void com1_timer(void)
{
! TTY_READ_FLUSH(tty_table+64);
}
static void com2_timer(void)
{
! TTY_READ_FLUSH(tty_table+65);
}
static void com3_timer(void)
{
! TTY_READ_FLUSH(tty_table+66);
}
static void com4_timer(void)
{
! TTY_READ_FLUSH(tty_table+67);
}
static inline void do_rs_write(unsigned int port)
*** OLD/linux/kernel/chr_drv/pty.c Sat Jan 11 01:56:45 1992
--- linux/kernel/chr_drv/pty.c Thu Mar 19 21:15:03 1992
***************
*** 25,31 ****
if (FULL(to->read_q)) {
if (FULL(to->secondary))
break;
! copy_to_cooked(to);
continue;
}
GETCH(from->write_q,c);
--- 25,31 ----
if (FULL(to->read_q)) {
if (FULL(to->secondary))
break;
! TTY_READ_FLUSH(to);
continue;
}
GETCH(from->write_q,c);
***************
*** 33,39 ****
if (current->signal & ~current->blocked)
break;
}
! copy_to_cooked(to);
wake_up(&from->write_q->proc_list);
}
--- 33,39 ----
if (current->signal & ~current->blocked)
break;
}
! TTY_READ_FLUSH(to);
wake_up(&from->write_q->proc_list);
}
*** OLD/linux/kernel/blk_drv/hd.c Sun Mar 15 20:46:53 1992
--- linux/kernel/blk_drv/hd.c Fri Mar 20 00:20:49 1992
***************
*** 82,88 ****
--- 82,90 ----
int minor, i;
struct buffer_head *bh;
struct partition *p;
+ unsigned long first_sector;
+ first_sector = hd[MINOR(dev)].start_sect;
if (!(bh = bread(dev,0))) {
printk("Unable to read partition table of device %04x\n",dev);
return;
***************
*** 93,99 ****
for (i=0 ; i<4 ; i++,p++) {
if (!(hd[i+minor].nr_sects = p->nr_sects))
continue;
! hd[i+minor].start_sect = p->start_sect;
if ((current_minor & 0x3f) >= 60)
continue;
if (p->sys_ind == EXTENDED_PARTITION) {
--- 95,101 ----
for (i=0 ; i<4 ; i++,p++) {
if (!(hd[i+minor].nr_sects = p->nr_sects))
continue;
! hd[i+minor].start_sect = first_sector + p->start_sect;
if ((current_minor & 0x3f) >= 60)
continue;
if (p->sys_ind == EXTENDED_PARTITION) {
***************
*** 141,156 ****
hd_info[drive].sect = *(unsigned char *) (14+BIOS);
BIOS += 16;
}
- if (hd_info[1].cyl)
- NR_HD=2;
- else
- NR_HD=1;
- #endif
- for (i=0 ; i<NR_HD ; i++) {
- hd[i<<6].start_sect = 0;
- hd[i<<6].nr_sects = hd_info[i].head*
- hd_info[i].sect*hd_info[i].cyl;
- }
/*
We querry CMOS about hard disks : it could be that
--- 143,148 ----
***************
*** 181,190 ****
NR_HD = 1;
else
NR_HD = 0;
! for (i = NR_HD ; i < 2 ; i++) {
! hd[i<<6].start_sect = 0;
! hd[i<<6].nr_sects = 0;
}
for (drive=0 ; drive<NR_HD ; drive++) {
current_minor = 1+(drive<<6);
check_partition(0x0300+(drive<<6));
--- 173,186 ----
NR_HD = 1;
else
NR_HD = 0;
! #endif
! for (i = 0 ; i < (MAX_HD<<6) ; i++) {
! hd[i].start_sect = 0;
! hd[i].nr_sects = 0;
}
+ for (i = 0 ; i < NR_HD ; i++)
+ hd[i<<6].nr_sects = hd_info[i].head*
+ hd_info[i].sect*hd_info[i].cyl;
for (drive=0 ; drive<NR_HD ; drive++) {
current_minor = 1+(drive<<6);
check_partition(0x0300+(drive<<6));
*** OLD/linux/kernel/ptrace.c Tue Mar 17 23:38:37 1992
--- linux/kernel/ptrace.c Thu Mar 19 23:49:42 1992
***************
*** 22,30 ****
/* set's the trap flag. */
#define TRAP_FLAG 0x100
- /* check's for granularity. */
- #define GRANULARITY 0x00800000
-
/*
* this is the number to subtract from the top of the stack. To find
* the local frame.
--- 22,27 ----
***************
*** 51,58 ****
* the offset is how far from the base addr as stored in the TSS.
* this routine assumes that all the priviledged stacks are in our
* data space.
! */
!
static inline int get_stack_long(struct task_struct *task, int offset)
{
unsigned char *stack;
--- 48,54 ----
* the offset is how far from the base addr as stored in the TSS.
* this routine assumes that all the priviledged stacks are in our
* data space.
! */
static inline int get_stack_long(struct task_struct *task, int offset)
{
unsigned char *stack;
***************
*** 69,213 ****
* data space.
*/
static inline int put_stack_long(struct task_struct *task, int offset,
! unsigned short data)
{
unsigned char * stack;
stack = (unsigned char *) task->tss.esp0;
stack += offset;
! *(int *) stack = data;
return 0;
}
/*
! * this routine will get a word out of an arbitrary
! * tasks data space. It likes to have the task number
! * rather than the task pointer. Perhaps the number
! * should be included in the pointer.
*/
! /* seg = 0 if I space */
! static inline int get_long(int tsk, long addr, unsigned seg, int *data)
{
- int i;
- int limit;
- int cur;
- unsigned long address;
unsigned long page;
- unsigned oldfs;
! /* find the task number of the current task. */
! for (i = 0; i < NR_TASKS ; i ++) {
! if (task[i] == current) break;
}
- if (i == NR_TASKS) {
- printk("PTRACE: Can't find current task\n");
- do_exit(SIGSEGV);
- }
- cur = i;
-
- /* we will need to check the readability of the segment
- and then the byte in order to avoid segment violations. */
- seg++;
- limit = (task[tsk]->ldt[seg].a) & 0xffff;
- /* this should be constant amound all of our segments, but we
- had better check anyway. */
- if (task[tsk]->ldt[seg].b & GRANULARITY)
- limit = limit << 12;
-
- if (limit <= addr+4)
- return -EIO;
-
- /* Now compute the address, and make sure that it is present. */
- address = task[tsk]->start_code + addr;
-
- page = *((unsigned long*) ((address >> 20) & 0xffc));
- /* see if it is present. */
if (!(page & PAGE_PRESENT)) {
! do_no_page(0, address, task[tsk]);
}
!
! oldfs = get_fs();
! /* now convert seg to the right format. */
! seg = (seg << 3) | 0x4;
!
! cli(); /* we are about to change our ldt, we better do it
! with interrupts off. Perhaps we should call schedule
! first so that we won't be taking too much extra time. */
! lldt(tsk);
! set_fs(seg);
! *data = get_fs_long((void *)addr); /* we are assuming kernel space
! is in the gdt here. */
! lldt(cur);
! set_fs(oldfs);
! sti();
! return 0;
}
/*
! * this routine will get a word out of an arbitrary
! * tasks data space. It likes to have the task number
! * rather than the task pointer. Perhaps the number
! * should be included in the pointer.
*/
! /* seg = 0 if I space */
! static inline int put_long(int tsk, long addr, int data, unsigned seg)
{
- int i;
- int limit;
- unsigned oldfs;
- unsigned long address;
unsigned long page;
- int cur;
! /* find the task number of the current task. */
! for (i = 0; i < NR_TASKS ; i++) {
! if (task[i] == current) break;
}
! if (i == NR_TASKS) {
! printk("PTRACE: Can't find current task\n");
! do_exit(SIGSEGV);
}
! cur = i;
! /* we will need to check the readability of the segment
! and then the byte in order to avoid segment violations. */
! seg++;
! limit = (task[tsk]->ldt[seg].a) & 0xffff;
! /* this should be constant amound all of our segments, but we
! had better check anyway. */
! if (task[tsk]->ldt[seg].b & GRANULARITY)
! limit = limit << 12;
! if (limit <= addr+4)
return -EIO;
! /* Now compute the address, and make sure that it is present. */
! address = task[tsk]->start_code + addr;
! page = *((unsigned long*) ((address >> 20) & 0xffc));
! /* see if it is present. */
! if (!(page & PAGE_PRESENT)) {
! do_no_page(0, address, task[tsk]);
! }
! write_verify(address);
!
! oldfs=get_fs();
! /* now convert seg to the right format. */
! seg = (seg << 3) | 0x4;
!
! cli(); /* we are about to change our ldt, we better do it
! with interrupts off. Perhaps we should call schedule
! first so that we won't be taking too much extra time. */
! lldt(tsk);
! set_fs(seg);
! put_fs_long(data,(void *)addr);
! lldt(cur);
! set_fs(oldfs);
! sti();
return 0;
}
-
/* Perform ptrace(request, pid, addr, data) syscall */
int sys_ptrace(unsigned long *buffer)
{
--- 65,223 ----
* data space.
*/
static inline int put_stack_long(struct task_struct *task, int offset,
! unsigned long data)
{
unsigned char * stack;
stack = (unsigned char *) task->tss.esp0;
stack += offset;
! *(unsigned long *) stack = data;
return 0;
}
/*
! * This routine gets a long from any process space by following the page
! * tables. NOTE! You should check that the long isn't on a page boundary,
! * and that it is in the task area before calling this: this routine does
! * no checking.
! *
! * NOTE2! This uses "tsk->tss.cr3" even though we know it's currently always
! * zero. This routine shouldn't have to change when we make a better mm.
*/
! static unsigned long get_long(struct task_struct * tsk,
! unsigned long addr)
{
unsigned long page;
! addr += tsk->start_code;
! repeat:
! page = tsk->tss.cr3 + ((addr >> 20) & 0xffc);
! page = *(unsigned long *) page;
! if (page & PAGE_PRESENT) {
! page &= 0xfffff000;
! page += (addr >> 10) & 0xffc;
! page = *((unsigned long *) page);
}
if (!(page & PAGE_PRESENT)) {
! do_no_page(0,addr,tsk);
! goto repeat;
}
! page &= 0xfffff000;
! page += addr & 0xfff;
! return *(unsigned long *) page;
}
/*
! * This routine puts a long into any process space by following the page
! * tables. NOTE! You should check that the long isn't on a page boundary,
! * and that it is in the task area before calling this: this routine does
! * no checking.
*/
! static void put_long(struct task_struct * tsk, unsigned long addr,
! unsigned long data)
{
unsigned long page;
! addr += tsk->start_code;
! repeat:
! page = tsk->tss.cr3 + ((addr >> 20) & 0xffc);
! page = *(unsigned long *) page;
! if (page & PAGE_PRESENT) {
! page &= 0xfffff000;
! page += (addr >> 10) & 0xffc;
! page = *((unsigned long *) page);
}
! if (!(page & PAGE_PRESENT)) {
! do_no_page(0,addr,tsk);
! goto repeat;
}
! if (!(page & PAGE_RW)) {
! write_verify(addr);
! goto repeat;
! }
! page &= 0xfffff000;
! page += addr & 0xfff;
! *(unsigned long *) page = data;
! }
! /*
! * This routine checks the page boundaries, and that the offset is
! * within the task area. It then calls get_long() to read a long.
! */
! static int read_long(struct task_struct * tsk, unsigned long addr,
! unsigned long * result)
! {
! unsigned long low,high;
! if (addr > TASK_SIZE-4)
return -EIO;
+ if ((addr & 0xfff) > PAGE_SIZE-4) {
+ low = get_long(tsk,addr & 0xfffffffc);
+ high = get_long(tsk,(addr+4) & 0xfffffffc);
+ switch (addr & 3) {
+ case 1:
+ low >>= 8;
+ low |= high << 24;
+ break;
+ case 2:
+ low >>= 16;
+ low |= high << 16;
+ break;
+ case 3:
+ low >>= 16;
+ low |= high << 16;
+ break;
+ }
+ *result = low;
+ } else
+ *result = get_long(tsk,addr);
+ return 0;
+ }
! /*
! * This routine checks the page boundaries, and that the offset is
! * within the task area. It then calls put_long() to write a long.
! */
! static int write_long(struct task_struct * tsk, unsigned long addr,
! unsigned long data)
! {
! unsigned long low,high;
! if (addr > TASK_SIZE-4)
! return -EIO;
! if ((addr & 0xfff) > PAGE_SIZE-4) {
! low = get_long(tsk,addr & 0xfffffffc);
! high = get_long(tsk,(addr+4) & 0xfffffffc);
! switch (addr & 3) {
! case 0: /* shouldn't happen, but safety first */
! low = data;
! break;
! case 1:
! low &= 0x000000ff;
! low |= data << 8;
! high &= 0xff000000;
! high |= data >> 8;
! break;
! case 2:
! low &= 0x0000ffff;
! low |= data << 16;
! high &= 0xffff0000;
! high |= data >> 16;
! break;
! case 3:
! low &= 0x00ffffff;
! low |= data << 24;
! high &= 0xffffff00;
! high |= data >> 24;
! break;
! }
! put_long(tsk,addr & 0xfffffffc,low);
! put_long(tsk,(addr+4) & 0xfffffffc,high);
! } else
! put_long(tsk,addr,data);
return 0;
}
/* Perform ptrace(request, pid, addr, data) syscall */
int sys_ptrace(unsigned long *buffer)
{
***************
*** 244,250 ****
case 2: {
int tmp,res;
! res = get_long(childno, addr, 1, &tmp);
if (res < 0)
return res;
verify_area((void *) data, 4);
--- 254,260 ----
case 2: {
int tmp,res;
! res = read_long(task[childno], addr, &tmp);
if (res < 0)
return res;
verify_area((void *) data, 4);
***************
*** 267,280 ****
/* when I and D space are seperate, this will have to be fixed. */
case 4: /* write the word at location addr. */
case 5:
! if (put_long(childno, addr, data, 1))
! return -EIO;
! return 0;
case 6: /* write the word at location addr in the USER area */
addr = addr >> 2; /* temproary hack. */
if (addr < 0 || addr >= 17)
! return -EIO;
if (addr == ORIG_EAX)
return -EIO;
if (addr == EFL) { /* flags. */
--- 277,288 ----
/* when I and D space are seperate, this will have to be fixed. */
case 4: /* write the word at location addr. */
case 5:
! return write_long(task[childno],addr,data);
case 6: /* write the word at location addr in the USER area */
addr = addr >> 2; /* temproary hack. */
if (addr < 0 || addr >= 17)
! return -EIO;
if (addr == ORIG_EAX)
return -EIO;
if (addr == EFL) { /* flags. */
***************
*** 281,287 ****
data &= FLAG_MASK;
data |= get_stack_long(child, EFL*4-MAGICNUMBER) & ~FLAG_MASK;
}
-
if (put_stack_long(child, 4*addr-MAGICNUMBER, data))
return -EIO;
return 0;
--- 289,294 ----
*** OLD/linux/mm/memory.c Tue Mar 17 22:35:13 1992
--- linux/mm/memory.c Thu Mar 19 23:19:03 1992
***************
*** 429,436 ****
return 0;
}
! void do_no_page(unsigned long error_code,
! unsigned long address, struct task_struct *tsk)
{
static unsigned int last_checked = 0;
int nr[4];
--- 429,436 ----
return 0;
}
! void do_no_page(unsigned long error_code, unsigned long address,
! struct task_struct *tsk)
{
static unsigned int last_checked = 0;
int nr[4];
***************
*** 439,445 ****
int block,i;
struct inode * inode;
! /* Trashing ? Make it interruptible, but don't penalize otherwise */
for (i = 0; i < CHECK_LAST_NR; i++)
if ((address & 0xfffff000) == last_pages[i]) {
current->counter = 0;
--- 439,445 ----
int block,i;
struct inode * inode;
! /* Thrashing ? Make it interruptible, but don't penalize otherwise */
for (i = 0; i < CHECK_LAST_NR; i++)
if ((address & 0xfffff000) == last_pages[i]) {
current->counter = 0;
***************
*** 492,499 ****
return;
}
if (tsk == current)
! if (share_page(inode,tmp))
! return;
if (!(page = get_free_page()))
oom();
/* remember that 1 block is used for header */
--- 492,499 ----
return;
}
if (tsk == current)
! if (share_page(inode,tmp))
! return;
if (!(page = get_free_page()))
oom();
/* remember that 1 block is used for header */
*** OLD/linux/include/linux/tty.h Sun Mar 15 02:43:54 1992
--- linux/include/linux/tty.h Thu Mar 19 21:16:26 1992
***************
*** 68,83 ****
struct tty_queue *secondary;
};
! #define TTY_WRITE(tty) \
do { \
cli(); \
! if (!(tty)->busy) { \
! (tty)->busy = 1; \
sti(); \
(tty)->write((tty)); \
! (tty)->busy = 0; \
! } else \
sti(); \
} while (0)
extern struct tty_struct tty_table[];
--- 68,105 ----
struct tty_queue *secondary;
};
! /*
! * so that interrupts won't be able to mess up the
! * queues, copy_to_cooked must be atomic with repect
! * to itself, as must tty->write.
! */
! #define TTY_WRITE_BUSY 1
! #define TTY_READ_BUSY 2
!
! #define TTY_WRITE_FLUSH(tty) \
do { \
cli(); \
! if (!EMPTY((tty)->write_q) && !(TTY_WRITE_BUSY & (tty)->busy)) { \
! (tty)->busy |= TTY_WRITE_BUSY; \
sti(); \
(tty)->write((tty)); \
! cli(); \
! (tty)->busy &= ~TTY_WRITE_BUSY; \
! } \
! sti(); \
! } while (0)
!
! #define TTY_READ_FLUSH(tty) \
! do { \
! cli(); \
! if (!EMPTY((tty)->read_q) && !(TTY_READ_BUSY & (tty)->busy)) { \
! (tty)->busy |= TTY_READ_BUSY; \
sti(); \
+ copy_to_cooked((tty)); \
+ cli(); \
+ (tty)->busy &= ~TTY_READ_BUSY; \
+ } \
+ sti(); \
} while (0)
extern struct tty_struct tty_table[];

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,114 @@
From: mper@uipsuxb.ps.uiuc.edu (Michael Pereckas)
This patch for linux/kernel/chr_drv/keyboard.S does two things: it
causes the ./del key on the keypad to produce a period, instead of a
comma, and it adds a Dvorak keyboard.
The first change will probably appeal to US users. Others may prefer
the comma. If there is a lot of difference of opinion on this, maybe
num_table should be moved into the national keyboard definitions. The
second change is great if you, like me, like the Dvorak keyboard
layout. Unfortunatly, the only way to change keyboards is to reboot
with a different kernel, so the Dvorak keyboard is a problem is more
than one person use the machine and they don't all know Dvorak. (this
only effects the console, serial port connections are uneffected.)
I post this on the off chance that someone is interested. If you
choose to use this, remember that although it seems to work fine for
me, this is an example of "programming by meta-w", that is, I copied
the US keyboard definition (using the emacs command meta-w) and
modified it, without really understanding it.
This patch is for linux/kernel/chr_drv/keyboard.S
It works for all the 0.95* versions, I think (!)
********** CUT HERE **********
*** keyboard.S.ori Wed Apr 8 16:57:58 1992
--- keyboard.S Wed Apr 8 17:03:10 1992
***************
*** 18,23 ****
--- 18,24 ----
* KBD_FR for Frech keyboard
* KBD_UK for British extended keyboard
* KBD_DK for Danish keyboard
+ * KBD_DVORAK for Dvorak (US) keyboard
*/
.text
***************
*** 251,257 ****
.ascii "789-456+1230."
#else
num_table:
! .ascii "789-456+1230,"
#endif
cur_table:
.ascii "HA5-DGC+YB623"
--- 252,258 ----
.ascii "789-456+1230."
#else
num_table:
! .ascii "789-456+1230."
#endif
cur_table:
.ascii "HA5-DGC+YB623"
***************
*** 611,616 ****
--- 612,667 ----
.byte 0,0,0,0,0 /* 4A-4E */
.byte 0,0,0,0,0,0,0 /* 4F-55 */
.ascii "\\"
+ .fill 10,1,0
+
+ #elif defined(KBD_DVORAK)
+
+ key_map:
+ .byte 0,27
+ .ascii "1234567890\\="
+ .byte 127,9
+ .ascii "',.pyfgcrl/]"
+ .byte 13,0
+ .ascii "aoeuidhtns-"
+ .byte '`,0
+ .ascii "[;qjkxbmwvz"
+ .byte 0,'*,0,32 /* 36-39 */
+ .fill 16,1,0 /* 3A-49 */
+ .byte '-,0,0,0,'+ /* 4A-4E */
+ .byte 0,0,0,0,0,0,0 /* 4F-55 */
+ .byte '<
+ .fill 10,1,0
+
+ shift_map:
+ .byte 0,27
+ .ascii "!@#$%^&*()|+"
+ .byte 127,9
+ .ascii "\"<>PYFGCRL?}"
+ .byte 13,0
+ .ascii "AOEUIDHTNS_"
+ .byte '~,0
+ .ascii "{:QJKXBMWVZ"
+ .byte 0,'*,0,32 /* 36-39 */
+ .fill 16,1,0 /* 3A-49 */
+ .byte '-,0,0,0,'+ /* 4A-4E */
+ .byte 0,0,0,0,0,0,0 /* 4F-55 */
+ .byte '>
+ .fill 10,1,0
+
+ alt_map:
+ .byte 0,0
+ .ascii "\0@\0$\0\0{[]}\\\0"
+ .byte 0,0
+ .byte 0,0,0,0,0,0,0,0,0,0,0
+ .byte '~,13,0
+ .byte 0,0,0,0,0,0,0,0,0,0,0
+ .byte 0,0
+ .byte 0,0,0,0,0,0,0,0,0,0,0
+ .byte 0,0,0,0 /* 36-39 */
+ .fill 16,1,0 /* 3A-49 */
+ .byte 0,0,0,0,0 /* 4A-4E */
+ .byte 0,0,0,0,0,0,0 /* 4F-55 */
+ .byte '|
.fill 10,1,0
#else

View File

@@ -0,0 +1,34 @@
From: johnsonm@stolaf.edu (Michael K. Johnson)
Subject: changing keyboard repeat rate.
OK, I have gotten several requests for info on how to change the
keyboard repeat rate, so here goes. Note: I can't just give diffs,
because there are lots of options, and for heaven's sake it's only
three lines of code.
In boot/setup.S, there are the lines:
! set the keyboard repeat rate to the max
mov ax,#0x0305
mov bx,0x0000
int 0x16
If you don't want to change the repeat rate at all, just comment out
these lines by prefacing them with !'s. If you want something in the
middle, change the
mov bx,0x0000
to mov bx,0x????
where ???? is determined by (from Ralf Brown's interrupt list)
bh = delay value (0x00 = 250 ms to 0x03 = 1000 ms (one second))
this is the delay before the repeat starts happening
bl = repeat rate (0x00 = 30/sec to 0x0c = 10/sec [default] to 0x1f = 2/sec)
I use mov bx,0x0006
to delay 1/4 sec, then repeat at what I think is a comfortable rate.
I am too lazy to calculate the exact speed -- maybe 20/sec? ;-)
Hope this helps people.
michaelkjohnson
johnsonm@stolaf.edu

View File

@@ -0,0 +1,837 @@
*** OLD/linux/kernel/chr_drv/console.c Fri Mar 13 00:37:07 1992
--- linux/kernel/chr_drv/console.c Thu Mar 19 21:15:03 1992
***************
*** 456,462 ****
p++;
}
sti();
! copy_to_cooked(tty);
}
static void insert_char(int currcons)
--- 456,462 ----
p++;
}
sti();
! TTY_READ_FLUSH(tty);
}
static void insert_char(int currcons)
***************
*** 823,829 ****
void do_keyboard_interrupt(void)
{
! copy_to_cooked(TTY_TABLE(0));
timer_active &= ~(1<<BLANK_TIMER);
if (console_blanked) {
timer_table[BLANK_TIMER].expires = 0;
--- 823,829 ----
void do_keyboard_interrupt(void)
{
! TTY_READ_FLUSH(TTY_TABLE(0));
timer_active &= ~(1<<BLANK_TIMER);
if (console_blanked) {
timer_table[BLANK_TIMER].expires = 0;
*** OLD/linux/kernel/chr_drv/tty_ioctl.c Thu Mar 12 23:51:41 1992
--- linux/kernel/chr_drv/tty_ioctl.c Thu Mar 19 21:27:07 1992
***************
*** 260,270 ****
switch (arg) {
case TCOOFF:
tty->stopped = 1;
! TTY_WRITE(tty);
return 0;
case TCOON:
tty->stopped = 0;
! TTY_WRITE(tty);
return 0;
case TCIOFF:
if (STOP_CHAR(tty))
--- 260,270 ----
switch (arg) {
case TCOOFF:
tty->stopped = 1;
! TTY_WRITE_FLUSH(tty);
return 0;
case TCOON:
tty->stopped = 0;
! TTY_WRITE_FLUSH(tty);
return 0;
case TCIOFF:
if (STOP_CHAR(tty))
*** OLD/linux/kernel/chr_drv/tty_io.c Tue Mar 17 22:46:46 1992
--- linux/kernel/chr_drv/tty_io.c Thu Mar 19 21:27:07 1992
***************
*** 129,141 ****
printk("copy_to_cooked: missing queues\n\r");
return;
}
- cli();
- if (tty->busy) {
- sti();
- return;
- }
- tty->busy = 1;
- sti();
while (1) {
if (EMPTY(tty->read_q))
break;
--- 129,134 ----
***************
*** 232,242 ****
PUTCH(c,tty->write_q);
}
PUTCH(c,tty->secondary);
}
- tty->write(tty);
- tty->busy = 0;
if (!EMPTY(tty->secondary))
wake_up(&tty->secondary->proc_list);
}
/*
--- 225,236 ----
PUTCH(c,tty->write_q);
}
PUTCH(c,tty->secondary);
+ TTY_WRITE_FLUSH(tty);
}
if (!EMPTY(tty->secondary))
wake_up(&tty->secondary->proc_list);
+ if (LEFT(tty->write_q) > TTY_BUF_SIZE/2)
+ wake_up(&tty->write_q->proc_list);
}
/*
***************
*** 305,314 ****
time = current->timeout = 0;
if (minimum>nr)
minimum = nr;
! copy_to_cooked(tty);
while (nr>0) {
if (other_tty && other_tty->write)
! TTY_WRITE(other_tty);
cli();
if (EMPTY(tty->secondary) || (L_CANON(tty) &&
!FULL(tty->read_q) && !tty->secondary->data)) {
--- 299,308 ----
time = current->timeout = 0;
if (minimum>nr)
minimum = nr;
! TTY_READ_FLUSH(tty);
while (nr>0) {
if (other_tty && other_tty->write)
! TTY_WRITE_FLUSH(other_tty);
cli();
if (EMPTY(tty->secondary) || (L_CANON(tty) &&
!FULL(tty->read_q) && !tty->secondary->data)) {
***************
*** 320,326 ****
break;
interruptible_sleep_on(&tty->secondary->proc_list);
sti();
! copy_to_cooked(tty);
continue;
}
sti();
--- 314,320 ----
break;
interruptible_sleep_on(&tty->secondary->proc_list);
sti();
! TTY_READ_FLUSH(tty);
continue;
}
sti();
***************
*** 398,404 ****
cr_flag = 0;
PUTCH(c,tty->write_q);
}
! TTY_WRITE(tty);
if (nr>0)
schedule();
}
--- 392,398 ----
cr_flag = 0;
PUTCH(c,tty->write_q);
}
! TTY_WRITE_FLUSH(tty);
if (nr>0)
schedule();
}
*** OLD/linux/kernel/chr_drv/serial.c Sat Mar 14 20:16:21 1992
--- linux/kernel/chr_drv/serial.c Thu Mar 19 21:15:03 1992
***************
*** 26,47 ****
static void com1_timer(void)
{
! copy_to_cooked(tty_table+64);
}
static void com2_timer(void)
{
! copy_to_cooked(tty_table+65);
}
static void com3_timer(void)
{
! copy_to_cooked(tty_table+66);
}
static void com4_timer(void)
{
! copy_to_cooked(tty_table+67);
}
static inline void do_rs_write(unsigned int port)
--- 26,47 ----
static void com1_timer(void)
{
! TTY_READ_FLUSH(tty_table+64);
}
static void com2_timer(void)
{
! TTY_READ_FLUSH(tty_table+65);
}
static void com3_timer(void)
{
! TTY_READ_FLUSH(tty_table+66);
}
static void com4_timer(void)
{
! TTY_READ_FLUSH(tty_table+67);
}
static inline void do_rs_write(unsigned int port)
*** OLD/linux/kernel/chr_drv/pty.c Sat Jan 11 01:56:45 1992
--- linux/kernel/chr_drv/pty.c Thu Mar 19 21:15:03 1992
***************
*** 25,31 ****
if (FULL(to->read_q)) {
if (FULL(to->secondary))
break;
! copy_to_cooked(to);
continue;
}
GETCH(from->write_q,c);
--- 25,31 ----
if (FULL(to->read_q)) {
if (FULL(to->secondary))
break;
! TTY_READ_FLUSH(to);
continue;
}
GETCH(from->write_q,c);
***************
*** 33,39 ****
if (current->signal & ~current->blocked)
break;
}
! copy_to_cooked(to);
wake_up(&from->write_q->proc_list);
}
--- 33,39 ----
if (current->signal & ~current->blocked)
break;
}
! TTY_READ_FLUSH(to);
wake_up(&from->write_q->proc_list);
}
*** OLD/linux/kernel/blk_drv/hd.c Sun Mar 15 20:46:53 1992
--- linux/kernel/blk_drv/hd.c Fri Mar 20 00:20:49 1992
***************
*** 82,88 ****
--- 82,90 ----
int minor, i;
struct buffer_head *bh;
struct partition *p;
+ unsigned long first_sector;
+ first_sector = hd[MINOR(dev)].start_sect;
if (!(bh = bread(dev,0))) {
printk("Unable to read partition table of device %04x\n",dev);
return;
***************
*** 93,99 ****
for (i=0 ; i<4 ; i++,p++) {
if (!(hd[i+minor].nr_sects = p->nr_sects))
continue;
! hd[i+minor].start_sect = p->start_sect;
if ((current_minor & 0x3f) >= 60)
continue;
if (p->sys_ind == EXTENDED_PARTITION) {
--- 95,101 ----
for (i=0 ; i<4 ; i++,p++) {
if (!(hd[i+minor].nr_sects = p->nr_sects))
continue;
! hd[i+minor].start_sect = first_sector + p->start_sect;
if ((current_minor & 0x3f) >= 60)
continue;
if (p->sys_ind == EXTENDED_PARTITION) {
***************
*** 141,156 ****
hd_info[drive].sect = *(unsigned char *) (14+BIOS);
BIOS += 16;
}
- if (hd_info[1].cyl)
- NR_HD=2;
- else
- NR_HD=1;
- #endif
- for (i=0 ; i<NR_HD ; i++) {
- hd[i<<6].start_sect = 0;
- hd[i<<6].nr_sects = hd_info[i].head*
- hd_info[i].sect*hd_info[i].cyl;
- }
/*
We querry CMOS about hard disks : it could be that
--- 143,148 ----
***************
*** 181,190 ****
NR_HD = 1;
else
NR_HD = 0;
! for (i = NR_HD ; i < 2 ; i++) {
! hd[i<<6].start_sect = 0;
! hd[i<<6].nr_sects = 0;
}
for (drive=0 ; drive<NR_HD ; drive++) {
current_minor = 1+(drive<<6);
check_partition(0x0300+(drive<<6));
--- 173,186 ----
NR_HD = 1;
else
NR_HD = 0;
! #endif
! for (i = 0 ; i < (MAX_HD<<6) ; i++) {
! hd[i].start_sect = 0;
! hd[i].nr_sects = 0;
}
+ for (i = 0 ; i < NR_HD ; i++)
+ hd[i<<6].nr_sects = hd_info[i].head*
+ hd_info[i].sect*hd_info[i].cyl;
for (drive=0 ; drive<NR_HD ; drive++) {
current_minor = 1+(drive<<6);
check_partition(0x0300+(drive<<6));
*** OLD/linux/kernel/ptrace.c Tue Mar 17 23:38:37 1992
--- linux/kernel/ptrace.c Thu Mar 19 23:49:42 1992
***************
*** 22,30 ****
/* set's the trap flag. */
#define TRAP_FLAG 0x100
- /* check's for granularity. */
- #define GRANULARITY 0x00800000
-
/*
* this is the number to subtract from the top of the stack. To find
* the local frame.
--- 22,27 ----
***************
*** 51,58 ****
* the offset is how far from the base addr as stored in the TSS.
* this routine assumes that all the priviledged stacks are in our
* data space.
! */
!
static inline int get_stack_long(struct task_struct *task, int offset)
{
unsigned char *stack;
--- 48,54 ----
* the offset is how far from the base addr as stored in the TSS.
* this routine assumes that all the priviledged stacks are in our
* data space.
! */
static inline int get_stack_long(struct task_struct *task, int offset)
{
unsigned char *stack;
***************
*** 69,213 ****
* data space.
*/
static inline int put_stack_long(struct task_struct *task, int offset,
! unsigned short data)
{
unsigned char * stack;
stack = (unsigned char *) task->tss.esp0;
stack += offset;
! *(int *) stack = data;
return 0;
}
/*
! * this routine will get a word out of an arbitrary
! * tasks data space. It likes to have the task number
! * rather than the task pointer. Perhaps the number
! * should be included in the pointer.
*/
! /* seg = 0 if I space */
! static inline int get_long(int tsk, long addr, unsigned seg, int *data)
{
- int i;
- int limit;
- int cur;
- unsigned long address;
unsigned long page;
- unsigned oldfs;
! /* find the task number of the current task. */
! for (i = 0; i < NR_TASKS ; i ++) {
! if (task[i] == current) break;
}
- if (i == NR_TASKS) {
- printk("PTRACE: Can't find current task\n");
- do_exit(SIGSEGV);
- }
- cur = i;
-
- /* we will need to check the readability of the segment
- and then the byte in order to avoid segment violations. */
- seg++;
- limit = (task[tsk]->ldt[seg].a) & 0xffff;
- /* this should be constant amound all of our segments, but we
- had better check anyway. */
- if (task[tsk]->ldt[seg].b & GRANULARITY)
- limit = limit << 12;
-
- if (limit <= addr+4)
- return -EIO;
-
- /* Now compute the address, and make sure that it is present. */
- address = task[tsk]->start_code + addr;
-
- page = *((unsigned long*) ((address >> 20) & 0xffc));
- /* see if it is present. */
if (!(page & PAGE_PRESENT)) {
! do_no_page(0, address, task[tsk]);
}
!
! oldfs = get_fs();
! /* now convert seg to the right format. */
! seg = (seg << 3) | 0x4;
!
! cli(); /* we are about to change our ldt, we better do it
! with interrupts off. Perhaps we should call schedule
! first so that we won't be taking too much extra time. */
! lldt(tsk);
! set_fs(seg);
! *data = get_fs_long((void *)addr); /* we are assuming kernel space
! is in the gdt here. */
! lldt(cur);
! set_fs(oldfs);
! sti();
! return 0;
}
/*
! * this routine will get a word out of an arbitrary
! * tasks data space. It likes to have the task number
! * rather than the task pointer. Perhaps the number
! * should be included in the pointer.
*/
! /* seg = 0 if I space */
! static inline int put_long(int tsk, long addr, int data, unsigned seg)
{
- int i;
- int limit;
- unsigned oldfs;
- unsigned long address;
unsigned long page;
- int cur;
! /* find the task number of the current task. */
! for (i = 0; i < NR_TASKS ; i++) {
! if (task[i] == current) break;
}
! if (i == NR_TASKS) {
! printk("PTRACE: Can't find current task\n");
! do_exit(SIGSEGV);
}
! cur = i;
! /* we will need to check the readability of the segment
! and then the byte in order to avoid segment violations. */
! seg++;
! limit = (task[tsk]->ldt[seg].a) & 0xffff;
! /* this should be constant amound all of our segments, but we
! had better check anyway. */
! if (task[tsk]->ldt[seg].b & GRANULARITY)
! limit = limit << 12;
! if (limit <= addr+4)
return -EIO;
! /* Now compute the address, and make sure that it is present. */
! address = task[tsk]->start_code + addr;
! page = *((unsigned long*) ((address >> 20) & 0xffc));
! /* see if it is present. */
! if (!(page & PAGE_PRESENT)) {
! do_no_page(0, address, task[tsk]);
! }
! write_verify(address);
!
! oldfs=get_fs();
! /* now convert seg to the right format. */
! seg = (seg << 3) | 0x4;
!
! cli(); /* we are about to change our ldt, we better do it
! with interrupts off. Perhaps we should call schedule
! first so that we won't be taking too much extra time. */
! lldt(tsk);
! set_fs(seg);
! put_fs_long(data,(void *)addr);
! lldt(cur);
! set_fs(oldfs);
! sti();
return 0;
}
-
/* Perform ptrace(request, pid, addr, data) syscall */
int sys_ptrace(unsigned long *buffer)
{
--- 65,223 ----
* data space.
*/
static inline int put_stack_long(struct task_struct *task, int offset,
! unsigned long data)
{
unsigned char * stack;
stack = (unsigned char *) task->tss.esp0;
stack += offset;
! *(unsigned long *) stack = data;
return 0;
}
/*
! * This routine gets a long from any process space by following the page
! * tables. NOTE! You should check that the long isn't on a page boundary,
! * and that it is in the task area before calling this: this routine does
! * no checking.
! *
! * NOTE2! This uses "tsk->tss.cr3" even though we know it's currently always
! * zero. This routine shouldn't have to change when we make a better mm.
*/
! static unsigned long get_long(struct task_struct * tsk,
! unsigned long addr)
{
unsigned long page;
! addr += tsk->start_code;
! repeat:
! page = tsk->tss.cr3 + ((addr >> 20) & 0xffc);
! page = *(unsigned long *) page;
! if (page & PAGE_PRESENT) {
! page &= 0xfffff000;
! page += (addr >> 10) & 0xffc;
! page = *((unsigned long *) page);
}
if (!(page & PAGE_PRESENT)) {
! do_no_page(0,addr,tsk);
! goto repeat;
}
! page &= 0xfffff000;
! page += addr & 0xfff;
! return *(unsigned long *) page;
}
/*
! * This routine puts a long into any process space by following the page
! * tables. NOTE! You should check that the long isn't on a page boundary,
! * and that it is in the task area before calling this: this routine does
! * no checking.
*/
! static void put_long(struct task_struct * tsk, unsigned long addr,
! unsigned long data)
{
unsigned long page;
! addr += tsk->start_code;
! repeat:
! page = tsk->tss.cr3 + ((addr >> 20) & 0xffc);
! page = *(unsigned long *) page;
! if (page & PAGE_PRESENT) {
! page &= 0xfffff000;
! page += (addr >> 10) & 0xffc;
! page = *((unsigned long *) page);
}
! if (!(page & PAGE_PRESENT)) {
! do_no_page(0,addr,tsk);
! goto repeat;
}
! if (!(page & PAGE_RW)) {
! write_verify(addr);
! goto repeat;
! }
! page &= 0xfffff000;
! page += addr & 0xfff;
! *(unsigned long *) page = data;
! }
! /*
! * This routine checks the page boundaries, and that the offset is
! * within the task area. It then calls get_long() to read a long.
! */
! static int read_long(struct task_struct * tsk, unsigned long addr,
! unsigned long * result)
! {
! unsigned long low,high;
! if (addr > TASK_SIZE-4)
return -EIO;
+ if ((addr & 0xfff) > PAGE_SIZE-4) {
+ low = get_long(tsk,addr & 0xfffffffc);
+ high = get_long(tsk,(addr+4) & 0xfffffffc);
+ switch (addr & 3) {
+ case 1:
+ low >>= 8;
+ low |= high << 24;
+ break;
+ case 2:
+ low >>= 16;
+ low |= high << 16;
+ break;
+ case 3:
+ low >>= 16;
+ low |= high << 16;
+ break;
+ }
+ *result = low;
+ } else
+ *result = get_long(tsk,addr);
+ return 0;
+ }
! /*
! * This routine checks the page boundaries, and that the offset is
! * within the task area. It then calls put_long() to write a long.
! */
! static int write_long(struct task_struct * tsk, unsigned long addr,
! unsigned long data)
! {
! unsigned long low,high;
! if (addr > TASK_SIZE-4)
! return -EIO;
! if ((addr & 0xfff) > PAGE_SIZE-4) {
! low = get_long(tsk,addr & 0xfffffffc);
! high = get_long(tsk,(addr+4) & 0xfffffffc);
! switch (addr & 3) {
! case 0: /* shouldn't happen, but safety first */
! low = data;
! break;
! case 1:
! low &= 0x000000ff;
! low |= data << 8;
! high &= 0xff000000;
! high |= data >> 8;
! break;
! case 2:
! low &= 0x0000ffff;
! low |= data << 16;
! high &= 0xffff0000;
! high |= data >> 16;
! break;
! case 3:
! low &= 0x00ffffff;
! low |= data << 24;
! high &= 0xffffff00;
! high |= data >> 24;
! break;
! }
! put_long(tsk,addr & 0xfffffffc,low);
! put_long(tsk,(addr+4) & 0xfffffffc,high);
! } else
! put_long(tsk,addr,data);
return 0;
}
/* Perform ptrace(request, pid, addr, data) syscall */
int sys_ptrace(unsigned long *buffer)
{
***************
*** 244,250 ****
case 2: {
int tmp,res;
! res = get_long(childno, addr, 1, &tmp);
if (res < 0)
return res;
verify_area((void *) data, 4);
--- 254,260 ----
case 2: {
int tmp,res;
! res = read_long(task[childno], addr, &tmp);
if (res < 0)
return res;
verify_area((void *) data, 4);
***************
*** 267,280 ****
/* when I and D space are seperate, this will have to be fixed. */
case 4: /* write the word at location addr. */
case 5:
! if (put_long(childno, addr, data, 1))
! return -EIO;
! return 0;
case 6: /* write the word at location addr in the USER area */
addr = addr >> 2; /* temproary hack. */
if (addr < 0 || addr >= 17)
! return -EIO;
if (addr == ORIG_EAX)
return -EIO;
if (addr == EFL) { /* flags. */
--- 277,288 ----
/* when I and D space are seperate, this will have to be fixed. */
case 4: /* write the word at location addr. */
case 5:
! return write_long(task[childno],addr,data);
case 6: /* write the word at location addr in the USER area */
addr = addr >> 2; /* temproary hack. */
if (addr < 0 || addr >= 17)
! return -EIO;
if (addr == ORIG_EAX)
return -EIO;
if (addr == EFL) { /* flags. */
***************
*** 281,287 ****
data &= FLAG_MASK;
data |= get_stack_long(child, EFL*4-MAGICNUMBER) & ~FLAG_MASK;
}
-
if (put_stack_long(child, 4*addr-MAGICNUMBER, data))
return -EIO;
return 0;
--- 289,294 ----
*** OLD/linux/mm/memory.c Tue Mar 17 22:35:13 1992
--- linux/mm/memory.c Thu Mar 19 23:19:03 1992
***************
*** 429,436 ****
return 0;
}
! void do_no_page(unsigned long error_code,
! unsigned long address, struct task_struct *tsk)
{
static unsigned int last_checked = 0;
int nr[4];
--- 429,436 ----
return 0;
}
! void do_no_page(unsigned long error_code, unsigned long address,
! struct task_struct *tsk)
{
static unsigned int last_checked = 0;
int nr[4];
***************
*** 439,445 ****
int block,i;
struct inode * inode;
! /* Trashing ? Make it interruptible, but don't penalize otherwise */
for (i = 0; i < CHECK_LAST_NR; i++)
if ((address & 0xfffff000) == last_pages[i]) {
current->counter = 0;
--- 439,445 ----
int block,i;
struct inode * inode;
! /* Thrashing ? Make it interruptible, but don't penalize otherwise */
for (i = 0; i < CHECK_LAST_NR; i++)
if ((address & 0xfffff000) == last_pages[i]) {
current->counter = 0;
***************
*** 492,499 ****
return;
}
if (tsk == current)
! if (share_page(inode,tmp))
! return;
if (!(page = get_free_page()))
oom();
/* remember that 1 block is used for header */
--- 492,499 ----
return;
}
if (tsk == current)
! if (share_page(inode,tmp))
! return;
if (!(page = get_free_page()))
oom();
/* remember that 1 block is used for header */
*** OLD/linux/include/linux/tty.h Sun Mar 15 02:43:54 1992
--- linux/include/linux/tty.h Thu Mar 19 21:16:26 1992
***************
*** 68,83 ****
struct tty_queue *secondary;
};
! #define TTY_WRITE(tty) \
do { \
cli(); \
! if (!(tty)->busy) { \
! (tty)->busy = 1; \
sti(); \
(tty)->write((tty)); \
! (tty)->busy = 0; \
! } else \
sti(); \
} while (0)
extern struct tty_struct tty_table[];
--- 68,105 ----
struct tty_queue *secondary;
};
! /*
! * so that interrupts won't be able to mess up the
! * queues, copy_to_cooked must be atomic with repect
! * to itself, as must tty->write.
! */
! #define TTY_WRITE_BUSY 1
! #define TTY_READ_BUSY 2
!
! #define TTY_WRITE_FLUSH(tty) \
do { \
cli(); \
! if (!EMPTY((tty)->write_q) && !(TTY_WRITE_BUSY & (tty)->busy)) { \
! (tty)->busy |= TTY_WRITE_BUSY; \
sti(); \
(tty)->write((tty)); \
! cli(); \
! (tty)->busy &= ~TTY_WRITE_BUSY; \
! } \
! sti(); \
! } while (0)
!
! #define TTY_READ_FLUSH(tty) \
! do { \
! cli(); \
! if (!EMPTY((tty)->read_q) && !(TTY_READ_BUSY & (tty)->busy)) { \
! (tty)->busy |= TTY_READ_BUSY; \
sti(); \
+ copy_to_cooked((tty)); \
+ cli(); \
+ (tty)->busy &= ~TTY_READ_BUSY; \
+ } \
+ sti(); \
} while (0)
extern struct tty_struct tty_table[];

BIN
Linux-0.95/patchs/mouse.tar Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,100 @@
/* fdformat.c - Low-level formats a floppy disk. */
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/fd.h>
static int ctrl;
struct floppy_struct param;
#define SECTOR_SIZE 512
#define PERROR(msg) { perror(msg); exit(1); }
static void format_disk(char *name)
{
struct format_descr descr;
int track;
char dummy;
printf("Formatting ... ");
fflush(stdout);
if (ioctl(ctrl,FDFMTBEG,NULL) < 0) PERROR("\nioctl(FDFMTBEG)");
for (track = 0; track < param.track; track++) {
descr.track = track;
descr.head = 0;
if (ioctl(ctrl,FDFMTTRK,(int) &descr) < 0) PERROR("\nioctl(FDFMTTRK)");
printf("%3d\b\b\b",track);
fflush(stdout);
if (param.head == 2) {
descr.head = 1;
if (ioctl(ctrl,FDFMTTRK,(int) &descr) < 0)
PERROR("\nioctl(FDFMTTRK)");
}
}
if (ioctl(ctrl,FDFMTEND,NULL) < 0) PERROR("\nioctl(FDFMTEND)");
printf("done\n");
}
static void verify_disk(char *name)
{
unsigned char *data;
int fd,cyl_size,cyl,count;
cyl_size = param.sect*param.head*512;
if ((data = (unsigned char *) malloc(cyl_size)) == NULL) PERROR("malloc");
printf("Verifying ... ");
fflush(stdout);
if ((fd = open(name,O_RDONLY)) < 0) PERROR(name);
for (cyl = 0; cyl < param.track; cyl++) {
printf("%3d\b\b\b",cyl);
fflush(stdout);
if (read(fd,data,cyl_size) != cyl_size) PERROR("read");
for (count = 0; count < cyl_size; count++)
if (data[count] != FD_FILL_BYTE) {
printf("bad data in cyl %d\nContinuing ... ",cyl);
fflush(stdout);
break;
}
}
printf("done\n");
if (close(fd) < 0) PERROR("close");
}
static void usage(char *name)
{
char *this;
if (this = strrchr(name,'/')) name = this+1;
fprintf(stderr,"usage: %s [ -n ] device\n",name);
exit(1);
}
main(int argc,char **argv)
{
int verify;
char *name;
name = argv[0];
verify = 1;
if (argc > 1 && argv[1][0] == '-') {
if (argv[1][1] != 'n') usage(name);
verify = 0;
argc--;
argv++;
}
if (argc != 2) usage(name);
if ((ctrl = open(argv[1],3)) < 0) PERROR(argv[1]);
if (ioctl(ctrl,FDGETPRM,(int) &param) < 0) PERROR("ioctl(FDGETPRM)");
printf("%sle-sided, %d tracks, %d sec/track. Total capacity %d kB.\n",
param.head ? "Doub" : "Sing",param.track,param.sect,param.size >> 1);
format_disk(argv[1]);
if (verify) verify_disk(argv[1]);
}

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,110 @@
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <linux/hdreg.h>
#define DISK_STRING "/dev/hd"
static int current_minor;
static int indent;
char * disk_type(unsigned char type)
{
switch (type) {
case 1: return "12-bit DOS";
case 4: return "16-bit DOS (<32M)";
case 5: return "extended partition (don't use)";
case 6: return "16-bit DOS (>=32M)";
case 0x81: return "minix";
}
return NULL;
}
char * dev_name(int minor)
{
char * ctl;
static char name[100];
if (minor & 0x3f)
ctl = "%s%c%d";
else
ctl = "%s%c";
sprintf(name,ctl,DISK_STRING,'a'+(minor >> 6),minor & 0x3f);
return name;
}
void fdisk(int minor)
{
char * type, * name;
char buffer[1024];
struct partition * p;
int fd;
int i;
int this_minor = current_minor;
if ((fd=open(name = dev_name(minor),O_RDONLY)) < 0) {
fprintf(stderr,"Unable to open %s\n",name);
exit(1);
}
if (1024 != read(fd,buffer,1024))
return;
if (!(minor & 0x3f)) {
printf("Disk %d:\n", minor >> 6);
indent = 4;
}
p = (struct partition *) (buffer + 0x1be);
for (i=0 ; i<4 ; p++,i++) {
if (!p->nr_sects)
continue;
printf("%*c",indent,' ');
printf("%s: %6d blocks",dev_name(this_minor+i),p->nr_sects>>1);
if (p->boot_ind == 0x80)
printf(" active");
else if (p->boot_ind)
printf(" active? (%02x)",p->boot_ind);
if (type = disk_type(p->sys_ind))
printf(" %s\n",type);
else
printf(" unknown partition type 0x%02X\n",p->sys_ind);
if (p->sys_ind == 5 && (0x3f & current_minor) < 60) {
indent += 4;
current_minor += 4;
fdisk(this_minor+i);
indent -= 4;
}
}
/* check for disk-manager partitions */
if (*(unsigned short *) (buffer + 0xfc) != 0x55AA)
return;
p = (struct partition *) (buffer + 0x1be);
for (i=4; i<16; i++) {
p--;
if ((current_minor & 0x3f) >= 60)
break;
if (!p->nr_sects)
continue;
printf("%*c",indent,' ');
printf("%s: %6d blocks disk-manager",dev_name(current_minor),p->nr_sects>>1);
if (p->boot_ind == 0x80)
printf(" active");
else if (p->boot_ind)
printf(" active? (%02x)",p->boot_ind);
if (type = disk_type(p->sys_ind))
printf(" %s\n",type);
else
printf(" unknown partition type 0x%02X\n",p->sys_ind);
current_minor++;
}
}
int main(int argc, char ** argv)
{
current_minor = 1;
fdisk(0);
current_minor = 65;
fdisk(64);
return 0;
}

View File

@@ -0,0 +1,114 @@
/***************************************************************************
* Program: lastlogin (c)1987 ICUS Computer Group *
* By: Lenny Tropiano ...{ihnp4,mtune}!icus!lenny *
* *
* Program intent: This will allow programs like 'finger' and 'last' to *
* lookup in the file /usr/adm/lastlogin.log and see *
* when a particular user has logged-in. This saves *
* the necessity to keep /etc/wtmp around for a long *
* period of time. *
* *
* This program can be used/modified and redistributed *
* I declare it PUBLIC DOMAIN. Please give me credit *
* when credit is due. *
* *
* AT&T 3B1 compiling instructions for shared-libaries: *
* *
* $ cc -c -O lastlogin.c *
* $ ld -s -o lastlogin lastlogin.o /lib/shlib.ifile /lib/crt0s.o *
* $ mv lastlogin /etc *
* $ su *
* Password: *
* # chown adm /etc/lastlogin /usr/adm *
* # chgrp adm /etc/lastlogin /usr/adm *
* # chmod 4755 /etc/lastlogin *
* *
* Place a call to /etc/lastlogin in your /etc/localprofile *
* to be run on all user logins. *
***************************************************************************/
/***************************************************************************
* Linux compiling instructions: *
* *
* $ gcc -o lastlogin lastlogin.c utmp2.o *
* utmp2.o is compiled from poe-IGL (1.2) *
* $ mv lastlogin /etc *
* $ su *
* Password: *
* # chown adm /etc/lastlogin /usr/adm *
* # chgrp adm /etc/lastlogin /usr/adm *
* # chmod 4755 /etc/lastlogin *
* *
* Place a call to /etc/lastlogin in your /etc/profile *
* to be run on all user logins. *
* *
* B.Bergt@informatik.tu-chemnitz.de *
***************************************************************************/
/* Print the last login time and record the new time */
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>
#include <utmp.h>
#define LOGFILE "/usr/adm/lastlog"
main()
{
struct utmp *utent, *getutent();
int fd;
long hrs, min, sec;
struct lastlog {
char ll_line[8];
time_t ll_time;
} ll;
if (access(LOGFILE, 0) == -1) {
if ((fd = creat(LOGFILE,0644)) == -1) {
fprintf(stderr,"Cannot create file %s: ", LOGFILE);
perror("creat()");
exit(1);
}
} else {
if ((fd = open(LOGFILE,O_RDWR)) == -1) {
fprintf(stderr,"Cannot open file %s: ", LOGFILE);
perror("open()");
exit(1);
}
}
if (lseek(fd, (long)(getuid()*sizeof(struct lastlog)), 0) == -1) {
fprintf(stderr,"Cannot position file %s: ", LOGFILE);
perror("lseek()");
exit(1);
}
if (read(fd, (char *) &ll, sizeof ll) == sizeof ll &&
ll.ll_time != 0L) {
printf("Last login: %.*s on %.*s\n" , 19
, (char *) ctime(&ll.ll_time) , sizeof(ll.ll_line)
, ll.ll_line);
} else printf("Last login: [No Login information on record]\n");
sprintf(ll.ll_line, "%.8s", strrchr(ttyname(0), '/')+1);
setutent();
while ((utent = getutent()) != NULL)
if (strcmp(utent->ut_line, ll.ll_line) == 0)
break;
if (utent == NULL) {
fprintf(stderr,"Cannot locate utmp entry for tty\n");
exit(1);
}
ll.ll_time = utent->ut_time;
endutent();
lseek(fd, (long)(getuid()*sizeof(struct lastlog)), 0);
write(fd, (char *) &ll, sizeof ll);
close(fd);
exit(0);
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

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)

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,55 @@
To: Linux-Activists@BLOOM-PICAYUNE.MIT.EDU
From: torvalds@klaava.Helsinki.FI (Linus Benedict Torvalds)
Crossposted-To: alt.os.linux
Subject: Second 0.95a alpha-patch, part 1/2
Date: 4 Apr 92 14:42:10 GMT
This is the promised patch to 0.95a, which hopefully corrects some of
the problems encountered. This is /not/ an offical new release: it's
just a set of patches to get the same kernel I am currently running.
Bugfixes:
- extended partitions should finally work correctly (this release also
contains code for the hd-ioctl call, needed for fdisk). Code mostly
by hedrick.
- I corrected my original ptrace-fix (writing a long word to another
process' data space could fail with my original patches)
- 387-emulation bug with the instructions "fcom[p] %st(x)" which
resulted in bad results on non-387 machines with newer versions of
gcc. The emulation is still ugly, but it seems to work.
- the cooked mode deletion/linekill bugs should be fixed.
- various error-returns were wrong: I correted some of them (thanks to
bruce evans who pointed them out). The bad error-values resulted in
incorrect or spurious error-messages from 'rm' etc.
- various minor fixes (including some in the hd-driver: this might help
persons with unexpected-interrupt and/or timeout errors)
Additionally this version contains VFS-code from entropy, and a
readdir() system call needed for the VFS. The latter was inspired by
patches sent by Remy Card, who did it with a getdirents sys-call. My
version is slightly simpler, but is probably slower. Things might yet
change.
The installation has also changed slightly: the keyboard type and
math-emulation are specified in the main Makefile. That one also
contains the -fcombine-regs flag needed for 1.40. The other makefiles
should no longer need editing.
I've also incorporated the ps095 kernel patches: to get the actual
user-level stuff you still have to get the ps-distribution. Printer
ports /still/ aren't in there, but this time I positively /promise/ to
put it in next week. Really.
People who have been patching their kernel might have problems getting
this patch to work: it was made against a clean 0.95a kernel. I'll
consider a patched-up kernel version 0.95c - and I'd appreciate if
future patches to me would be sent against this version. I'll still
accept older patches, or course.
Linus

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More