diff options
Diffstat (limited to 'usr/src/lib/libdscfg/common/cfg_lockdmsg.c')
-rw-r--r-- | usr/src/lib/libdscfg/common/cfg_lockdmsg.c | 324 |
1 files changed, 0 insertions, 324 deletions
diff --git a/usr/src/lib/libdscfg/common/cfg_lockdmsg.c b/usr/src/lib/libdscfg/common/cfg_lockdmsg.c deleted file mode 100644 index 238c75967e..0000000000 --- a/usr/src/lib/libdscfg/common/cfg_lockdmsg.c +++ /dev/null @@ -1,324 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#include <signal.h> -#include <sys/types.h> -#include <sys/time.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <netinet/tcp.h> -#include <netdb.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <stdlib.h> -#include <errno.h> - -#include "cfg_lockd.h" - -static daemonaddr_t clientaddr; -static daemonaddr_t server; - -static unsigned short server_port = CFG_SERVER_PORT; -static int lock_soc = 0; -static int pf_inet = AF_INET; -static int locked; -static int initdone; -static int initresult; -static pid_t socket_pid; - -static void cfg_lockd_reinit(); - -static int last_cmd = -1; -static uint8_t seq = 0; - -static void -send_cmd(int cmd) -{ - struct lock_msg message_buf; - int rc; - - if (last_cmd == cmd) { - message_buf.seq = seq; - } else { - message_buf.seq = ++seq; - last_cmd = cmd; - } - message_buf.message = cmd; - if ((message_buf.pid = getpid()) != socket_pid) - cfg_lockd_reinit(); - - do { - rc = sendto(lock_soc, &message_buf, sizeof (message_buf), 0, - (struct sockaddr *)&server, sizeof (server)); - } while (rc == -1 && errno == EINTR); -#ifdef CFG_LOCKD_DEBUG - if (rc < 0) { - perror("send"); - } -#endif -} - -static void -read_msg(struct lock_msg *mp) -{ - struct sockaddr from; - int rc, len; - - /* wait for response */ - do { - struct pollfd fds; - - fds.fd = lock_soc; - fds.events = POLLIN; - fds.revents = 0; - - rc = poll(&fds, 1, 500); - if (!rc) { -#ifdef CFG_LOCKD_DEBUG - fprintf(stderr, "LOCKD: resending last command (%d)\n", - last_cmd); -#endif - send_cmd(last_cmd); - } - } while (rc == 0 || - (rc == -1 && errno == EINTR)); - - do { - len = sizeof (from); - rc = recvfrom(lock_soc, mp, sizeof (*mp), 0, - &from, &len); - } while (rc == -1 && errno == EINTR); -#ifdef CFG_LOCKD_DEBUG - if (rc < 0) { - perror("revcfrom"); - } -#endif -} - -static void -read_reply() -{ - struct lock_msg message_buf; - - do { - read_msg(&message_buf); - } while (message_buf.seq != seq || message_buf.message != LOCK_LOCKED); -} - -static void -read_ack() -{ - struct lock_msg message_buf; - - do { - read_msg(&message_buf); - } while (message_buf.seq != seq || message_buf.message != LOCK_ACK); -} - -void -cfg_lockd_rdlock() -{ -#ifdef CFG_LOCKD_DEBUG - FILE *fp; -#endif - - send_cmd(LOCK_READ); - locked = 1; - read_reply(); - -#ifdef CFG_LOCKD_DEBUG - fp = fopen("/tmp/locktag", "a"); - if (fp) { - time_t t = time(0); - fprintf(fp, "%19.19s read lock acquired\n", ctime(&t)); - fclose(fp); - } - sleep(3); -#endif -} - -void -cfg_lockd_wrlock() -{ -#ifdef CFG_LOCKD_DEBUG - FILE *fp; -#endif - - send_cmd(LOCK_WRITE); - locked = 1; - read_reply(); - -#ifdef CFG_LOCKD_DEBUG - fp = fopen("/tmp/locktag", "a"); - if (fp) { - time_t t = time(0); - fprintf(fp, "%19.19s write lock acquired\n", ctime(&t)); - fclose(fp); - } - sleep(3); -#endif -} - -void -cfg_lockd_unlock() -{ -#ifdef CFG_LOCKD_DEBUG - FILE *fp; -#endif - - send_cmd(LOCK_NOTLOCKED); - read_ack(); - locked = 0; - -#ifdef CFG_LOCKD_DEBUG - fp = fopen("/tmp/locktag", "a"); - if (fp) { - time_t t = time(0); - fprintf(fp, "%19.19s ----- lock released\n", ctime(&t)); - fclose(fp); - } - sleep(3); -#endif -} - -void -cfg_lockd_stat() -{ - send_cmd(LOCK_STAT); -} - -cfglockd_t -cfg_lockedby(pid_t *pidp) -{ - struct lock_msg message_buf; - send_cmd(LOCK_LOCKEDBY); - read_msg(&message_buf); - *pidp = message_buf.pid; - return ((cfglockd_t)message_buf.message); -} - -static void -cfg_atexit() -{ - if (locked) - cfg_lockd_unlock(); -} - -static int -cfg_lockd_socket() -{ - if ((lock_soc = socket(pf_inet, SOCK_DGRAM, 0)) < 0) { -#ifdef CFG_LOCKD_DEBUG - fprintf(stderr, "libcfg: failed to create socket\n"); - perror("socket"); -#endif - return (-1); - } - clientaddr.sin_family = AF_INET; - clientaddr.sin_addr.s_addr = INADDR_ANY; - clientaddr.sin_port = htons(0); - if (bind(lock_soc, (struct sockaddr *)&clientaddr, - sizeof (clientaddr)) < 0) { -#ifdef CFG_LOCKD_DEBUG - perror("bind"); -#endif - return (-1); - } - socket_pid = getpid(); - return (0); -} - -/* - * Re-initialise after a fork has been detected. - * - * Needs to create a new socket for new process to receive messages - * from the lock daemon and enter pid into lock file so that the daemon - * can detect new processes exit if it doesn't call unlock first. - */ - -static void -cfg_lockd_reinit() -{ - if (lock_soc) - close(lock_soc); - lock_soc = 0; - if (cfg_lockd_socket()) { - initresult = 0; - return; - } - cfg_enterpid(); - initresult = 1; -} - -int -cfg_lockd_init() -{ - struct hostent *hp; - FILE *fp; - int pid = 0x12345678; - - if (initdone) { - /* only perform reinit if init worked first time */ - if (getpid() != socket_pid && initresult != 0) - cfg_lockd_reinit(); - return (initresult); - } - - initdone = 1; - initresult = 0; - - /* check if there's a lock daemon out there */ - if ((fp = fopen(CFG_PIDFILE, "r")) == NULL) - return (0); - if (fscanf(fp, "%d\n", &pid) != 1) { - fclose(fp); - return (0); - } - fclose(fp); - if (kill((pid_t)pid, 0) != 0) - return (0); - - /* there is a lock daemon */ - cfg_lfinit(); - cfg_enterpid(); - if (cfg_lockd_socket()) - return (0); - - if ((hp = gethostbyname("localhost")) == NULL) { -#ifdef CFG_LOCKD_DEBUG - fprintf(stderr, "Can't find hostent for %s\n", "localhost"); -#endif - return (0); - } - (void) memcpy(&(server.sin_addr.s_addr), *(hp->h_addr_list), - sizeof (server.sin_addr)); - server.sin_port = htons(server_port); - server.sin_family = hp->h_addrtype; - endhostent(); - atexit(cfg_atexit); - initresult = 1; - return (1); -} |