[Adduser-devel] r192 - in trunk: debian examples examples/examples examples/examples/skel examples/examples/skel.other

Marc Haber zugschlus@costa.debian.org
Sat, 05 Feb 2005 13:48:53 +0100


Author: zugschlus
Date: 2005-02-05 13:48:53 +0100 (Sat, 05 Feb 2005)
New Revision: 192

Added:
   trunk/examples/examples/
   trunk/examples/examples/adduser.conf
   trunk/examples/examples/bash.bashrc
   trunk/examples/examples/profile
   trunk/examples/examples/skel.other/
   trunk/examples/examples/skel.other/index.html
   trunk/examples/examples/skel/
   trunk/examples/examples/skel/dot.bash_logout
   trunk/examples/examples/skel/dot.bash_profile
   trunk/examples/examples/skel/dot.bashrc
Modified:
   trunk/debian/changelog
   trunk/debian/copyright
   trunk/examples/INSTALL
   trunk/examples/README
   trunk/examples/adduser.local
   trunk/examples/adduser.local.conf
Log:
  * Add new adduser.local examples directory by John Zaitseff. (mh)
    Closes: #273010.



Modified: trunk/debian/changelog
===================================================================
--- trunk/debian/changelog	2005-02-05 12:42:37 UTC (rev 191)
+++ trunk/debian/changelog	2005-02-05 12:48:53 UTC (rev 192)
@@ -14,9 +14,11 @@
   * Fix adduser manpage: Adding an already-existing system user issues
     a warning. The manpage claims adduser will exit silently. (mh)
   * Add Basque program and debconf translation. Thanks to Piarres Beobide
-    Egaña. (mh) Closes: #279659.
+    Egaña. (mh) Closes: #279659.
+  * Add new adduser.local examples directory by John Zaitseff. (mh)
+    Closes: #273010.
 
- -- Marc Haber <mh+debian-packages@zugschlus.de>  Sat,  5 Feb 2005 13:41:54 +0100
+ -- Marc Haber <mh+debian-packages@zugschlus.de>  Sat,  5 Feb 2005 13:48:15 +0100
 
 adduser (3.59) unstable; urgency=low
 

Modified: trunk/debian/copyright
===================================================================
--- trunk/debian/copyright	2005-02-05 12:42:37 UTC (rev 191)
+++ trunk/debian/copyright	2005-02-05 12:48:53 UTC (rev 192)
@@ -21,6 +21,9 @@
 adduser is Copyright (C) 1995 Ted Hajek <tedhajek@boombox.micro.umn.edu>
 with portions Copyright (C) 1994 Debian Association, Inc.
 
+The examples directory has been contributed by John Zaitseff, and is
+GPL V2 as well.
+
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation; either version 2 of the License, or

Modified: trunk/examples/INSTALL
===================================================================
--- trunk/examples/INSTALL	2005-02-05 12:42:37 UTC (rev 191)
+++ trunk/examples/INSTALL	2005-02-05 12:48:53 UTC (rev 192)
@@ -2,11 +2,12 @@
 be done to install the ADDUSER Local System Additions program.  In brief:
 
 # cp ./adduser.local /usr/local/sbin
+# chmod 755 /usr/local/sbin/adduser.local
 # cp ./adduser.local.conf /etc
 # editor /etc/adduser.local.conf         # The important step!
 # mkdir /etc/skel.other
 # cp ./examples/skel.other/index.html /etc/skel.other
 
-IMPORTANT: Do  NOT  just perform the above steps  without knowing what you
-are doing!  In particular,  the third step is very important for you to do
+IMPORTANT: Do  NOT just perform the  above steps without  knowing what you
+are doing!  In particular, the fourth step is very important for you to do
 correctly.

Modified: trunk/examples/README
===================================================================
--- trunk/examples/README	2005-02-05 12:42:37 UTC (rev 191)
+++ trunk/examples/README	2005-02-05 12:48:53 UTC (rev 192)
@@ -1,7 +1,7 @@
 **************************************************************************
 *                                                                        *
-*                   ADDUSER Local System Additions v4.3                  *
-*                 Copyright (C) 1999-2001, John Zaitseff                 *
+*                   ADDUSER Local System Additions v4.6                  *
+*                 Copyright (C) 1999-2004, John Zaitseff                 *
 *                                                                        *
 **************************************************************************
 
@@ -17,11 +17,11 @@
 "ftp" and "www" groups and  so on.  All, naturally, without forgetting any
 vital step!
 
-The adduser.local  program automates all  this for you.  By  modifying the
-program's configuration file, /etc/adduser.local.conf, to match your local
-requirements, this  program can automatically add a  user to supplementary
-groups, create directories  and symbolic links and copy  skeleton files to
-the newly-created directories.
+The adduser.local  program automates much  of this for you.   By modifying
+the program's  configuration file, /etc/adduser.local.conf,  to match your
+local  requirements,  this  program   can  automatically  add  a  user  to
+supplementary  groups,  create directories  and  symbolic  links and  copy
+skeleton files to the newly-created directories.
 
 Note that once you install this program (and edit the configuration file),
 you will never  need to directly run adduser.local:  the Debian adduser(8)
@@ -69,7 +69,7 @@
   - the  file "/etc/skel.other/index.html"  is copied  to  this directory,
     owned by the user "john" and with group owner "www".
 
-For more details, just read through the sample configuration file!
+For more details, just read through the sample configuration file.
 
 
 INSTALLATION
@@ -81,6 +81,7 @@
 1. Copy the actual program to the correct location:
 
        # cp ./adduser.local /usr/local/sbin
+       # chmod 755 /usr/local/sbin/adduser.local
 
 2. Copy the configuration file to the correct location:
 
@@ -98,7 +99,7 @@
        # mkdir /etc/skel.other
        # cp ./examples/skel.other/index.html /etc/skel.other
 
-5. You are finished!
+5. You are finished.
 
 The main reason  you have to install this program manually  is so that you
 do not forget to do Step 3, the most important one!
@@ -128,10 +129,10 @@
 welcome!  Please send these to:
 
 Postal:   John Zaitseff,
-          4 McCabe Close,
-          Menai, NSW, 2234,
+          Unit 6, 116 Woodburn Road,
+          Berala, NSW, 2141,
           Australia.
 
 E-mail:   J.Zaitseff@zap.org.au
-Web:      http://www.zap.org.au/software/adduser.local/
-FTP:      ftp://ftp.zap.org.au/pub/adduser.local/adduser.local.tar.gz
+Web:      http://www.zap.org.au/software/utils/adduser.local/
+FTP:      ftp://ftp.zap.org.au/pub/utils/adduser.local/adduser.local.tar.gz

Modified: trunk/examples/adduser.local
===================================================================
--- trunk/examples/adduser.local	2005-02-05 12:42:37 UTC (rev 191)
+++ trunk/examples/adduser.local	2005-02-05 12:48:53 UTC (rev 192)
@@ -2,14 +2,14 @@
 
 #########################################################################
 #                                                                       #
