a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * CDDL HEADER START
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * The contents of this file are subject to the terms of the
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Common Development and Distribution License (the "License").
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * You may not use this file except in compliance with the License.
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * See the License for the specific language governing permissions
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * and limitations under the License.
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * When distributing Covered Code, include this CDDL HEADER in each
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * If applicable, add the following below this CDDL HEADER, with the
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * fields enclosed by brackets "[]" replaced with your own identifying
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * information: Portions Copyright [yyyy] [name of copyright owner]
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * CDDL HEADER END
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Use is subject to license terms.
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#pragma ident "%Z%%M% %I% %E% SMI"
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen/* Signal handler type */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen/* oplhpd process id file descriptor */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen/* Program Name */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen/* Macros */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#define OPLHPD_DEV_DIR "/devices" /* device base dir */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#define OPLHPD_PID_FILE "/var/run/oplhpd.pid" /* lock file path */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen/* Event handler to get information */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Function Prototypes
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenSigHandler *set_sig_handler(int sig, SigHandler *handler);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Terminate and Quit Daemon Process.
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * signo = 0 ... normal quit
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * > 0 ... signaled quit
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * < 0 ... failure quit
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen syslog(LOG_DEBUG, "*** quit daemon [pid:%d, signal#:%d].\n",
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) unlink(OPLHPD_PID_FILE); /* clean up lock file */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Setting the signal handler utility
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Setup oplhpd daemon
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen if (geteuid() != 0) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Daemonize
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen /* Parent, exit. */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) openlog(OPLHPD_PROG_NAME, LOG_PID, LOG_DAEMON);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Create the lock file for singletonize
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen if ((pid_fd = open(OPLHPD_PID_FILE, O_RDWR | O_CREAT, 0644)) < 0) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen syslog(LOG_ERR, "another oplhpd is already running");
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Set signal handlers
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) set_sig_handler(SIGTERM, (SigHandler *)quit_daemon);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) set_sig_handler(SIGQUIT, (SigHandler *)quit_daemon);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) set_sig_handler(SIGINT, (SigHandler *)quit_daemon);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Inform the SCF of the change in the state of the pci hot plug
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * cassette.
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Initialization for hotplug event.
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * - Bind event handler.
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * - Subscribe the handler to the hotplug event.
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen if (sysevent_subscribe_event(oplhpd_hdl, EC_DR, &subclass, 1) != 0) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen /* Get Program Name */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen if ((oplhpd_prog_name = strrchr(argv[0], '/')) == NULL) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen /* Check the daemon running lock and Initialize the signal */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen /* Subscribe to the hotplug event */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen /* Unsubscribe the hotplug event */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen return (0);