xref: /freebsd/lib/libutil/uucplock.3 (revision b5ebf1f5cde72e225f8bf989d82e7d8a1d9ebb45)
1568b59b9SBrian Somers.\"
2568b59b9SBrian Somers.\" Copyright (c) 1996 Brian Somers <brian@awfulhak.demon.co.uk>
3568b59b9SBrian Somers.\"
4568b59b9SBrian Somers.\" All rights reserved.
5568b59b9SBrian Somers.\"
6568b59b9SBrian Somers.\" Redistribution and use in source and binary forms, with or without
7568b59b9SBrian Somers.\" modification, are permitted provided that the following conditions
8568b59b9SBrian Somers.\" are met:
9568b59b9SBrian Somers.\" 1. Redistributions of source code must retain the above copyright
10568b59b9SBrian Somers.\"    notice, this list of conditions and the following disclaimer.
11568b59b9SBrian Somers.\" 2. Redistributions in binary form must reproduce the above copyright
12568b59b9SBrian Somers.\"    notice, this list of conditions and the following disclaimer in the
13568b59b9SBrian Somers.\"    documentation and/or other materials provided with the distribution.
14568b59b9SBrian Somers.\"
15568b59b9SBrian Somers.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
16568b59b9SBrian Somers.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17568b59b9SBrian Somers.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18568b59b9SBrian Somers.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
19568b59b9SBrian Somers.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20568b59b9SBrian Somers.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21568b59b9SBrian Somers.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22568b59b9SBrian Somers.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23568b59b9SBrian Somers.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24568b59b9SBrian Somers.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25568b59b9SBrian Somers.\"
26b5ebf1f5SMike Pritchard.\" $Id: uucplock.3,v 1.2 1997/03/31 22:47:53 brian Exp $
27568b59b9SBrian Somers.\" "
28568b59b9SBrian Somers.Dd March 30, 1997
29568b59b9SBrian Somers.Os
30568b59b9SBrian Somers.Dt uucplock 3
31568b59b9SBrian Somers.Sh NAME
32568b59b9SBrian Somers.Nm uu_lock ,
33b5ebf1f5SMike Pritchard.Nm uu_unlock ,
34b5ebf1f5SMike Pritchard.Nm uu_lockerr
35568b59b9SBrian Somers.Nd acquire and release control of a serial device
36568b59b9SBrian Somers.Sh SYNOPSIS
37568b59b9SBrian Somers.Fd #include <libutil.h>
38568b59b9SBrian Somers.Ft int
39568b59b9SBrian Somers.Fn uu_lock "char *ttyname"
40568b59b9SBrian Somers.Ft int
41568b59b9SBrian Somers.Fn uu_unlock "char *ttyname"
42687d0cdeSBrian Somers.Ft char *
43687d0cdeSBrian Somers.Fn uu_lockerr "int uu_lockresult"
44568b59b9SBrian Somers.Pp
45568b59b9SBrian SomersLink with
46568b59b9SBrian Somers.Va -lutil
47568b59b9SBrian Somerson the
48568b59b9SBrian Somers.Xr cc 1
49568b59b9SBrian Somerscommand line.
50568b59b9SBrian Somers.Sh DESCRIPTION
51568b59b9SBrian SomersThe
52568b59b9SBrian Somers.Fn uu_lock
53568b59b9SBrian Somersfunction attempts to create a lock file called
54b5ebf1f5SMike Pritchard.Pa /var/spool/lock/LCK..
55568b59b9SBrian Somerswith a suffix given by the passed
56568b59b9SBrian Somers.Fa ttyname .
57568b59b9SBrian SomersIf the file already exists, it is expected to contain the process
58568b59b9SBrian Somersid of the locking program.
59568b59b9SBrian Somers.Pp
60568b59b9SBrian SomersIf the file does not already exist, or the owning process given by
61568b59b9SBrian Somersthe process id found in the lock file is no longer running,
62568b59b9SBrian Somers.Fn uu_lock
63568b59b9SBrian Somerswill write its own process id into the file and return success.
64568b59b9SBrian Somers.Pp
65568b59b9SBrian Somers.Fn uu_unlock
66568b59b9SBrian Somersremoves the lockfile created by
67568b59b9SBrian Somers.Fn uu_lock
68568b59b9SBrian Somersfor the given
69568b59b9SBrian Somers.Fa ttyname .
70568b59b9SBrian SomersCare should be taken that
71568b59b9SBrian Somers.Fn uu_lock
72568b59b9SBrian Somerswas successful before calling
73568b59b9SBrian Somers.Fn uu_unlock .
74687d0cdeSBrian Somers.Pp
75687d0cdeSBrian Somers.Fn uu_lockerr
76687d0cdeSBrian Somersreturns an error string representing the error
77687d0cdeSBrian Somers.Fa uu_lockresult ,
78687d0cdeSBrian Somersas returned from
79687d0cdeSBrian Somers.Fn uu_lock .
80568b59b9SBrian Somers.Sh RETURN VALUES
81687d0cdeSBrian Somers.Fn uu_unlock
82687d0cdeSBrian Somersreturns 0 on success and -1 on failure.
83687d0cdeSBrian Somers.Pp
84687d0cdeSBrian Somers.Fn uu_lock
85687d0cdeSBrian Somersmay return any of the following values:
86687d0cdeSBrian Somers.Pp
87687d0cdeSBrian Somers.Dv UU_LOCK_INUSE:
88687d0cdeSBrian SomersThe lock is in use by another process.
89687d0cdeSBrian Somers.Pp
90687d0cdeSBrian Somers.Dv UU_LOCK_OK:
91687d0cdeSBrian SomersThe lock was successfully created.
92687d0cdeSBrian Somers.Pp
93687d0cdeSBrian Somers.Dv UU_LOCK_OPEN_ERR:
94687d0cdeSBrian SomersThe lock file could not be opened via
95687d0cdeSBrian Somers.Xr open 2 .
96687d0cdeSBrian Somers.Pp
97687d0cdeSBrian Somers.Dv UU_LOCK_READ_ERR:
98687d0cdeSBrian SomersThe lock file could not be read via
99687d0cdeSBrian Somers.Xr read 2 .
100687d0cdeSBrian Somers.Pp
101687d0cdeSBrian Somers.Dv UU_LOCK_SEEK_ERR:
102687d0cdeSBrian SomersThe lock file was
103687d0cdeSBrian Somers.Dq stale ,
104687d0cdeSBrian Somersbut the call to
105687d0cdeSBrian Somers.Xr lseek 2
106687d0cdeSBrian Somersnecessary to write the current process id failed.
107687d0cdeSBrian Somers.Pp
108687d0cdeSBrian Somers.Dv UU_LOCK_WRITE_ERR:
109687d0cdeSBrian SomersThe current process id could not be written to the lock file via a call to
110687d0cdeSBrian Somers.Xr write 2 .
111687d0cdeSBrian Somers.Pp
112687d0cdeSBrian SomersIf a value of
113687d0cdeSBrian Somers.Dv UU_LOCK_OK
114687d0cdeSBrian Somersis passed to
115687d0cdeSBrian Somers.Fn uu_lockerr ,
116687d0cdeSBrian Somersa
117687d0cdeSBrian Somers.Dv NULL
118687d0cdeSBrian Somerspointer is returned.  If a value of
119687d0cdeSBrian Somers.Dv UU_LOCK_INUSE
120687d0cdeSBrian Somersis passed, an empty string is returned.  Otherwise, a string specifying
121687d0cdeSBrian Somersthe reason for failure is returned.
122687d0cdeSBrian Somers.Fn uu_lockerr
123687d0cdeSBrian Somersuses the current value of
124b5ebf1f5SMike Pritchard.Va errno
125687d0cdeSBrian Somersto determine the exact error.  Care should be made not to allow
126b5ebf1f5SMike Pritchard.Va errno
127687d0cdeSBrian Somersto be changed between calls to
128568b59b9SBrian Somers.Fn uu_lock
129568b59b9SBrian Somersand
130687d0cdeSBrian Somers.Fn uu_lockerr .
131568b59b9SBrian Somers.Sh ERRORS
132687d0cdeSBrian SomersIf
133568b59b9SBrian Somers.Fn uu_lock
134687d0cdeSBrian Somersreturns one of the four error values above, the global value
135b5ebf1f5SMike Pritchard.Va errno
136687d0cdeSBrian Somerscan be used to determine the cause.  Refer to the respective manual pages
137687d0cdeSBrian Somersfor further details.
138568b59b9SBrian Somers.Pp
139568b59b9SBrian Somers.Fn uu_unlock
140568b59b9SBrian Somerswill set the global variable
141b5ebf1f5SMike Pritchard.Va errno
142568b59b9SBrian Somersto reflect the reason that the lock file could not be removed.
143568b59b9SBrian SomersRefer to the description of
144568b59b9SBrian Somers.Xr unlink 2
145568b59b9SBrian Somersfor further details.
146687d0cdeSBrian Somers.Sh SEE ALSO
147687d0cdeSBrian Somers.Xr open 2 ,
148687d0cdeSBrian Somers.Xr read 2 ,
149687d0cdeSBrian Somers.Xr lseek 2 ,
150687d0cdeSBrian Somers.Xr write 2
151568b59b9SBrian Somers.Sh BUGS
152687d0cdeSBrian SomersLocking is not atomic.  Should a race condition occur, it's
153687d0cdeSBrian Somerspossible that the
154687d0cdeSBrian Somers.Dq losing
155687d0cdeSBrian Somersprocess fails to identify the
156687d0cdeSBrian Somers.Dq winning
157687d0cdeSBrian Somersprocess.  If this happens,
158687d0cdeSBrian Somers.Fn uu_lock
159687d0cdeSBrian Somersreturns
160687d0cdeSBrian Somers.Dv UU_LOCK_READ_ERR
161687d0cdeSBrian Somersand errno is set to
162b5ebf1f5SMike Pritchard.Er EINVAL .
163568b59b9SBrian Somers.Pp
164568b59b9SBrian SomersIt is possible that a stale lock is not recognised as such if a new
165568b59b9SBrian Somersprocesses is assigned the same processes id as the program that left
166568b59b9SBrian Somersthe stale lock.
167568b59b9SBrian Somers.Pp
168568b59b9SBrian SomersThe calling process must have write permissions to the
169b5ebf1f5SMike Pritchard.Pa /var/spool/lock
170568b59b9SBrian Somersdirectory.  There is no mechanism in place to ensure that the
171568b59b9SBrian Somerspermissions of this directory are the same as those of the
172568b59b9SBrian Somersserial devices that might be locked.
173