-#                  ADDUSER Local System Additions v4.3                  #
-#                Copyright (C) 1999-2001, John Zaitseff                 #
+#                  ADDUSER Local System Additions v4.6                  #
+#                Copyright (C) 1999-2004, John Zaitseff                 #
 #                                                                       #
 #########################################################################
 
 # Author:   John Zaitseff <J.Zaitseff@zap.org.au>
-# Date:     17th April, 2001
-# Version:  4.3
+# Date:     23rd September, 2004
+# Version:  4.6
 
 # This program, once installed as /usr/local/sbin/adduser.local, is auto-
 # matically called by the adduser(8) system program on a Debian system.
@@ -53,101 +53,105 @@
 #########################################################################
 # Configuration parameters and default values
 
-($O = $0)      =~ s,^.*/,,;     # adduser.local script name (without path)
-$version       = '4.3';         # Script version
+use strict;
 
-@adduser       = ('/usr/sbin/adduser', '--quiet');  # Location of adduser(8)
-@chown         = ('/bin/chown');                    # Location of chown(1)
-@install       = ('/usr/bin/install', '-p');        # Location of install(1)
-$procmounts    = '/proc/mounts';                    # List of current mounts
 
-$s_false       = 'false';       # False string value, in lower case
-$s_true        = 'true';        # True string value, in lower case
+(our $O = $0)      =~ s,^.*/,,;	# adduser.local script name (without path)
+our $version       = '4.6';	# Script version
 
+our @adduser       = ('/usr/sbin/adduser', '--quiet');  # adduser(8)
+our @chown         = ('/bin/chown');                    # chown(1)
+our @install       = ('/usr/bin/install', '-p');        # install(1)
+
+our $procmounts    = '/proc/mounts';            # List of current mounts
+
+our $s_false       = 'false';	# False string value, in lower case
+our $s_true        = 'true';	# True string value, in lower case
+
 # These default values are extensively documented in adduser.local.conf.
 
-$d_conffile    = '/etc/adduser.local.conf';     # Configuration file location
-$d_skelother   = '/etc/skel.other';             # Location of skeleton files
-$d_dirmode     = '2755';                        # Octal mode for directories
-$d_filemode    = '0644';                        # Octal mode for files
+our $d_conffile    = '/etc/adduser.local.conf'; # Configuration file location
+our $d_skelother   = '/etc/skel.other';         # Location of skeleton files
+our $d_dirmode     = '2755';                    # Octal mode for directories
+our $d_filemode    = '0644';                    # Octal mode for files
 
-$d_user        = '';            # Default service user name
-$d_group       = '';            # Default service group name
-$d_addtogroup  = $s_false;      # Default for addtogroup variable
-$d_homedir     = '';            # Default home directory
-$d_subdir      = '';            # Default subdirectory
-$d_althome     = $s_false;      # Default for using alternate home directory
-$d_mounted     = $s_false;      # Default for checking if mounted
-$d_mkdir       = $s_false;      # Default for creating directory
-$d_chgrpdir    = $s_false;      # Default for chgrpdir variable
-$d_mklink      = $s_false;      # Default for creating symbolic link
-$d_linkname    = '';            # Default for symbolic link name
-$d_skelfile    = '';            # Default for skeleton file
-$d_chgrpskel   = $s_false;      # Default for chgrpskel variable
+our $d_user        = '';	# Default service user name
+our $d_group       = '';	# Default service group name
+our $d_addtogroup  = $s_false;	# Default for addtogroup variable
+our $d_homedir     = '';	# Default home directory
+our $d_subdir      = '';	# Default subdirectory
+our $d_althome     = $s_false;	# Default for use alternate home directory
+our $d_mounted     = $s_false;	# Default for checking if mounted
+our $d_mkdir       = $s_false;	# Default for creating directory
+our $d_chgrpdir    = $s_false;	# Default for chgrpdir variable
+our $d_mklink      = $s_false;	# Default for creating symbolic link
+our $d_linkname    = '';	# Default for symbolic link name
+our $d_skelfile    = '';	# Default for skeleton file
+our $d_chgrpskel   = $s_false;	# Default for chgrpskel variable
 
 # Various strings appearing in the configuration file.  While they are
 # case insensitive in the configuration file, they must appear in lower
 # case here.
 
-$s_skelother   = 'skelother';
-$s_dirmode     = 'dirmode';
-$s_filemode    = 'filemode';
+our $s_skelother   = 'skelother';
+our $s_dirmode     = 'dirmode';
+our $s_filemode    = 'filemode';
 
-$s_service     = 'service';
+our $s_service     = 'service';
 
-$s_user        = 'user';
-$s_group       = 'group';
-$s_addtogroup  = 'addtogroup';
-$s_homedir     = 'homedir';
-$s_subdir      = 'subdir';
-$s_althome     = 'althome';
-$s_mounted     = 'mounted';
-$s_mkdir       = 'mkdir';
-$s_chgrpdir    = 'chgrpdir';
-$s_mklink      = 'mklink';
-$s_linkname    = 'linkname';
-$s_skelfile    = 'skelfile';
-$s_chgrpskel   = 'chgrpskel';
+our $s_user        = 'user';
+our $s_group       = 'group';
+our $s_addtogroup  = 'addtogroup';
+our $s_homedir     = 'homedir';
+our $s_subdir      = 'subdir';
+our $s_althome     = 'althome';
+our $s_mounted     = 'mounted';
+our $s_mkdir       = 'mkdir';
+our $s_chgrpdir    = 'chgrpdir';
+our $s_mklink      = 'mklink';
+our $s_linkname    = 'linkname';
+our $s_skelfile    = 'skelfile';
+our $s_chgrpskel   = 'chgrpskel';
 
-@s_false       = ($s_false, 'f', 'no',  'n', '0');
-@s_true        = ($s_true,  't', 'yes', 'y', '1');
+our @s_false       = ($s_false, 'f', 'no',  'n', '0');
+our @s_true        = ($s_true,  't', 'yes', 'y', '1');
 
 # Strings internal to this program (as used by the %cv hash)
 
-$s_svcuid      = '.svcuid';     # Storage for UID of service's user name
-$s_svcgid      = '.svcgid';     # GID of service's user name or group name
-$s_actualdir   = '.actualdir';  # Actual directory: homedir + subdir + username
-$s_actuallink  = '.actuallink'; # Actual symbolic link: user homedir + linkname
-$s_actualsrcf  = '.actualsrcf'; # Actual source file: skelother + skelfile
-$s_actualdstf  = '.actualdstf'; # Actual destination file: actualdir + skelfile
+our $s_svcuid      = '.svcuid';      # Storage for UID of service's user name
+our $s_svcgid      = '.svcgid';      # GID of service's user name or group name
+our $s_actualdir   = '.actualdir';   # Actual dir: homedir + subdir + username
+our $s_actuallink  = '.actuallink';  # Actual sym link: user homedir + linkname
+our $s_actualsrcf  = '.actualsrcf';  # Actual source file: skelother + skelfile
+our $s_actualdstf  = '.actualdstf';  # Actual dest file: actualdir + skelfile
 
