diff options
Diffstat (limited to 'plugins/imdoor/sun_cddl.c')
-rw-r--r-- | plugins/imdoor/sun_cddl.c | 592 |
1 files changed, 0 insertions, 592 deletions
diff --git a/plugins/imdoor/sun_cddl.c b/plugins/imdoor/sun_cddl.c deleted file mode 100644 index 8e9714d9..00000000 --- a/plugins/imdoor/sun_cddl.c +++ /dev/null @@ -1,592 +0,0 @@ -#define MAXLINE 4096 -/* - * 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 - */ -/* Portions Copyright 2010 by Rainer Gerhards and Adiscon - */ -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -/* - * Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T - * All Rights Reserved - */ - -/* - * University Copyright- Copyright (c) 1982, 1986, 1988 - * The Regents of the University of California - * All Rights Reserved - * - * University Acknowledgment- Portions of this document are derived from - * software developed by the University of California, Berkeley, and its - * contributors. - */ -#include <unistd.h> -#include <note.h> -#include <errno.h> -#include <sys/types.h> -#include <stdio.h> -#include <stdio_ext.h> -#include <stdlib.h> -#include <ctype.h> -#include <signal.h> -#include <string.h> -#include <strings.h> -#include <libscf.h> -#include <netconfig.h> -#include <netdir.h> -#include <pwd.h> -#include <sys/socket.h> -#include <tiuser.h> -#include <utmpx.h> -#include <limits.h> -#include <pthread.h> -#include <fcntl.h> -#include <stropts.h> -#include <assert.h> -#include <sys/statvfs.h> - -#include <sys/param.h> -#include <sys/sysmacros.h> -#include <sys/syslog.h> -#include <sys/strlog.h> -#include <sys/stat.h> -#include <sys/time.h> -#include <sys/utsname.h> -#include <sys/poll.h> -#include <sys/wait.h> -#include <sys/resource.h> -#include <sys/mman.h> -#include <sys/note.h> -#include <door.h> -#include <sys/door.h> - -#include "rsyslog.h" -#include "debug.h" - -#define DOORFILE "/var/run/syslog_door" -#define RELATIVE_DOORFILE "../var/run/syslog_door" -#define OLD_DOORFILE "/etc/.syslog_door" - -static int DoorFd = -1; -static int DoorCreated = 0; -static char *DoorFileName = DOORFILE; - -/* for managing door server threads */ -static pthread_mutex_t door_server_cnt_lock = PTHREAD_MUTEX_INITIALIZER; -static uint_t door_server_cnt = 0; -static pthread_attr_t door_thr_attr; - -/* - * the 'server' function that we export via the door. It does - * nothing but return. - */ -/*ARGSUSED*/ -static void -server(void *cookie, char *argp, size_t arg_size, - door_desc_t *dp, uint_t n) -{ - (void) door_return(NULL, 0, NULL, 0); - /* NOTREACHED */ -} - -/*ARGSUSED*/ -static void * -create_door_thr(void *arg) -{ - (void) pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); - (void) door_return(NULL, 0, NULL, 0); - - /* - * If there is an error in door_return(), it will return here and - * the thread will exit. Hence we need to decrement door_server_cnt. - */ - (void) pthread_mutex_lock(&door_server_cnt_lock); - door_server_cnt--; - (void) pthread_mutex_unlock(&door_server_cnt_lock); - return (NULL); -} - -/* - * Max number of door server threads for syslogd. Since door is used - * to check the health of syslogd, we don't need large number of - * server threads. - */ -#define MAX_DOOR_SERVER_THR 3 - -/* - * Manage door server thread pool. - */ -/*ARGSUSED*/ -static void -door_server_pool(door_info_t *dip) -{ - (void) pthread_mutex_lock(&door_server_cnt_lock); - if (door_server_cnt <= MAX_DOOR_SERVER_THR && - pthread_create(NULL, &door_thr_attr, create_door_thr, NULL) == 0) { - door_server_cnt++; - (void) pthread_mutex_unlock(&door_server_cnt_lock); - return; - } - - (void) pthread_mutex_unlock(&door_server_cnt_lock); -} - -static void -delete_doorfiles(void) -{ - pthread_t mythreadno; - struct stat sb; - int err; - char line[MAXLINE+1]; - - if (Debug) { - mythreadno = pthread_self(); - } - - - if (lstat(DoorFileName, &sb) == 0 && !S_ISDIR(sb.st_mode)) { - if (unlink(DoorFileName) < 0) { - err = errno; - (void) snprintf(line, sizeof (line), - "unlink() of %s failed - fatal", DoorFileName); - errno = err; - DBGPRINTF("%s", line);//logerror(line); - DBGPRINTF("delete_doorfiles(%u): error: %s, " - "errno=%d\n", mythreadno, line, err); - exit(1); - } - - DBGPRINTF("delete_doorfiles(%u): deleted %s\n", - mythreadno, DoorFileName); - } - - if (strcmp(DoorFileName, DOORFILE) == 0) { - if (lstat(OLD_DOORFILE, &sb) == 0 && !S_ISDIR(sb.st_mode)) { - if (unlink(OLD_DOORFILE) < 0) { - err = errno; - (void) snprintf(line, sizeof (line), - "unlink() of %s failed", OLD_DOORFILE); - DBGPRINTF("delete_doorfiles(%u): %s\n", - mythreadno, line); - - if (err != EROFS) { - errno = err; - (void) strlcat(line, " - fatal", - sizeof (line)); - logerror(line); - DBGPRINTF("delete_doorfiles(%u): " - "error: %s, errno=%d\n", - mythreadno, line, err); - exit(1); - } - - DBGPRINTF("delete_doorfiles(%u): unlink() " - "failure OK on RO file system\n", - mythreadno); - } - - DBGPRINTF("delete_doorfiles(%u): deleted %s\n", - mythreadno, OLD_DOORFILE); - } - } - -#if 0 - if (lstat(PidFileName, &sb) == 0 && !S_ISDIR(sb.st_mode)) { - if (unlink(PidFileName) < 0) { - err = errno; - (void) snprintf(line, sizeof (line), - "unlink() of %s failed - fatal", PidFileName); - errno = err; - logerror(line); - DBGPRINTF("delete_doorfiles(%u): error: %s, " - "errno=%d\n", mythreadno, line, err); - exit(1); - } - - DBGPRINTF("delete_doorfiles(%u): deleted %s\n", mythreadno, - PidFileName); - } - - if (strcmp(PidFileName, PIDFILE) == 0) { - if (lstat(OLD_PIDFILE, &sb) == 0 && !S_ISDIR(sb.st_mode)) { - if (unlink(OLD_PIDFILE) < 0) { - err = errno; - (void) snprintf(line, sizeof (line), - "unlink() of %s failed", OLD_PIDFILE); - DBGPRINTF(5, "delete_doorfiles(%u): %s, \n", - mythreadno, line); - - if (err != EROFS) { - errno = err; - (void) strlcat(line, " - fatal", - sizeof (line)); - logerror(line); - DBGPRINTF(1, "delete_doorfiles(%u): " - "error: %s, errno=%d\n", - mythreadno, line, err); - exit(1); - } - - DBGPRINTF(5, "delete_doorfiles(%u): unlink " - "failure OK on RO file system\n", - mythreadno); - } - - DBGPRINTF(5, "delete_doorfiles(%u): deleted %s\n", - mythreadno, OLD_PIDFILE); - } - } -#endif - - if (DoorFd != -1) { - (void) door_revoke(DoorFd); - } - - DBGPRINTF("delete_doorfiles(%u): revoked door: DoorFd=%d\n", - mythreadno, DoorFd); -} - - -/* - * Create the door file and the pid file in /var/run. If the filesystem - * containing /etc is writable, create symlinks /etc/.syslog_door and - * /etc/syslog.pid to them. On systems that do not support /var/run, create - * /etc/.syslog_door and /etc/syslog.pid directly. - * - * Note: it is not considered fatal to fail to create the pid file or its - * symlink. Attempts to use them in the usual way will fail, of course, but - * syslogd will function nicely without it (not so for the door file). - */ - -static void -sun_open_door(void) -{ - struct stat buf; - door_info_t info; - char line[MAXLINE+1]; - pthread_t mythreadno; - int err; - - if (Debug) { - mythreadno = pthread_self(); - } - - /* - * first see if another syslogd is running by trying - * a door call - if it succeeds, there is already - * a syslogd process active - */ - - if (!DoorCreated) { - int door; - - if ((door = open(DoorFileName, O_RDONLY)) >= 0) { - DBGPRINTF("open_door(%u): %s opened " - "successfully\n", mythreadno, DoorFileName); - - if (door_info(door, &info) >= 0) { - DBGPRINTF("open_door(%u): " - "door_info:info.di_target = %ld\n", - mythreadno, info.di_target); - - if (info.di_target > 0) { - (void) sprintf(line, "syslogd pid %ld" - " already running. Cannot " - "start another syslogd pid %ld", - info.di_target, getpid()); - DBGPRINTF("open_door(%u): error: " - "%s\n", mythreadno, line); - errno = 0; - //logerror(line); - exit(1); - } - } - - (void) close(door); - } else { - if (lstat(DoorFileName, &buf) < 0) { - err = errno; - - DBGPRINTF("open_door(%u): lstat() of %s " - "failed, errno=%d\n", - mythreadno, DoorFileName, err); - - if ((door = creat(DoorFileName, 0644)) < 0) { - err = errno; - (void) snprintf(line, sizeof (line), - "creat() of %s failed - fatal", - DoorFileName); - DBGPRINTF("open_door(%u): error: %s, " - "errno=%d\n", mythreadno, line, - err); - errno = err; - //logerror(line); - delete_doorfiles(); - exit(1); - } - - (void) fchmod(door, - S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); - - DBGPRINTF("open_door(%u): creat() of %s " - "succeeded\n", mythreadno, - DoorFileName); - - (void) close(door); - } - } - - if (strcmp(DoorFileName, DOORFILE) == 0) { - if (lstat(OLD_DOORFILE, &buf) == 0) { - DBGPRINTF("open_door(%u): lstat() of %s " - "succeeded\n", mythreadno, - OLD_DOORFILE); - - if (S_ISDIR(buf.st_mode)) { - (void) snprintf(line, sizeof (line), - "%s is a directory - fatal", - OLD_DOORFILE); - DBGPRINTF("open_door(%u): error: " - "%s\n", mythreadno, line); - errno = 0; - //logerror(line); - delete_doorfiles(); - exit(1); - } - - DBGPRINTF("open_door(%u): %s is not a " - "directory\n", - mythreadno, OLD_DOORFILE); - - if (unlink(OLD_DOORFILE) < 0) { - err = errno; - (void) snprintf(line, sizeof (line), - "unlink() of %s failed", - OLD_DOORFILE); - DBGPRINTF("open_door(%u): %s\n", - mythreadno, line); - - if (err != EROFS) { - DBGPRINTF("open_door(%u): " - "error: %s, " - "errno=%d\n", - mythreadno, line, err); - (void) strcat(line, " - fatal"); - errno = err; - //logerror(line); - delete_doorfiles(); - exit(1); - } - - DBGPRINTF("open_door(%u): unlink " - "failure OK on RO file " - "system\n", mythreadno); - } - } else { - DBGPRINTF("open_door(%u): file %s doesn't " - "exist\n", mythreadno, OLD_DOORFILE); - } - - if (symlink(RELATIVE_DOORFILE, OLD_DOORFILE) < 0) { - err = errno; - (void) snprintf(line, sizeof (line), - "symlink %s -> %s failed", OLD_DOORFILE, - RELATIVE_DOORFILE); - DBGPRINTF("open_door(%u): %s\n", mythreadno, - line); - - if (err != EROFS) { - DBGPRINTF("open_door(%u): error: %s, " - "errno=%d\n", mythreadno, line, - err); - errno = err; - (void) strcat(line, " - fatal"); - //logerror(line); - delete_doorfiles(); - exit(1); - } - - DBGPRINTF("open_door(%u): symlink failure OK " - "on RO file system\n", mythreadno); - } else { - DBGPRINTF("open_door(%u): symlink %s -> %s " - "succeeded\n", mythreadno, - OLD_DOORFILE, RELATIVE_DOORFILE); - } - } - - if ((DoorFd = door_create(server, 0, - DOOR_REFUSE_DESC)) < 0) { - //???? DOOR_NO_CANEL requires newer libs??? DOOR_REFUSE_DESC | DOOR_NO_CANCEL)) < 0) { - err = errno; - (void) sprintf(line, "door_create() failed - fatal"); - DBGPRINTF("open_door(%u): error: %s, errno=%d\n", - mythreadno, line, err); - errno = err; - //logerror(line); - delete_doorfiles(); - exit(1); - } - //???? (void) door_setparam(DoorFd, DOOR_PARAM_DATA_MAX, 0); - DBGPRINTF("open_door(%u): door_create() succeeded, " - "DoorFd=%d\n", mythreadno, DoorFd); - - DoorCreated = 1; - } - - (void) fdetach(DoorFileName); /* just in case... */ - - (void) door_server_create(door_server_pool); - - if (fattach(DoorFd, DoorFileName) < 0) { - err = errno; - (void) snprintf(line, sizeof (line), "fattach() of fd" - " %d to %s failed - fatal", DoorFd, DoorFileName); - DBGPRINTF("open_door(%u): error: %s, errno=%d\n", mythreadno, - line, err); - errno = err; - //logerror(line); - delete_doorfiles(); - exit(1); - } - - DBGPRINTF("open_door(%u): attached server() to %s\n", mythreadno, - DoorFileName); - -#if 0 - /* - * create pidfile anyway, so those using it to control - * syslogd (with kill `cat /etc/syslog.pid` perhaps) - * don't get broken. - */ - - if (!PidfileCreated) { - int pidfd; - - PidfileCreated = 1; - - if ((pidfd = open(PidFileName, O_RDWR|O_CREAT|O_TRUNC, 0644)) - < 0) { - err = errno; - (void) snprintf(line, sizeof (line), - "open() of %s failed", PidFileName); - DBGPRINTF(1, "open_door(%u): warning: %s, errno=%d\n", - mythreadno, line, err); - errno = err; - //logerror(line); - return; - } - - (void) fchmod(pidfd, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); - (void) sprintf(line, "%ld\n", getpid()); - - if (write(pidfd, line, strlen(line)) < 0) { - err = errno; - (void) snprintf(line, sizeof (line), - "write to %s on fd %d failed", PidFileName, pidfd); - DBGPRINTF(1, "open_door(%u): warning: %s, errno=%d\n", - mythreadno, line, err); - errno = err; - //logerror(line); - return; - } - - (void) close(pidfd); - - DBGPRINTF("open_door(%u): %s created\n", - mythreadno, PidFileName); - - if (strcmp(PidFileName, PIDFILE) == 0) { - if (lstat(OLD_PIDFILE, &buf) == 0) { - DBGPRINTF("open_door(%u): lstat() of %s " - "succeded\n", mythreadno, OLD_PIDFILE); - - if (S_ISDIR(buf.st_mode)) { - (void) snprintf(line, sizeof (line), - "file %s is a directory", - OLD_PIDFILE); - DBGPRINTF("open_door(%u): warning: " - "%s\n", mythreadno, line); - errno = 0; - //logerror(line); - return; - } - - if (unlink(OLD_PIDFILE) < 0) { - err = errno; - (void) snprintf(line, sizeof (line), - "unlink() of %s failed", - OLD_PIDFILE); - DBGPRINTF("open_door(%u): %s\n", - mythreadno, line); - - if (err != EROFS) { - DBGPRINTF(1, "open_door (%u): " - "warning: %s, " - "errno=%d\n", - mythreadno, line, err); - errno = err; - //logerror(line); - return; - } - - DBGPRINTF(5, "open_door(%u): unlink " - "failure OK on RO file " - "system\n", mythreadno); - } - } else { - DBGPRINTF("open_door(%u): file %s doesn't " - "exist\n", mythreadno, OLD_PIDFILE); - } - - if (symlink(RELATIVE_PIDFILE, OLD_PIDFILE) < 0) { - err = errno; - (void) snprintf(line, sizeof (line), - "symlink %s -> %s failed", OLD_PIDFILE, - RELATIVE_PIDFILE); - DBGPRINTF("open_door(%u): %s\n", mythreadno, - line); - - if (err != EROFS) { - DBGPRINTF(1, "open_door(%u): warning: " - "%s, errno=%d\n", mythreadno, - line, err); - errno = err; - //logerror(line); - return; - } - - DBGPRINTF(5, "open_door(%u): symlink failure OK " - "on RO file system\n", mythreadno); - return; - } - - DBGPRINTF(5, "open_door(%u): symlink %s -> %s " - "succeeded\n", mythreadno, OLD_PIDFILE, - RELATIVE_PIDFILE); - } - } -#endif -} - - |