home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 3
/
goldfish_volume_3.bin
/
files
/
util
/
misc
/
multiuser
/
multiuser.doc
< prev
next >
Wrap
Text File
|
1994-07-03
|
67KB
|
1,687 lines
/ / / /
/ / / /
\ \ \ \/ / / -+*+- MultiUser Release 1.8 -+*+-
\ \/\ \/ /
\
\
/\
\
/
DISCLAIMER
WITH THIS DOCUMENT I MAKE NO WARRANTIES OR REPRESENTATIONS, EITHER
EXPRESSED OR IMPLIED, WITH RESPECT TO THE PRODUCT DESCRIBED HEREIN. THE
INFORMATION PRESENTED HEREIN IS BEING SUPPLIED ON AN 'AS IS' BASIS AND IS
EXPRESSLY SUBJECT TO CHANGE WITHOUT NOTICE. THE ENTIRE RISK AS TO THE USE
OF THIS INFORMATION IS ASSUMED BY THE USER. IN NO EVENT WILL I BE LIABLE
FOR DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES RESULTING FROM
ANY CLAIM ARISING OUT OF THE INFORMATION PRESENTED HEREIN, EVEN IF I HAVE
BEEN ADVISED OF THE POSSIBILITIES OF SUCH DAMAGES.
COPYRIGHT
This package is shareware. This means you can copy it freely as long as
you don't ask any money for it, except perhaps a nominal fee for copying.
If you like and use this package on a regular base, I'd appreciate it if
you send me a contribution of 500 BEF or USD 15 (or the equivalent in any
other solid currency). Please send money by International Money Order,
EuroCheck (in BEF!) or Cash, because it's very difficult for me to cash in
other checks.
This package should not be spread in any other form than an LhA archive
and all parts of it should be spread together. The package may not be
altered in any way and cannot be used for commercial purposes without the
prior written permission of the author. This does not apply to the source
of the support commands, they are full public domain, only the copyright
message should be preserved.
The package is Copyright © Geert Uytterhoeven, All Rights Reserved. The
author reserves the right to change the status of this package whenever he
may find it appropriate.
The rules above do not apply to the external utilities, for which I don't
give any warranties. Read the appropriate documentation for information
about their disclaimers, distributability and copyright notices.
CONTENTS
Introduction
System Requirements
Installation
The password file
The configuration file
The group file
Support Commands
The log file
Caveats
External utilities
Other software supporting MultiUser
History
Plans for the future
Credits
Contacts
Special thanks go to ...
1. Introduction
You've got an Amiga with Kickstart 2.04 or higher and several people are
regularly fooling around with it ... Last week your sister deleted your
20MB JPEG collection by mistake and you don't want this to happen again ...
Well, here's the answer: MultiUser!
MultiUser allows you to create a *IX-like environment where several users
live together in harmony, unable to delete each others files, unable to
read those private love-letters of other users ... And this even if
several users are working on the machine at the same time (on a terminal
hooked up to the serial port) ...
You are the sole user of your computer? Well, make sure it stays that
way by installing MultiUser! People without a valid login ID and password
won't be able to access files you have made private with MultiUser. If you
make all files private (not readable for others), the only useful thing
they could do, is boot from a floppy ...
And ... you do not have to reformat your hard drive!
2. System Requirements
Your Amiga should be equipped with Kickstart 2.04 (V37+) or higher, and
with a hard drive/controller combination that supports the CBM Rigid Disk
Block protocol (e.g. an A590 or A2091, an A3000 SCSI controller, an A4000
IDE controller and most GVP SCSI controllers). MultiUser can not be used
on floppy drive systems in a sensible way (keeping your floppies in a safe
place is still safer :-).
If you want to use localization, you need Workbench 2.1 or higher.
You do need an original FastFileSystem (V36.102 (release 2.04), V36.104
(release 2.05 or 2.1), V39.27 (release 3.0) or V40.1 (release 3.1)), which
should have been included with your system software.
The package was written on an A4000/040 running Kickstart 39.106 and was
tested on the following configurations:
o A4000/040, 540 MB Conner CP30544 (a VERY fast IDE!) + 120 MB IDE
harddisk, 2 MB chip ram, 8 MB fast ram
o A4000/040, 120 MB IDE harddisk, 2 MB chip ram, 8 MB fast ram, Retina
graphics board, Retina WB emulation
o A3000T 25MHz, 500+ MB harddisk, 2 MB chip ram and 16 MB fast ram,
Kickstart 37.175, GVP '040 accel, Retina graphics board, Retina WB
emulation, Vortex 486 SLC board (this is shit!), Amax II+, IV-24
graphics board,... (Not mine :-( A demonstration model in a store Kurt
frequently
visits :^)
o A3000 25MHz, 52 MB + 120 MB harddisk, 2 MB chip ram and some MB static
column ram. Kickstart 39.110 (developer)
o A500, 20 MB harddisk (A590 XT), 512 K chip ram, 512 K ranger mem, 2 MB
fast ram, old chipset, 68010 processor, Kickstart 2.04 softkicked
(developer)
o A500, 84 or 105 MB harddisk (A590 SCSI), 512 K chip ram, 512 K ranger
mem, 2 MB fast ram, old chipset, Kickstart 2.04 softkicked (developer)
On all these configuration the package seems to work fine, so I guess you
can run it on almost any machine.
You do need the reqtools.library version 38 or higher. Reqtools is
Copyright © Nico François.
3. Installation
WARNING: Read the installation part completely BEFORE you apply it! If
you still don't know what we're talking about, you'd better don't use this
package! It's NOT for the casual user; managing a MultiUser system is a
difficult and tedious task!
If anything fails during the installation, don't forget to restore your
system to it's original state, else you could be surprised in a very bad
way!
If you're upgrading from release 1.4 or 1.3 (or even from an older
version), please read 'MultiUser.upgrade' first.
o Extract the archive and change the current directory to the directory
MultiUser located in the directory where you extracted the archive to.
(Preferably RAM:)
o Install the library and the support commands with the following
commands:
Copy Libs/multiuser.library LIBS:
Copy C/#? C:
o Install the catalog files for the library and the support commands with
the following command:
Copy Locale Locale: all
o The MultiUserFileSystem is distributed as a patch for the original
FastFileSystem. There are patches for the FastFileSystems of release
2.04 (V36.102), release 2.05 (V36.104), release 2.1 (V36.104), release
3.0 (V39.27) and release 3.1 (V40.1) of the operating system. Make
sure you have one of these FastFileSystems in the L: directory! If
it's not there you can copy it from the L directory on the Install disk
of the operating system install disk set. If you're not sure about the
version of your FastFileSystem use the command 'Version
L:FastFileSystem'. Now Create a MultiUserFileSystem with the command:
Patch/spatch -oL:MultiUserFileSystem
-pPatch/MultiUserFileSystem_xxx.pch L:FastFileSystem
where xxx stands for '2.04', '2.05', '2.1', '3.0' or '3.1', depending
on your operating system release.
If you get the message
Incorrect version of original file.
you used the wrong patchfile or you have an original FastFileSystem
which is not supported (or your original FastFileSystem has been
corrupted).
Spatch is © Copyright SAS Institute, Inc., but freely distributable.
o Choose the partitions you want to protect and the directory where you
want to store the MultiUser configuration stuff. Make sure this
directory is located on one of the partitions you want to protect!
Let's say your configuration directory is 'App:MultiUser' (Replace
'App:MultiUser' anywhere in this document by the name of your
configuration directory if you use another directory name). Copy the
configuration stuff to this directory with the following command:
Copy Config/#? App:MultiUser
o If you've installed the TCP/IP package from Commodore (AS225) you
already have a valid password file (inet:db/passwd). The inet:db
directory must be located on one of the partitions you want to protect!
Make sure there's an entry for a 'root' user with '65535' for the user
and primary group number, e.g.:
root||65535|65535|The Bastard Operator From Hell|SYS:Homes/Root|cli
^^^^^ ^^^^^
o Append the next line to your 'S:User-Startup' file:
Logout GUI GLOBAL
o Pick a name for your computer ... This name will appear in the
login/logout requester. Let's say you want to call your system
'Pythagoras', then you have to execute the following:
Echo "Pythagoras" >ENVARC:HostName
o Let's say you want to protect the partitions 'SYS:' and 'App:'. You
can protect as many partitions as you like, just add their name to the
list below. Create the required Keyfiles on these partitions with the
following command if you haven't installed the TCP/IP package from
Commodore:
MakeKeyfiles App:MultiUser App:MultiUser SYS: App:
TCP/IP users should use a command line like this:
MakeKeyfiles inet:db App:MultiUser SYS: App:
o Start HDToolBox to install the MultiUserFileSystem. If HDToolBox does
not find your hard drive, you probably have to start it from the shell
with 'HDToolBox <hddev>', where <hddev> stands for the name of your
hard drive controller device (e.g. 'scsi.device' for CBM controllers
or 'gvpscsi.device' for GVP controllers). If that fails too, you can't
use MultiUser on your system.
NOTE: The following text describes the use of the version of
HDToolBox that is supplied with AmigaOS Release 3.0. Other
versions may slightly differ.
x Choose the drive you want to protect. If you want to protect more
than one drive, you simply repeat this for each of the drives.
Select the drive by clicking on it in the listview where all
connected drives are displayed.
x Press the <Partition Drive> button. Now a new display should
appear containing a large box which may be divided up into several
partitions ...
x Activate the <Advanced Options> checkbox. Now some additional
options should appear ...
x Press the <Add/Update...> button in the file system section of the
HDToolBox window. (There's only one gadget labeled
<Add/Update...>, so you can't miss it.)
x Now the window should contain a list of currently installed file
systems and some additional buttons. If you are updating your
MultiUserFileSystem, there should already be an entry with the
0x6d754653 ('muFS' in HEX ASCII) identifier. If this is the case,
click on it and press <Update File System...>, in all other cases,
press the <Add New File System...> button.
x Now a requester appears. Enter 'L:MultiUserFileSystem' in the
string-gadget of the requester and '0x6d754653' in the identifier
(also called DosType) gadget. If your version of HDToolBox asks
you to enter a version number, you should use 39. Some versions of
HDToolbox (the one with 3.0) uses two requesters for the needed
information, so it may be necessary to select the <Ok> button of
the requester before you can fill in the DosType.
x Press the <Ok> button of the requester (if you haven't done this
yet). Now you should be back in the File Systems display. Go back
to the Partitions display by pressing the <Ok> button.
x Select the partition on the drive that you wanna protect. If you
want to protect more than one partition (it is recommended to
protect all partitions on the drive), you simply repeat the
following stuff for every partition. You select a partition by
clicking on the part of the large box (which represents your
harddisk) that represents that partition.
x Press the <Change ...> or <Change File System> button.
x Select the <Custom File System> gadget and enter '0x6d754653'
('muFS' in HEX ASCII) into the <Identifier> gadget.
x Press the <Ok> button to return to the Partitions display. You
should repeat the above steps for all the partitions you wish to
protect before continuing ...
x Press the <Ok> button to return to the main HDToolBox display.
x Press the <Save Changes to Drive> button. Don't care about the
warning that this will destroy the data on your partition, no data
will be lost :-). If HDToolBox complains that there isn't enough
space on the drive to save all the configuration data, you should
return to the File System Maintenance section of HDToolBox by
pressing <Partition Drive> and <Add/Update ...> buttons. Now you
should select another file system than the one with identifier
0x6d754653, press <Delete File System>, return to the main
HDToolBox display and try saving the configuration again. Note
that you should make sure not to delete any file system that's
still used on any partition! This is why it is recommended that
all partitions on the drive should use the MultiUserFileSystem.
x If everything went OK, select Exit and confirm the reboot request
of HDToolBox. Now your machine should automatically reset.
o After the reboot, a requester should appear. Simply enter 'root' as
login id. You should now be logged in as root, having access to all
files.
o The first thing you should do is to change your password. This is done
by entering the Passwd GUI command in a shell you open or with the
<Execute Command ...> option of the Workbench. You are prompted to
enter your old password, so simply press enter. Now you are asked to
enter your new password twice. If you enter the same password twice,
this will from now on (until you change it again) be the password root
has to enter at a login request.
o Now you have to protect some important files using the MProtect and
SetOwner[37] commands. We will use SetOwner in this description, but
if you aren't using Kickstart 39.xx or higher, you should use
SetOwner37 instead!
You should protect the Keyfiles on all protected partitions. Execute
the following commands for every protected partition:
SetOwner <VOL>.MultiUser.keyfile root
MProtect <VOL>.MultiUser.keyfile R
where <VOL> stands for a partition name (e.g. 'SYS:' or 'App:' in our
example). Protect some other important files, too:
SetOwner App:MultiUser/passwd root
MProtect App:MultiUser/passwd RWD
SetOwner App:MultiUser/MultiUser.config root
MProtect App:MultiUser/MultiUser.config RWD
SetOwner App:MultiUser/MultiUser.group root
MProtect App:MultiUser/MultiUser.group RWD
SetOwner App:MultiUser/.profile root
MProtect App:MultiUser/.profile SRWED GROUP R OTHER R
SetOwner S:Startup-Sequence root
MProtect S:Startup-Sequence SRWED GROUP R OTHER R
SetOwner S:User-Startup root
MProtect S:User-Startup SRWED GROUP R OTHER R
SetOwner SYS:Tools/HDToolBox root
MProtect SYS:Tools/HDToolBox RWED
... and any other files you wish to protect ...
It is recommended to leave most files readable for others, except of
course the files you really wanna keep to yourself. .info files and
.backdrop files should be readable for everybody if you don't want
complications when using the Workbench.
o Do NOT forget to make a backup of all Keyfiles, in case an accident
occurs!
o If you think you may ever forget your root password, create an
emergency boot disk using the procedure mentioned in 'Emergency.doc' in
the 'Emergency' directory. If you don't I hope your strong memory will
never leave you!
4. The password file
The password file contains all the information the system needs on the
users that are allowed to access the system. This file (named 'passwd')
must be located in the PASSWDDIR directory, as specified with the
'MakeKeyFiles' command. Each line of the file contains information on one
user. The syntax of such a line is as follows:
<userid>'|'<passwd>'|'<uid>'|'<gid>'|'<name>'|'<home>'|'<port>
<userid> is the same as the name this user will need to give at a login
request. This name may be upto 31 characters long.
<passwd> if the user has a password, this is his coded password. If you
add new users, you should make this field empty, this means the
user doesn't have a password yet. Then login as that user and
change his password using the Passwd command.
<uid> is the user identifier, a number between 1 and 65535. Each user
should have a different user identifier! The identifier 65535 is
reserved for root!
<gid> is the primary group identifier, a number between 0 and 65535.
Users with the same group identifier belong to the same group and
can access each others files depending on the group-protection
bits. Users with different group identifiers can access each
others files depending on the other-protection bits. The
identifier 65535 is reserved for root! For users belonging to
more than one group, see the group file section.
<name> is the real name of the user. You can enter whatever you like
for this. At the moment this is limited to 219 characters. This
name is displayed when user information is asked using the
UserInfo command.
<home> is the home-directory of the user. When a logout is performed, a
requester will appear prompting for a new login. If a user logs
in using this requester, the current directory will be changed to
the home of this user and the local environment variable HOME
will be set to the name of the home-directory. This doesn't
happen when a Login command is used.
<port> is only used by the TCP/IP package from Commodore (AS225). If
you haven't installed that package you should leave this field
empty.
A passwd file could look like this:
root||65535|65535|The Bastard Operator From Hell|SYS:Homes/Root|cli
geert|Fqhg_IYBiU`|2|1|Geert Uytterhoeven|SYS:Homes/Geert|cli
kurt|fNXjuAgFBFF|3|2|Kurt Haenen|SYS:Homes/Kurt|cli
guest||1|0|Anonymous Guest|SYS:Homes/Guest|cli
If there are bad lines in the password file, a warning will be posted and
the bad line will be ignored. The warning requester will disappear
automatically after 10 seconds if the user doesn't respond.
5. The configuration file
The configuration file defines some settings. This file (named
'MultiUser.config') must be located in the CONFIGDIR directory, as
specified with the 'MakeKeyFiles' command. It contains lines with options
and values - in the form <OPTION>=<VALUE> -, and comments. Comments must
be preceeded with a semicolon. If an option is missing, the default value
will be taken. 0 is used for OFF, 1 for ON.
The 'MultiUser.config' example delivered with the package reflects the
default settings.
If there are bad options in the configuration file, a warning will be
posted and the bad line will be ignored. The warning requester will
disappear automatically after 10 seconds if the user doesn't respond.
5.1. LIMITDOSSETPROTECTION
If this options is turned on, the protection bits for GROUP and OTHER can
no longer be changed with the dos.library/SetProtection() call. Of course
you can still change the protection bits for GROUP and OTHER with the
MProtect command (or with the library call muSetProtection()). It's very
useful because a lot of programs change the protection bits without knowing
about bits for GROUP and OTHER. Defaults to ON. See also the support
command LimitDOSSetProtection.
5.2. PROFILE
If this option is turned on and there exists a script file '.profile' in
the configuration directory, it will be executed after each login prompt by
the support command Logout. Defaults to ON.
The '.profile' example delivered with the package displays a
'Message_Of_The_Day' if it exists in the configuration directory (change
the directory in the '.profile' if you have a different configuration
directory than 'App:MultiUser') and executes a '.profile' if it exists in
the user's home-directory.
5.3. LASTLOGINREQ
If this option is turned on, there will appear a lastlogin requester
after each graphical login. Defaults to ON.
5.4. LOGSTARTUP
If this option is turned on, every startup or reinitialisation of the
MultiUser.server will be logged to the file 'MultiUser.log' in the
configuration directory. Defaults to OFF.
5.5. LOGLOGIN
If this option is turned on, every successful login will be logged to the
file 'MultiUser.log' in the configuration directory. Defaults to OFF.
5.6. LOGLOGINFAIL
If this option is turned on, every unsuccessful login will be logged to
the file 'MultiUser.log' in the configuration directory. Defaults to OFF.
5.7. LOGPASSWD
If this option is turned on, every successful password change will be
logged to the file 'MultiUser.log' in the configuration directory.
Defaults to OFF.
5.8. LOGPASSWDFAIL
If this option is turned on, every unsuccessful password change will be
logged to the file 'MultiUser.log' in the configuration directory.
Defaults to OFF.
5.9. LOGCHECKPASSWD
If this option is turned on, every successful password check (see the
library function muCheckPasswd()) will be logged to the file
'MultiUser.log' in the configuration directory. Defaults to OFF.
5.10. LOGCHECKPASSWDFAIL
If this option is turned on, every unsuccessful password check (see the
library function muCheckPasswd()) will be logged to the file
'MultiUser.log' in the configuration directory. Defaults to OFF.
5.11. PASSWDUIDLEVEL
Users with a user identifier greater or equal than the specified value
are allowed to change their passwords. Specify a value in the range
0..65535. E.g. if you specify a value of 2, a guest user with a user
identifier of 1 cannot change his password, unless his primary group
identifier is greater than the PASSWDGIDLEVEL. See also the option
PASSWDGIDLEVEL. Defaults to 0.
5.12. PASSWDGIDLEVEL
Users with a primary group identifier greater or equal than the specified
value are allowed to change their passwords. Specify a value in the range
0..65535. E.g. if you specify a value of 1, all users in a guest group
with a primary group identifier of 0 cannot change their passwords, unless
their user identifiers are greater than the PASSWDUIDLEVEL. See also the
option PASSWDUIDLEVEL. Defaults to 0.
6. The group file
The group file contains more information about the groups and defines the
secondary groups a user belongs to, and thus allows a user to belong to
more than one group. This file (named 'MultiUser.group') must be located
in the CONFIGDIR directory, as specified with the 'MakeKeyFiles' command.
This file exists out of two parts, separated by a blank line.
Each line in the first part of the file contains information on one
group. Note however that not every group should have a line in this file,
but at least one must have one. The syntax of such a line is as follows:
<GroupID>|<gid>|<MgrUid>|<GroupName>
<GroupID> is the short name of the group. This name may be upto 31
characters long.
<gid> is the group identifier for this group, a number between 0 and
65535.
<MgrUid> is the user identifier of this group's manager. If the group
doesn't have a manager, you should specify 0. It is not
necessary that a group's manager belongs to the group.
<GroupName> is the full name of the group. This name may be upto 219
characters long.
Each line in the second part of the file contains information on one user
(there may exist more than one line for each user). The syntax of such a
line is as follows (max. about 1024 characters):
<uid>:<gid>[,<gid>...]
<uid> is the user identifier of a user.
<gid> is the group identifier of a secondary group to which the user
belongs. It is NOT necessary to specify the primary group number
(as specified in the passwd file) as one of the secondary groups.
A group file could look like this:
root|65535|65535|System
dev|1|65535|Developers
stud|2|2|Students
guest|0|65535|Anonymous Guest
2:2,65535
3:1
If there are bad lines in the group file, a warning will be posted and
the bad line will be ignored. The warning requester will disappear
automatically after 10 seconds if the user doesn't respond.
7. Support Commands
The support commands are used to login to/logout from the system, change
the protection bits of a file, change the owner of a file, change the
default protection bits for a group of tasks, ... The number of support
commands may grow in future releases. Here are the commands that are
currently supported. They can only be executed from the shell or with the
<Execute Command...> option of the Workbench.
7.1. Freeze
This command freezes a specified task. You cannot freeze yourself nor
the MultiUser.server. This command can be used only by root.
See also the support commands 'Unfreeze' and 'Kill'.
Options ...
TCB The address of the Task Control Block of the task you want to
freeze. It can be both hexadecimal (preceeded with '$' or '0x')
or decimal.
7.2. Kill
This command tries to cancel a specified task. You cannot commit suicide
nor kill the MultiUser.server. This command can be used only by root.
WARNING: Due to the nature of AmigaOS, killing a task is a very
dangerous action! Use it at your own risk! Freezing a task is much safer.
See also the support commands 'Freeze' and 'Unfreeze'.
Options ...
TCB The address of the Task Control Block of the task you want to
cancel. It can be both hexadecimal (preceeded with '$' or '0x')
or decimal. This task may be frozen.
7.3. LimitDOSSetProtection
This command defines whether the protection bits for GROUP and OTHER may
be changed via the dos.library/SetProtection() call. It's very useful
because a lot of programs change the protection bits without knowing about
bits for GROUP and OTHER. See also the option LIMITDOSSETPROTECTION in the
configuration file.
Options ...
ON Turn the limitation on. This means the protection bits for GROUP
and OTHER no longer can be changed with the
dos.library/SetProtection() call. Of course you can still change
the protection bits for GROUP and OTHER with the MProtect command
(or with the library call muSetProtection()).
OFF Turn the limitation off.
7.4. Login
This command will put a new owner on top of the current owner of the
task. *IX users may think of this as the *IX su command. The effect of a
successful login can be reversed with the Logout command. The owner-list
of a task is sort of a stack: with Login you put a new owner on top of the
stack, with Logout, you take an owner of the stack (unless the stack is
empty).
Options ...
USERID Login as this user.
GUI Normally the login prompt appears in the shell-window that was
used to execute Login, but if this option is specified, a
requester is used.
TASK Login another task than the one we're currently working in. A
task name should be specified after the TASK keyword. You can
only login tasks which you own (unless you are root)!
OWN Login another task than the one we're currently working in by
changing it's owner to the owner of the current task. This works
only with tasks that are owned by nobody (unless you are root)!
This option must be used in conjunction with the TASK option.
GLOBAL Login all tasks connected to the current task. It's a bit
difficult to explain what connected means, but you could say that
a parent task and all its children are connected unless one of
them was logged in/out without the GLOBAL option.
PROCESS Login another process than the one you're currently working in.
A process number (as displayed by the Status command) should be
specified after the PROCESS keyword. You can only login
processes which you own (unless you are root)!
7.5. Logout
This command is the inverse of Login if the stack of owners of the
current task isn't empty. If the stack is empty or becomes empty after
executing the Logout command, a login prompt will appear. After login, the
current directory will be changed to the user's home-directory, and
depending on your configuration settings, the '.profile' script in the
configuration directory may be executed.
Options ...
GUI If a login request is generated by Logout, should it use a
requester?
TASK See Login
GLOBAL This option only works when the owner stack is or becomes empty
when executing the Logout command. If this option is specified
in such a case, not only this task will change its owner, but all
connected task as well. It's a bit difficult to explain what
connected means, but you could say that a parent task and all its
children are connected unless one of them was logged out without
the GLOBAL option. It's very useful to logout all your tasks
from your current session.
QUIET Tells logout never to generate a login request. If the owner
stack becomes empty, you will simply be logged in as nobody.
This may be removed in future releases, but since it isn't really
useful, this shouldn't be a problem.
PROCESS See Login
ALL Remove all users from the stack of owners. Specifying this
option has the same effect as using 'Logout' until you get a
login request.
7.6. MakeKeyfiles
This command creates the Keyfiles. Every partitions you want to use with
the MultiUserFileSystem must have a Keyfile ('.MultiUser.keyfile') in its
root directory. If one of them is missing or inconsistent, all tasks will
be owned by nobody to prevent unprivileged accesses, and an alert will be
posted!
Do NOT forget to make a backup of all Keyfiles, in case an accident
occurs!
Options ...
PASSWDDIR The directory where you've put the password file. This directory
must be on one of the protected partitions.
CONFIGDIR The directory where you've put the configuration and group file.
This directory must be on one of the protected partitions.
VOLUME The list of partitions you want to protect.
7.7. MAssign
This command lets you create non-binding assigns (i.e. assigns which are
evaluated each time you use them) for a template path. You should start it
from a shell using 'Run' (since MAssign won't return until you send an
ACTION_DIE DosPacket) and may want to redirect it's output to NIL:. MAssign
must be run by root, so change its owner to root and set its 'U'-bit (see
MProtect).
Options ...
NAME The logical device name for the assignment to create. It should
end with a colon (':'). This name will show up in ReqTools
requesters too, but unfortunately not in asl requesters, so use
RTPatch (© Nico François)!
TARGET Template path for the assignment. It may contain option
specifiers which are replaced by a string - depending on the
calling user - on every usage.
%u UserId of the calling user
%h Home directory of the calling user
%g GroupID of the calling user
%% %
VOLUME Create a volume node for this assign so an icon will appear on
the Workbench.
CREATE Create the TARGET directory if it doesn't exist on access.
E.g. after the command
Run >NIL: MAssign HOME: %h VOLUME
every user can refer to his/her home directory simply by using HOME:. If
you want a separate ENVARC: directory for every user you can use the
following two commands:
Assign ENVARC:
Run >NIL: MAssign ENVARC: %h/Env-Archive CREATE
This technique can easily be extended to ENV:, S:, MAIL:, ... The 'Assign
... DISMOUNT' is only necessary if you want to redefine an assign which
already exists.
7.8. MList
This is a simple list replacement. It takes none, one or more path-names
as parameters and lists the files in those path(s) or in the current
directory if no path-name was specified, together with all their protection
bits and some other info. It recognizes the new 'U' protection bit.
Options ...
DIR The pathname(s) or the directory(s) you want information on. The
standard AmigaDOS wildcards may be used here.
GROUPS Display the GroupIDs for the files.
7.9. MProtect
This command changes the protection flags for files or directories.
Options ...
FILE The file or directory you want to change the protection flags of.
The standard AmigaDOS wildcards may be used here.
FLAGS The protection flags used for the owner of the file. Valid flags
are none or some out of:
U Set uid bit: during execution, change the owner of the
process (i.e. the uid and gid) to the owner of the file
(cfr. *IX). This even works if you make the program
resident. However, this only works after the
multiuser.library has been initialised. If you put
programs with the 'U' bit on in your S:User-Startup, make
sure you do it after the 'Logout GLOBAL' command, or put
'UserInfo <>NIL:' before the first of them to assure the
library has been loaded! If you set the 'U' bit together
with 'GROUP W' or 'OTHER W', you will get a warning because
this is a very dangerous situation :-)
S Script bit: file is a shell script.
P Pure bit: program is reentrant and reexecutable.
A Archive bit: file has been backed up or archived.
R Read bit: file is readable.
W Write bit: file is writable.
E Execute bit: file is executable.
D Delete bit: file is deletable.
GROUP The protection flags used for users in the same group as the
owner of the file. Specify them after the GROUP keyword. Valid
flags are none or some out of 'R', 'W', 'E' and 'D'.
OTHER The protection flags used for users outside the owner's group.
Specify them after the OTHER keyword. Valid flags are none or
some out of 'R', 'W', 'E' and 'D'.
ADD Add all specified protection flags to the flags that are already
set.
SUB Subtract all specified protection flags from the flags that are
already set.
ALL Recursively scan all directories from within the specified
directory and process all found files and directories.
QUIET Process silently, but do report errors.
7.10. Passwd
The Passwd command is used to change your password. Simply type in the
command in the shell and you will be prompted to enter your old password
and type your new password twice. If you did this correctly, your password
will be changed!
Options ...
GUI If this option is specified, Passwd uses requesters to prompt for
your passwords instead of simple console I/O.
7.11. RunCommand
The RunCommand command lets you execute a set uid program (a program with
the 'U'-bit set and thus want to change it's owner during execution) from a
shell that does not use Create[New]Proc() or RunCommand() to execute
commands (e.g. WShell). If you don't have such a shell or you do not want
to use the set uid feature, you won't need this utility.
Options ...
COMMAND The program you want to execute.
ARGS The arguments for the program.
7.12. SetDefProtect
This commands sets the default protection bits for the current task.
Options ...
FLAGS The protection flags used for the owner of the file. See
MProtect ('U' is not valid here).
GROUP The protection flags used for users in the same group as the
owner of the file. Specify them after the GROUP keyword. See
MProtect.
OTHER The protection flags used for users outside the owner's group.
Specify them after the OTHER keyword. See MProtect.
GLOBAL Change the default protection bits not only for the current task,
but for all tasks on the same level.
7.13. SetOwner
This command is used to change the owner of a file. You can only change
the owner of files you own or of files that are owned by nobody, unless
you're root. If you don't have Kickstart 39.xx or higher, you should use
SetOwner37 instead of SetOwner!
Options ...
FILE The file or directory you want to change the owner of. The
standard AmigaDOS wildcards may be used here.
USER The UserID of the user that should become the owner of the file
or directory. If no user is specified, the current task owner
will be taken. You're not allowed to change the owner of a file
to someone else than yourself or nobody, unless you're root.
GROUP The GroupID of the group for the file or directory owner. If you
don't specify any group, the user's primary group will be taken.
Of course you must specify a group you belongs to (i.e. your
primary group or one of your secondary groups), unless you're
root.
NOBODY Set the owner of the file or directory to nobody.
ALL Recursively scan all directories from within the specified
directory and process all found files and directories.
QUIET Process silently, but do report errors.
7.14. Tasks
This command lists the active tasks of a user.
Options ...
USERID List the active tasks of the specified user. Default is the
current user.
ALL List all active tasks.
7.15. Unfreeze
This command unfreezes a task you have frozen before. This command can
be used only by root.
See also the support commands 'Freeze' and 'Kill'.
Options ...
TCB The address of the Task Control Block of the task you want to
unfreeze. It can be both hexadecimal (preceeded with '$' or
'0x') or decimal.
7.16. UserInfo
This command can be used to get some information on the users of this
system. It will display the UserID and uid, GroupID and gid, name,
home-directory, lastlogin date and the contents of a '.plan' file if it
exists in the home-directory of the appropriate user.
Options ...
USERID Give information on the user with the specified UserID. The
UserID is the name you have to enter at a login prompt. The
standard AmigaDOS wildcards may be used here. Default is the
current user.
UID Same as USERID, but this time information on the user whose user
ID is specified is listed. The user ID is the number given as
second entry in the passwd file. Specify the userid after the
UID keyword.
GID Same thing as UID, but this time for all users in the group with
the specified group ID. Specify the group ID after the GID
keyword.
NAME Gives information on the user with the specified real name.
Specify the name after the NAME keyword. The standard AmigaDOS
wildcards may be used here.
GROUPID Gives information on all the users in the group with the
specified GroupID. Specify the GroupID after the GROUPID
keyword.
GROUPNAME Gives information on all the users in the group with the
specified Group Name. Specify the Group Name after the GROUPNAME
keyword.
ALL Give information on all the users of this system. This means all
users listed in the passwd file.
QUICK If you add this option, only the UserID(s) will be displayed.
This is very useful for scripts and aliases. E.g. after the
alias definition
Alias HCD CD SYS:Homes/*`UserInfo QUICK []*`
the command 'HCD guest' will change the current directory to
guest's home directory, supposed all your users have a
home-directory in SYS:Homes.
GROUPS If you add this option, the secondary groups a user belongs to
will be displayed too.
7.17. Who
This command lists the names and UserIDs of all users who are logged in
currently.
Options ...
AM I Display only the name and UserID of the current user.
QUICK If you add this option, only the UserID(s) will be displayed.
8. The log file
Depending on your configuration file, some actions will be logged to the
file 'MultiUser.log' in your configuration directory. The following kind
of entries may appear therein (<user> stands for a user represented by his
user identifier, <userid> stands for a user represented by his UserID):
o <date>, <time>: Startup
MultiUser startup on <date>, <time>.
o <date>, <time>: Login from <user> to <UserID>
<UserID> was logged in from a task owned by <user> on <date>, <time>.
<user> will be '0000' if the Logout command was used instead of Login.
o <date>, <time>: Login from <user> to <UserID> failed
<UserID> failed to login from a task owned by <user> on <date>, <time>.
<user> will be '0000' if the Logout command was used instead of Login.
This may indicate an attempt of <user> to do an unauthorized login on
the account of <UserID>!
o <date>, <time>: Passwd for <user>
<user> changed his password on <date>, <time>.
o <date>, <time>: Passwd for <user> failed
<user> failed to change his password on <date>, <time>.
o <date>, <time>: CheckPasswd for <user>
The password check ((see the library function muCheckPasswd()) on
<date>, <time> for <user> was successful.
o <date>, <time>: CheckPasswd for <user> failed
The password check ((see the library function muCheckPasswd()) on
<date>, <time> for <user> was unsuccessful. This may indicate an
attempt of an unknown person to make unauthorizedly use of the account
of <user>!
9. Caveats
o Unlike the FastFileSystem, the MultiUserFileSystem returns an error on
illegal lock modes (i.e. anything else than ACCESS_READ/SHARED_LOCK or
ACCESS_WRITE/EXCLUSIVE_LOCK). This has been done for future
compatibility reasons. However, some programs do pass illegal lock
modes - which is a violation of the Amiga rules - and thus will fail to
work.
o The .profile will not be executed under Csh because Csh is not a real
(Amiga) shell but rather an interactive program.
o Csh expands wild cards by itself, so quote them (e.g. "*") if you use
the support commands.
o Do not try to use the MultiUserFileSystem on floppy disks or other
removables (unless you want to create an emergency boot disk as
explained in the appropriate documentation)! Although it is possible,
you will almost always get in trouble with the Keyfiles. Keeping your
floppies in a safe place is still the best protection!
o ARexx programs are always executed under the same ownership as the
RexxMaster task - which is started by RexxMast -, so make sure the
RexxMast command is executed by NOBODY (i.e. before the first
Login/Logout command) and do not set the set uid bit for RexxMast!
o The protection bits for a directory are not used to check if a user has
access to objects in the directory. They do are used to check if a
user can Lock() the directory, so you can't CD to a directory you have
no access to.
o If gzip complains
<file> is not a directory or a regular file - ignored
just use 'MProtect <file> RWED' to clear the protection bits for GROUP
and OTHER. Gzip doesn't like them!
10. External utilities
The Extern archive contains utilities written by other programmers who
allowed me to distribute them with the MultiUser package. Some may have
the source included, other not. For more information about their usages,
disclaimers, distributability and copyright notices, refer to the
appropriate documentation.
Currently the following external utilities are included:
o Amilock 1.0.1 by Michael Nielsen (cemn@manta.jcu.edu.au)
o DICElib by Fabian Nuñez (fnunez@cs.uct.ac.za)
o DosWedge 1.1 by David Swasbrook (swaz@iconz.co.nz)
o ExamPatch 1.0 by Todd Vierling (Todd.Vierling@f46.n371.z1.fidonet.org)
o Fingerd 0.1 by Marco Ciuchini (CIUCHINI@roma1.infn.it)
o MInfo 1.01 by Matt Francis (m.p.francis@newcastle.ac.uk)
o MLock 1.01 by Matt Francis (m.p.francis@newcastle.ac.uk)
o Modula by Frank J. Beckmann (infjb@sun.rz.tu-clausthal.de)
o muFSinc by Norbert Püschel (nobbi@zaphod.rhein.de)
o MuMu 1.0 by Litrik De Roy (FidoNet 2:292/603.61)
o NetmuFS 1.1 by Norbert Püschel (nobbi@zaphod.rhein.de)
o UserID 39.14 by Fabian Nuñez (fnunez@cs.uct.ac.za)
If you write an interesting piece of software you want me to distribute
as an external utility, please send it to me and I'll add it to the
package.
11. Other software supporting MultiUser
o AlertPatch V3.0 by David Swasbrook (swaz@iconz.co.nz)
o AmiTCP 2.3 by the AmiTCP/IP Group (amitcp-group@hut.fi)
o Newlist8: 'ls' clone by Phil Dietz (pdietz@cse.unl.edu)
o ReOrg V3.1: disk optimizer by Holger Kruse (kruse@cs.ucf.edu)
o SwazInfo by David Swasbrook (swaz@iconz.co.nz)
o Tnserv: telnet daemon for AmiTCP by Steve Holland (sdh4@cornell.edu)
If you write an interesting piece of software that supports MultiUser,
please let me know and I'll add it to the list above.
12. History
Release 1.0ß
(Library Version 39.134)
First public release of MultiUser. All the work on this one was done by
Geert Uytterhoeven.
Internal Release
(Library Version 39.135)
Update of the library and the support programs to allow global logging
out. (Kurt Haenen)
o The way the library manages the linking of tasks and owners was changed
to allow a kind of global control over all tasks of a single user. It
still isn't quite the way I'd like it, but it's getting closer ...
o The GLOBAL option was added to the Logout command to allow the user to
logout all tasks connected to the same tasknode (private structure).
This means that you can logout/login a task and all its children by
executing a LOGOUT GLOBAL command from one of them. Very useful 'cause
now you can logout the Workbench without having to quit it ...
o TASK option added to Login and Logout to allow you to Login/Logout
another task (of which you are the owner or that's owned by nobody or
whatever task if you are root).
o QUIET option added to Logout to force Logout so that nobody will become
owner of the task. We're still discussing this, so it may be removed
again in the future ...
Internal Release
(Library Version 39.136)
Update of the file system, library and support programs so that default
protection bits can be set and are used by the file system. (Geert
Uytterhoeven)
o The file system and library were updated to keep track of default
protection bits and to use them whenever a file is created.
o A new utility SetDefProtect (name may change in the future) was added
to allow the user to specify the default protection bits for a
tasknode.
Release 1.1
(Library Version 39.137)
Update of the library to support .profiles and allow hiding of the
password on any terminal (I hope)! Update to the file system to support
protection of files against locking. (Geert Uytterhoeven and Kurt Haenen)
o The Logout command now also executes a .profile script after login.
o An exclusive lock can only be taken on a file you have write-, or
delete-rights on. A shared lock can be obtained on a file you have
read-, write-, execute- or delete-rights on or that's owned by you.
o The UserInfo command can now display the .sig file located in the home
of the user on which info is demanded. To do this, you have to give
the SIG option. The .sig file should be readable for the one asking
information about the owner of the .sig!
Release 1.2
(Library Version 39.140)
Starting with this release, all the work was done by Geert Uytterhoeven.
o The password file should be compatible with the TCP/IP package from
Commdore (AS225) (I hope :-).
o Wildcards added in some support commands.
o If a user doesn't have a password he won't be asked for it no more
during Login/Logout.
o Finally: autodoc and includes added!!
o .sig renamed to .plan. SIG option renamed to PLAN.
o PURE bit set for the support commands. They were also pure in earlier
releases, but I forgot the magic bit.
o Some other minor changes I can't remember :-)
Release 1.2a
(Library Version 39.141)
Only some bug fixes :-(
o SetOwner37: opened wrong dos.library version.
o Setowner[37]: crashed when bad operating system version.
o Password encryption still wasn't compatible with AS225 because of an
ambiguity in the ACrypt() documentation (I passed the UserName instead
of the UserID).
Release 1.3 (11/05/93)
(Library Version 39.145)
WARNING: THIS IS A MAJOR UPDATE WITH SOME FUNDAMENTAL CHANGES!! YOU
SHOULD CHECK YOUR OWN MULTIUSER APPLICATION SOURCES AND
RECOMPILE THEM!!
o Using history after changing the password from the console doesn't
reveal the entered passwords anymore.
o Bug fixed: If you used Passwd before IPrefs installed localization or
in case of a pre-2.1 Workbench, a corrupt password file was written
(RawDoFmt() patched by locale.library treats %u different than the
original).
o New less kludgy, object oriented internal structure.
o Meaning of tag muT_Task changed. Now it needs a pointer to a task
structure rather than the task's name.
o Library function muSetDefProtection() renamed to muSetDefProtectionA():
its arguments are now passed via a taglist using the tag muT_Task and
the new tag muT_DefProtection.
o If you're already root you won't be asked for a password anymore during
Login.
o GLOBAL flag added to SetDefProtect.
o PROCESS keyword added for Login/Logout.
o New tags muT_UserID and muT_Password added for muLoginA().
o You aren't allowed anymore to change the owner of a file to someone
else than yourself or nobody, unless you're root.
o Owner change during execution (set uid bit, cfr. *IX) added.
o Source of support commands added as examples. They are full public
domain. If you develop your own support commands I'd appreciate it if
you would send me a copy (eventually a copy of the source too :-).
Maybe I could add them to the next release of the package.
o From now on the MultiUserFileSystem is distributed as a patch for the
original FastFileSystem.
o New support command Tasks.
o New library functions muSetProtection() and muLimitDOSSetProtection().
New support command LimitDOSSetProtection.
Release 1.4 (20/07/93)
(Library Version 39.151)
o Logout QUIET was broken: fixed!
o If the password file is corrupt, you will get a warning instead of an
inaccessible system. All invalid lines will be ignored.
o The ramlib task isn't owned by root anymore.
o UserInfo entered an endless loop if a .plan was read protected: fixed!
o SetOwner37 caused a (harmless) Enforcer hit (thanks Max): fixed!
o New keytypes muKeyType_WUserID, muKeyType_WUserName,
muKeyType_WUserIDNext and muKeyType_WUserNameNext for muGetUserInfo()
to handle wildcards in a UserID or UserName.
o UserInfo uses the new keytypes and thus allows wildcards for UserID and
UserName.
o New library function muCheckPasswd().
o The MultiUser.server doesn't spawn AmigaDOS-requesters anymore.
o The support commands MList, MProtect and SetOwner[37] now handle
non-matching wildcards correctly and give the right error message.
o Enhanced security using Keyfiles.
o The (private) library function muSetLibFlush() is obsolete now.
o Configuration file and log options added.
o The .profile in the configuration directory will be executed (depending
on your configuration settings), rather than the .profile in a user's
home-directory.
o New library functions muGetPasswdDirLock() and muGetConfigDirLock().
o Patch for the FastFileSystem of AmigaOS Release 2.05 (V36.104) added.
o QUICK flag added for UserInfo.
o If the user doesn't respond to a warning requester, the requester will
disappear automatically after 10 seconds to allow unattended operation
in production environments.
o Bug fixed: If you specify a nonexistent task name, Login/Logout TASK
raises an error now instead of operating on the current task.
o Security hole fixed: now set uid only works on volumes using the
MultiUserFileSystem.
o The .lastlogin file is human readable now (i.e. <Day> <Date> <Time>).
o The PLAN flag for UserInfo is obsolete now, UserInfo always displays
the contents of the .plan file (unless you specify the QUICK flag).
Now UserInfo displays the lastlogin date too.
o Almost all of Kurt's code is gone now (I hope this won't start an
AT&T/USL <-> BSD alike war :-).
o Finally Passwd looks fine when used from a Shell on a serial terminal:
now it dumps carriage returns where it should. I still don't know why
muLogin()/Logout() always worked correctly and Passwd not (in both
cases I used almost the same code!), but who cares??
Release 1.5 (14/10/93)
(Library Version 39.157)
o Patch for the FastFileSystem of AmigaOS Release 3.1 (V40.1) added.
o Bug fixed: If the multiuser.library hasn't been loaded yet or the
owner of a DosPacket can't be found, the default protection bits are
now RWED GROUP R OTHER R instead of RWED.
o New support command Who.
o External utility UserID added.
o Now MultiUser works fine with programs using Soft Interrupts for their
packet I/O, especially programs using ixemul.library (i.e. gcc/g++ and
programs compiled with gcc/g++). Thanks Markus!
o Bug fixed: If the LASTLOGINREQ option is turned off, Logout GUI won't
output to a console window anymore.
o Autodoc bug fixed: muLogoutA() executes the .profile in the
configuration directory rather than the .profile in the user's
home-directory.
o New tag muT_All for muLogoutA(), new flag ALL for Logout.
o The library functions muGetPasswdDirLock() and muGetConfigDirLock() are
now callable by everybody instead of root only.
o Partitions formatted under the MultiUserFileSystem for more security
(which results in a format equivalent to FFS INTL) can now be converted
to any other MultiUserFileSystem equivalent of the standard file system
(e.g. OFS or FFS DC) using ReOrg 3.1. Thanks Holger!
o Group file added, new structure muGroupInfo, new according keytypes and
new library functions muAllocGroupInfo(), muFreeGroupInfo() and
muGetGroupInfo().
o New flag GROUPS for MList, new flag GROUPS and new options GROUPID and
GROUPNAME for UserInfo, new option GROUP for SetOwner and SetOwner37.
o New structure muExtOwner, new library functions muGetTaskExtOwner() and
muUserInfo2ExtOwner(), new macros muSecGroups() and muExtOwner2ULONG().
o New library function muGetRelationshipA() for easier access control.
o Bug fixed: If you called SetOwner(), SetProtection(), SetComment() or
SetFileDate() too many times on files or directories you have no access
to, the file system crashed. This bug appeared in all subsequent
releases!
o New structures muMonitor and muMonMsg, new library functions
muAddMonitor() and muRemMonitor() for system monitoring.
o Minor changes in the format of the log file.
o New support command MAssign.
o Bug fixed: the .lastlogin file wasn't recognized using some languages.
o Installation method for Supra Wordsync controllers added. Thanks René!
Release 1.6 (27/01/94)
(Library Version 39.161)
o muLoginA() with muT_UserID and without muT_Password is allowed now.
o New option USERID for Login.
o New tag muT_NoLog for muLoginA(), for use in set uid daemons. MAssign
uses this new tag. Thanks Bernhard!
o The maximum Hostname size is extended from 15 to 31 characters. Now
Hostname is truncated on the first period.
o Login/Logout/Passwd GUI uses console I/O if the pr_WindowPtr is -1.
o New library functions muKill(), muFreeze() and muUnfreeze(). New
support commands Kill, Freeze and Unfreeze.
o Some bugs fixed in MAssign (thanks Ingolf), new options VOLUME and
CREATE for MAssign (thanks Bernhard).
o Source of the library added.
o All memory allocations are pooled now.
o Some external utilities added, list of software supporting MultiUser
extended.
o Now the file system patches are applied using spatch (© Copyright SAS
Institute, Inc.).
o Emergency boot disk method added. Thanks Ingolf!
o New Shell field in the muUserInfo structure. Thanks Thomas!
o New support command RunCommand as a workaround for the WShell set uid
problem.
Release 1.7 (07/03/94)
(Library Version 39.164)
o The LOG* flags in the config file didn't behave like they should.
o Due to a synchronization problem the keyfiles could be declared invalid
when they were valid.
o Installation method for Supra Wordsync controllers removed since it
seemed to contain Workbench files. Sorry Commodore, never noticed
it!
o Sometimes Login reported a failure in case of succes.
o Finally logout 'till the root of the task tree creates a new tree. I
hope it will work like it should this time!
o Some external utilities added, list of software supporting MultiUser
extended.
o Some other small and harmless bugs fixed.
o Package split in parts to reduce FTP bandwidth.
Release 1.8 (03/07/94)
(Library Version 39.165)
o Added Locale support for the library and support commands. (NP)
o Included interims release of filesystem.
o No new version of external utilities, use version 1.7.
13. Plans for the future
o A redesign allowing POSIX compliancy.
o The multiuser.library should be a part of the MultiUserFileSystem.
o A 'safe' backdoor for emergency situations.
o A brand new File System: maybe the Berkeley Fast File System? Any
help is welcome!
14. Credits
o Library : Geert Uytterhoeven & Kurt Haenen
o Support Commands : Geert Uytterhoeven & Kurt Haenen
o Documentation : Geert Uytterhoeven & Kurt Haenen
o File System Patches : Geert Uytterhoeven
o Locale : Norbert Püschel (also see README in Locale)
Starting with Release 1.2, all the work was done by Geert Uytterhoeven.
(The localized release 1.8 was done by Norbert Püschel).
15. Contacts
How to contact the author ...
o E-mail
uytterho@cs.kuleuven.ac.be
This account is at least valid 'till end June '94.
o Fax
+32-16-535823
o Snail mail
- My home address
Geert Uytterhoeven
Huysmansstraat 12
B-3128 BAAL
BELGIUM
- My study address (from October '93 'till end June '94)
Geert Uytterhoeven
Tervuursevest 119
B-3001 HEVERLEE
BELGIUM
How to contact the MultiUser mailing list ...
(thanks Kai)
Mail your comments to
mufs@hactar.hanse.de
If you want to subscribe to this mailing list, just send an E-mail to
listserv@hactar.hanse.de
containing a line like this:
ADD <address> mufs
where <address> stands for your E-mail address. From then on you will
receive a copy of all mails sent to the mailing list. For more help about
the mailing list, send an E-mail containing only the magic word 'HELP' to
the list server (i.e. listserv@hactar.hanse.de).
16. Special thanks go to ...
o Nico François for developing ReqTools.
o Jorrit Tyberghein for developing the magnificent debugger PowerVisor
(We're still waiting for release 1.43 :-), from which muKill(),
muFreeze() and muUnfreeze() were derived.
o SAS Institute, Inc. for spatch.
o Kurt Haenen, Ives Aerts, Litrik De Roy and Nico François for beta
testing.
o Kai 'wusel' Siering, Markus Illenseer, Tako Schotanus, Ralph-Thomas
Aussem, Max Hantsch, Markus Wild, Jason Gouger, René Laederach,
Bernhard Seefeld, Ingolf Koch and Thomas Holmstrom for their comments
and/or tips.
o The Department of Computer Science at the Katholieke Universiteit
Leuven for allowing me to use the InterNet for this MultiUser project.
o Kai 'wusel' Siering for setting up a mailing list for MultiUser.
o Fabian Nuñez, Michael Nielsen, Todd Vierling, Marco Ciuchini, Frank J.
Beckmann, Matt Francis, Litrik De Roy and Norbert Püschel for supplying
an external utility.
o Holger Kruse, Phil Dietz, the AmiTCP/IP Group and Steve Holland for
supporting MultiUser in their programs.
/ / / /
/ / / /
/ / / /
/ / / /
\ \ \ \/ / / /
\ \ \ \ / / /
\ \ \ \/ / /
\ \/\ \/ /
\ \ \ \ /
\
\
/\
\
/
Only Amiga makes it possible ...
But wouldn't Linux for Amiga be nice!
/\
/XX\
/XXXX\
/XXXXXX\
/XXXXXXXX\
/\ \XXXXXXXX/ /\
/XX\ \XXXXXX/ /XX\
/XXXX\ \XXXX/ /XXXX\
/XXXXXX\ \XX/ /XXXXXX\
/XXXXXXXX\ \/ /XXXXXXXX\
\XXXXXXXX/ /\ \XXXXXXXX/
\XXXXXX/ /XX\ \XXXXXX/
\XXXX/ /XXXX\ \XXXX/
\XX/ /XXXXXX\ \XX/
\/ /XXXXXXXX\ \/
\XXXXXXXX/
\XXXXXX/
\XXXX/
\XX/
\/