-$s_addtogroupB = '.addtogroupB';        # Boolean versions of variables
-$s_althomeB    = '.althomeB';
-$s_mountedB    = '.mountedB';
-$s_mkdirB      = '.mkdirB';
-$s_chgrpdirB   = '.chgrpdirB';
-$s_mklinkB     = '.mklinkB';
-$s_chgrpskelB  = '.chgrpskelB';
+our $s_addtogroupB = '.addtogroupB'; # Boolean versions of variables
+our $s_althomeB    = '.althomeB';
+our $s_mountedB    = '.mountedB';
+our $s_mkdirB      = '.mkdirB';
+our $s_chgrpdirB   = '.chgrpdirB';
+our $s_mklinkB     = '.mklinkB';
+our $s_chgrpskelB  = '.chgrpskelB';
 
 
 #########################################################################
 # Initialise global variables
 
-$conffile      = $d_conffile;   # Default configuration file
-$verbose       = 1;             # Be verbose by default
-$dryrun        = 0;             # NOT a dry run by default
+our $conffile      = $d_conffile;   # Default configuration file
+our $verbose       = 1;		    # Be verbose by default
+our $dryrun        = 0;             # NOT a dry run by default
 
-$sep           = '.';           # Service-specific separator
+our @services      = ();            # No services to install by default
 
-@services      = ();            # No services to install by default
-
 # %cv is a hash for all configuration variables read in from the
 # configuration file.  Global variables are represented by their strings,
 # eg, $cv{"skelother"}.  Service-specific variables are represented by the
-# service string value, then $sep, then their string, eg, $cv{"www.user"}.
+# service string value, a comma, then their string, eg, $cv{"www","user"}.
 # The %cl hash plays a similar role, but contains the line number of the
 # configuration.
 
+our (%cv, %cl);
+
 $cv{$s_skelother} = $d_skelother;  $cl{$s_skelother} = 0;
 $cv{$s_dirmode}   = $d_dirmode;    $cl{$s_dirmode}   = 0;
 $cv{$s_filemode}  = $d_filemode;   $cl{$s_filemode}  = 0;
@@ -156,7 +160,14 @@
 
 $ENV{PATH} = '/usr/sbin:/usr/bin:/sbin:/bin';
 
+# Declare some global variables
 
+our $username;			# Username for which adduser.local was called
+our $uid;			# User's UID
+our $gid;			# User's GID
+our $homedir;			# User's home directory
+
+
 #########################################################################
 # Process command-line arguments
 
@@ -228,7 +239,7 @@
 
     $username = $ARGV[0];
 
-    ($t_name, my $t1, $uid, $gid, my $t2, my $t3, my $t4, $homedir)
+    (my $t_name, my $t1, $uid, $gid, my $t2, my $t3, my $t4, $homedir)
         = getpwnam($username);
 
     die "$O: No such user: $username\n" if ! $t_name;
@@ -242,7 +253,7 @@
     $homedir  = $ARGV[3];
 
     $homedir =~ s,/$,,;             # Remove trailing '/' if present
-    ($t_name, my $t1, $t_uid, $t_gid) = getpwnam($username);
+    (my $t_name, my $t1, my $t_uid, my $t_gid) = getpwnam($username);
 
     die "$O: No such user: $username\n" if ! $t_name;
     die "$O: No such UID: $uid\n" if ! getpwuid($uid);
