.\" $NetBSD: pidlock.3,v 1.1 1997/10/11 02:56:22 cjs Exp $ .\" .\" Copyright 1996, 1997 by Curt Sampson .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED .\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR .\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS .\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR .\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF .\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN .\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" .Dd November 10, 1996 .Os .Dt PIDLOCK 3 .Sh NAME .Nm pidlock , .Nm ttylock , .Nm ttyunlock .Nd locks based on files containing PIDs .Sh SYNOPSIS .Fd #include .Ft int .Fn pidlock "const char *lockfile" "int flags" "pid_t *locker" "const char *info" .Ft int .Fn ttylock "const char *tty" "int flags" "pid_t *locker" .Ft int .Fn ttyunlock "const char *tty" .Sh DESCRIPTION The .Fn pidlock .Fn ttylock , and .Fn ttyunlock functions attempt to create a lockfile for an arbitrary resource that only one program may hold at a time. (In the case of .Fn ttylock , this is access to a tty device.) If the function succeeds in creating the lockfile, it will succeed for no other program calling it with the same lockfile until the original calling program has removed the lockfile or exited. The .Fn ttyunlock function will remove the lockfile created by .Fn ttylock . .Pp These functions use the method of creating a lockfile traditionally used by UUCP software. This is described as follows in the documentation for Taylor UUCP: .Bd -filled -offset indent The lock file normally contains the process ID of the locking process. This makes it easy to determine whether a lock is still valid. The algorithm is to create a temporary file and then link it to the name that must be locked. If the link fails because a file with that name already exists, the existing file is read to get the process ID. If the process still exists, the lock attempt fails. Otherwise the lock file is deleted and the locking algorithm is retried. .Ed .Pp The PID is stored in ASCII format, with leading spaces to pad it out to ten characters, and a terminating newline. This implementation has been extended to put the hostname on the second line of the file, terminated with a newline, and optionally an arbitrary comment on the third line of the file, also terminated with a newline. If a comment is given, but .Dv PIDLOCK_NONBLOCK is not, a blank line will be written as the second line of the file. .Pp The .Fn pidlock function will attempt to create the file .Fa lockfile and put the current process's pid in it. The .Fn ttylock function will do the same, but should be passed only the base name (with no leading directory prefix) of the tty to be locked; it will test that the tty exists in .Pa /dev and is a character device, and then create the file in the .Pa /var/spool/lock directory and prefix the filename with .Pa LCK.. . Use the .Fn ttyunlock function to remove this lock. .Pp The following flags may be passed in .Pa flags : .Bl -tag -width Dv -offset indent .It Dv PIDLOCK_NONBLOCK The function should return immediately when a lock is held by another active process. Otherwise the function will wait (forever, if necessary) for the lock to be freed. .It Dv PIDLOCK_USEHOSTNAME The hostname should be compared against the hostname in the second line of the file (if present), and if they differ, no attempt at checking for a living process holding the lock will be made, and the lockfile will never be deleted. (The process is assumed to be alive.) This is used for locking on NFS or other remote filesystems. (The function will never create a lock if .Dv PIDLOCK_USEHOSTNAME is specified and no hostname is present.) .El .Pp If .Pa locker is non-null, it will contain the PID of the locking process, if there is one, on return. .Pp If .Pa info is non-null and the lock succeeds, the string it points to will be written as the third line of the lock file. .Sh RETURN VALUES Zero is returned if the operation was successful; on an error a -1 is returned and a standard error code is left in the global location errno. .Sh ERRORS These are among the values left in .Va errno if .Fn pidlock or .Fn ttylock returns a failure: .Bl -tag -width Er .It Bq Er EPERM The current process does not have some of the privileges necessary to perform the lock. These include read and write access to the lock directory, and read access to the current lockfile, if it exists. .It Bq Er ENOENT A component of a specified pathname did not exist, or the pathname was an empty string. .It Bq Er EWOULBLOCK Another runnning process has a lock and the .Dv PIDLOCK_NONBLOCK flag was specified. .It Bq Er ENAMETOOLONG A component of the path name exceeded 255 (MAXNAMELEN) characters, or an entire path name exceeded 1023 (MAXPATHLEN-1) characters. .El .\" .Sh SEE ALSO .Sh HISTORY The .Fn pidlock and .Fn ttylock functions appeared in .Nx 1.3 . .Sh AUTHORS Curt Sampson .Sh BUGS The lockfile format breaks if a pid is longer than ten digits when printed in decimal form. .Pp The PID returned will be the pid of the locker on the remote machine if .Dv PIDLOCK_USEHOSTNAME is specified, but there is no indication that this is not on the local machine. .Pp