home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD1.bin / new / util / misc / multiuser / multiuser.doc < prev    next >
Text File  |  1994-07-03  |  67KB  |  1,687 lines

  1.  
  2.                                                                  
  3.                    / / / /                                       
  4.                   / / / /
  5.             \ \ \ \/ / /      -+*+- MultiUser Release 1.8 -+*+-
  6.              \ \/\ \/ /                                          
  7.               \ \/\ \/                                           
  8.  
  9.  
  10.  
  11. DISCLAIMER
  12.  
  13. WITH  THIS  DOCUMENT  I  MAKE  NO  WARRANTIES  OR  REPRESENTATIONS,  EITHER
  14. EXPRESSED  OR  IMPLIED,  WITH RESPECT TO THE PRODUCT DESCRIBED HEREIN.  THE
  15. INFORMATION  PRESENTED  HEREIN IS BEING SUPPLIED ON AN 'AS IS' BASIS AND IS
  16. EXPRESSLY  SUBJECT TO CHANGE WITHOUT NOTICE.  THE ENTIRE RISK AS TO THE USE
  17. OF  THIS  INFORMATION IS ASSUMED BY THE USER.  IN NO EVENT WILL I BE LIABLE
  18. FOR  DIRECT,  INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES RESULTING FROM
  19. ANY  CLAIM  ARISING OUT OF THE INFORMATION PRESENTED HEREIN, EVEN IF I HAVE
  20. BEEN ADVISED OF THE POSSIBILITIES OF SUCH DAMAGES.
  21.  
  22.  
  23. COPYRIGHT
  24.  
  25.   This  package is shareware.  This means you can copy it freely as long as
  26. you  don't  ask any money for it, except perhaps a nominal fee for copying.
  27. If  you  like  and use this package on a regular base, I'd appreciate it if
  28. you  send  me a contribution of 500 BEF or USD 15 (or the equivalent in any
  29. other  solid  currency).   Please  send money by International Money Order,
  30. EuroCheck  (in BEF!) or Cash, because it's very difficult for me to cash in
  31. other checks.
  32.  
  33.   This  package  should not be spread in any other form than an LhA archive
  34. and  all  parts  of  it  should be spread together.  The package may not be
  35. altered  in  any way and cannot be used for commercial purposes without the
  36. prior  written permission of the author.  This does not apply to the source
  37. of  the  support  commands, they are full public domain, only the copyright
  38. message should be preserved.
  39.  
  40.   The  package is Copyright © Geert Uytterhoeven, All Rights Reserved.  The
  41. author  reserves the right to change the status of this package whenever he
  42. may find it appropriate.
  43.  
  44.   The rules above do not apply to the external utilities, for which I don't
  45. give  any  warranties.   Read the appropriate documentation for information
  46. about their disclaimers, distributability and copyright notices.
  47.  
  48.  
  49. CONTENTS
  50.  
  51.   Introduction
  52.   System Requirements
  53.   Installation
  54.   The password file
  55.   The configuration file
  56.   The group file
  57.   Support Commands
  58.   The log file
  59.   Caveats
  60.   External utilities
  61.   Other software supporting MultiUser
  62.   History
  63.   Plans for the future
  64.   Credits
  65.   Contacts
  66.   Special thanks go to ...
  67.  
  68.  
  69.  
  70. 1. Introduction
  71.  
  72.   You've  got an Amiga with Kickstart 2.04 or higher and several people are
  73. regularly  fooling  around  with it ...  Last week your sister deleted your
  74. 20MB JPEG collection by mistake and you don't want this to happen again ...
  75. Well, here's the answer:  MultiUser!
  76.  
  77.   MultiUser allows you to create a *IX-like environment where several users
  78. live  together  in  harmony,  unable to delete each others files, unable to
  79. read  those  private  love-letters  of  other  users  ...  And this even if
  80. several  users  are  working on the machine at the same time (on a terminal
  81. hooked up to the serial port) ...
  82.  
  83.   You  are  the  sole user of your computer?  Well, make sure it stays that
  84. way  by installing MultiUser!  People without a valid login ID and password
  85. won't be able to access files you have made private with MultiUser.  If you
  86. make  all  files  private  (not readable for others), the only useful thing
  87. they could do, is boot from a floppy ...
  88.  
  89.   And ...  you do not have to reformat your hard drive!
  90.  
  91.  
  92.  
  93. 2. System Requirements
  94.  
  95.   Your  Amiga  should be equipped with Kickstart 2.04 (V37+) or higher, and
  96. with  a  hard drive/controller combination that supports the CBM Rigid Disk
  97. Block  protocol (e.g.  an A590 or A2091, an A3000 SCSI controller, an A4000
  98. IDE  controller  and most GVP SCSI controllers).  MultiUser can not be used
  99. on  floppy drive systems in a sensible way (keeping your floppies in a safe
  100. place is still safer :-).
  101.  
  102.   If you want to use localization, you need Workbench 2.1 or higher.
  103.  
  104.   You  do  need an original FastFileSystem (V36.102 (release 2.04), V36.104
  105. (release  2.05 or 2.1), V39.27 (release 3.0) or V40.1 (release 3.1)), which
  106. should have been included with your system software.
  107.  
  108.   The  package was written on an A4000/040 running Kickstart 39.106 and was
  109. tested on the following configurations:
  110.  
  111.   o A4000/040,  540  MB  Conner  CP30544  (a  VERY  fast IDE!) + 120 MB IDE
  112.     harddisk, 2 MB chip ram, 8 MB fast ram
  113.  
  114.   o A4000/040,  120  MB  IDE harddisk, 2 MB chip ram, 8 MB fast ram, Retina
  115.     graphics board, Retina WB emulation
  116.  
  117.   o A3000T  25MHz,  500+  MB  harddisk,  2  MB chip ram and 16 MB fast ram,
  118.     Kickstart  37.175,  GVP  '040  accel,  Retina graphics board, Retina WB
  119.     emulation,  Vortex  486  SLC  board  (this  is  shit!), Amax II+, IV-24
  120.     graphics board,...  (Not mine :-( A demonstration model in a store Kurt
  121.     frequently visits :^)
  122.  
  123.   o A3000  25MHz, 52 MB + 120 MB harddisk, 2 MB chip ram and some MB static
  124.     column ram.  Kickstart 39.110 (developer)
  125.  
  126.   o A500,  20 MB harddisk (A590 XT), 512 K chip ram, 512 K ranger mem, 2 MB
  127.     fast  ram,  old  chipset,  68010  processor,  Kickstart 2.04 softkicked
  128.     (developer)
  129.  
  130.   o A500,  84  or 105 MB harddisk (A590 SCSI), 512 K chip ram, 512 K ranger
  131.     mem, 2 MB fast ram, old chipset, Kickstart 2.04 softkicked (developer)
  132.  
  133.  
  134.   On all these configuration the package seems to work fine, so I guess you
  135. can run it on almost any machine.
  136.  
  137.   You  do  need  the  reqtools.library  version  38 or higher.  Reqtools is
  138. Copyright © Nico François.
  139.  
  140.  
  141.  
  142. 3. Installation
  143.  
  144.   WARNING:   Read the installation part completely BEFORE you apply it!  If
  145. you  still don't know what we're talking about, you'd better don't use this
  146. package!   It's  NOT  for the casual user; managing a MultiUser system is a
  147. difficult and tedious task!
  148.   If  anything  fails during the installation, don't forget to restore your
  149. system  to  it's  original state, else you could be surprised in a very bad
  150. way!
  151.   If  you're  upgrading  from  release  1.4  or  1.3 (or even from an older
  152. version), please read 'MultiUser.upgrade' first.
  153.  
  154.   o Extract  the  archive and change the current directory to the directory
  155.     MultiUser  located in the directory where you extracted the archive to.
  156.     (Preferably RAM:)
  157.  
  158.   o Install  the  library  and  the  support  commands  with  the following
  159.     commands:
  160.  
  161.                        Copy Libs/multiuser.library LIBS:
  162.                        Copy C/#?                   C:
  163.  
  164.   o Install the catalog files for the library and the support commands with
  165.     the following command:
  166.  
  167.                        Copy Locale                 Locale: all
  168.  
  169.   o The  MultiUserFileSystem  is  distributed  as  a patch for the original
  170.     FastFileSystem.   There  are patches for the FastFileSystems of release
  171.     2.04  (V36.102), release 2.05 (V36.104), release 2.1 (V36.104), release
  172.     3.0  (V39.27)  and  release  3.1 (V40.1) of the operating system.  Make
  173.     sure  you  have  one of these FastFileSystems in the L:  directory!  If
  174.     it's not there you can copy it from the L directory on the Install disk
  175.     of the operating system install disk set.  If you're not sure about the
  176.     version    of    your   FastFileSystem   use   the   command   'Version
  177.     L:FastFileSystem'.  Now Create a MultiUserFileSystem with the command:
  178.  
  179.                      Patch/spatch -oL:MultiUserFileSystem
  180.              -pPatch/MultiUserFileSystem_xxx.pch L:FastFileSystem
  181.  
  182.     where  xxx  stands for '2.04', '2.05', '2.1', '3.0' or '3.1', depending
  183.     on your operating system release.
  184.  
  185.     If you get the message
  186.  
  187.                       Incorrect version of original file.
  188.  
  189.     you  used  the  wrong  patchfile or you have an original FastFileSystem
  190.     which  is  not  supported  (or  your  original  FastFileSystem has been
  191.     corrupted).
  192.  
  193.     Spatch is © Copyright SAS Institute, Inc., but freely distributable.
  194.  
  195.   o Choose  the  partitions you want to protect and the directory where you
  196.     want  to  store  the  MultiUser  configuration  stuff.   Make sure this
  197.     directory  is  located  on  one  of the partitions you want to protect!
  198.     Let's  say  your  configuration  directory  is 'App:MultiUser' (Replace
  199.     'App:MultiUser'   anywhere  in  this  document  by  the  name  of  your
  200.     configuration  directory  if you use another directory name).  Copy the
  201.     configuration stuff to this directory with the following command:
  202.  
  203.                          Copy Config/#? App:MultiUser
  204.  
  205.   o If  you've  installed  the  TCP/IP  package  from Commodore (AS225) you
  206.     already  have  a  valid  password  file  (inet:db/passwd).  The inet:db
  207.     directory must be located on one of the partitions you want to protect!
  208.     Make  sure there's an entry for a 'root' user with '65535' for the user
  209.     and primary group number, e.g.:
  210.  
  211.     root||65535|65535|The Bastard Operator From Hell|SYS:Homes/Root|cli
  212.           ^^^^^ ^^^^^
  213.  
  214.   o Append the next line to your 'S:User-Startup' file:
  215.  
  216.                                Logout GUI GLOBAL
  217.  
  218.   o Pick  a  name  for  your  computer  ...   This  name will appear in the
  219.     login/logout  requester.   Let's  say  you  want  to  call  your system
  220.     'Pythagoras', then you have to execute the following:
  221.  
  222.                       Echo "Pythagoras" >ENVARC:HostName
  223.  
  224.   o Let's  say  you  want to protect the partitions 'SYS:' and 'App:'.  You
  225.     can  protect as many partitions as you like, just add their name to the
  226.     list  below.  Create the required Keyfiles on these partitions with the
  227.     following  command  if  you  haven't  installed the TCP/IP package from
  228.     Commodore:
  229.  
  230.               MakeKeyfiles App:MultiUser App:MultiUser SYS: App:
  231.  
  232.     TCP/IP users should use a command line like this:
  233.  
  234.                  MakeKeyfiles inet:db App:MultiUser SYS: App:
  235.  
  236.   o Start  HDToolBox to install the MultiUserFileSystem.  If HDToolBox does
  237.     not  find your hard drive, you probably have to start it from the shell
  238.     with  'HDToolBox  <hddev>',  where  <hddev> stands for the name of your
  239.     hard  drive  controller device (e.g.  'scsi.device' for CBM controllers
  240.     or 'gvpscsi.device' for GVP controllers).  If that fails too, you can't
  241.     use MultiUser on your system.
  242.  
  243.       NOTE: The  following  text  describes  the  use  of  the  version  of
  244.             HDToolBox  that  is  supplied  with AmigaOS Release 3.0.  Other
  245.             versions may slightly differ.
  246.  
  247.       x Choose  the drive you want to protect.  If you want to protect more
  248.         than  one  drive,  you  simply  repeat this for each of the drives.
  249.         Select  the  drive  by  clicking  on  it  in the listview where all
  250.         connected drives are displayed.
  251.  
  252.       x Press  the  <Partition  Drive>  button.   Now  a new display should
  253.         appear  containing a large box which may be divided up into several
  254.         partitions ...
  255.  
  256.       x Activate  the  <Advanced  Options>  checkbox.   Now some additional
  257.         options should appear ...
  258.  
  259.       x Press  the <Add/Update...> button in the file system section of the
  260.         HDToolBox    window.     (There's    only    one   gadget   labeled
  261.         <Add/Update...>, so you can't miss it.)
  262.  
  263.       x Now  the  window  should contain a list of currently installed file
  264.         systems  and  some  additional  buttons.   If you are updating your
  265.         MultiUserFileSystem,  there  should  already  be  an entry with the
  266.         0x6d754653  ('muFS' in HEX ASCII) identifier.  If this is the case,
  267.         click  on it and press <Update File System...>, in all other cases,
  268.         press the <Add New File System...> button.
  269.  
  270.       x Now  a  requester  appears.   Enter  'L:MultiUserFileSystem' in the
  271.         string-gadget  of  the requester and '0x6d754653' in the identifier
  272.         (also  called  DosType)  gadget.  If your version of HDToolBox asks
  273.         you to enter a version number, you should use 39.  Some versions of
  274.         HDToolbox  (the  one  with  3.0) uses two requesters for the needed
  275.         information,  so  it  may be necessary to select the <Ok> button of
  276.         the requester before you can fill in the DosType.
  277.  
  278.       x Press  the  <Ok>  button of the requester (if you haven't done this
  279.         yet).  Now you should be back in the File Systems display.  Go back
  280.         to the Partitions display by pressing the <Ok> button.
  281.  
  282.       x Select  the  partition on the drive that you wanna protect.  If you
  283.         want  to  protect  more  than  one  partition (it is recommended to
  284.         protect  all  partitions  on  the  drive),  you  simply  repeat the
  285.         following  stuff  for  every  partition.  You select a partition by
  286.         clicking  on  the  part  of  the  large  box (which represents your
  287.         harddisk) that represents that partition.
  288.  
  289.       x Press the <Change ...> or <Change File System> button.
  290.  
  291.       x Select  the  <Custom  File  System>  gadget  and enter '0x6d754653'
  292.         ('muFS' in HEX ASCII) into the <Identifier> gadget.
  293.  
  294.       x Press  the  <Ok>  button  to return to the Partitions display.  You
  295.         should  repeat  the  above steps for all the partitions you wish to
  296.         protect before continuing ...
  297.  
  298.       x Press the <Ok> button to return to the main HDToolBox display.
  299.  
  300.       x Press  the  <Save  Changes  to Drive> button.  Don't care about the
  301.         warning  that this will destroy the data on your partition, no data
  302.         will  be  lost :-).  If HDToolBox complains that there isn't enough
  303.         space  on  the drive to save all the configuration data, you should
  304.         return  to  the  File  System  Maintenance  section of HDToolBox by
  305.         pressing  <Partition  Drive> and <Add/Update ...> buttons.  Now you
  306.         should  select  another  file  system  than the one with identifier
  307.         0x6d754653,   press  <Delete  File  System>,  return  to  the  main
  308.         HDToolBox  display  and  try  saving the configuration again.  Note
  309.         that  you  should  make  sure  not to delete any file system that's
  310.         still  used  on  any partition!  This is why it is recommended that
  311.         all partitions on the drive should use the MultiUserFileSystem.
  312.  
  313.       x If  everything  went OK, select Exit and confirm the reboot request
  314.         of HDToolBox.  Now your machine should automatically reset.
  315.  
  316.   o After  the  reboot,  a requester should appear.  Simply enter 'root' as
  317.     login  id.   You  should now be logged in as root, having access to all
  318.     files.
  319.  
  320.   o The first thing you should do is to change your password.  This is done
  321.     by  entering  the  Passwd  GUI  command in a shell you open or with the
  322.     <Execute  Command  ...>  option  of the Workbench.  You are prompted to
  323.     enter  your  old password, so simply press enter.  Now you are asked to
  324.     enter  your  new password twice.  If you enter the same password twice,
  325.     this  will from now on (until you change it again) be the password root
  326.     has to enter at a login request.
  327.  
  328.   o Now  you  have  to  protect some important files using the MProtect and
  329.     SetOwner[37]  commands.   We will use SetOwner in this description, but
  330.     if  you  aren't  using  Kickstart  39.xx  or  higher,  you  should  use
  331.     SetOwner37 instead!
  332.     You  should  protect the Keyfiles on all protected partitions.  Execute
  333.     the following commands for every protected partition:
  334.  
  335.                SetOwner <VOL>.MultiUser.keyfile root
  336.                MProtect <VOL>.MultiUser.keyfile R
  337.  
  338.     where  <VOL> stands for a partition name (e.g.  'SYS:' or 'App:' in our
  339.     example).  Protect some other important files, too:
  340.  
  341.              SetOwner App:MultiUser/passwd root
  342.              MProtect App:MultiUser/passwd RWD
  343.              SetOwner App:MultiUser/MultiUser.config root
  344.              MProtect App:MultiUser/MultiUser.config RWD
  345.              SetOwner App:MultiUser/MultiUser.group root
  346.              MProtect App:MultiUser/MultiUser.group RWD
  347.              SetOwner App:MultiUser/.profile root
  348.              MProtect App:MultiUser/.profile SRWED GROUP R OTHER R
  349.              SetOwner S:Startup-Sequence root
  350.              MProtect S:Startup-Sequence SRWED GROUP R OTHER R
  351.              SetOwner S:User-Startup root
  352.              MProtect S:User-Startup SRWED GROUP R OTHER R
  353.              SetOwner SYS:Tools/HDToolBox root
  354.              MProtect SYS:Tools/HDToolBox RWED
  355.  
  356.                 ... and any other files you wish to protect ...
  357.  
  358.     It  is  recommended  to leave most files readable for others, except of
  359.     course  the  files  you really wanna keep to yourself.  .info files and
  360.     .backdrop  files  should  be  readable  for everybody if you don't want
  361.     complications when using the Workbench.
  362.  
  363.   o Do  NOT  forget  to  make a backup of all Keyfiles, in case an accident
  364.     occurs!
  365.  
  366.   o If  you  think  you  may  ever  forget  your  root  password, create an
  367.     emergency boot disk using the procedure mentioned in 'Emergency.doc' in
  368.     the 'Emergency' directory.  If you don't I hope your strong memory will
  369.     never leave you!
  370.  
  371.  
  372.  
  373. 4. The password file
  374.  
  375.   The  password  file  contains all the information the system needs on the
  376. users  that  are  allowed to access the system.  This file (named 'passwd')
  377. must  be  located  in  the  PASSWDDIR  directory,  as  specified  with  the
  378. 'MakeKeyFiles'  command.  Each line of the file contains information on one
  379. user.  The syntax of such a line is as follows:
  380.  
  381.       <userid>'|'<passwd>'|'<uid>'|'<gid>'|'<name>'|'<home>'|'<port>
  382.  
  383. <userid>  is  the  same  as the name this user will need to give at a login
  384.           request.  This name may be upto 31 characters long.
  385.  
  386. <passwd>  if  the  user has a password, this is his coded password.  If you
  387.           add  new  users, you should make this field empty, this means the
  388.           user  doesn't  have  a password yet.  Then login as that user and
  389.           change his password using the Passwd command.
  390.  
  391. <uid>     is  the user identifier, a number between 1 and 65535.  Each user
  392.           should have a different user identifier!  The identifier 65535 is
  393.           reserved for root!
  394.  
  395. <gid>     is  the  primary  group identifier, a number between 0 and 65535.
  396.           Users with the same group identifier belong to the same group and
  397.           can  access  each  others files depending on the group-protection
  398.           bits.   Users  with  different  group identifiers can access each
  399.           others   files  depending  on  the  other-protection  bits.   The
  400.           identifier  65535  is  reserved for root!  For users belonging to
  401.           more than one group, see the group file section.
  402.  
  403. <name>    is  the  real  name of the user.  You can enter whatever you like
  404.           for this.  At the moment this is limited to 219 characters.  This
  405.           name  is  displayed  when  user  information  is  asked using the
  406.           UserInfo command.
  407.  
  408. <home>    is the home-directory of the user.  When a logout is performed, a
  409.           requester  will appear prompting for a new login.  If a user logs
  410.           in using this requester, the current directory will be changed to
  411.           the  home  of  this  user and the local environment variable HOME
  412.           will  be  set  to  the  name of the home-directory.  This doesn't
  413.           happen when a Login command is used.
  414.  
  415. <port>    is  only  used  by the TCP/IP package from Commodore (AS225).  If
  416.           you  haven't  installed  that package you should leave this field
  417.           empty.
  418.  
  419.   A passwd file could look like this:
  420.  
  421.     root||65535|65535|The Bastard Operator From Hell|SYS:Homes/Root|cli
  422.     geert|Fqhg_IYBiU`|2|1|Geert Uytterhoeven|SYS:Homes/Geert|cli
  423.     kurt|fNXjuAgFBFF|3|2|Kurt Haenen|SYS:Homes/Kurt|cli
  424.     guest||1|0|Anonymous Guest|SYS:Homes/Guest|cli
  425.  
  426.   If there are bad lines in the password file, a warning will be posted and
  427. the  bad  line  will  be  ignored.   The  warning  requester will disappear
  428. automatically after 10 seconds if the user doesn't respond.
  429.  
  430.  
  431.  
  432. 5. The configuration file
  433.  
  434.   The   configuration   file  defines  some  settings.   This  file  (named
  435. 'MultiUser.config')   must  be  located  in  the  CONFIGDIR  directory,  as
  436. specified  with the 'MakeKeyFiles' command.  It contains lines with options
  437. and  values  - in the form <OPTION>=<VALUE> -, and comments.  Comments must
  438. be  preceeded with a semicolon.  If an option is missing, the default value
  439. will be taken.  0 is used for OFF, 1 for ON.
  440.   The  'MultiUser.config'  example  delivered with the package reflects the
  441. default settings.
  442.   If  there  are  bad  options in the configuration file, a warning will be
  443. posted  and  the  bad  line  will  be  ignored.  The warning requester will
  444. disappear automatically after 10 seconds if the user doesn't respond.
  445.  
  446.  
  447. 5.1. LIMITDOSSETPROTECTION
  448.  
  449.   If this options is turned on, the protection bits for GROUP and OTHER can
  450. no  longer be changed with the dos.library/SetProtection() call.  Of course
  451. you  can  still  change  the  protection  bits for GROUP and OTHER with the
  452. MProtect  command  (or with the library call muSetProtection()).  It's very
  453. useful because a lot of programs change the protection bits without knowing
  454. about  bits  for  GROUP  and  OTHER.  Defaults to ON.  See also the support
  455. command LimitDOSSetProtection.
  456.  
  457.  
  458. 5.2. PROFILE
  459.  
  460.   If  this option is turned on and there exists a script file '.profile' in
  461. the configuration directory, it will be executed after each login prompt by
  462. the support command Logout.  Defaults to ON.
  463.   The   '.profile'   example   delivered   with   the  package  displays  a
  464. 'Message_Of_The_Day'  if  it  exists in the configuration directory (change
  465. the  directory  in  the  '.profile'  if  you have a different configuration
  466. directory  than  'App:MultiUser') and executes a '.profile' if it exists in
  467. the user's home-directory.
  468.  
  469.  
  470. 5.3. LASTLOGINREQ
  471.  
  472.   If  this  option  is  turned  on, there will appear a lastlogin requester
  473. after each graphical login.  Defaults to ON.
  474.  
  475.  
  476. 5.4. LOGSTARTUP
  477.  
  478.   If  this  option  is  turned on, every startup or reinitialisation of the
  479. MultiUser.server  will  be  logged  to  the  file  'MultiUser.log'  in  the
  480. configuration directory.  Defaults to OFF.
  481.  
  482.  
  483. 5.5. LOGLOGIN
  484.  
  485.   If this option is turned on, every successful login will be logged to the
  486. file 'MultiUser.log' in the configuration directory.  Defaults to OFF.
  487.  
  488.  
  489. 5.6. LOGLOGINFAIL
  490.  
  491.   If  this  option is turned on, every unsuccessful login will be logged to
  492. the file 'MultiUser.log' in the configuration directory.  Defaults to OFF.
  493.  
  494.  
  495. 5.7. LOGPASSWD
  496.  
  497.   If  this  option  is  turned on, every successful password change will be
  498. logged   to  the  file  'MultiUser.log'  in  the  configuration  directory.
  499. Defaults to OFF.
  500.  
  501.  
  502. 5.8. LOGPASSWDFAIL
  503.  
  504.   If  this  option is turned on, every unsuccessful password change will be
  505. logged   to  the  file  'MultiUser.log'  in  the  configuration  directory.
  506. Defaults to OFF.
  507.  
  508. 5.9. LOGCHECKPASSWD
  509.  
  510.   If  this  option  is  turned on, every successful password check (see the
  511. library   function   muCheckPasswd())   will   be   logged   to   the  file
  512. 'MultiUser.log' in the configuration directory.  Defaults to OFF.
  513.  
  514.  
  515. 5.10. LOGCHECKPASSWDFAIL
  516.  
  517.   If  this  option is turned on, every unsuccessful password check (see the
  518. library   function   muCheckPasswd())   will   be   logged   to   the  file
  519. 'MultiUser.log' in the configuration directory.  Defaults to OFF.
  520.  
  521.  
  522. 5.11. PASSWDUIDLEVEL
  523.  
  524.   Users  with  a  user identifier greater or equal than the specified value
  525. are  allowed  to  change  their  passwords.   Specify  a value in the range
  526. 0..65535.   E.g.   if  you  specify  a value of 2, a guest user with a user
  527. identifier  of  1  cannot  change  his  password,  unless his primary group
  528. identifier  is  greater  than  the  PASSWDGIDLEVEL.   See  also  the option
  529. PASSWDGIDLEVEL.  Defaults to 0.
  530.  
  531.  
  532. 5.12. PASSWDGIDLEVEL
  533.  
  534.   Users with a primary group identifier greater or equal than the specified
  535. value  are allowed to change their passwords.  Specify a value in the range
  536. 0..65535.   E.g.   if  you specify a value of 1, all users in a guest group
  537. with  a primary group identifier of 0 cannot change their passwords, unless
  538. their  user  identifiers are greater than the PASSWDUIDLEVEL.  See also the
  539. option PASSWDUIDLEVEL.  Defaults to 0.
  540.  
  541.  
  542.  
  543. 6. The group file
  544.  
  545.   The group file contains more information about the groups and defines the
  546. secondary  groups  a  user  belongs to, and thus allows a user to belong to
  547. more  than  one group.  This file (named 'MultiUser.group') must be located
  548. in  the  CONFIGDIR directory, as specified with the 'MakeKeyFiles' command.
  549. This file exists out of two parts, separated by a blank line.
  550.   Each  line  in  the  first  part  of the file contains information on one
  551. group.   Note however that not every group should have a line in this file,
  552. but at least one must have one.  The syntax of such a line is as follows:
  553.  
  554.                    <GroupID>|<gid>|<MgrUid>|<GroupName>
  555.  
  556. <GroupID>   is  the  short  name  of  the  group.  This name may be upto 31
  557.             characters long.
  558.  
  559. <gid>       is  the group identifier for this group, a number between 0 and
  560.             65535.
  561.  
  562. <MgrUid>    is  the  user identifier of this group's manager.  If the group
  563.             doesn't  have  a  manager,  you  should  specify  0.  It is not
  564.             necessary that a group's manager belongs to the group.
  565.  
  566. <GroupName> is  the  full  name  of  the  group.  This name may be upto 219
  567.             characters long.
  568.  
  569.   Each line in the second part of the file contains information on one user
  570. (there  may  exist more than one line for each user).  The syntax of such a
  571. line is as follows (max.  about 1024 characters):
  572.  
  573.                           <uid>:<gid>[,<gid>...]
  574.  
  575. <uid>     is the user identifier of a user.
  576.  
  577. <gid>     is  the  group  identifier of a secondary group to which the user
  578.           belongs.  It is NOT necessary to specify the primary group number
  579.           (as specified in the passwd file) as one of the secondary groups.
  580.  
  581.   A group file could look like this:
  582.  
  583.                        root|65535|65535|System
  584.                        dev|1|65535|Developers
  585.                        stud|2|2|Students
  586.                        guest|0|65535|Anonymous Guest
  587.  
  588.                        2:2,65535
  589.                        3:1
  590.  
  591.   If  there  are  bad lines in the group file, a warning will be posted and
  592. the  bad  line  will  be  ignored.   The  warning  requester will disappear
  593. automatically after 10 seconds if the user doesn't respond.
  594.  
  595.  
  596.  
  597. 7. Support Commands
  598.  
  599.   The  support commands are used to login to/logout from the system, change
  600. the  protection  bits  of  a  file,  change the owner of a file, change the
  601. default  protection  bits  for a group of tasks, ...  The number of support
  602. commands  may  grow  in  future  releases.   Here are the commands that are
  603. currently  supported.  They can only be executed from the shell or with the
  604. <Execute Command...> option of the Workbench.
  605.  
  606.  
  607. 7.1. Freeze
  608.  
  609.   This  command  freezes  a specified task.  You cannot freeze yourself nor
  610. the MultiUser.server.  This command can be used only by root.
  611.   See also the support commands 'Unfreeze' and 'Kill'.
  612.  
  613. Options ...
  614.  
  615. TCB       The  address  of  the  Task Control Block of the task you want to
  616.           freeze.   It can be both hexadecimal (preceeded with '$' or '0x')
  617.           or decimal.
  618.  
  619.  
  620. 7.2. Kill
  621.  
  622.   This command tries to cancel a specified task.  You cannot commit suicide
  623. nor kill the MultiUser.server.  This command can be used only by root.
  624.   WARNING:   Due  to  the  nature  of  AmigaOS,  killing  a  task is a very
  625. dangerous action!  Use it at your own risk!  Freezing a task is much safer.
  626.   See also the support commands 'Freeze' and 'Unfreeze'.
  627.  
  628. Options ...
  629.  
  630. TCB       The  address  of  the  Task Control Block of the task you want to
  631.           cancel.   It can be both hexadecimal (preceeded with '$' or '0x')
  632.           or decimal.  This task may be frozen.
  633.  
  634.  
  635. 7.3. LimitDOSSetProtection
  636.  
  637.   This  command defines whether the protection bits for GROUP and OTHER may
  638. be  changed  via  the  dos.library/SetProtection()  call.  It's very useful
  639. because  a lot of programs change the protection bits without knowing about
  640. bits for GROUP and OTHER.  See also the option LIMITDOSSETPROTECTION in the
  641. configuration file.
  642.  
  643. Options ...
  644.  
  645. ON        Turn the limitation on.  This means the protection bits for GROUP
  646.           and    OTHER    no    longer    can    be    changed   with   the
  647.           dos.library/SetProtection() call.  Of course you can still change
  648.           the protection bits for GROUP and OTHER with the MProtect command
  649.           (or with the library call muSetProtection()).
  650.  
  651. OFF       Turn the limitation off.
  652.  
  653.  
  654. 7.4. Login
  655.  
  656.   This  command  will  put  a  new owner on top of the current owner of the
  657. task.   *IX users may think of this as the *IX su command.  The effect of a
  658. successful  login  can be reversed with the Logout command.  The owner-list
  659. of a task is sort of a stack:  with Login you put a new owner on top of the
  660. stack,  with  Logout,  you  take an owner of the stack (unless the stack is
  661. empty).
  662.  
  663. Options ...
  664.  
  665. USERID    Login as this user.
  666.  
  667. GUI       Normally  the  login  prompt appears in the shell-window that was
  668.           used  to  execute  Login,  but  if  this  option  is specified, a
  669.           requester is used.
  670.  
  671. TASK      Login  another  task  than the one we're currently working in.  A
  672.           task  name  should  be specified after the TASK keyword.  You can
  673.           only login tasks which you own (unless you are root)!
  674.  
  675. OWN       Login  another  task  than  the one we're currently working in by
  676.           changing it's owner to the owner of the current task.  This works
  677.           only  with  tasks that are owned by nobody (unless you are root)!
  678.           This option must be used in conjunction with the TASK option.
  679.  
  680. GLOBAL    Login  all  tasks  connected  to  the  current  task.  It's a bit
  681.           difficult to explain what connected means, but you could say that
  682.           a  parent  task  and all its children are connected unless one of
  683.           them was logged in/out without the GLOBAL option.
  684.  
  685. PROCESS   Login  another  process than the one you're currently working in.
  686.           A  process  number (as displayed by the Status command) should be
  687.           specified   after  the  PROCESS  keyword.   You  can  only  login
  688.           processes which you own (unless you are root)!
  689.  
  690.  
  691. 7.5. Logout
  692.  
  693.   This  command  is  the  inverse  of  Login  if the stack of owners of the
  694. current  task  isn't  empty.   If the stack is empty or becomes empty after
  695. executing the Logout command, a login prompt will appear.  After login, the
  696. current  directory  will  be  changed  to  the  user's  home-directory, and
  697. depending  on  your  configuration  settings,  the '.profile' script in the
  698. configuration directory may be executed.
  699.  
  700. Options ...
  701.  
  702. GUI       If  a  login  request  is  generated  by  Logout, should it use a
  703.           requester?
  704.  
  705. TASK      See Login
  706.  
  707. GLOBAL    This  option  only works when the owner stack is or becomes empty
  708.           when  executing  the Logout command.  If this option is specified
  709.           in such a case, not only this task will change its owner, but all
  710.           connected  task  as  well.   It's a bit difficult to explain what
  711.           connected means, but you could say that a parent task and all its
  712.           children  are connected unless one of them was logged out without
  713.           the  GLOBAL  option.   It's  very useful to logout all your tasks
  714.           from your current session.
  715.  
  716. QUIET     Tells  logout  never  to  generate a login request.  If the owner
  717.           stack  becomes  empty,  you  will  simply be logged in as nobody.
  718.           This may be removed in future releases, but since it isn't really
  719.           useful, this shouldn't be a problem.
  720.  
  721. PROCESS   See Login
  722.  
  723. ALL       Remove  all  users  from  the  stack  of owners.  Specifying this
  724.           option  has  the  same  effect  as using 'Logout' until you get a
  725.           login request.
  726.  
  727.  
  728. 7.6. MakeKeyfiles
  729.  
  730.   This command creates the Keyfiles.  Every partitions you want to use with
  731. the  MultiUserFileSystem  must have a Keyfile ('.MultiUser.keyfile') in its
  732. root  directory.  If one of them is missing or inconsistent, all tasks will
  733. be  owned  by nobody to prevent unprivileged accesses, and an alert will be
  734. posted!
  735.   Do  NOT  forget  to  make  a  backup of all Keyfiles, in case an accident
  736. occurs!
  737.  
  738. Options ...
  739.  
  740. PASSWDDIR The directory where you've put the password file.  This directory
  741.           must be on one of the protected partitions.
  742.  
  743. CONFIGDIR The  directory where you've put the configuration and group file.
  744.           This directory must be on one of the protected partitions.
  745.  
  746. VOLUME    The list of partitions you want to protect.
  747.  
  748.  
  749. 7.7. MAssign
  750.  
  751.   This  command  lets  you create non-binding assigns (i.e.  assigns which are
  752. evaluated  each  time  you use them) for a template path.  You should start it
  753. from  a  shell  using  'Run'  (since  MAssign  won't  return until you send an
  754. ACTION_DIE  DosPacket)  and may want to redirect it's output to NIL:.  MAssign
  755. must  be  run  by  root,  so change its owner to root and set its 'U'-bit (see
  756. MProtect).
  757.  
  758. Options ...
  759.  
  760. NAME      The  logical device name for the assignment to create.  It should
  761.           end  with  a  colon  (':').   This  name will show up in ReqTools
  762.           requesters  too,  but unfortunately not in asl requesters, so use
  763.           RTPatch (© Nico François)!
  764.  
  765. TARGET    Template   path  for  the  assignment.   It  may  contain  option
  766.           specifiers  which  are  replaced  by  a string - depending on the
  767.           calling user - on every usage.
  768.  
  769.             %u  UserId of the calling user
  770.  
  771.             %h  Home directory of the calling user
  772.  
  773.             %g  GroupID of the calling user
  774.  
  775.             %%  %
  776.  
  777. VOLUME    Create  a  volume  node for this assign so an icon will appear on
  778.           the Workbench.
  779.  
  780. CREATE    Create the TARGET directory if it doesn't exist on access.
  781.  
  782. E.g.  after the command
  783.  
  784.                       Run >NIL: MAssign HOME: %h VOLUME
  785.  
  786. every  user  can refer to his/her home directory simply by using HOME:.  If
  787. you  want  a  separate  ENVARC:   directory  for every user you can use the
  788. following two commands:
  789.  
  790.                               Assign ENVARC:
  791.                Run >NIL: MAssign ENVARC: %h/Env-Archive CREATE
  792.  
  793. This  technique can easily be extended to ENV:, S:, MAIL:, ...  The 'Assign
  794. ...   DISMOUNT'  is  only necessary if you want to redefine an assign which
  795. already exists.
  796.  
  797.  
  798. 7.8. MList
  799.  
  800.   This is a simple list replacement.  It takes none, one or more path-names
  801. as  parameters  and  lists  the  files  in  those path(s) or in the current
  802. directory if no path-name was specified, together with all their protection
  803. bits and some other info.  It recognizes the new 'U' protection bit.
  804.  
  805. Options ...
  806.  
  807. DIR       The pathname(s) or the directory(s) you want information on.  The
  808.           standard AmigaDOS wildcards may be used here.
  809.  
  810. GROUPS    Display the GroupIDs for the files.
  811.  
  812.  
  813. 7.9. MProtect
  814.  
  815.   This command changes the protection flags for files or directories.
  816.  
  817. Options ...
  818.  
  819. FILE      The file or directory you want to change the protection flags of.
  820.           The standard AmigaDOS wildcards may be used here.
  821.  
  822. FLAGS     The protection flags used for the owner of the file.  Valid flags
  823.           are none or some out of:
  824.  
  825.             U   Set  uid  bit:   during  execution, change the owner of the
  826.                 process  (i.e.   the  uid and gid) to the owner of the file
  827.                 (cfr.   *IX).   This  even  works  if  you make the program
  828.                 resident.     However,    this   only   works   after   the
  829.                 multiuser.library   has   been  initialised.   If  you  put
  830.                 programs  with  the 'U' bit on in your S:User-Startup, make
  831.                 sure  you  do  it after the 'Logout GLOBAL' command, or put
  832.                 'UserInfo  <>NIL:'  before  the first of them to assure the
  833.                 library  has  been loaded!  If you set the 'U' bit together
  834.                 with 'GROUP W' or 'OTHER W', you will get a warning because
  835.                 this is a very dangerous situation :-)
  836.  
  837.             S   Script bit:  file is a shell script.
  838.  
  839.             P   Pure bit:  program is reentrant and reexecutable.
  840.  
  841.             A   Archive bit:  file has been backed up or archived.
  842.  
  843.             R   Read bit:  file is readable.
  844.  
  845.             W   Write bit:  file is writable.
  846.  
  847.             E   Execute bit:  file is executable.
  848.  
  849.             D   Delete bit:  file is deletable.
  850.  
  851. GROUP     The  protection  flags  used  for  users in the same group as the
  852.           owner  of the file.  Specify them after the GROUP keyword.  Valid
  853.           flags are none or some out of 'R', 'W', 'E' and 'D'.
  854.  
  855. OTHER     The  protection  flags  used for users outside the owner's group.
  856.           Specify  them  after  the OTHER keyword.  Valid flags are none or
  857.           some out of 'R', 'W', 'E' and 'D'.
  858.  
  859. ADD       Add  all specified protection flags to the flags that are already
  860.           set.
  861.  
  862. SUB       Subtract  all  specified protection flags from the flags that are
  863.           already set.
  864.  
  865. ALL       Recursively  scan  all  directories  from  within  the  specified
  866.           directory and process all found files and directories.
  867.  
  868. QUIET     Process silently, but do report errors.
  869.  
  870.  
  871. 7.10. Passwd
  872.  
  873.   The  Passwd  command is used to change your password.  Simply type in the
  874. command  in  the  shell and you will be prompted to enter your old password
  875. and type your new password twice.  If you did this correctly, your password
  876. will be changed!
  877.  
  878. Options ...
  879.  
  880. GUI       If this option is specified, Passwd uses requesters to prompt for
  881.           your passwords instead of simple console I/O.
  882.  
  883.  
  884. 7.11. RunCommand
  885.   The RunCommand command lets you execute a set uid program (a program with
  886. the 'U'-bit set and thus want to change it's owner during execution) from a
  887. shell  that  does  not  use  Create[New]Proc()  or  RunCommand() to execute
  888. commands (e.g.  WShell).  If you don't have such a shell or you do not want
  889. to use the set uid feature, you won't need this utility.
  890.  
  891. Options ...
  892.  
  893. COMMAND   The program you want to execute.
  894.  
  895. ARGS      The arguments for the program.
  896.  
  897.  
  898. 7.12. SetDefProtect
  899.  
  900.   This commands sets the default protection bits for the current task.
  901.  
  902. Options ...
  903.  
  904. FLAGS     The  protection  flags  used  for  the  owner  of  the file.  See
  905.           MProtect ('U' is not valid here).
  906.  
  907. GROUP     The  protection  flags  used  for  users in the same group as the
  908.           owner  of  the  file.  Specify them after the GROUP keyword.  See
  909.           MProtect.
  910.  
  911. OTHER     The  protection  flags  used for users outside the owner's group.
  912.           Specify them after the OTHER keyword.  See MProtect.
  913.  
  914. GLOBAL    Change the default protection bits not only for the current task,
  915.           but for all tasks on the same level.
  916.  
  917.  
  918. 7.13. SetOwner
  919.  
  920.   This  command is used to change the owner of a file.  You can only change
  921. the  owner  of  files  you own or of files that are owned by nobody, unless
  922. you're  root.   If you don't have Kickstart 39.xx or higher, you should use
  923. SetOwner37 instead of SetOwner!
  924.  
  925. Options ...
  926.  
  927. FILE      The  file  or  directory  you  want  to change the owner of.  The
  928.           standard AmigaDOS wildcards may be used here.
  929.  
  930. USER      The  UserID  of the user that should become the owner of the file
  931.           or  directory.   If  no user is specified, the current task owner
  932.           will  be taken.  You're not allowed to change the owner of a file
  933.           to someone else than yourself or nobody, unless you're root.
  934.  
  935. GROUP     The GroupID of the group for the file or directory owner.  If you
  936.           don't  specify any group, the user's primary group will be taken.
  937.           Of  course  you  must  specify a group you belongs to (i.e.  your
  938.           primary  group  or  one  of your secondary groups), unless you're
  939.           root.
  940.  
  941. NOBODY    Set the owner of the file or directory to nobody.
  942.  
  943. ALL       Recursively  scan  all  directories  from  within  the  specified
  944.           directory and process all found files and directories.
  945.  
  946. QUIET     Process silently, but do report errors.
  947.  
  948.  
  949. 7.14. Tasks
  950.  
  951.   This command lists the active tasks of a user.
  952.  
  953. Options ...
  954.  
  955. USERID    List  the  active  tasks  of  the specified user.  Default is the
  956.           current user.
  957.  
  958. ALL       List all active tasks.
  959.  
  960.  
  961. 7.15. Unfreeze
  962.  
  963.   This  command  unfreezes a task you have frozen before.  This command can
  964. be used only by root.
  965.   See also the support commands 'Freeze' and 'Kill'.
  966.  
  967. Options ...
  968.  
  969. TCB       The  address  of  the  Task Control Block of the task you want to
  970.           unfreeze.   It  can  be  both  hexadecimal (preceeded with '$' or
  971.           '0x') or decimal.
  972.  
  973.  
  974. 7.16. UserInfo
  975.  
  976.   This  command  can  be  used to get some information on the users of this
  977. system.   It  will  display  the  UserID  and  uid,  GroupID and gid, name,
  978. home-directory,  lastlogin  date  and  the contents of a '.plan' file if it
  979. exists in the home-directory of the appropriate user.
  980.  
  981. Options ...
  982.  
  983. USERID    Give  information  on  the  user  with the specified UserID.  The
  984.           UserID  is  the  name  you  have to enter at a login prompt.  The
  985.           standard  AmigaDOS  wildcards  may  be used here.  Default is the
  986.           current user.
  987.  
  988. UID       Same  as USERID, but this time information on the user whose user
  989.           ID  is  specified  is listed.  The user ID is the number given as
  990.           second  entry  in  the passwd file.  Specify the userid after the
  991.           UID keyword.
  992.  
  993. GID       Same  thing as UID, but this time for all users in the group with
  994.           the  specified  group  ID.   Specify  the  group ID after the GID
  995.           keyword.
  996.  
  997. NAME      Gives  information  on  the  user  with  the specified real name.
  998.           Specify  the  name after the NAME keyword.  The standard AmigaDOS
  999.           wildcards may be used here.
  1000.  
  1001. GROUPID   Gives  information  on  all  the  users  in  the  group  with the
  1002.           specified   GroupID.   Specify  the  GroupID  after  the  GROUPID
  1003.           keyword.
  1004.  
  1005. GROUPNAME Gives  information  on  all  the  users  in  the  group  with the
  1006.           specified Group Name.  Specify the Group Name after the GROUPNAME
  1007.           keyword.
  1008.  
  1009. ALL       Give information on all the users of this system.  This means all
  1010.           users listed in the passwd file.
  1011.  
  1012. QUICK     If  you  add  this  option, only the UserID(s) will be displayed.
  1013.           This  is  very  useful  for scripts and aliases.  E.g.  after the
  1014.           alias definition
  1015.  
  1016.                     Alias HCD CD SYS:Homes/*`UserInfo QUICK []*`
  1017.  
  1018.           the  command  'HCD  guest'  will  change the current directory to
  1019.           guest's   home   directory,   supposed  all  your  users  have  a
  1020.           home-directory in SYS:Homes.
  1021.  
  1022. GROUPS    If  you  add  this option, the secondary groups a user belongs to
  1023.           will be displayed too.
  1024.  
  1025.  
  1026. 7.17. Who
  1027.  
  1028.   This  command  lists the names and UserIDs of all users who are logged in
  1029. currently.
  1030.  
  1031. Options ...
  1032.  
  1033. AM I      Display only the name and UserID of the current user.
  1034.  
  1035. QUICK     If you add this option, only the UserID(s) will be displayed.
  1036.  
  1037.  
  1038.  
  1039. 8. The log file
  1040.  
  1041.   Depending  on your configuration file, some actions will be logged to the
  1042. file  'MultiUser.log'  in your configuration directory.  The following kind
  1043. of  entries may appear therein (<user> stands for a user represented by his
  1044. user identifier, <userid> stands for a user represented by his UserID):
  1045.  
  1046.   o <date>, <time>: Startup
  1047.  
  1048.     MultiUser startup on <date>, <time>.
  1049.  
  1050.   o <date>, <time>: Login from <user> to <UserID>
  1051.  
  1052.     <UserID>  was  logged in from a task owned by <user> on <date>, <time>.
  1053.     <user> will be '0000' if the Logout command was used instead of Login.
  1054.  
  1055.   o <date>, <time>: Login from <user> to <UserID> failed
  1056.  
  1057.     <UserID> failed to login from a task owned by <user> on <date>, <time>.
  1058.     <user>  will be '0000' if the Logout command was used instead of Login.
  1059.     This  may  indicate an attempt of <user> to do an unauthorized login on
  1060.     the account of <UserID>!
  1061.  
  1062.   o <date>, <time>: Passwd for <user>
  1063.  
  1064.     <user> changed his password on <date>, <time>.
  1065.  
  1066.   o <date>, <time>: Passwd for <user> failed
  1067.  
  1068.     <user> failed to change his password on <date>, <time>.
  1069.  
  1070.   o <date>, <time>: CheckPasswd for <user>
  1071.  
  1072.     The  password  check  ((see  the  library  function muCheckPasswd()) on
  1073.     <date>, <time> for <user> was successful.
  1074.  
  1075.   o <date>, <time>: CheckPasswd for <user> failed
  1076.  
  1077.     The  password  check  ((see  the  library  function muCheckPasswd()) on
  1078.     <date>,  <time>  for  <user>  was  unsuccessful.   This may indicate an
  1079.     attempt  of an unknown person to make unauthorizedly use of the account
  1080.     of <user>!
  1081.  
  1082.  
  1083.  
  1084. 9. Caveats
  1085.  
  1086.   o Unlike  the FastFileSystem, the MultiUserFileSystem returns an error on
  1087.     illegal lock modes (i.e.  anything else than ACCESS_READ/SHARED_LOCK or
  1088.     ACCESS_WRITE/EXCLUSIVE_LOCK).    This   has   been   done   for  future
  1089.     compatibility  reasons.   However,  some  programs do pass illegal lock
  1090.     modes - which is a violation of the Amiga rules - and thus will fail to
  1091.     work.
  1092.  
  1093.   o The  .profile  will not be executed under Csh because Csh is not a real
  1094.     (Amiga) shell but rather an interactive program.
  1095.  
  1096.   o Csh  expands wild cards by itself, so quote them (e.g.  "*") if you use
  1097.     the support commands.
  1098.  
  1099.   o Do  not  try  to  use  the MultiUserFileSystem on floppy disks or other
  1100.     removables  (unless  you  want  to  create  an  emergency  boot disk as
  1101.     explained  in the appropriate documentation)!  Although it is possible,
  1102.     you  will almost always get in trouble with the Keyfiles.  Keeping your
  1103.     floppies in a safe place is still the best protection!
  1104.  
  1105.   o ARexx  programs  are  always  executed  under the same ownership as the
  1106.     RexxMaster  task  -  which  is  started by RexxMast -, so make sure the
  1107.     RexxMast  command  is  executed  by  NOBODY  (i.e.   before  the  first
  1108.     Login/Logout command) and do not set the set uid bit for RexxMast!
  1109.  
  1110.   o The protection bits for a directory are not used to check if a user has
  1111.     access  to  objects  in  the directory.  They do are used to check if a
  1112.     user  can Lock() the directory, so you can't CD to a directory you have
  1113.     no access to.
  1114.  
  1115.   o If gzip complains
  1116.  
  1117.              <file> is not a directory or a regular file - ignored
  1118.  
  1119.     just  use 'MProtect <file> RWED' to clear the protection bits for GROUP
  1120.     and OTHER.  Gzip doesn't like them!
  1121.  
  1122.  
  1123.  
  1124. 10. External utilities
  1125.  
  1126.   The  Extern  archive  contains utilities written by other programmers who
  1127. allowed  me  to  distribute them with the MultiUser package.  Some may have
  1128. the  source  included, other not.  For more information about their usages,
  1129. disclaimers,   distributability   and   copyright  notices,  refer  to  the
  1130. appropriate documentation.
  1131.  
  1132.   Currently the following external utilities are included:
  1133.  
  1134.   o Amilock 1.0.1 by Michael Nielsen (cemn@manta.jcu.edu.au)
  1135.  
  1136.   o DICElib by Fabian Nuñez (fnunez@cs.uct.ac.za)
  1137.  
  1138.   o DosWedge 1.1 by David Swasbrook (swaz@iconz.co.nz)
  1139.  
  1140.   o ExamPatch 1.0 by Todd Vierling (Todd.Vierling@f46.n371.z1.fidonet.org)
  1141.  
  1142.   o Fingerd 0.1 by Marco Ciuchini (CIUCHINI@roma1.infn.it)
  1143.  
  1144.   o MInfo 1.01 by Matt Francis (m.p.francis@newcastle.ac.uk)
  1145.  
  1146.   o MLock 1.01 by Matt Francis (m.p.francis@newcastle.ac.uk)
  1147.  
  1148.   o Modula by Frank J. Beckmann (infjb@sun.rz.tu-clausthal.de)
  1149.  
  1150.   o muFSinc by Norbert Püschel (nobbi@zaphod.rhein.de)
  1151.  
  1152.   o MuMu 1.0 by Litrik De Roy (FidoNet 2:292/603.61)
  1153.  
  1154.   o NetmuFS 1.1 by Norbert Püschel (nobbi@zaphod.rhein.de)
  1155.  
  1156.   o UserID 39.14 by Fabian Nuñez (fnunez@cs.uct.ac.za)
  1157.  
  1158.   If  you  write an interesting piece of software you want me to distribute
  1159. as  an  external  utility,  please  send  it  to  me and I'll add it to the
  1160. package.
  1161.  
  1162.  
  1163.  
  1164. 11. Other software supporting MultiUser
  1165.  
  1166.   o AlertPatch V3.0 by David Swasbrook (swaz@iconz.co.nz)
  1167.  
  1168.   o AmiTCP 2.3 by the AmiTCP/IP Group (amitcp-group@hut.fi)
  1169.  
  1170.   o Newlist8: 'ls' clone by Phil Dietz (pdietz@cse.unl.edu)
  1171.  
  1172.   o ReOrg V3.1: disk optimizer by Holger Kruse (kruse@cs.ucf.edu)
  1173.  
  1174.   o SwazInfo by David Swasbrook (swaz@iconz.co.nz)
  1175.  
  1176.   o Tnserv: telnet daemon for AmiTCP by Steve Holland (sdh4@cornell.edu)
  1177.  
  1178.   If  you  write  an interesting piece of software that supports MultiUser,
  1179. please let me know and I'll add it to the list above.
  1180.  
  1181.  
  1182.  
  1183. 12. History
  1184.  
  1185. Release 1.0ß (Library Version 39.134)
  1186.  
  1187.   First  public release of MultiUser.  All the work on this one was done by
  1188. Geert Uytterhoeven.
  1189.  
  1190.  
  1191. Internal Release (Library Version 39.135)
  1192.  
  1193.   Update  of  the  library and the support programs to allow global logging
  1194. out.  (Kurt Haenen)
  1195.  
  1196.   o The way the library manages the linking of tasks and owners was changed
  1197.     to  allow a kind of global control over all tasks of a single user.  It
  1198.     still isn't quite the way I'd like it, but it's getting closer ...
  1199.  
  1200.   o The  GLOBAL option was added to the Logout command to allow the user to
  1201.     logout  all  tasks  connected to the same tasknode (private structure).
  1202.     This  means  that  you  can logout/login a task and all its children by
  1203.     executing a LOGOUT GLOBAL command from one of them.  Very useful 'cause
  1204.     now you can logout the Workbench without having to quit it ...
  1205.  
  1206.   o TASK  option  added  to  Login  and Logout to allow you to Login/Logout
  1207.     another  task  (of which you are the owner or that's owned by nobody or
  1208.     whatever task if you are root).
  1209.  
  1210.   o QUIET option added to Logout to force Logout so that nobody will become
  1211.     owner  of  the task.  We're still discussing this, so it may be removed
  1212.     again in the future ...
  1213.  
  1214.  
  1215. Internal Release (Library Version 39.136)
  1216.  
  1217.   Update  of  the file system, library and support programs so that default
  1218. protection  bits  can  be  set  and  are  used  by the file system.  (Geert
  1219. Uytterhoeven)
  1220.  
  1221.   o The  file  system  and  library  were  updated to keep track of default
  1222.     protection bits and to use them whenever a file is created.
  1223.  
  1224.   o A  new  utility SetDefProtect (name may change in the future) was added
  1225.     to  allow  the  user  to  specify  the  default  protection  bits for a
  1226.     tasknode.
  1227.  
  1228.  
  1229. Release 1.1 (Library Version 39.137)
  1230.  
  1231.   Update  of  the  library  to  support  .profiles  and allow hiding of the
  1232. password  on  any  terminal (I hope)!  Update to the file system to support
  1233. protection of files against locking.  (Geert Uytterhoeven and Kurt Haenen)
  1234.  
  1235.   o The Logout command now also executes a .profile script after login.
  1236.  
  1237.   o An  exclusive  lock  can  only  be  taken on a file you have write-, or
  1238.     delete-rights  on.   A  shared  lock can be obtained on a file you have
  1239.     read-, write-, execute- or delete-rights on or that's owned by you.
  1240.  
  1241.   o The  UserInfo command can now display the .sig file located in the home
  1242.     of  the  user  on which info is demanded.  To do this, you have to give
  1243.     the  SIG  option.   The .sig file should be readable for the one asking
  1244.     information about the owner of the .sig!
  1245.  
  1246.  
  1247. Release 1.2 (Library Version 39.140)
  1248.  
  1249.   Starting with this release, all the work was done by Geert Uytterhoeven.
  1250.  
  1251.   o The  password  file  should  be compatible with the TCP/IP package from
  1252.     Commdore (AS225) (I hope :-).
  1253.  
  1254.   o Wildcards added in some support commands.
  1255.  
  1256.   o If  a  user  doesn't  have  a password he won't be asked for it no more
  1257.     during Login/Logout.
  1258.  
  1259.   o Finally:  autodoc and includes added!!
  1260.  
  1261.   o .sig renamed to .plan. SIG option renamed to PLAN.
  1262.  
  1263.   o PURE  bit set for the support commands.  They were also pure in earlier
  1264.     releases, but I forgot the magic bit.
  1265.  
  1266.   o Some other minor changes I can't remember :-)
  1267.  
  1268.  
  1269. Release 1.2a (Library Version 39.141)
  1270.  
  1271.   Only some bug fixes :-(
  1272.  
  1273.   o SetOwner37: opened wrong dos.library version.
  1274.  
  1275.   o Setowner[37]: crashed when bad operating system version.
  1276.  
  1277.   o Password  encryption  still  wasn't compatible with AS225 because of an
  1278.     ambiguity  in the ACrypt() documentation (I passed the UserName instead
  1279.     of the UserID).
  1280.  
  1281.  
  1282. Release 1.3 (11/05/93) (Library Version 39.145)
  1283.  
  1284.   WARNING: THIS  IS  A  MAJOR  UPDATE  WITH SOME FUNDAMENTAL CHANGES!!  YOU
  1285.            SHOULD   CHECK   YOUR  OWN  MULTIUSER  APPLICATION  SOURCES  AND
  1286.            RECOMPILE THEM!!
  1287.  
  1288.   o Using  history  after  changing  the  password from the console doesn't
  1289.     reveal the entered passwords anymore.
  1290.  
  1291.   o Bug  fixed:  If you used Passwd before IPrefs installed localization or
  1292.     in  case  of  a  pre-2.1 Workbench, a corrupt password file was written
  1293.     (RawDoFmt()  patched  by  locale.library  treats  %u different than the
  1294.     original).
  1295.  
  1296.   o New less kludgy, object oriented internal structure.
  1297.  
  1298.   o Meaning  of  tag  muT_Task  changed.   Now it needs a pointer to a task
  1299.     structure rather than the task's name.
  1300.  
  1301.   o Library function muSetDefProtection() renamed to muSetDefProtectionA():
  1302.     its  arguments  are now passed via a taglist using the tag muT_Task and
  1303.     the new tag muT_DefProtection.
  1304.  
  1305.   o If you're already root you won't be asked for a password anymore during
  1306.     Login.
  1307.  
  1308.   o GLOBAL flag added to SetDefProtect.
  1309.  
  1310.   o PROCESS keyword added for Login/Logout.
  1311.  
  1312.   o New tags muT_UserID and muT_Password added for muLoginA().
  1313.  
  1314.   o You  aren't  allowed  anymore  to change the owner of a file to someone
  1315.     else than yourself or nobody, unless you're root.
  1316.  
  1317.   o Owner change during execution (set uid bit, cfr.  *IX) added.
  1318.  
  1319.   o Source  of  support  commands  added as examples.  They are full public
  1320.     domain.   If you develop your own support commands I'd appreciate it if
  1321.     you  would  send  me  a  copy (eventually a copy of the source too :-).
  1322.     Maybe I could add them to the next release of the package.
  1323.  
  1324.   o From  now  on the MultiUserFileSystem is distributed as a patch for the
  1325.     original FastFileSystem.
  1326.  
  1327.   o New support command Tasks.
  1328.  
  1329.   o New  library functions muSetProtection() and muLimitDOSSetProtection().
  1330.     New support command LimitDOSSetProtection.
  1331.  
  1332.  
  1333. Release 1.4 (20/07/93) (Library Version 39.151)
  1334.  
  1335.   o Logout QUIET was broken: fixed!
  1336.  
  1337.   o If  the  password file is corrupt, you will get a warning instead of an
  1338.     inaccessible system.  All invalid lines will be ignored.
  1339.  
  1340.   o The ramlib task isn't owned by root anymore.
  1341.  
  1342.   o UserInfo entered an endless loop if a .plan was read protected:  fixed!
  1343.  
  1344.   o SetOwner37 caused a (harmless) Enforcer hit (thanks Max):  fixed!
  1345.  
  1346.   o New        keytypes       muKeyType_WUserID,       muKeyType_WUserName,
  1347.     muKeyType_WUserIDNext  and  muKeyType_WUserNameNext for muGetUserInfo()
  1348.     to handle wildcards in a UserID or UserName.
  1349.  
  1350.   o UserInfo uses the new keytypes and thus allows wildcards for UserID and
  1351.     UserName.
  1352.  
  1353.   o New library function muCheckPasswd().
  1354.  
  1355.   o The MultiUser.server doesn't spawn AmigaDOS-requesters anymore.
  1356.  
  1357.   o The  support  commands  MList,  MProtect  and  SetOwner[37]  now handle
  1358.     non-matching wildcards correctly and give the right error message.
  1359.  
  1360.   o Enhanced security using Keyfiles.
  1361.  
  1362.   o The (private) library function muSetLibFlush() is obsolete now.
  1363.  
  1364.   o Configuration file and log options added.
  1365.  
  1366.   o The .profile in the configuration directory will be executed (depending
  1367.     on  your  configuration settings), rather than the .profile in a user's
  1368.     home-directory.
  1369.  
  1370.   o New library functions muGetPasswdDirLock() and muGetConfigDirLock().
  1371.  
  1372.   o Patch for the FastFileSystem of AmigaOS Release 2.05 (V36.104) added.
  1373.  
  1374.   o QUICK flag added for UserInfo.
  1375.  
  1376.   o If  the user doesn't respond to a warning requester, the requester will
  1377.     disappear  automatically after 10 seconds to allow unattended operation
  1378.     in production environments.
  1379.  
  1380.   o Bug  fixed:   If you specify a nonexistent task name, Login/Logout TASK
  1381.     raises an error now instead of operating on the current task.
  1382.  
  1383.   o Security  hole  fixed:   now  set  uid  only works on volumes using the
  1384.     MultiUserFileSystem.
  1385.  
  1386.   o The .lastlogin file is human readable now (i.e. <Day> <Date> <Time>).
  1387.  
  1388.   o The  PLAN  flag  for UserInfo is obsolete now, UserInfo always displays
  1389.     the  contents  of  the  .plan file (unless you specify the QUICK flag).
  1390.     Now UserInfo displays the lastlogin date too.
  1391.  
  1392.   o Almost  all  of  Kurt's  code  is  gone now (I hope this won't start an
  1393.     AT&T/USL <-> BSD alike war :-).
  1394.  
  1395.   o Finally  Passwd looks fine when used from a Shell on a serial terminal:
  1396.     now  it dumps carriage returns where it should.  I still don't know why
  1397.     muLogin()/Logout()  always  worked  correctly  and  Passwd not (in both
  1398.     cases I used almost the same code!), but who cares??
  1399.  
  1400.  
  1401. Release 1.5 (14/10/93) (Library Version 39.157)
  1402.  
  1403.   o Patch for the FastFileSystem of AmigaOS Release 3.1 (V40.1) added.
  1404.  
  1405.   o Bug  fixed:   If  the  multiuser.library  hasn't been loaded yet or the
  1406.     owner  of  a  DosPacket can't be found, the default protection bits are
  1407.     now RWED GROUP R OTHER R instead of RWED.
  1408.  
  1409.   o New support command Who.
  1410.  
  1411.   o External utility UserID added.
  1412.  
  1413.   o Now  MultiUser works fine with programs using Soft Interrupts for their
  1414.     packet I/O, especially programs using ixemul.library (i.e.  gcc/g++ and
  1415.     programs compiled with gcc/g++).  Thanks Markus!
  1416.  
  1417.   o Bug  fixed:  If the LASTLOGINREQ option is turned off, Logout GUI won't
  1418.     output to a console window anymore.
  1419.  
  1420.   o Autodoc   bug   fixed:    muLogoutA()  executes  the  .profile  in  the
  1421.     configuration   directory  rather  than  the  .profile  in  the  user's
  1422.     home-directory.
  1423.  
  1424.   o New tag muT_All for muLogoutA(), new flag ALL for Logout.
  1425.  
  1426.   o The library functions muGetPasswdDirLock() and muGetConfigDirLock() are
  1427.     now callable by everybody instead of root only.
  1428.  
  1429.   o Partitions  formatted  under  the MultiUserFileSystem for more security
  1430.     (which results in a format equivalent to FFS INTL) can now be converted
  1431.     to any other MultiUserFileSystem equivalent of the standard file system
  1432.     (e.g.  OFS or FFS DC) using ReOrg 3.1.  Thanks Holger!
  1433.  
  1434.   o Group file added, new structure muGroupInfo, new according keytypes and
  1435.     new   library   functions   muAllocGroupInfo(),  muFreeGroupInfo()  and
  1436.     muGetGroupInfo().
  1437.  
  1438.   o New  flag GROUPS for MList, new flag GROUPS and new options GROUPID and
  1439.     GROUPNAME for UserInfo, new option GROUP for SetOwner and SetOwner37.
  1440.  
  1441.   o New structure muExtOwner, new library functions muGetTaskExtOwner() and
  1442.     muUserInfo2ExtOwner(), new macros muSecGroups() and muExtOwner2ULONG().
  1443.  
  1444.   o New library function muGetRelationshipA() for easier access control.
  1445.  
  1446.   o Bug  fixed:  If you called SetOwner(), SetProtection(), SetComment() or
  1447.     SetFileDate() too many times on files or directories you have no access
  1448.     to,  the  file  system  crashed.   This  bug appeared in all subsequent
  1449.     releases!
  1450.  
  1451.   o New   structures   muMonitor   and   muMonMsg,  new  library  functions
  1452.     muAddMonitor() and muRemMonitor() for system monitoring.
  1453.  
  1454.   o Minor changes in the format of the log file.
  1455.  
  1456.   o New support command MAssign.
  1457.  
  1458.   o Bug fixed:  the .lastlogin file wasn't recognized using some languages.
  1459.  
  1460.   o Installation method for Supra Wordsync controllers added.  Thanks René!
  1461.  
  1462.  
  1463. Release 1.6 (27/01/94) (Library Version 39.161)
  1464.  
  1465.   o muLoginA() with muT_UserID and without muT_Password is allowed now.
  1466.  
  1467.   o New option USERID for Login.
  1468.  
  1469.   o New  tag muT_NoLog for muLoginA(), for use in set uid daemons.  MAssign
  1470.     uses this new tag.  Thanks Bernhard!
  1471.  
  1472.   o The  maximum  Hostname  size is extended from 15 to 31 characters.  Now
  1473.     Hostname is truncated on the first period.
  1474.  
  1475.   o Login/Logout/Passwd GUI uses console I/O if the pr_WindowPtr is -1.
  1476.  
  1477.   o New  library  functions  muKill(),  muFreeze()  and  muUnfreeze().  New
  1478.     support commands Kill, Freeze and Unfreeze.
  1479.  
  1480.   o Some  bugs  fixed  in  MAssign  (thanks Ingolf), new options VOLUME and
  1481.     CREATE for MAssign (thanks Bernhard).
  1482.  
  1483.   o Source of the library added.
  1484.  
  1485.   o All memory allocations are pooled now.
  1486.  
  1487.   o Some  external  utilities  added, list of software supporting MultiUser
  1488.     extended.
  1489.  
  1490.   o Now  the  file system patches are applied using spatch (© Copyright SAS
  1491.     Institute, Inc.).
  1492.  
  1493.   o Emergency boot disk method added.  Thanks Ingolf!
  1494.  
  1495.   o New Shell field in the muUserInfo structure.  Thanks Thomas!
  1496.  
  1497.   o New  support  command RunCommand as a workaround for the WShell set uid
  1498.     problem.
  1499.  
  1500.  
  1501. Release 1.7 (07/03/94) (Library Version 39.164)
  1502.  
  1503.   o The LOG* flags in the config file didn't behave like they should.
  1504.  
  1505.   o Due to a synchronization problem the keyfiles could be declared invalid
  1506.     when they were valid.
  1507.  
  1508.   o Installation  method  for  Supra  Wordsync controllers removed since it
  1509.     seemed  to  contain  Workbench  files.   Sorry Commodore, never noticed
  1510.     it!
  1511.  
  1512.   o Sometimes Login reported a failure in case of succes.
  1513.  
  1514.   o Finally  logout  'till the root of the task tree creates a new tree.  I
  1515.     hope it will work like it should this time!
  1516.  
  1517.   o Some  external  utilities  added, list of software supporting MultiUser
  1518.     extended.
  1519.  
  1520.   o Some other small and harmless bugs fixed.
  1521.  
  1522.   o Package split in parts to reduce FTP bandwidth.
  1523.  
  1524. Release 1.8 (03/07/94) (Library Version 39.165)
  1525.  
  1526.   o Added Locale support for the library and support commands. (NP)
  1527.  
  1528.   o Included interims release of filesystem.
  1529.  
  1530.   o No new version of external utilities, use version 1.7.
  1531.  
  1532.  
  1533. 13. Plans for the future
  1534.  
  1535.   o A redesign allowing POSIX compliancy.
  1536.  
  1537.   o The multiuser.library should be a part of the MultiUserFileSystem.
  1538.  
  1539.   o A 'safe' backdoor for emergency situations.
  1540.  
  1541.   o A  brand  new  File  System:  maybe the Berkeley Fast File System?  Any
  1542.     help is welcome!
  1543.  
  1544.  
  1545.  
  1546. 14. Credits
  1547.  
  1548.   o Library             :   Geert Uytterhoeven & Kurt Haenen
  1549.  
  1550.   o Support Commands    :   Geert Uytterhoeven & Kurt Haenen
  1551.  
  1552.   o Documentation       :   Geert Uytterhoeven & Kurt Haenen
  1553.  
  1554.   o File System Patches :   Geert Uytterhoeven
  1555.  
  1556.   o Locale              :   Norbert Püschel (also see README in Locale)
  1557.  
  1558.   Starting with Release 1.2, all the work was done by Geert Uytterhoeven.
  1559.   (The localized release 1.8 was done by Norbert Püschel).
  1560.  
  1561.  
  1562. 15. Contacts
  1563.  
  1564. How to contact the author ...
  1565.  
  1566.   o E-mail
  1567.  
  1568.                            uytterho@cs.kuleuven.ac.be
  1569.  
  1570.       This account is at least valid 'till end June '94.
  1571.  
  1572.  
  1573.   o Fax
  1574.  
  1575.                                   +32-16-535823
  1576.  
  1577.  
  1578.   o Snail mail
  1579.  
  1580.       - My home address
  1581.  
  1582.                                Geert Uytterhoeven
  1583.                                Huysmansstraat 12
  1584.                                B-3128 BAAL
  1585.                                BELGIUM
  1586.  
  1587.       - My study address (from October '93 'till end June '94)
  1588.  
  1589.                                Geert Uytterhoeven
  1590.                                Tervuursevest 119
  1591.                                B-3001 HEVERLEE
  1592.                                BELGIUM
  1593.  
  1594.  
  1595. How to contact the MultiUser mailing list ... (thanks Kai)
  1596.  
  1597.   Mail your comments to
  1598.  
  1599.                            mufs@hactar.hanse.de
  1600.  
  1601.   If you want to subscribe to this mailing list, just send an E-mail to
  1602.  
  1603.                          listserv@hactar.hanse.de
  1604.  
  1605. containing a line like this:
  1606.  
  1607.                             ADD <address> mufs
  1608.  
  1609. where  <address>  stands  for  your  E-mail address.  From then on you will
  1610. receive  a copy of all mails sent to the mailing list.  For more help about
  1611. the  mailing  list, send an E-mail containing only the magic word 'HELP' to
  1612. the list server (i.e. listserv@hactar.hanse.de).
  1613.  
  1614.  
  1615.  
  1616. 16. Special thanks go to ...
  1617.  
  1618.   o Nico François for developing ReqTools.
  1619.  
  1620.   o Jorrit  Tyberghein  for  developing the magnificent debugger PowerVisor
  1621.     (We're  still  waiting  for  release  1.43  :-),  from  which muKill(),
  1622.     muFreeze() and muUnfreeze() were derived.
  1623.  
  1624.   o SAS Institute, Inc. for spatch.
  1625.  
  1626.   o Kurt  Haenen,  Ives  Aerts,  Litrik  De  Roy and Nico François for beta
  1627.     testing.
  1628.  
  1629.   o Kai  'wusel'  Siering,  Markus  Illenseer, Tako Schotanus, Ralph-Thomas
  1630.     Aussem,  Max  Hantsch,  Markus  Wild,  Jason  Gouger,  René  Laederach,
  1631.     Bernhard  Seefeld,  Ingolf Koch and Thomas Holmstrom for their comments
  1632.     and/or tips.
  1633.  
  1634.   o The  Department  of  Computer  Science  at  the Katholieke Universiteit
  1635.     Leuven for allowing me to use the InterNet for this MultiUser project.
  1636.  
  1637.   o Kai 'wusel' Siering for setting up a mailing list for MultiUser.
  1638.  
  1639.   o Fabian  Nuñez, Michael Nielsen, Todd Vierling, Marco Ciuchini, Frank J.
  1640.     Beckmann, Matt Francis, Litrik De Roy and Norbert Püschel for supplying
  1641.     an external utility.
  1642.  
  1643.   o Holger  Kruse,  Phil  Dietz,  the AmiTCP/IP Group and Steve Holland for
  1644.     supporting MultiUser in their programs.
  1645.  
  1646.  
  1647.  
  1648.                                                     
  1649.                                          /   / /   /
  1650.                                         /   / /   /
  1651.                                        /   / /   /
  1652.                                       /   / /   /
  1653.                           \   \ \   \/   / /   /
  1654.                            \   \ \   \  / /   /
  1655.                             \   \ \   \/ /   /
  1656.                              \   \/\   \/   /
  1657.                               \   \ \   \  /
  1658.                                \   \/\   \/
  1659.  
  1660.  
  1661.                      Only Amiga makes it possible ...
  1662.  
  1663.                    But wouldn't Linux for Amiga be nice!
  1664.  
  1665.  
  1666.                                     /\
  1667.                                    /XX\
  1668.                                   /XXXX\
  1669.                                  /XXXXXX\
  1670.                                 /XXXXXXXX\
  1671.                              /\ \XXXXXXXX/ /\
  1672.                             /XX\ \XXXXXX/ /XX\
  1673.                            /XXXX\ \XXXX/ /XXXX\
  1674.                           /XXXXXX\ \XX/ /XXXXXX\
  1675.                          /XXXXXXXX\ \/ /XXXXXXXX\
  1676.                          \XXXXXXXX/ /\ \XXXXXXXX/
  1677.                           \XXXXXX/ /XX\ \XXXXXX/
  1678.                            \XXXX/ /XXXX\ \XXXX/
  1679.                             \XX/ /XXXXXX\ \XX/
  1680.                              \/ /XXXXXXXX\ \/
  1681.                                 \XXXXXXXX/
  1682.                                  \XXXXXX/
  1683.                                   \XXXX/
  1684.                                    \XX/
  1685.                                     \/
  1686.  
  1687.