a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen/*
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * CDDL HEADER START
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen *
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 *
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * or http://www.opensolaris.org/os/licensing.
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * See the License for the specific language governing permissions
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * and limitations under the License.
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen *
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 *
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * CDDL HEADER END
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen/*
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Use is subject to license terms.
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#pragma ident "%Z%%M% %I% %E% SMI"
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#include <sys/param.h>
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#include <sys/stat.h>
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#include <sys/types.h>
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#include <sys/sysevent/eventdefs.h>
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#include <sys/sysevent/dr.h>
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#include <stdio.h>
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#include <stdlib.h>
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#include <unistd.h>
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#include <signal.h>
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#include <syslog.h>
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#include <string.h>
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#include <fcntl.h>
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#include <errno.h>
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#include <time.h>
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#include <config_admin.h>
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#include <libsysevent.h>
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen/* Signal handler type */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsentypedef void (SigHandler)(int);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen/* oplhpd process id file descriptor */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenstatic int pid_fd;
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen/* Program Name */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenchar *oplhpd_prog_name = "";
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen/* Macros */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#define OPLHPD_DEV_DIR "/devices" /* device base dir */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#define OPLHPD_PID_FILE "/var/run/oplhpd.pid" /* lock file path */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen#define OPLHPD_PROG_NAME oplhpd_prog_name
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen/* Event handler to get information */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenstatic sysevent_handle_t *oplhpd_hdl;
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen/*
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Function Prototypes
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenvoid quit_daemon(int signo);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenSigHandler *set_sig_handler(int sig, SigHandler *handler);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenvoid init_daemon(void);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenvoid oplhpd_init(void);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenvoid oplhpd_fini(void);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenstatic void oplhpd_event(sysevent_t *ev);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenextern void notify_scf_of_hotplug(sysevent_t *ev);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen/*
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Terminate and Quit Daemon Process.
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * signo = 0 ... normal quit
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * > 0 ... signaled quit
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * < 0 ... failure quit
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenvoid
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenquit_daemon(int signo)
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen{
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen int status = 0;
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen id_t pgid;
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen syslog(LOG_DEBUG, "*** quit daemon [pid:%d, signal#:%d].\n",
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen getpid(), signo);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) set_sig_handler(SIGTERM, SIG_IGN);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen pgid = getpgrp();
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) kill(-pgid, SIGTERM);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) close(pid_fd);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) unlink(OPLHPD_PID_FILE); /* clean up lock file */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen if (signo < 0) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen status = signo;
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen }
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen _exit(status);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen}
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen/*
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Setting the signal handler utility
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenSigHandler *
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenset_sig_handler(int sig, SigHandler *handler)
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen{
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen struct sigaction act, oact;
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen act.sa_handler = handler;
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen act.sa_flags = 0;
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen if (sig == SIGCHLD && handler == SIG_IGN) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen act.sa_flags |= SA_NOCLDWAIT;
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen }
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) sigemptyset(&act.sa_mask);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) sigemptyset(&oact.sa_mask);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen if (sigaction(sig, &act, &oact) < 0) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen return (SIG_ERR);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen }
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen return (oact.sa_handler);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen}
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen/*
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Setup oplhpd daemon
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenvoid
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielseninit_daemon()
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen{
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen int i;
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen int ret;
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen int fd;
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen pid_t pid;
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen char pid_str[32];
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen if (geteuid() != 0) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen syslog(LOG_ERR, "must be root to execute %s\n",
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen OPLHPD_PROG_NAME);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen exit(1);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen }
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen /*
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Daemonize
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen if ((pid = fork()) < 0) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen perror("fork failed");
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen exit(1);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen }
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen if (pid > 0) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen /* Parent, exit. */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen exit(0);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen }
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) setsid();
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) chdir("/");
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) umask(0);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) closefrom(0);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) open("/dev/null", O_RDONLY);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) open("/dev/null", O_WRONLY);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) dup(1);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) openlog(OPLHPD_PROG_NAME, LOG_PID, LOG_DAEMON);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen /*
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Create the lock file for singletonize
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen if ((pid_fd = open(OPLHPD_PID_FILE, O_RDWR | O_CREAT, 0644)) < 0) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen syslog(LOG_ERR, "could not create pid file: %s",
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen strerror(errno));
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen exit(1);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen }
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen if (lockf(pid_fd, F_TLOCK, 0L) < 0) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen if (errno == EACCES || errno == EAGAIN) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen syslog(LOG_ERR, "another oplhpd is already running");
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen } else {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen syslog(LOG_ERR, "could not lock pid file");
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen }
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen exit(1);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen }
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) ftruncate(pid_fd, 0);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen i = sprintf(pid_str, "%d\n", getpid());
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen while ((ret = write(pid_fd, pid_str, i)) != i) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen if (errno == EINTR) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen continue;
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen }
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen if (ret < 0) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen syslog(LOG_ERR, "pid file write fail: %s",
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen strerror(errno));
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen exit(1);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen }
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen }
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen /*
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Set signal handlers
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen */
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 (void) set_sig_handler(SIGCHLD, SIG_IGN);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen}
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenstatic void
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenoplhpd_event(sysevent_t *ev)
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen{
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen /*
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Inform the SCF of the change in the state of the pci hot plug
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * cassette.
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen notify_scf_of_hotplug(ev);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen}
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen/*
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * Initialization for hotplug event.
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * - Bind event handler.
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen * - Subscribe the handler to the hotplug event.
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenvoid
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenoplhpd_init()
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen{
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen const char *subclass = ESC_DR_AP_STATE_CHANGE;
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen syslog(LOG_DEBUG, "oplhpd_init");
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen oplhpd_hdl = sysevent_bind_handle(oplhpd_event);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen if (oplhpd_hdl == NULL) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen syslog(LOG_ERR, "event handler bind fail");
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen quit_daemon(-1);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen }
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen if (sysevent_subscribe_event(oplhpd_hdl, EC_DR, &subclass, 1) != 0) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen syslog(LOG_ERR, "event handler subscribe fail");
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen sysevent_unbind_handle(oplhpd_hdl);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen quit_daemon(-1);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen }
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen for (;;) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen (void) pause();
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen }
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen}
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenvoid
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenoplhpd_fini()
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen{
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen if (oplhpd_hdl != NULL) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen sysevent_unsubscribe_event(oplhpd_hdl, EC_DR);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen sysevent_unbind_handle(oplhpd_hdl);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen }
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen}
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenint
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsenmain(int argc, char *argv[])
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen{
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen int opt;
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen /* Get Program Name */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen if ((oplhpd_prog_name = strrchr(argv[0], '/')) == NULL) {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen oplhpd_prog_name = argv[0];
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen } else {
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen oplhpd_prog_name++;
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen }
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen /* Check the daemon running lock and Initialize the signal */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen init_daemon();
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen /* Subscribe to the hotplug event */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen oplhpd_init();
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen /* Unsubscribe the hotplug event */
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen oplhpd_fini();
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen return (0);
a4ac8bb3f5b2fff60581bee101792ac7a34bad8cdnielsen}