Add uu_lock_txfr() to transfer ownership of a successful

uu_lock() to another process.
This commit is contained in:
Brian Somers 1998-05-28 23:17:09 +00:00
parent 85fd273a31
commit 46cf264a26
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=36451
4 changed files with 62 additions and 10 deletions

View File

@ -26,7 +26,8 @@ MLINKS+=login_times.3 parse_lt.3 login_times.3 in_ltm.3 \
login_times.3 in_lts.3
MLINKS+=login_ok.3 auth_ttyok.3 login_ok.3 auth_hostok.3 \
login_ok.3 auth_timeok.3
MLINKS+=uucplock.3 uu_lock.3 uucplock.3 uu_unlock.3 uucplock.3 uu_lockerr.3
MLINKS+=uucplock.3 uu_lock.3 uucplock.3 uu_lock_txfr.3 \
uucplock.3 uu_unlock.3 uucplock.3 uu_lockerr.3
beforeinstall:
${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 ${.CURDIR}/libutil.h \

View File

@ -18,7 +18,7 @@
* 5. Modifications may be freely made to this file providing the above
* conditions are met.
*
* $Id: libutil.h,v 1.12 1997/08/31 20:09:38 brian Exp $
* $Id: libutil.h,v 1.13 1997/09/04 22:38:58 pst Exp $
*/
#ifndef _LIBUTIL_H_
@ -43,6 +43,7 @@ int forkpty __P((int *_amaster, char *_name,
struct termios *_termp, struct winsize *_winp));
const char *uu_lockerr __P((int _uu_lockresult));
int uu_lock __P((const char *_ttyname));
int uu_lock_txfr __P((const char *_ttyname, pid_t _pid));
int uu_unlock __P((const char *_ttyname));
int _secure_path __P((const char *_path, uid_t _uid, gid_t _gid));
__END_DECLS
@ -55,5 +56,6 @@ __END_DECLS
#define UU_LOCK_WRITE_ERR (-4)
#define UU_LOCK_LINK_ERR (-5)
#define UU_LOCK_TRY_ERR (-6)
#define UU_LOCK_OWNER_ERR (-7)
#endif /* !_LIBUTIL_H_ */

View File

@ -23,7 +23,7 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
.\" $Id: uucplock.3,v 1.9 1997/09/29 19:11:25 wosch Exp $
.\" $Id: uucplock.3,v 1.10 1997/10/07 07:24:50 joerg Exp $
.\" "
.Dd March 30, 1997
.Os
@ -39,6 +39,8 @@
.Ft int
.Fn uu_lock "const char *ttyname"
.Ft int
.Fn uu_lock_txfr "const char *ttyname" "pid_t pid"
.Ft int
.Fn uu_unlock "const char *ttyname"
.Ft const char *
.Fn uu_lockerr "int uu_lockresult"
@ -63,6 +65,11 @@ the process id found in the lock file is no longer running,
.Fn uu_lock
will write its own process id into the file and return success.
.Pp
.Fn uu_lock_txfr
transfers lock ownership to another process.
.Fn uu_lock
must have previously been successful.
.Pp
.Fn uu_unlock
removes the lockfile created by
.Fn uu_lock
@ -130,10 +137,24 @@ to be changed between calls to
.Fn uu_lock
and
.Fn uu_lockerr .
.Pp
.Fn uu_lock_txfr
may return any of the following values:
.Pp
.Dv UU_LOCK_OK:
The transfer was successful. The specified process now holds the device
lock.
.Pp
.Dv UU_LOCK_OWNER_ERR:
The current process does not already own a lock on the specified device.
.Pp
.Dv UU_LOCK_WRITE_ERR:
The new process id could not be written to the lock file via a call to
.Xr write 2 .
.Sh ERRORS
If
.Fn uu_lock
returns one of the four error values above, the global value
returns one of the error values above, the global value
.Va errno
can be used to determine the cause. Refer to the respective manual pages
for further details.

View File

@ -30,7 +30,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: uucplock.c,v 1.7 1997/08/05 12:58:02 ache Exp $
* $Id: uucplock.c,v 1.8 1997/08/10 18:42:39 ache Exp $
*
*/
@ -66,7 +66,8 @@ static pid_t get_pid (int fd,int *err);
* uucp style locking routines
*/
int uu_lock (const char *ttyname)
int
uu_lock(const char *ttyname)
{
int fd, tmpfd, i;
pid_t pid;
@ -127,7 +128,28 @@ int uu_lock (const char *ttyname)
return uuerr;
}
int uu_unlock (const char *ttyname)
int
uu_lock_txfr(const char *ttyname, pid_t pid)
{
int fd, err;
char lckname[sizeof(_PATH_UUCPLOCK) + MAXNAMLEN];
snprintf(lckname, sizeof(lckname), _PATH_UUCPLOCK LOCKFMT, ttyname);
if ((fd = open(lckname, O_RDWR)) < 0)
return UU_LOCK_OWNER_ERR;
if (get_pid(fd, &err) != getpid())
return UU_LOCK_OWNER_ERR;
lseek(fd, 0, SEEK_SET);
if (put_pid(fd, pid))
return UU_LOCK_WRITE_ERR;
close(fd);
return UU_LOCK_OK;
}
int
uu_unlock(const char *ttyname)
{
char tbuf[sizeof(_PATH_UUCPLOCK) + MAXNAMLEN];
@ -135,7 +157,8 @@ int uu_unlock (const char *ttyname)
return unlink(tbuf);
}
const char *uu_lockerr (int uu_lockresult)
const char *
uu_lockerr(int uu_lockresult)
{
static char errbuf[128];
char *fmt;
@ -163,6 +186,9 @@ const char *uu_lockerr (int uu_lockresult)
case UU_LOCK_TRY_ERR:
fmt = "too many tries: %s";
break;
case UU_LOCK_OWNER_ERR:
fmt = "not locking process: %s";
break;
default:
fmt = "undefined error: %s";
break;
@ -172,7 +198,8 @@ const char *uu_lockerr (int uu_lockresult)
return errbuf;
}
static int put_pid (int fd, pid_t pid)
static int
put_pid(int fd, pid_t pid)
{
char buf[32];
int len;
@ -181,7 +208,8 @@ static int put_pid (int fd, pid_t pid)
return write (fd, buf, len) == len;
}
static pid_t get_pid (int fd, int *err)
static pid_t
get_pid(int fd, int *err)
{
int bytes_read;
char buf[32];