NAME
File::LckPwdF - Lock and unlock the passwd and shadow files with lckpwdf
and ulckpwdf
SYNOPSIS
use File::LckPwdF;
(lock_passwd(15)) || (die "Can't lock password file:\n$! stopped");
# ... do stuff with the passwd file ...
(unlock_passwd()) || (die "Can't unlock password file:\n$! stopped");
DESCRIPTION
This is a perl module to use lckpwdf(3) and ulckpwdf(3) to lock the
/etc/passwd and (if present) /etc/shadow files.
Functions exported automatically
lock_passwd($timeout)
$timeout works as follows:
1. The initial time is checked.
2. If $timeout is 0, it tries lckpwdf() until it succeeds, waiting a
random time in between.
3. If $timeout is above 0, it tries lckpwdf() once. If that (or any
following lckpwdf()) succeeds, it returns 1. It will try lckpwdf() until
either it succeeds or the time is greater than the initial time plus
$timeout. In the latter case, it returns 0. It waits a random time in
between tries of lckpwdf().
The random timeout is controlled by $File::LckPwdF::Rand_Wait, which is
exported on request. It is used via
sleep int(rand($Rand_Wait) + 1);
inside an until loop. This sleep is only done if
$File::LckPwdF::Rand_Wait is above 0.
$timeout defaults to $File::LckPwdF::Default_Timeout, which is also
exported on request; the initial setting of
$File::LckPwdF::Default_Timeout (the default default) is 15 seconds. The
default setting for $File::LckPwdF::Rand_Wait is 10 seconds.
unlock_passwd()
This function uses ulckpwdf(). If lock_passwd() has previously been used
to lock the passwd file, and unlock_passwd() has not been used to lock
it, then it will be used to unlock the passwd file in an END: statement.
(Admittedly, with many implementations of lckpwdf() this is not
necessary, since when a process exits it loses the passwd file lock; it
is present as a safety measure for those systems for which this is not
true.)
Functions exported by request
lckpwdf() ulckpwdf()
These are the xs-loaded versions of lckpwdf(3) and ulckpwdf(3),
respectively.
RETURN VALUE
The lock_passwd() and unlock_passwd() functions return 1 on success and
0 on failure. The return values for lckpwdf() and ulckpwdf() are the
same as for the system versions (lckpwdf(3) and ulckpwdf(3)).
ERRORS
If the effective UID is not 0, then lock_passwd() and unlock_passwd()
set $! to EACCES if they fail (they do try once, just in case you've got
a *really* weird setup).
If the effective UID is 0, in the event of failure, lock_passwd() sets
$! to:
1. if you've already locked the file through lock_passwd(), EALREADY
2. EAGAIN (or EWOULDBLOCK, if EAGAIN isn't present on your system and
EWOULDBLOCK is; $File::LckPwdF::EAGAIN, which is exported on request, is
equal to the value returned).
unlock_passwd(), in the event of failure, sets $! to:
1. if you've already unlocked the file via unlock_passwd() or haven't
locked it via lock_passwd(), EALREADY.
2. EINVAL.
If you try to use a negative number for $timeout with
lock_passwd($timeout), it carps, returns 0, and sets $! to EINVAL.
CAVEATS
This program only works if your system has lckpwdf(3) and ulckpwdf(3).
This should be true of SVR4 systems; others will vary. If you use
lock_passwd() and unlock_passwd(), lckpwdf(3) and ulckpwdf(3) need to
have return values of 0+ for success and below 0 (usually -1) for
failure.
The timeout period for lock_passwd() is approximate, since many versions
of lckpwdf() will keep trying for a total of 15 seconds to lock the
passwd (and possibly shadow) files before they return an appropriate
value.
This module only keeps track on its own of whether the passwd file is
locked if you always use lock_passwd() and unlock_passwd(). If you use
lckpwdf() or ulckpwdf() by themselves for locking and unlocking, you
will need to set $File::LckPwdF::Passwd_Locked to 1 for locked and 0 for
unlocked yourself.
BUGS
I haven't written any good automated tests for this program yet. If
anyone's interested, be my guest (or for any other improvements, of
course).
AUTHOR
E. Allen Smith, <easmith@beatrice.rutgers.edu>. Copyright 1998. This
software may be used, distributed, modified, etcetera under the same
conditions as perl.
FILES
/etc/passwd, /etc/shadow
SEE ALSO
the perl(1) manpage, the lckpwdf(3) manpage, the ulckpwdf(3) manpage