5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER START
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The contents of this file are subject to the terms of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Common Development and Distribution License (the "License").
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You may not use this file except in compliance with the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or http://www.opensolaris.org/os/licensing.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * See the License for the specific language governing permissions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and limitations under the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * When distributing Covered Code, include this CDDL HEADER in each
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If applicable, add the following below this CDDL HEADER, with the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner]
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER END
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Use is subject to license terms.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Module: lock.c
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Program: pkgadm (/usr/bin/pkgadm)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: implements the zone/package administrative lock interface
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public methods:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * admin_lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Usage:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Acquire: -a [ -e | -s ] [ -o obj ] [ -k key ] [ -R root ] [ -q ] \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * [ -w ] [ -W timeout ]
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Release: -r -o object -k key [ -R altRoot ] [ -q ]
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Status: [ -o object ] [ -k key ] [ -R altRoot ] [ -q ]
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* enable extentions to standard Unix libraries */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define __EXTENSIONS__
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* unix system includes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdarg.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <strings.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/types.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <wait.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/stat.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <fcntl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <signal.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <locale.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libgen.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/param.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <openssl/bio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <assert.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <time.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <fnmatch.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <zone.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* local includes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libinst.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkglib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkgerr.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <keystore.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkgadm.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkgadm_msgs.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* definition and conversion of sleep units */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define SECONDS(x) ((unsigned int)(x))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MINUTES(x) ((unsigned int)(seconds(x)*60))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* define how waits are timed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WAITER_INITIAL SECONDS(1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WAITER_MAX SECONDS(60)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WAITER_NEXT(x) ((x)*2)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandtypedef unsigned int WAITER_T;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The administrative lock file resides in /tmp
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * It does not survive a reboot
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * It consists of fixed length records
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Each record has the following information:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * record number - record position within the lock file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * lock count - number of lock holders maintaining this lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * lock object - object being locked
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * lock key - key needed to manipulate existing lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * lock exclusive - is the lock exclusive (single locker only)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define LOCK_OBJECT_MAXLEN 512-1
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define LOCK_KEY_MAXLEN 37
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define LOCK_DIRECTORY "/tmp"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * this is the "well known name" of the lock file that is used by the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package, patch, and zone administration commands to synchronize their
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * various efforts - it must live in a temporary directory that is cleared
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * on system reboot but it is NOT a temporary file in that it survives
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the process that creates and updates it - if the format of the lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file ever changes, this path should be updated with a later "uuid"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * so that previous (incompatible) pkgadm's will not use the later data.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define LOCK_FILENAME \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "/tmp/.ai.pkg.zone.lock-afdb66cf-1dd1-11b2-a049-000d560ddc3e"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* mode to use for LOCK_FILENAME */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define LOCK_FILEMODE \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (S_ISGID|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define LOCK_SLEEP_INTERVAL SECONDS(2)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* lock contents types */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandtypedef unsigned long RECORDNUM_T;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define RECORDNUM_NONE 0xFFFFFFFF
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* actual lock data */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstruct _adminLock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland RECORDNUM_T lockRecordNum;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned long lockCount;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned long lockExclusive;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pid_t lockPid;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneid_t lockZoneId;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char lockKey[LOCK_KEY_MAXLEN+1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char lockObject[LOCK_OBJECT_MAXLEN+1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandtypedef struct _adminLock ADMINLOCK_T;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* size of an individual "lock" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define LOCK_SIZE sizeof (ADMINLOCK_T)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* union to allow lock to be accessed as raw or structured data */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandunion _lockRecord
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char _lrLockData[LOCK_SIZE];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ADMINLOCK_T _lrLock;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandtypedef union _lockRecord LOCK_T;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* return codes from "_findLock" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandtypedef unsigned long FINDLOCK_T;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define FINDLOCK_FOUND ((FINDLOCK_T)0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define FINDLOCK_ERROR ((FINDLOCK_T)-1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define FINDLOCK_NOTFOUND ((FINDLOCK_T)-2)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define FINDLOCK_KEYMISMATCH ((FINDLOCK_T)-3)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define FINDLOCK_LOCKED ((FINDLOCK_T)-4)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define FINDLOCK_NOTLOCKED ((FINDLOCK_T)-5)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define FINDLOCK_LOCKACQUIRED ((FINDLOCK_T)-6)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Forward declarations
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* local main function implementation methods */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic FINDLOCK_T lock_acquire(LOCK_T *a_lock, int *a_fd, char *a_root,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_key, char *a_object, int a_quiet,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_wait, long a_timeout, int a_exclusive,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_altRoot, pid_t a_pid, zoneid_t a_zid);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int lock_release(int a_fd, char *a_key, char *a_object,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_quiet);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int lock_status(int a_fd, char *a_key, char *a_object,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_quiet);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* local utility functions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int _lockMatch(char *a_s1Lock, char *a_s2Lock);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic FINDLOCK_T _findLock(LOCK_T *a_theLock, RECORDNUM_T *r_recordNum,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_fd, char *a_object, char *a_key);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int _decrementLockCount(int a_fd, LOCK_T *a_theLock);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int _addLock(char *r_key, int a_fd, char *a_object,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_exclusive, pid_t a_pid, zoneid_t a_zid);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int _incrementLockCount(int a_fd, LOCK_T *a_theLock);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic FINDLOCK_T _lock_acquire(LOCK_T *a_lock, int a_fd, char *a_key,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_object, int a_quiet, int a_exclusive,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pid_t a_pid, zoneid_t a_zid);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *_getUniqueId(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int _openLockFile(char *a_root);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void sighup_handler(int a_signo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void sigint_handler(int a_signo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t _validateLock(int a_fd, LOCK_T *a_theLock, int a_quiet);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int signal_received = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * main methods with external entry points
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: admin_lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: main entry point for pkgadm "lock" subcommand
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Control zone/package administrative locking
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: 0 on success, non-zero otherwise.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandadmin_lock(int argc, char **argv)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FINDLOCK_T tResult;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland LOCK_T theLock;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *RFlag = "/"; /* altRoot */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *endptr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *kFlag = ""; /* key */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *oFlag = ""; /* object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int aFlag = 0; /* acquire lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int eFlag = 0; /* exclusive lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int exclusive = 1; /* exclusive vs shared lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int fd;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int qFlag = 0; /* quiet */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int rFlag = 0; /* release lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int result;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int sFlag = 0; /* shared lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int tFlag = 0; /* test comparison */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int wFlag = 0; /* wait */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland long WFlag = 0; /* wait timeout */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pid_t pFlag = 0; /* process # */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct sigaction nact;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct sigaction oact;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland void (*funcSighup)();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland void (*funcSigint)();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneid_t zFlag = -1; /* zone i.d. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((c = getopt(argc, argv, ":aek:o:p:qrR:stwW:z:")) != EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (c) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'a': /* acquire lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland aFlag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'e': /* exclusive lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland eFlag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'k': /* lock-key */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland kFlag = optarg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strlen(optarg) > LOCK_KEY_MAXLEN) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_kARG_TOOLONG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strlen(optarg), LOCK_KEY_MAXLEN);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'o': /* object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland oFlag = optarg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strlen(optarg) > LOCK_OBJECT_MAXLEN) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_oARG_TOOLONG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strlen(optarg), LOCK_OBJECT_MAXLEN);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'p': /* process i.d. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland endptr = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pFlag = strtol(optarg, &endptr, 10);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((endptr != (char *)NULL) && (*endptr != '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_pFLAG_BADINT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland optarg, *endptr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pFlag == 0) && (errno != 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_pFLAG_ERROR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland optarg, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'q': /* quiet */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland qFlag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'r': /* release lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rFlag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'R': /* alternative root */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if root directory is not absolute path, error */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*optarg != '/') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_RARG_NOT_ABSOLUTE, optarg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if root directory does not exist, create it */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(optarg, F_OK) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create top level root directory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mkdirp(optarg, 0755) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_ALTROOT_CANTCREATE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland optarg, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if $ALTROOT/tmp directory does not exist create it */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = pkgstrPrintf("%s/tmp", optarg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(p, F_OK) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create $ALTROOT/tmp directory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mkdirp(p, 0777) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_ALTROOT_CANTCREATE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if $ALTROOT/tmp directory cannot be created, exit */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(p, F_OK) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_ALTROOT_NONEXIST,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland optarg, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) free(p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland RFlag = optarg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 's': /* shared */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sFlag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 't': /* test comparison */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tFlag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'w': /* wait */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wFlag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'W': /* wait with timeout */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland endptr = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland WFlag = strtol(optarg, &endptr, 10);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((endptr != (char *)NULL) && (*endptr != '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_WFLAG_BADINT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland optarg, *endptr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((WFlag == 0) && (errno != 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_WFLAG_ERROR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland optarg, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wFlag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'z': /* zone i.d. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland endptr = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zFlag = strtol(optarg, &endptr, 10);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((endptr != (char *)NULL) && (*endptr != '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_zFLAG_BADINT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland optarg, *endptr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((zFlag == 0) && (errno != 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_zFLAG_ERROR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland optarg, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ':':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_MISSING_OPERAND, optopt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* LINTED fallthrough on case statement */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '?':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_USAGE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * validate arguments
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if -t option is specified, override all other options */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tFlag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int rs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int rx;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* only 2 or 3 args are valid */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a = argc-optind;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((a < 2) || (a > 3)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, MSG_T_OPTION_ARGS, argc-optind);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if 3rd argument given, it is return value to check */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a == 3) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rs = atoi(argv[optind+2]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rx = _lockMatch(argv[optind+0], argv[optind+1]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if 3rd argument not given, code to check is code returned */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a == 2) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rs = rx;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* report results */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a == 2) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, MSG_T_RESULT_TWO,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rx, argv[optind+0], argv[optind+1]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (rx);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (rx != rs) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, MSG_T_RESULT_THREE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rs, rx, argv[optind+0], argv[optind+1]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* always successful */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (rx == rs ? 0 : 1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* must be no non-option arguments left */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((argc-optind) > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_USAGE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* -a and -r cannot be used together */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (aFlag && rFlag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_ar_TOGETHER);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* -e and -s cannot be used together */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (eFlag && sFlag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_es_TOGETHER);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* -e can only be used if -a is used */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!aFlag && eFlag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_e_without_a);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* -s can only be used if -a is used */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!aFlag && sFlag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_s_without_a);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * perform the requested operation
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * hook SIGINT and SIGHUP interrupts into quit.c's trap handler
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* hold SIGINT/SIGHUP interrupts */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sighold(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sighold(SIGINT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* connect sigint_handler() to SIGINT */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_handler = sigint_handler;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_flags = SA_RESTART;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigemptyset(&nact.sa_mask);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (sigaction(SIGINT, &nact, &oact) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland funcSigint = SIG_DFL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland funcSigint = oact.sa_handler;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* connect sighupt_handler() to SIGHUP */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_handler = sighup_handler;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_flags = SA_RESTART;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigemptyset(&nact.sa_mask);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (sigaction(SIGHUP, &nact, &oact) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland funcSighup = SIG_DFL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland funcSighup = oact.sa_handler;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* release hold on signals */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigrelse(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigrelse(SIGINT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* open the lock file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fd = _openLockFile(RFlag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fd < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (aFlag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set "exclusive" mode based on -e/-s flag used */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (sFlag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exclusive = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (eFlag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exclusive = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* acquire lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tResult = lock_acquire(&theLock, &fd, RFlag, kFlag, oFlag,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland qFlag, wFlag, WFlag, exclusive, RFlag, pFlag, zFlag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (tResult) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_LOCKACQUIRED:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stdout, "%s\n",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland theLock._lrLock.lockKey);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_LOCKED:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stdout, "%s\n",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland theLock._lrLock.lockObject);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (rFlag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* release lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = lock_release(fd, kFlag, oFlag, qFlag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* lock status */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = lock_status(fd, kFlag, oFlag, qFlag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close the lock file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return results of operation */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (result);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * local main function implementation methods
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: lock_acquire
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: implement lock acquisition implementing the wait/timeouts
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Calls _lock_acquire to attempt lock acquisition.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_theLock - lock object filled with contents of existing lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_fd - file descriptor opened on the lock file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_root - root of file system to manipulate locks on
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_key - key associated with lock to acquire
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_object - object associated with lock to acquire
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_wait - wait if lock cannot be acquired flag:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == 0 - do not wait
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != 0 - wait
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_timeout - timeout if waiting to acquire busy lock:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == 0 - no timeout (wait forever)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != 0 - max # seconds to wait to acquire busy lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_quiet - quiet mode enabled flag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_exclusive - exclusive/shared lock flag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_pid - if != 0 process i.d. to associate with this lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_zid - if >= 0 - zone i.d. to associate with this lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == 0 - successful
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != 0 - not successful
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic FINDLOCK_T
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandlock_acquire(LOCK_T *a_theLock, int *a_fd, char *a_root, char *a_key,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_object, int a_quiet, int a_wait, long a_timeout,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_exclusive, char *a_altRoot, pid_t a_pid, zoneid_t a_zid)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int notified = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FINDLOCK_T result;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland time_t timeout;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int closeOnExit = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset the lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(a_theLock, sizeof (LOCK_T));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* open file if not open */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((*a_fd) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (*a_fd) = _openLockFile(a_altRoot);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((*a_fd) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (FINDLOCK_ERROR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland closeOnExit++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* compute time after which acquire times out */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland timeout = time((time_t *)NULL) + a_timeout;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (;;) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland time_t curtime;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* attempt to aquire the lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = _lock_acquire(a_theLock, *a_fd, a_key, a_object,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_quiet, a_exclusive, a_pid, a_zid);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return result if any result other than object is locked */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (result) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_LOCKACQUIRED:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close lock file if opened in this function */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (closeOnExit) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(*a_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_fd = -1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (FINDLOCK_LOCKACQUIRED);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_FOUND:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_NOTFOUND:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_KEYMISMATCH:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_NOTLOCKED:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_ERROR:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close lock file if opened in this function */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (closeOnExit) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(*a_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_fd = -1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (result);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_LOCKED:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* FALLTHROUGH */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * object locked OR SIGINT/SIGHUP interrupt received;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * return error if not waiting for lock OR signal received
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((a_wait == 0) || (signal_received != 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(a_quiet ? LOG_MSG_DEBUG : LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_ACQUIRE_BUSY_FIRST,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_exclusive ? MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object, a_key,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockObject,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockExclusive ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockExclusive !=
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_exclusive ? "" :
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_ACQUIRE_BUSY_ADDITIONAL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close lock file if opened in this function */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (closeOnExit) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(*a_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_fd = -1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (FINDLOCK_LOCKED);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* waiting for lock - if timeout specified see if time left */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_timeout > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland curtime = time((time_t *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (curtime > timeout) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(a_quiet ? LOG_MSG_DEBUG : LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_ACQUIRE_TIMEDOUT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_exclusive ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object, a_key);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close lock file if opened in this function */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (closeOnExit) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(*a_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_fd = -1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (FINDLOCK_ERROR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * waiting to aquire lock:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - notify waiting (one time only)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - close lock file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - sleep
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - open lock file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - try again
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* notify once */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (notified++ == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(a_quiet ? LOG_MSG_DEBUG : LOG_MSG_WRN,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_ACQUIRE_WAITING,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close lock file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(*a_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* wait (sleep) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sleep(LOCK_SLEEP_INTERVAL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* open the lock file and try again */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_fd = _openLockFile(a_root);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*a_fd < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_ACQUIRE_REOPEN_FAILED,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close lock file if opened in this function */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (closeOnExit) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(*a_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_fd = -1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (FINDLOCK_ERROR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: lock_release
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: implement lock release
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_fd - file descriptor opened on the lock file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_key - key associated with lock to release
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_object - object associated with lock to release
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_quiet - quiet mode enabled flag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == 0 - successful
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != 0 - not successful
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandlock_release(int a_fd, char *a_key, char *a_object, int a_quiet)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland RECORDNUM_T recordNum;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland LOCK_T theLock;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FINDLOCK_T result;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_RELEASE_ENTRY,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_key, a_object, a_quiet);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* find the lock to be released */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = _findLock(&theLock, &recordNum, a_fd, a_object, a_key);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_RELEASE_FINDRESULT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result, recordNum);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine how to release the lock if found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (result) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * object is not locked but a key was specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_NOTLOCKED:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(a_quiet ? LOG_MSG_DEBUG : LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_RELEASE_NOTLOCKED,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object, a_key);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (result);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * object is locked and no matching key was specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_LOCKED:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(a_quiet ? LOG_MSG_DEBUG : LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_RELEASE_LOCKED,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object, a_key);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (result);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * object is not locked
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_NOTFOUND:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(a_quiet ? LOG_MSG_DEBUG : LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_RELEASE_NOTFOUND,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object, a_key);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (result);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * object is locked and specified key does not match
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_KEYMISMATCH:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(a_quiet ? LOG_MSG_DEBUG : LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_RELEASE_KEYMISMATCH,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (result);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * error determining if object is locked
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_ERROR:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(a_quiet ? LOG_MSG_DEBUG : LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_RELEASE_ERROR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object, a_key);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland perror(LOCK_FILENAME);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (result);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * object is locked and specified key matches
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_FOUND:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_RELEASE_FOUND,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object, a_key);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) _decrementLockCount(a_fd, &theLock);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * unknown return
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = FINDLOCK_ERROR;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (result);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: lock_status
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: implement lock status display/inquiry
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_fd - file descriptor opened on the lock file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_key - key associated with lock to look up
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_object - object associated with lock to look up
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_quiet - quiet mode enabled flag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == 0 - successful
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != 0 - not successful
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandlock_status(int a_fd, char *a_key, char *a_object, int a_quiet)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ADMINLOCK_T *pll;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland LOCK_T theLock;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland RECORDNUM_T recordNum = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pld;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int found = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland long pls;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_STATUS_ENTRY,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_key, a_object);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* localize references to lock object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pld = &theLock._lrLockData[0];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll = &theLock._lrLock;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pls = sizeof (theLock._lrLockData);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(pld, pls);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* read and process each lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (; pread(a_fd, pld, pls, pls*recordNum) == pls; recordNum++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* debug info on this lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_STATUS_READRECORD,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland recordNum, pll->lockCount,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockObject, pll->lockKey, pll->lockPid,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockZoneId);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore if key specified and key does not match */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((*a_key != '\0') &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (strcmp(pll->lockKey, a_key) != 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore if object specified and object does not match */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((*a_object != '\0') &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (strcmp(pll->lockObject, a_object) != 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland found++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* process next lock if quiet operation */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_quiet != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* output header if first lock object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (found == 1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stdout,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%2s %2s %3s %8s %3s %9s %37s %s\n",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "i#", "l#", "cnt", "pid", "zid", "lock-type",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "---------------lock-key-------------",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "lock-object");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* output status line for this lock object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stdout,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%2ld %2ld %3ld %8ld %3d %9s %37s %s\n",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland recordNum, pll->lockRecordNum, pll->lockCount,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockPid, pll->lockZoneId,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockExclusive ? MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockKey,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pll->lockObject == '\0' ? "*" : pll->lockObject);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return == 0 if found, != 0 if not found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (found == 0 ? 1 : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * local utility functions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _lock_acquire
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: implement lock acquisition without wait/timeouts
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_theLock - lock object filled with contents of existing lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_fd - file descriptor opened on the lock file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_key - key associated with lock to acquire
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_object - object associated with lock to acquire
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_quiet - quiet mode enabled flag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_exclusive - exclusive/shared lock flag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_pid - if != 0 process i.d. to associate with this lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_zid - if >= 0 zone i.d. to associate with this lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: FINDLOCK_T
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic FINDLOCK_T
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_lock_acquire(LOCK_T *a_theLock, int a_fd, char *a_key,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_object, int a_quiet, int a_exclusive, pid_t a_pid,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneid_t a_zid)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland RECORDNUM_T recordNum;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FINDLOCK_T result;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char key[LOCK_KEY_MAXLEN+1] = {'\0'};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_ACQUIRE_ENTRY,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_key, a_object, a_quiet, a_exclusive);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* is the specified object already locked? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (;;) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = _findLock(a_theLock, &recordNum, a_fd, a_object,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_key);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (result != FINDLOCK_LOCKED) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (_validateLock(a_fd, a_theLock, a_quiet) == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* debug info on result of find of lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_ACQUIRE_FINDRESULT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_exclusive ? MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result, recordNum);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine how to acquire the lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (result) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * object is not locked but a key was specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_NOTLOCKED:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(a_quiet ? LOG_MSG_DEBUG : LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_ACQUIRE_NOTLOCKED,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_exclusive ? MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object, a_key);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * object is locked and no key was specified:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - if lock is exclusively held, return "locked"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - if exclusive lock requested, return "locked"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - otherwise lock is shared and shared lock requested,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - increment lock count and return the key
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_LOCKED:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return error if current lock exclusive */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_theLock->_lrLock.lockExclusive) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return error if requesting exclusive lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_exclusive) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* shared requesting shared - add to shared lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_ACQUIRE_LOCKED_SHARED,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object, a_key);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* increment shared lock count */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (_incrementLockCount(a_fd, a_theLock) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = FINDLOCK_LOCKACQUIRED;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = FINDLOCK_ERROR;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * object is not locked
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_NOTFOUND:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_ACQUIRE_NOTFOUND,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_exclusive ? MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (_addLock(key, a_fd, a_object, a_exclusive,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_pid, a_zid) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strncpy(a_theLock->_lrLock.lockKey, key,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (a_theLock->_lrLock.lockKey));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = FINDLOCK_LOCKACQUIRED;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = FINDLOCK_ERROR;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * object is locked, key specified, specified key does not match
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_KEYMISMATCH:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(a_quiet ? LOG_MSG_DEBUG : LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_ACQUIRE_KEYMISMATCH,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_exclusive ? MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * error determining if object is locked
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_ERROR:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_ACQUIRE_ERROR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object, a_key, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * object is locked and specified key matches
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case FINDLOCK_FOUND:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return locked if object currently locked */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_exclusive != a_theLock->_lrLock.lockExclusive) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = FINDLOCK_LOCKED;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_ACQUIRE_FOUND_INC,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object, a_key,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_exclusive ? MSG_LOCK_EXC : MSG_LOCK_SHR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* increment shared lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (_incrementLockCount(a_fd, a_theLock) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = FINDLOCK_LOCKACQUIRED;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = FINDLOCK_ERROR;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * unknown return
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = FINDLOCK_ERROR;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (result);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _openLockFile
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: open the lock file, acquiring exclusive record locks
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_root - root of file system to manipulate locks on
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * >= 0 - successful - file descriptor lock file opened on
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * < 0 - not successful
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_openLockFile(char *a_root)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland WAITER_T waiter;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char lockpath[MAXPATHLEN];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int fd;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int result;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_OPENFILE_ENTRY,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_root, LOCK_FILENAME);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate path to lock directory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(lockpath, sizeof (lockpath), "%s/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_root, LOCK_DIRECTORY);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(lockpath, F_OK) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_ROOTDIR_INVALID,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lockpath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate path to lock file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(lockpath, sizeof (lockpath),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/%s", a_root, LOCK_FILENAME);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* wait for open to succeed up to limits */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (waiter = WAITER_INITIAL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland waiter < WAITER_MAX;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland waiter = WAITER_NEXT(waiter)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* LINTED O_CREAT without O_EXCL specified in call to open() */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fd = open(lockpath, O_CREAT|O_RDWR, LOCK_FILEMODE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* break out of loop if file opened */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fd >= 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* failed - exit loop if due to access (permissions) failure */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (errno == EACCES) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* file is busy - wait and try again */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (waiter == WAITER_INITIAL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_OPENFILE_SLEEPING,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno), waiter);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sleep(waiter);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if open filed generate error message and return error */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fd < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_OPENFILE_FAILURE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland perror(lockpath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * lock file opened - acquire exclusive section lock on entire file;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * wait for lockf to succeed up to limits
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (waiter = WAITER_INITIAL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland waiter < WAITER_MAX;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland waiter = WAITER_NEXT(waiter)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* acquire exclusive section lock on entire file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = lockf(fd, F_LOCK, 0xFFFFF);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* break out of loop if entire file locked */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (result == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* file is busy - wait and try again */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (waiter == WAITER_INITIAL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_OPENFILE_SLEEP2,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno), waiter);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sleep(waiter);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if section lock failed generate error message and return error */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (result < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_OPENFILE_FAIL2,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland perror(lockpath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* file opened and locked - return success */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_OPENFILE_SUCCESS, fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _lockMatch
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Compare two lock objects using file name match criteria
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_s1Lock - first lock object to compare against the second
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_s2Lock - second lock object to compare against the first
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == 0 - the locks match at some level
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != 0 - the locks do not match at any level
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_lockMatch(char *a_s1Lock, char *a_s2Lock)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t s1Sfx = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t s2Sfx = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *final1Lock = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *final2Lock = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char s1Buf[MAXPATHLEN] = {'\0'};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char s1Prefix[MAXPATHLEN] = {'\0'};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char s2Buf[MAXPATHLEN] = {'\0'};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char s2Prefix[MAXPATHLEN] = {'\0'};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int result = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int s1Cnt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int s2Cnt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_s1Lock != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_s2Lock != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LCKMCH_ENTRY, a_s1Lock, a_s2Lock);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * attempt to find a common anchor between the two locks; that is,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * find the first node in the first lock that matches any node
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * in the second lock; for example:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> a/b/c vs b/c/d
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> common anchor is "b"; comparison would expand to:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> a/b/c/? vs ?/b/c/d
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* process each node in the first lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (s1Cnt = 0; ; s1Cnt++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get next first lock node */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgstrGetToken_r((char *)NULL, a_s1Lock, s1Cnt, "/",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s1Buf, sizeof (s1Buf));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LCKMCH_FSTNODE, s1Cnt, s1Buf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit if no more nodes left */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (s1Buf[0] == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* discover "." prefix for this node */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgstrGetToken_r((char *)NULL, s1Buf, 0, ".", s1Prefix,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (s1Prefix));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s1Sfx = (strlen(s1Prefix) == strlen(s1Buf) ? B_FALSE : B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* search each second lock node; look for the first node lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (s2Cnt = 0; ; s2Cnt++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get next second lock node */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgstrGetToken_r((char *)NULL, a_s2Lock, s2Cnt, "/",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s2Buf, sizeof (s2Buf));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LCKMCH_SCNDNODE, s2Cnt,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s2Buf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit if no nodes left */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (s2Buf[0] == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* discover "." prefix for this node */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgstrGetToken_r((char *)NULL, s2Buf, 0, ".", s2Prefix,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (s2Prefix));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s2Sfx = (strlen(s2Prefix) ==
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strlen(s2Buf) ? B_FALSE : B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * process this pair of nodes:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if both nodes do not have a prefix, then directly
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * compare the nodes (e.g. a/b vs c/d: a vs c, b vs d)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and break out of the loop if there is a match;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * otherwise, compare prefixes and break out of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * loop if there is a match (e.g. a.* / b.* vs
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * vs c.* / d.*: a.* vs c.*, a.* vs d.*, b.* vs c.*,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * b.* vs d.*).
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LCKMCH_NODES, s1Buf,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s1Prefix, s1Sfx, s2Buf, s2Prefix, s2Sfx);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((s1Sfx == B_FALSE) || (s2Sfx == B_FALSE)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* one doesnt have a prefix direct comparison */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(s1Buf, s2Buf) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LCKMCH_DIRMCH,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s1Buf, s2Buf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* nodes do not directly match, continue */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LCKMCH_DIRNOMCH,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s1Buf, s2Buf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* both have prefix, compare prefixes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(s1Prefix, s2Prefix) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LCKMCH_PFXMCH,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s1Prefix, s2Prefix);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* prefixes do not match, continue */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LCKMCH_PFXNOMCH, s1Prefix,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s2Prefix);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * match found if not at the end of the second lock node list,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * break out of loop because some match between the two lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * objects has been found
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (s2Buf[0] != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * at this point, either a match has been found between the nodes in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the two lock objects, or there is no commonality at all between
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the two lock objects.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * s1Buf[0] == '\0' && s2Buf[0] == '\0':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> nothing in first lock matches anything in second lock:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ----> (s1Cnt == 1) || (s2Cnt == 1) && (s1Sfx == B_FALSE)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ----> || (s2Sfx == B_FALSE)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --------> an absolute lock do not match
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ----> else both object locks have nothing in common - match
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * s2Buf[0] != '\0' && s1Buf[0] != '\0' && s1Cnt > 0 && s2Cnt > 0
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> locks have incompatible overlaps - no match, such as:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ----> a.* / b.* / c.* / d.* and y.* / b.* / c.*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * s1Cnt == 0 && s2Cnt == 0:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> locks begin with same node - do comparison
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * s1Cnt != 0 && s2Cnt == 0 && s2Buf[0] != '\0'
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> second lock is subset of first lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * s2Cnt == 0 && s2Buf[0] != '\0':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> s1Buf[s1Cnt] matches s2Buf[0] - second is subset of first
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * s2Cnt != 0 && s1Cnt == 0 && s1Buf[0] != '\0':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> first lock is subset of second lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LCKMCH_FSTLCK, s1Cnt, s1Buf,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s1Prefix, s1Sfx);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LCKMCH_SCNDLCK, s2Cnt, s2Buf,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s2Prefix, s2Sfx);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* process any direct comparisons that might be possible */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((s1Buf[0] == '\0') && (s2Buf[0] == '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* nothing in first matches anything in second lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (((s1Cnt == 1) || (s2Cnt == 1)) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((s1Sfx == B_FALSE) || (s2Sfx == B_FALSE))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* two absolute locks match (e.g. 'file' and 'dir') */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LCKMCH_ABSNOMCH, a_s1Lock,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_s2Lock);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* two object locks have nothing in common: match */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LCKMCH_OBJMCH, a_s1Lock, a_s2Lock);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((s2Buf[0] != '\0') && (s1Buf[0] != '\0') &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (s1Cnt > 0) && (s2Cnt > 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* incompatible overlapping objects */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LCKMCH_OVLPNOMCH, a_s1Lock, a_s2Lock,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s1Cnt+1, s1Buf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * must compare each node of each lock to determine match;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * start off at the first byte of both locks
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland final1Lock = a_s1Lock;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland final2Lock = a_s2Lock;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((s1Cnt == 0) && (s2Cnt == 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* both have first match - start comparison from the begining */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LCKMCH_SAME, a_s1Lock, a_s2Lock,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s1Buf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if ((s1Cnt != 0) && (s2Cnt == 0) && (s2Buf[0] != '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* second lock begins somewhere inside of the first lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LCKMCH_SCNDSUB, a_s2Lock, a_s1Lock,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s1Cnt+1, s1Buf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* advance first lock to matching node in second lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr(a_s1Lock, '/') != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (; s1Cnt > 0 && (*final1Lock != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland final1Lock++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*final1Lock == '/') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s1Cnt--;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if ((s2Cnt != 0) && (s1Cnt == 0) && (s1Buf[0] != '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* first lock begins somewhere inside of the second lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LCKMCH_FRSTSUB, a_s1Lock, a_s2Lock,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s2Cnt+1, s2Buf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* advance second lock to matching node in first lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr(a_s2Lock, '/') != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (; s2Cnt > 0 && (*final2Lock != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland final2Lock++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*final2Lock == '/') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s2Cnt--;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* unknown condition (probably impossible): directly compare */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LCKMCH_DONTKNOW, a_s1Lock, a_s2Lock);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * locks have common node - compare from that node forward
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LCKMCH_READY, final1Lock, final2Lock);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* compare each node (prefix) - success when no more nodes to compare */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (s1Cnt = 0; ; s1Cnt++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get next node from first lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgstrGetToken_r((char *)NULL, final1Lock, s1Cnt, "/", s1Buf,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (s1Buf));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* success if at end of lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (s1Buf[0] == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get next node from second lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgstrGetToken_r((char *)NULL, final2Lock, s1Cnt, "/", s2Buf,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (s2Buf));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* success if at end of lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (s2Buf[0] == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* compare both nodes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = fnmatch(s1Buf, s2Buf, 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (result != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = fnmatch(s2Buf, s1Buf, 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* failure if nodes do not match */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (result != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LCKMCH_NODEFAIL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s1Cnt, s1Buf, s2Buf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* nodes match, continue and compare next set of nodes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LCKMCH_NODEOK, s1Cnt, s1Buf, s2Buf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no more nodes to compare - locks match */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LCKMCH_MATCHOK, final1Lock, final2Lock);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _findLock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Locate specified lock in lock file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_theLock - lock object filled with contents of lock (if found)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * r_recordNum - will contain record number if lock found
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - will be RECORDNUM_NONE if lock not found
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_fd - file descriptor opened on the lock file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_key - key associated with lock to look up
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_object - object associated with lock to look up
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * FINDLOCK_FOUND - specified lock found; a_theLock contains contents
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of found lock, r_recordNum contain record number of lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * FINDLOCK_ERROR - failed - error occurred looking up the lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * FINDLOCK_NOTFOUND - specified object is not locked
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * FINDLOCK_KEYMISMATCH - object lock found but specified key doesnt match
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * FINDLOCK_LOCKED - object lock found but no key specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * FINDLOCK_NOTLOCKED - object not locked
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic FINDLOCK_T
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_findLock(LOCK_T *a_theLock, RECORDNUM_T *r_recordNum,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_fd, char *a_object, char *a_key)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ADMINLOCK_T *pll;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pld;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int recordNum = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland long pls;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland off_t pos;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset returned record number to "none" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_recordNum = RECORDNUM_NONE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* localize references to lock object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pld = &a_theLock->_lrLockData[0];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll = &a_theLock->_lrLock;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pls = sizeof (a_theLock->_lrLockData);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* zero out returned lock data */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(pld, pls);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* debug info before processing lock file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_FINDLOCK_ENTRY,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object, a_key);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* rewind to beginning of lock file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pos = lseek(a_fd, 0L, SEEK_SET);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pos == (off_t)-1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_FINDLOCK_LSEEK_FAILURE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object, a_key, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (FINDLOCK_ERROR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* read and process each lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (; pread(a_fd, pld, pls, pls*recordNum) == pls; recordNum++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* debug info on this lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_FINDLOCK_READRECORD,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland recordNum, pll->lockCount,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockObject, pll->lockKey, pll->lockPid,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockZoneId);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* continue if object is not the one we are looking for */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (_lockMatch(a_object, pll->lockObject) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * object found; return locked if searching for no key
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*a_key == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no key specified - object is locked */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_recordNum = recordNum;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (FINDLOCK_LOCKED);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * object found and keys present; see if keys match
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(pll->lockKey, a_key) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* keys do not match */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_recordNum = recordNum;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (FINDLOCK_KEYMISMATCH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* object found and keys match - return match */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_FINDLOCK_FOUND);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_recordNum = recordNum;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (FINDLOCK_FOUND);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* object not locked - return error if key supplied */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*a_key != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (FINDLOCK_NOTLOCKED);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* object not locked and key not supplied - no lock found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_FINDLOCK_NOTFOUND);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (FINDLOCK_NOTFOUND);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _addLock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Add a new lock to the lock file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * r_key - if lock acquired key is placed here
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_fd - file descriptor opened on the lock file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_object - object to lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_exclusive - type of lock to add:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == 0 - shared lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != 0 - exclusive lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_pid - if != 0 process i.d. to associate with this lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_zid - if >= 0 zone i.d. to associate with this lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == 0 - success
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != 0 - failure
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_addLock(char *r_key, int a_fd, char *a_object, int a_exclusive, pid_t a_pid,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneid_t a_zid)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland LOCK_T theLock;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *key;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland off_t pos;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ssize_t result;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get unique i.d. for this lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland key = _getUniqueId();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine record number for next record in lock file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pos = lseek(a_fd, 0L, SEEK_END);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pos == (off_t)-1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_ADDLOCK_LSEEK_FAILURE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_exclusive ? MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate storace for this lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(&theLock, sizeof (theLock));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* fill in components of the lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(theLock._lrLock.lockObject, a_object,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland LOCK_OBJECT_MAXLEN);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(theLock._lrLock.lockKey, key, LOCK_KEY_MAXLEN);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland theLock._lrLock.lockCount = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland theLock._lrLock.lockPid = (a_pid > 0 ? a_pid : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland theLock._lrLock.lockRecordNum = (pos == 0 ? 0 : (pos/sizeof (LOCK_T)));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland theLock._lrLock.lockExclusive = a_exclusive;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland theLock._lrLock.lockZoneId = (a_zid >= 0 ? a_zid : -1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* debug info on new lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_ADDLOCK_ADDING,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_exclusive ? MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pos, theLock._lrLock.lockObject, theLock._lrLock.lockKey,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland theLock._lrLock.lockPid, theLock._lrLock.lockZoneId);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* write the new lock record to the end of the lock file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = pwrite(a_fd, &theLock, LOCK_SIZE, pos);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (result != LOCK_SIZE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_ADDLOCK_PWRITE_FAILURE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_exclusive ? MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_object, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* output the key assigned to standard out */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strncpy(r_key, key, LOCK_KEY_MAXLEN);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_incrementLockCount(int a_fd, LOCK_T *a_theLock)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ADMINLOCK_T *pll;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pld;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland long pls;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ssize_t result;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* localize references to lock object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pld = &a_theLock->_lrLockData[0];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll = &a_theLock->_lrLock;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pls = sizeof (a_theLock->_lrLockData);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* debug info on incrementing lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_INCLOCK_ENTRY,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockExclusive ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockRecordNum, pll->lockCount);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* increment lock count */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockCount++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* write out updated lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = pwrite(a_fd, pld, pls, pll->lockRecordNum*pls);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (result != pls) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_INCLOCK_PWRITE_FAILURE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockExclusive ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockObject,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* debug info lock incremented */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_INCLOCK_DONE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockRecordNum, pll->lockCount,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockObject, pll->lockKey);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _validateLock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: determine if a specified lock is valid; if the lock is not valid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * then remove the lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_fd - file descriptor opened on the lock file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_theLock - lock object to validate
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_TRUE - the lock is valid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE - the lock is not valid and has been removed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_validateLock(int a_fd, LOCK_T *a_theLock, int a_quiet)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ADMINLOCK_T *pll;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pld;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland long pls;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char path[MAXPATHLEN];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* localize references to lock object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pld = &a_theLock->_lrLockData[0];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll = &a_theLock->_lrLock;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pls = sizeof (a_theLock->_lrLockData);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return true if no process i.d. associated with lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pll->lockPid <= 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_VALID_NOPID, pll->lockObject);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* see if the zone i.d. matches */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pll->lockZoneId != getzoneid()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_VALID_BADZID, pll->lockObject,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockZoneId, getzoneid());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_VALID_ZIDOK, pll->lockObject,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockZoneId, getzoneid());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* see if the process is still active */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgstrPrintf_r(path, sizeof (path), "/proc/%d", pll->lockPid);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(path, F_OK) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_VALID_OK, pll->lockObject,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockPid, path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_VALID_NOTOK, pll->lockObject, pll->lockPid,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* delete this lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(a_quiet ? LOG_MSG_DEBUG : LOG_MSG_WRN,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_VALID_STALE, pll->lockObject, pll->lockPid,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockZoneId);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _decrementLockCount(a_fd, a_theLock);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_decrementLockCount(int a_fd, LOCK_T *a_theLock)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ADMINLOCK_T *pll;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland LOCK_T tmpLock;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland RECORDNUM_T lastRecord;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pld;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland long pls;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland off_t lastPos;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ssize_t result;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int res;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* localize references to lock object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pld = &a_theLock->_lrLockData[0];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll = &a_theLock->_lrLock;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pls = sizeof (a_theLock->_lrLockData);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* decrement lock count */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockCount--;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if lock count > 0 then write out and leave locked */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pll->lockCount > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_DECLOCK_DECING,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockExclusive ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockRecordNum, pll->lockCount);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = pwrite(a_fd, pld, pls, pll->lockRecordNum*pls);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (result != pls) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_DECLOCK_PWRITE_FAILURE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockExclusive ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockObject,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_DECLOCK_DONE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockRecordNum, pll->lockCount,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockObject, pll->lockKey);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * lock count zero - erase the record
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* find last record in the lock file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lastPos = lseek(a_fd, 0L, SEEK_END); /* get size of lock file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (lastPos == (off_t)-1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_DECLOCK_LSEEK_FAILURE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockExclusive ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockObject,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lastRecord = (lastPos/pls)-1; /* convert size to record # */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_DECLOCK_REMOVE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lastPos, lastRecord, pll->lockRecordNum);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* see if removing last record of file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (lastRecord == pll->lockRecordNum) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* debug info removing last record */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_DECLOCK_LASTONE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockExclusive ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lastRecord, lastPos-pls);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* removing last record of file, truncate */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland res = ftruncate(a_fd, lastPos-pls);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (res == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_DECLOCK_FTRUNCATE_FAILURE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockExclusive ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockObject,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * not removing last record of file:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * read last record, truncate file one record,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * replace record to be removed with last record read
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_DECLOCK_REMOVING,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pll->lockRecordNum, lastRecord, lastPos-pls);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* read in the last record */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = pread(a_fd, tmpLock._lrLockData, pls, lastRecord*pls);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (result != pls) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_DECLOCK_PREAD_FAILURE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockExclusive ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockObject,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* truncate lock file removing the last record (just read in) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland res = ftruncate(a_fd, lastPos-pls);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (res == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_DECLOCK_FTRUNCATE_FAILURE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockExclusive ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockObject,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* update record to indicate its new position in the lock file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmpLock._lrLock.lockRecordNum = pll->lockRecordNum;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* write out the updated record to the new location */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland result = pwrite(a_fd, tmpLock._lrLockData, pls, pll->lockRecordNum*pls);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (result != pls) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_ERR, MSG_LOCK_DECLOCK_PWRITE_FAILURE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockExclusive ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MSG_LOCK_EXC : MSG_LOCK_SHR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_theLock->_lrLock.lockObject,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _getUniqueId
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Generate a unique ID that can be used as a key for a new lock
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: None
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == NULL - error, no key generated
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != NULL - generated key
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any results returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling method. The caller must use 'lu_memFree' to dispose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the storage once the results are no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_getUniqueId(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *args[10];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *execResults;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char newkey[LOCK_KEY_MAXLEN];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland hrtime_t hretime;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int b;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int execStatus;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct tm tstruct;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland time_t thetime;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * try and use makeuuid to generate a unique i.d. Such a unique i.d.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * will look like:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 7814e3c1-1dd2-11b2-9fe8-000d560ddc82
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland args[0] = "makeuuid";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland args[1] = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = e_ExecCmdList(&execStatus, &execResults, (char *)NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "/usr/bin/makeuuid", (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((b == 0) && (execStatus == 0) && (*execResults != '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = strpbrk(execResults, " \t\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (p != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *p = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_GENUID_MAKEUUID,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland execResults);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (execResults);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * cannot run makeuuid - generate own unique key - the key is the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * same length as unique uid but contains different information that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is as unique as can be made - include current hires time (nanosecond
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * real timer. Such a unique i.d. will look like:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0203104092-1145345-0004e94d6af481a0
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland hretime = gethrtime();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland thetime = time((time_t *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) localtime_r(&thetime, &tstruct);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(newkey, sizeof (newkey),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%02d%02d%02d%03d-%02d%02d%02d%d-%016llx", tstruct.tm_mday,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tstruct.tm_mon, tstruct.tm_year, tstruct.tm_yday,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tstruct.tm_hour, tstruct.tm_min, tstruct.tm_sec,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tstruct.tm_wday, hretime);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland log_msg(LOG_MSG_DEBUG, MSG_LOCK_GENUID_INTERNAL, newkey);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (strdup(newkey));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: sigint_handler
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: SIGINT interrupt handler
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Catch the "SIGINT" signal; increment signal_received
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * global variable,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: signo - [RO, *RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Signal number that was caught
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandsigint_handler(int a_signo)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland signal_received++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: sighup_handler
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: SIGHUP interrupt handler
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Catch the "SIGHUP" signal; increment signal_received
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * global variable,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: signo - [RO, *RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Signal number that was caught
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandsighup_handler(int a_signo)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland signal_received++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}