@@ -293,47 +304,44 @@
         if ($lcvar eq $s_service) {
 
             # Special global configuration variable "service"
-            my $svc;
+            my $svc = $lcval;
 
-            if (grep((lc $_) eq $lcval, @services)) {
+            if (grep((lc $_) eq $svc, @services)) {
                 warn "$O: Service \"$val\" redefined at $conffile:$.\n";
                 next;
             }
 
             push @services, $val;
 
-            # Set up default values.  See the note later on as to why $svc
-            # is defined in the following way.
+            # Set up default values
 
-            $svc = $lcval . $sep;
+            $cv{$svc,$s_user}       = $d_user;
+            $cv{$svc,$s_group}      = $d_group;
+            $cv{$svc,$s_addtogroup} = $d_addtogroup;
+            $cv{$svc,$s_homedir}    = $d_homedir;
+            $cv{$svc,$s_subdir}     = $d_subdir;
+            $cv{$svc,$s_althome}    = $d_althome;
+            $cv{$svc,$s_mounted}    = $d_mounted;
+            $cv{$svc,$s_mkdir}      = $d_mkdir;
+            $cv{$svc,$s_chgrpdir}   = $d_chgrpdir;
+            $cv{$svc,$s_mklink}     = $d_mklink;
+            $cv{$svc,$s_linkname}   = $d_linkname;
+            $cv{$svc,$s_skelfile}   = $d_skelfile;
+            $cv{$svc,$s_chgrpskel}  = $d_chgrpskel;
 
-            $cv{$svc.$s_user}       = $d_user;
-            $cv{$svc.$s_group}      = $d_group;
-            $cv{$svc.$s_addtogroup} = $d_addtogroup;
-            $cv{$svc.$s_homedir}    = $d_homedir;
-            $cv{$svc.$s_subdir}     = $d_subdir;
-            $cv{$svc.$s_althome}    = $d_althome;
-            $cv{$svc.$s_mounted}    = $d_mounted;
-            $cv{$svc.$s_mkdir}      = $d_mkdir;
-            $cv{$svc.$s_chgrpdir}   = $d_chgrpdir;
-            $cv{$svc.$s_mklink}     = $d_mklink;
-            $cv{$svc.$s_linkname}   = $d_linkname;
-            $cv{$svc.$s_skelfile}   = $d_skelfile;
-            $cv{$svc.$s_chgrpskel}  = $d_chgrpskel;
-
-            $cl{$svc.$s_user}       = 0;
-            $cl{$svc.$s_group}      = 0;
-            $cl{$svc.$s_addtogroup} = 0;
-            $cl{$svc.$s_homedir}    = 0;
-            $cl{$svc.$s_subdir}     = 0;
-            $cl{$svc.$s_althome}    = 0;
-            $cl{$svc.$s_mounted}    = 0;
-            $cl{$svc.$s_mkdir}      = 0;
-            $cl{$svc.$s_chgrpdir}   = 0;
-            $cl{$svc.$s_mklink}     = 0;
-            $cl{$svc.$s_linkname}   = 0;
-            $cl{$svc.$s_skelfile}   = 0;
-            $cl{$svc.$s_chgrpskel}  = 0;
+            $cl{$svc,$s_user}       = 0;
+            $cl{$svc,$s_group}      = 0;
+            $cl{$svc,$s_addtogroup} = 0;
+            $cl{$svc,$s_homedir}    = 0;
+            $cl{$svc,$s_subdir}     = 0;
+            $cl{$svc,$s_althome}    = 0;
+            $cl{$svc,$s_mounted}    = 0;
+            $cl{$svc,$s_mkdir}      = 0;
+            $cl{$svc,$s_chgrpdir}   = 0;
+            $cl{$svc,$s_mklink}     = 0;
+            $cl{$svc,$s_linkname}   = 0;
+            $cl{$svc,$s_skelfile}   = 0;
+            $cl{$svc,$s_chgrpskel}  = 0;
         }
         else {
             # Ordinary global variable
@@ -358,19 +366,18 @@
 
         my $lcvar = lc $var;
         my $lcsvc = lc $svc;
-        my $svcvar = $lcsvc . $sep . $lcvar;
 
         if (! grep((lc $_) eq $lcsvc, @services)) {
             warn "$O: Undefined service \"$svc\" at $conffile:$.\n";
             next;
         }
-        if (! defined($cv{$svcvar})) {
+        if (! defined($cv{$lcsvc,$lcvar})) {
             warn "$O: Unknown service variable \"$var\" at $conffile:$.\n";
             next;
         }
 
-        $cv{$svcvar} = $val;
-        $cl{$svcvar} = $.;
+        $cv{$lcsvc,$lcvar} = $val;
+        $cl{$lcsvc,$lcvar} = $.;
     }
 
     # Otherwise, it is an error in the configuration file
@@ -417,88 +424,88 @@
 #########################################################################
 # Actually perform what is required, with appropriate error checking
 
-foreach $service (@services) {
+foreach my $service (@services) {
 
-    # Note that defining $svc in the following way is rather clever; it
-    # allows access to the %cv and %cl hashes to be more aesthetically
-    # pleasing, especially to a C programmer!  For example, the "mkdir"
-    # component would be accessed by $cv{$svc.$s_mkdir} instead of the
-    # more cumbersome (but equivalent) $cv{lc($service) . $sep . $s_mkdir}.
-
-    my $svc = lc($service) . $sep;
+    my $svc = lc $service;
     my ($t_user, $t_group, $t_homedir);
 
     print "Processing service \"$service\"\n" if $verbose;
 
     # Check validity of all boolean variables and convert them to true bools
 
-    &chkbool($svc.$s_addtogroup, $svc.$s_addtogroupB, $d_addtogroup, "$s_addtogroup\[$service\]");
-    &chkbool($svc.$s_althome,    $svc.$s_althomeB,    $d_althome,    "$s_althome\[$service\]");
-    &chkbool($svc.$s_mounted,    $svc.$s_mountedB,    $d_mounted,    "$s_mounted\[$service\]");
-    &chkbool($svc.$s_mkdir,      $svc.$s_mkdirB,      $d_mkdir,      "$s_mkdir\[$service\]");
-    &chkbool($svc.$s_chgrpdir,   $svc.$s_chgrpdirB,   $d_chgrpdir,   "$s_chgrpdir\[$service\]");
-    &chkbool($svc.$s_mklink,     $svc.$s_mklinkB,     $d_mklink,     "$s_mklink\[$service\]");
-    &chkbool($svc.$s_chgrpskel,  $svc.$s_chgrpskelB,  $d_chgrpskel,  "$s_chgrpskel\[$service\]");
+    # Note that the notation $hash{$idx1,$idx2} is exactly the same as the
+    # expression $hash{$idx1 . $; . $idx2}.  It is for this reason that
+    # $svcc is defined.
 
+    my $svcc = $svc . $;;	# $svc concatenated with $; ($SUBSEP)
+
+    &chkbool($svcc.$s_addtogroup, $svcc.$s_addtogroupB, $d_addtogroup, "$s_addtogroup\[$service\]");
+    &chkbool($svcc.$s_althome,    $svcc.$s_althomeB,    $d_althome,    "$s_althome\[$service\]");
+    &chkbool($svcc.$s_mounted,    $svcc.$s_mountedB,    $d_mounted,    "$s_mounted\[$service\]");
+    &chkbool($svcc.$s_mkdir,      $svcc.$s_mkdirB,      $d_mkdir,      "$s_mkdir\[$service\]");
+    &chkbool($svcc.$s_chgrpdir,   $svcc.$s_chgrpdirB,   $d_chgrpdir,   "$s_chgrpdir\[$service\]");
+    &chkbool($svcc.$s_mklink,     $svcc.$s_mklinkB,     $d_mklink,     "$s_mklink\[$service\]");
+    &chkbool($svcc.$s_chgrpskel,  $svcc.$s_chgrpskelB,  $d_chgrpskel,  "$s_chgrpskel\[$service\]");
+
     # Process the "user" configuration variable
 
-    if ($cv{$svc.$s_user} ne '') {
+    if ($cv{$svc,$s_user} ne '') {
         # Retrieve information about the specified service's user name
 
-        ($t_user, my $t1, $cv{$svc.$s_svcuid}, $cv{$svc.$s_svcgid},
-         my $t2, my $t3, my $t4, $t_homedir)
-            = getpwnam $cv{$svc.$s_user};
+        (my $t_user, my $t1, $cv{$svc,$s_svcuid}, $cv{$svc,$s_svcgid},
+         my $t2, my $t3, my $t4, my $t_homedir)
+            = getpwnam $cv{$svc,$s_user};
 
         if (! $t_user) {
-            warn "$O: Illegal user name \"$cv{$svc.$s_user}\" at $conffile:$cl{$svc.$s_user}\n";
+            warn "$O: Illegal user name \"$cv{$svc,$s_user}\" at $conffile:$cl{$svc,$s_user}\n";
         } else {
-            $cv{$svc.$s_user} = $t_user;
+            $cv{$svc,$s_user} = $t_user;
         }
 
         # Only set home directory information if not specified by user
-        if ($cv{$svc.$s_homedir} eq '') {
-            if ($cv{$svc.$s_althomeB}) {
-                $cv{$svc.$s_homedir} = $homedir;      # From command line
+        if ($cv{$svc,$s_homedir} eq '') {
+            if ($cv{$svc,$s_althomeB}) {
+                $cv{$svc,$s_homedir} = $homedir;      # From command line
             } else {
-                $cv{$svc.$s_homedir} = $t_homedir;    # From service's home
+                $cv{$svc,$s_homedir} = $t_homedir;    # From service's home
             }
         }
 
         # If the group parameter is not specified, get the appropriate info
         # from the user information
-        if ($cv{$svc.$s_svcgid} && ($cv{$svc.$s_group} eq '')) {
-            ($cv{$svc.$s_group}) = getgrgid $cv{$svc.$s_svcgid};
+        if ($cv{$svc,$s_svcgid} && ($cv{$svc,$s_group} eq '')) {
+            ($cv{$svc,$s_group}) = getgrgid $cv{$svc,$s_svcgid};
         }
     }
 
     # Process the "group" configuration variable
 
-    if ($cv{$svc.$s_group} ne '') {
+    if ($cv{$svc,$s_group} ne '') {
         # Retrieve info about the group.  Yes, it may have been done
         # above, but specifying "group" can be done without specifying
         # "user".  In addition, a different group can be specified from
         # that used by "user".
 
-        ($t_group, my $t1, $cv{$svc.$s_svcgid}) = getgrnam $cv{$svc.$s_group};
+        ($t_group, my $t1, $cv{$svc,$s_svcgid}) = getgrnam $cv{$svc,$s_group};
 
         if (! $t_group) {
-            warn "$O: Illegal group name \"$cv{$svc.$s_group}\" at $conffile:$cl{$svc.$s_group}\n";
+            warn "$O: Illegal group name \"$cv{$svc,$s_group}\" at $conffile:$cl{$svc,$s_group}\n";
 
-            $cv{$svc.$s_addtogroup} = $s_false;   $cv{$svc.$s_addtogroupB} = 0;
-            $cv{$svc.$s_chgrpdir}   = $s_false;   $cv{$svc.$s_chgrpdirB}   = 0;
-            $cv{$svc.$s_chgrpskel}  = $s_false;   $cv{$svc.$s_chgrpskelB}  = 0;
+            $cv{$svc,$s_addtogroup} = $s_false;   $cv{$svc,$s_addtogroupB} = 0;
+            $cv{$svc,$s_chgrpdir}   = $s_false;   $cv{$svc,$s_chgrpdirB}   = 0;
+            $cv{$svc,$s_chgrpskel}  = $s_false;   $cv{$svc,$s_chgrpskelB}  = 0;
         }
         else {
-            $cv{$svc.$s_group} = $t_group;
+            $cv{$svc,$s_group} = $t_group;
         }
     }
 
     # Process the "addtogroup" configuration variable
 
-    if ($cv{$svc.$s_addtogroupB} && ($cv{$svc.$s_group} ne '')) {
+    if ($cv{$svc,$s_addtogroupB} && ($cv{$svc,$s_group} ne '')) {
 
-        my $t = $cv{$svc.$s_group};
-        ($t_group, my $t1, $t_gid, $t_members) = getgrnam $t;
+        my $t = $cv{$svc,$s_group};
+        (my $t_group, my $t1, my $t_gid, my $t_members) = getgrnam $t;
 
         # Check if the user is already a member of that group
 
@@ -514,11 +521,11 @@
 
     # Process the "mounted" configuration variable
 
-    $cv{$svc.$s_homedir} =~ s,/$,,;             # Remove trailing / on homedir
-    $cv{$svc.$s_subdir}  =~ s,^/,,;             # Remove leading / on subdir
-    $cv{$svc.$s_subdir}  =~ s,/$,,;             # Remove trailing / on subdir
+    $cv{$svc,$s_homedir} =~ s,/$,,;             # Remove trailing / on homedir
+    $cv{$svc,$s_subdir}  =~ s,^/,,;             # Remove leading / on subdir
+    $cv{$svc,$s_subdir}  =~ s,/$,,;             # Remove trailing / on subdir
 
-    if (($cv{$svc.$s_homedir} ne '') && $cv{$svc.$s_mountedB}) {
+    if (($cv{$svc,$s_homedir} ne '') && $cv{$svc,$s_mountedB}) {
         # Need to check for "mounted" before checking for the existence of
         # of the service's home directory.
 
@@ -527,7 +534,7 @@
         } else {
             my ($t_dev, $t_mntpoint, $t_type, $t_options);
             my $ismounted = 0;
-            my $t_dir = $cv{$svc.$s_homedir} . '/';
+            my $t_dir = $cv{$svc,$s_homedir} . '/';
 
             # Open mounts table and process it
 
@@ -548,60 +555,60 @@
             close(MOUNTS) || die "$O: $procmounts: $!\n";
 
             if (! $ismounted) {
-                print "    Directory $cv{$svc.$s_homedir} not mounted\n"
+                print "    Directory $cv{$svc,$s_homedir} not mounted\n"
                     if $verbose;
-                $cv{$svc.$s_homedir} = '';
+                $cv{$svc,$s_homedir} = '';
             }
         }
     }
 
     # Process the "homedir" and "subdir" configuration variables
 
-    if ($cv{$svc.$s_homedir} ne '') {
-        if (! -d $cv{$svc.$s_homedir}) {
-            warn "$O: Directory $cv{$svc.$s_homedir} does not exist\n";
-            $cv{$svc.$s_homedir} = '';
+    if ($cv{$svc,$s_homedir} ne '') {
+        if (! -d $cv{$svc,$s_homedir}) {
+            warn "$O: Directory $cv{$svc,$s_homedir} does not exist\n";
+            $cv{$svc,$s_homedir} = '';
         }
-        elsif (($cv{$svc.$s_subdir} ne '') && (! $cv{$svc.$s_althomeB})) {
-            my $t = $cv{$svc.$s_homedir} . '/' . $cv{$svc.$s_subdir};
+        elsif (($cv{$svc,$s_subdir} ne '') && (! $cv{$svc,$s_althomeB})) {
+            my $t = $cv{$svc,$s_homedir} . '/' . $cv{$svc,$s_subdir};
             if (! -d $t) {
                 warn "$O: Directory $t does not exist\n";
-                $cv{$svc.$s_subdir} = '';
-                $cv{$svc.$s_homedir} = '';
+                $cv{$svc,$s_subdir} = '';
+                $cv{$svc,$s_homedir} = '';
             }
         }
     }
 
     # Calculate the actual directory to create (if necessary)
 
-    if ($cv{$svc.$s_homedir} ne '') {
-        $cv{$svc.$s_actualdir} = $cv{$svc.$s_homedir};
-        if ($cv{$svc.$s_subdir} ne '') {
-            $cv{$svc.$s_actualdir} .= '/' . $cv{$svc.$s_subdir};
+    if ($cv{$svc,$s_homedir} ne '') {
+        $cv{$svc,$s_actualdir} = $cv{$svc,$s_homedir};
+        if ($cv{$svc,$s_subdir} ne '') {
+            $cv{$svc,$s_actualdir} .= '/' . $cv{$svc,$s_subdir};
         }
-        if (! $cv{$svc.$s_althomeB}) {
-            $cv{$svc.$s_actualdir} .= '/' . $username;
+        if (! $cv{$svc,$s_althomeB}) {
+            $cv{$svc,$s_actualdir} .= '/' . $username;
         }
     }
 
     # Process the "mkdir" and "chgrpdir" configuration variables
 
-    if (($cv{$svc.$s_homedir} ne '') && $cv{$svc.$s_mkdirB}) {
-        my $t = $cv{$svc.$s_actualdir};
+    if (($cv{$svc,$s_homedir} ne '') && $cv{$svc,$s_mkdirB}) {
+        my $t = $cv{$svc,$s_actualdir};
 
         if (-d $t) {
             print "    Directory $t already exists\n" if $verbose;
         } elsif (-e $t) {
             warn "$O: $t is not a directory\n";
-            $cv{$svc.$s_homedir} = '';
+            $cv{$svc,$s_homedir} = '';
         } else {
             print "    Directory $t created\n" if $verbose;
             mkdir($t, oct($cv{$s_dirmode})) if ! $dryrun;
                 # Note that this newly-created directory will inherit the
                 # SGID (set group ID) bit from its parent directory.  This
                 # IS desired, hence, do NOT do a separate chmod()!
-            if ($cv{$svc.$s_chgrpdirB}) {
-                chown($uid, $cv{$svc.$s_svcgid}, $t) if ! $dryrun;
+            if ($cv{$svc,$s_chgrpdirB}) {
+                chown($uid, $cv{$svc,$s_svcgid}, $t) if ! $dryrun;
             } else {
                 chown($uid, $gid, $t) if ! $dryrun;
             }
@@ -610,22 +617,22 @@
 
     # Process the "mklink" and "linkname" configuration variables
 
-    if (($cv{$svc.$s_homedir} ne '') && $cv{$svc.$s_mklinkB}
-        && (-d $cv{$svc.$s_actualdir})) {
+    if (($cv{$svc,$s_homedir} ne '') && $cv{$svc,$s_mklinkB}
+        && (-d $cv{$svc,$s_actualdir})) {
 
         # Calculate the actual link name
 
-        $cv{$svc.$s_linkname} =~ s,/$,,;        # Remove trailing '/'
+        $cv{$svc,$s_linkname} =~ s,/$,,;        # Remove trailing '/'
 
-        if ($cv{$svc.$s_linkname} eq '') {
-            $cv{$svc.$s_actuallink} = $homedir . '/' . $service;
+        if ($cv{$svc,$s_linkname} eq '') {
+            $cv{$svc,$s_actuallink} = $homedir . '/' . $service;
         } else {
-            $cv{$svc.$s_actuallink} = $homedir . '/' . $cv{$svc.$s_linkname};
+            $cv{$svc,$s_actuallink} = $homedir . '/' . $cv{$svc,$s_linkname};
         }
 
         # Create the symbolic link, if needed
 
-        my $t = $cv{$svc.$s_actuallink};
+        my $t = $cv{$svc,$s_actuallink};
         if (-l $t) {
             print "    Symbolic link $t already exists\n"
                 if $verbose;
@@ -633,9 +640,9 @@
             warn "$O: $t is not a symbolic link\n";
         } else {
             print "    Symbolic link $t created\n" if $verbose;
-            symlink($cv{$svc.$s_actualdir}, $t) if ! $dryrun;
-            if ($cv{$svc.$s_chgrpdirB}) {
-                &lchown($uid, $cv{$svc.$s_svcgid}, $t) if ! $dryrun;
+            symlink($cv{$svc,$s_actualdir}, $t) if ! $dryrun;
+            if ($cv{$svc,$s_chgrpdirB}) {
+                &lchown($uid, $cv{$svc,$s_svcgid}, $t) if ! $dryrun;
             } else {
                 &lchown($uid, $gid, $t) if ! $dryrun;
             }
@@ -647,28 +654,28 @@
 
     # Process the "skelfile" and "chgrpskel" configuration variables
 
-    if (($cv{$svc.$s_homedir} ne '') && ($cv{$svc.$s_skelfile} ne '')
-        && (-d $cv{$svc.$s_actualdir})) {
+    if (($cv{$svc,$s_homedir} ne '') && ($cv{$svc,$s_skelfile} ne '')
+        && (-d $cv{$svc,$s_actualdir})) {
 
-        my $t = $cv{$svc.$s_skelfile};
-        $cv{$svc.$s_actualsrcf} = $cv{$s_skelother} . '/' . $t;
-        $cv{$svc.$s_actualdstf} = $cv{$svc.$s_actualdir} . '/' . $t;
+        my $t = $cv{$svc,$s_skelfile};
+        $cv{$svc,$s_actualsrcf} = $cv{$s_skelother} . '/' . $t;
+        $cv{$svc,$s_actualdstf} = $cv{$svc,$s_actualdir} . '/' . $t;
 
-        if (-e $cv{$svc.$s_actualdstf}) {
-            print "    File $cv{$svc.$s_actualdstf} already exists\n"
+        if (-e $cv{$svc,$s_actualdstf}) {
+            print "    File $cv{$svc,$s_actualdstf} already exists\n"
                 if $verbose;
-        } elsif (! -r $cv{$svc.$s_actualsrcf}) {
-            warn "$O: $cv{$svc.$s_actualsrcf}: $!\n";
+        } elsif (! -r $cv{$svc,$s_actualsrcf}) {
+            warn "$O: $cv{$svc,$s_actualsrcf}: $!\n";
         } else {
-            print "    File $cv{$svc.$s_actualdstf} created\n" if $verbose;
-            if ($cv{$svc.$s_chgrpskelB}) {
+            print "    File $cv{$svc,$s_actualdstf} created\n" if $verbose;
+            if ($cv{$svc,$s_chgrpskelB}) {
                 system(@install, '-m', $cv{$s_filemode}, '-o', $uid,
-                       '-g', $cv{$svc.$s_svcgid},
-                       $cv{$svc.$s_actualsrcf}, $cv{$svc.$s_actualdstf})
+                       '-g', $cv{$svc,$s_svcgid},
+                       $cv{$svc,$s_actualsrcf}, $cv{$svc,$s_actualdstf})
                     if ! $dryrun;
             } else {
                 system(@install, '-m', $cv{$s_filemode}, '-o', $uid, '-g',
-                       $gid, $cv{$svc.$s_actualsrcf}, $cv{$svc.$s_actualdstf})
+                       $gid, $cv{$svc,$s_actualsrcf}, $cv{$svc,$s_actualdstf})
                     if ! $dryrun;
             }
         }
@@ -757,15 +764,15 @@
     print <<"DATAEND"
 
 $O v$version --- adduser(8) local system additions.
-Copyright (C) 1999-2001, John Zaitseff.
+Copyright (C) 1999-2004, John Zaitseff.
 
 This program, once installed as /usr/local/sbin/adduser.local, is auto-
 matically called by the adduser(8) system program on a Debian system.
 This script completes the creation of a user account in a system-
 dependent way.
 
-This script is automatically called by adduser with arguments "username
-uid gid homedir".  See adduser(8) for more details.  In addition, this
+This script is automatically called by adduser with arguments \"username
+uid gid homedir\".  See adduser(8) for more details.  In addition, this
 script may be called manually.  In this case, the following syntax
 applies:
 
@@ -775,7 +782,7 @@
 
     --dry-run      -n   - Pretend to fulfil everything required, without
                           doing anything.
-    --quiet        -q   - Don't show extraneous information.
+    --quiet        -q   - Don\'t show extraneous information.
     --verbose      -v   - Show information about what was done (default).
     --help         -h   - Show a brief command-line summary.
     --version      -V   - Show the version of the adduser.local script.
@@ -794,7 +801,7 @@
     print <<"DATAEND"
 
 $O v$version --- adduser(8) local system additions.
-Copyright (C) 1999-2001, John Zaitseff.
+Copyright (C) 1999-2004, John Zaitseff.
 
 This program, including associated files, is distributed under the GNU General
 Public License.  See /usr/share/common-licenses/GPL for more information.

Modified: trunk/examples/adduser.local.conf
===================================================================
--- trunk/examples/adduser.local.conf	2005-02-05 12:42:37 UTC (rev 191)
+++ trunk/examples/adduser.local.conf	2005-02-05 12:48:53 UTC (rev 192)
@@ -2,7 +2,7 @@
 # /etc/adduser.local.conf: Configuration for /usr/local/sbin/adduser.local #
 ############################################################################
 
-# [JNZ] Modified 17-Apr-2001
+# [JNZ] Modified 23-Sep-2004
 
 # This file configures the local system additions to adduser(8) and should
 # be modified to suit local conditions.
@@ -39,6 +39,20 @@
 filemode = 0644
 
 
+#####################
+#   USERS service   #
+#####################
+
+# Add the user to the Unix group "users".  Every user on this machine
+# should be a member of this group.  This is already done if the file
+# /etc/adduser.conf includes the setting "USERGROUPS=no".  If USERGROUPS
+# is set to "yes", you should uncomment the following three lines.
+
+# service = users
+# group[users] = users
+# addtogroup[users] = true
+
+
 ###################
 #   WWW service   #
 ###################
@@ -122,23 +136,60 @@
 #   ZIP service   #
 ###################
 
-# Create the directory /mnt/zip/home/$USER, owned by the user.  This is
-# only done if /mnt/zip exists and some device is mounted on it at the
+# Create the directory /media/zip/home/$USER, owned by the user.  This is
+# only done if /media/zip exists and some device is mounted on it at the
 # time the adduser.local script is run.
 
 service = zip
 
-homedir[zip] = "/mnt/zip"
+homedir[zip] = "/media/zip"
 subdir[zip]  = "home"
 mounted[zip] = true
 mkdir[zip]   = true
 
 
+#####################
+#   CDROM service   #
+#####################
+
+# Add the user to the Unix group "cdrom" (if it exists).  This allows the
+# user to access the CD-ROM hardware on the machine.
+
+service = cdrom
+group[cdrom] = cdrom
+addtogroup[cdrom] = true
+
+
+######################
+#   FLOPPY service   #
+######################
+
+# Add the user to the Unix group "floppy" (if it exists).  This allows the
+# user to access the floppy drive on the machine.
+
+service = floppy
+group[floppy] = floppy
+addtogroup[floppy] = true
+
+
+#####################
+#   AUDIO service   #
+#####################
+
+# Add the user to the Unix group "audio" (if it exists).  This allows the
+# user to access the audio hardware on the machine.
+
+service = audio
+group[audio] = audio
+addtogroup[audio] = true
+
+
 ###################
 #   DIP service   #
 ###################
 
-# Add the user to the Unix group "dip" (if it exists)
+# Add the user to the Unix group "dip" (if it exists).  This allows the
+# user to dial out using the local modem.
 
 service = dip
 group[dip] = dip
@@ -326,13 +377,13 @@
 #     the user's name (for whom adduser.local was called).  For example,
 #     if the following were to be specified:
 #
-#         homedir[svc] = /mnt/zip
+#         homedir[svc] = /media/zip
 #         subdir[svc] = home
 #         althome[svc] = false
 #         mkdir[svc] = true
 #
 #     and the user's name (for whom adduser.local was called) was "james",
-#     the directory "/mnt/zip/home/james" would be created.
+#     the directory "/media/zip/home/james" would be created.
 #
 #     If, on the other hand, the "althome" variable was set to true, the
 #     subdirectory is used only in conjunction with the home directory; it
@@ -348,7 +399,7 @@
 #     would be created.
 #
 #     and the user's name (for whom adduser.local was called) was "james",
-#     the directory "/mnt/zip/home/james" would be created.
+#     the directory "/media/zip/home/james" would be created.
 #
 #     If this variable is not specified, blank is assumed.
 #

Added: trunk/examples/examples/adduser.conf
===================================================================
--- trunk/examples/examples/adduser.conf	2005-02-05 12:42:37 UTC (rev 191)
+++ trunk/examples/examples/adduser.conf	2005-02-05 12:48:53 UTC (rev 192)
@@ -0,0 +1,68 @@
+# /etc/adduser.conf: `adduser' configuration.
+# See adduser(8) and adduser.conf(5) for full documentation.
+
+# [JNZ] Modified 23-Sep-2004
+
+# Modified from the version shipped with adduser(8) by John Zaitseff.
+# These modifications are released into the public domain.
+
+# The DSHELL variable specifies the default login shell on your
+# system.
+DSHELL=/bin/bash
+
+# The DHOME variable specifies the directory containing users' home
+# directories.
+DHOME=/home
+
+# If GROUPHOMES is "yes", then the home directories will be created as
+# /home/groupname/user.
+GROUPHOMES=no
+
+# If LETTERHOMES is "yes", then the created home directories will have
+# an extra directory - the first letter of the user name. For example:
+# /home/u/user.
+LETTERHOMES=no
+
+# The SKEL variable specifies the directory containing "skeletal" user
+# files; in other words, files such as a sample .profile that will be
+# copied to the new user's home directory when it is created.
+SKEL=/etc/skel
+
+# FIRST_SYSTEM_[GU]ID to LAST_SYSTEM_[GU]ID inclusive is the range for UIDs
+# for dynamically allocated administrative and system accounts/groups.
+FIRST_SYSTEM_UID=100
+LAST_SYSTEM_UID=999
+FIRST_SYSTEM_GID=100
+LAST_SYSTEM_GID=999
+
+# FIRST_[GU]ID to LAST_[GU]ID inclusive is the range of UIDs of dynamically
+# allocated user accounts/groups.
+FIRST_UID=1000
+LAST_UID=29999
+FIRST_GID=1000
+LAST_GID=29999
+
+# The USERGROUPS variable can be either "yes" or "no".  If "yes" each
+# created user will be given their own group to use as a default, and
+# their home directories will be g+s.  If "no", each created user will
+# be placed in the group whose gid is USERS_GID (see below).
+USERGROUPS=no
+
+# If USERGROUPS is "no", then USERS_GID should be the GID of the group
+# `users' (or the equivalent group) on your system.
+USERS_GID=100
+
+# If QUOTAUSER is set, a default quota will be set from that user with
+# `edquota -p QUOTAUSER newuser'
+QUOTAUSER=""
+
+# If DIR_MODE is set, directories will be created with the specified
+# mode. Otherwise the default mode 0755 will be used.
+DIR_MODE=0755
+
+# If SETGID_HOME is "yes" home directories for users with their own
+# group the setgid bit will be set. This was the default for
+# versions << 3.13 of adduser. Because it has some bad side effects we
+# no longer do this per default. If you want it nevertheless you can
+# still set it here.
+SETGID_HOME=no

Added: trunk/examples/examples/bash.bashrc
===================================================================
--- trunk/examples/examples/bash.bashrc	2005-02-05 12:42:37 UTC (rev 191)
+++ trunk/examples/examples/bash.bashrc	2005-02-05 12:48:53 UTC (rev 192)
@@ -0,0 +1,32 @@
+#########################################################################
+#      /etc/bash.bashrc: System-wide initialisation file for bash       #
+#########################################################################
+
+# This script file is executed by bash(1) for interactive shells.
+#
+# [JNZ] Modified 23-Sep-2004
+#
+# Written by John Zaitseff and released into the public domain.
+
+umask 022
+
+shopt -s checkwinsize expand_aliases
+set -P
+
+# Terminal type modifications
+
+if [ "$TERM" = teraterm ]; then
+    export TERM=linux
+fi
+
+# Set the complete path, as /etc/login.defs does not seem to be consulted
+
+if [ $(id -u) -eq 0 ]; then
+    export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin/X11
+else
+    export PATH=/usr/local/bin:/bin:/usr/bin:/usr/bin/X11:/usr/games
+fi
+
+if [ -d ${HOME}/bin ]; then
+    export PATH=${HOME}/bin:${PATH}
+fi

Added: trunk/examples/examples/profile
===================================================================
--- trunk/examples/examples/profile	2005-02-05 12:42:37 UTC (rev 191)
+++ trunk/examples/examples/profile	2005-02-05 12:48:53 UTC (rev 192)
@@ -0,0 +1,31 @@
+#########################################################################
+#        /etc/profile: System-wide initialisation file for bash         #
+#########################################################################
+
+# This script file is executed by bash(1) for login shells.  By default,
+# it executes /etc/bash.bashrc and ~/.bashrc, as well as performing login-
+# only functions.
+#
+# [JNZ] Modified 23-Sep-2004
+#
+# Written by John Zaitseff and released into the public domain.
+
+if [ -r /etc/bash.bashrc ]; then . /etc/bash.bashrc; fi
+if [ -r $HOME/.bashrc ];    then . $HOME/.bashrc;    fi
+
+# Display a verse from the Bible using verse(1)
+
+if [ ! -f $HOME/.hushlogin -a ! -f $HOME/.hushverse ]; then
+    if [ $(type -p verse) ]; then
+        echo
+        verse
+    fi
+fi
+
+# Turn on talk(1) messages, unless the user does not want this
+
+if [ ! -f $HOME/.hushlogin -a ! -f $HOME/.hushtalk ]; then
+    mesg y
+fi
+
+echo

Added: trunk/examples/examples/skel/dot.bash_logout
===================================================================
--- trunk/examples/examples/skel/dot.bash_logout	2005-02-05 12:42:37 UTC (rev 191)
+++ trunk/examples/examples/skel/dot.bash_logout	2005-02-05 12:48:53 UTC (rev 192)
@@ -0,0 +1,10 @@
+#########################################################################
+#                .bash_logout:  Log-out script for bash                 #
+#########################################################################
+
+# This script file is executed by bash(1) when the login shell terminates.
+# By default, no action is taken.
+#
+# [JNZ] Modified 23-Sep-2004
+#
+# Written by John Zaitseff and released into the public domain.

Added: trunk/examples/examples/skel/dot.bash_profile
===================================================================
--- trunk/examples/examples/skel/dot.bash_profile	2005-02-05 12:42:37 UTC (rev 191)
+++ trunk/examples/examples/skel/dot.bash_profile	2005-02-05 12:48:53 UTC (rev 192)
@@ -0,0 +1,10 @@
+#########################################################################
+#         .bash_profile: Personal initialisation file for bash          #
+#########################################################################
+
+# This script file is executed by bash(1) for login shells.  By default,
+# it does nothing, as ~/.bashrc is already sourced by /etc/profile.
+#
+# [JNZ] Modified 23-Sep-2004
+#
+# Written by John Zaitseff and released into the public domain.

Added: trunk/examples/examples/skel/dot.bashrc
===================================================================
--- trunk/examples/examples/skel/dot.bashrc	2005-02-05 12:42:37 UTC (rev 191)
+++ trunk/examples/examples/skel/dot.bashrc	2005-02-05 12:48:53 UTC (rev 192)
@@ -0,0 +1,62 @@
+#########################################################################
+#            .bashrc: Personal initialisation file for bash             #
+#########################################################################
+
+# This file is executed by interactive shells (ie, shells for which you
+# are able to provide keyboard input).  It is the best place to put shell
+# aliases, etc.
+#
+# [JNZ] Modified 23-Sep-2004
+#
+# Written by John Zaitseff and released into the public domain.
+
+
+# Variable settings for your convenience
+
+export LANG=en_AU.UTF-8				# We are in Australia
+export LC_ALL=en_AU.UTF-8
+export TIME_STYLE=$'+%b %e  %Y\n%b %e %H:%M'	# As used by ls(1)
+export EDITOR=emacs				# Everyone's favourite editor
+export CVSROOT=:ext:cvs.zap.org.au:/data/cvs
+export CVS_RSH=ssh
+
+# Useful aliases, defined whether or not this shell is interactive
+
+alias cls=clear
+alias ls="ls -v"
+alias dir="ls -laF"
+alias lock="clear; vlock -a; clear"
+alias e="emacs -nw"
+
+
+# Run the following only if this shell is interactive
+
+if [ "$PS1" ]; then
+
+    export IGNOREEOF=5			# Disallow accidental Ctrl-D
+
+    # Set options, depending on terminal type
+    if [ -z "$TERM" -o "$TERM" = "dumb" ]; then
+        # Not a very smart terminal
+        export PS1="[ \u@\h | \w ] "
+    else
+        # Assume a smart VT100-based terminal with colour
+
+	# Make sure the terminal is in UTF-8 mode.  This is a hack!
+	/bin/echo -n -e '\033%G'
+
+	# Make ls(1) use colour in its listings
+        if [ -x /usr/bin/dircolors ]; then
+            alias ls="ls -v --color=auto"
+            eval $(/usr/bin/dircolors --sh)
+        fi
+
+	# Set the terminal prompt
+        if [ $(id -u) -ne 0 ]; then
+            export PS1="\[\e[7m\][ \u@\h | \w ]\[\e[0m\] "
+        else
+            # Root user gets a nice RED prompt!
+            export PS1="\[\e[41;30m\][ \u@\h | \w ]\[\e[0m\] "
+        fi
+    fi
+fi

Added: trunk/examples/examples/skel.other/index.html
===================================================================
--- trunk/examples/examples/skel.other/index.html	2005-02-05 12:42:37 UTC (rev 191)
+++ trunk/examples/examples/skel.other/index.html	2005-02-05 12:48:53 UTC (rev 192)
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html lang="en">
+
+<!-- This document is a place-holder for the home page until the user
+     gets around to replacing it with his or her own.
+
+     [JNZ] Modified 23-Sep-2004
+
+     Written by John Zaitseff and released into the public domain.  -->
+
+<head>
+    <title>My Home Page</title>
+    <meta name="Author" content="The user">
+    <meta name="Description" content="The user's default home page">
+    <meta name="Keywords" content="home, homepage, default">
+    <meta name="Language" content="English">
+    <link rev="made" href="mailto:webmaster@zap.org.au">
+    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+    <meta http-equiv="Content-Language" content="en">
+</head>
+<body text="#000000" bgcolor="#FFFFFF"
+      link="#0000FF" vlink="#330066" alink="#FF0000">
+
+<h1>My Home Page</h1>
+
+<p>Welcome to my home page on the World Wide Web!  This page, like many
+others, is under construction.  I&rsquo;ll be replacing this page
+soon&hellip; I hope.</p>
+
+</body>
+</html>