usr/src/cmd/lp/cmd/lpsched/lpsched.c
author esaxe
Fri, 11 Aug 2006 18:11:49 -0700
changeset 2538 b5894d78c55a
parent 1914 8a8c5f225b1b
child 3125 084bca4d4623
permissions -rw-r--r--
5016095 nightly should help determine what really changes from build to build 6404876 uses of __DATE__ / __TIME__ should be purged from ON 6404908 ON builds should employ a static globalization prefix
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 831
diff changeset
     5
 * Common Development and Distribution License (the "License").
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 831
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
320
7e1ecf3ab9be 6264775 lpadmin expects to write into string constants
ceastha
parents: 0
diff changeset
    21
/*
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 831
diff changeset
    22
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
320
7e1ecf3ab9be 6264775 lpadmin expects to write into string constants
ceastha
parents: 0
diff changeset
    23
 * Use is subject to license terms.
7e1ecf3ab9be 6264775 lpadmin expects to write into string constants
ceastha
parents: 0
diff changeset
    24
 */
7e1ecf3ab9be 6264775 lpadmin expects to write into string constants
ceastha
parents: 0
diff changeset
    25
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
/*	  All Rights Reserved  	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#pragma ident	"%Z%%M%	%I%	%E% SMI" 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include "limits.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include "ulimit.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include "sys/utsname.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include "lpsched.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/time.h>		/* to up the max # of fds */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <sys/resource.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <syslog.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <locale.h>
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 831
diff changeset
    42
#include <stdio_ext.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
int			lock_fd		= -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
int			isStartingForms = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
int			Starting	= 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
int			Shutdown	= 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
int			DoneChildren	= 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
int			Sig_Alrm	= 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
int			OpenMax		= OPEN_MAX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
int			Reserve_Fds	= 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
char			*Local_System	= 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
char			*SHELL		= 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
char *LP_TRAY_UNMOUNT = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
char *LP_KILL_NO_PAPER = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
char *LP_ALL_NEW = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
gid_t			Lp_Gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
uid_t			Lp_Uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
#if	defined(DEBUG)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
unsigned long		debug = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
static int		signals = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
extern int		errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
extern void		shutdown_messages();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
int			am_in_background	= 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
static void		disable_signals();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
static void		startup();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
static void		process();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
static void		ticktock(int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
static void		background();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
static void		usage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
static void		Exit();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
static void		disable_signals();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
/**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
 ** main()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
 **/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
320
7e1ecf3ab9be 6264775 lpadmin expects to write into string constants
ceastha
parents: 0
diff changeset
    87
int
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
main(int argc, char *argv[])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
    int		c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
    extern char	*optarg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
    extern int	optopt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
    extern int	opterr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
    char *	cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
    struct rlimit rlim;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
    int fd_limit = 4096;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	(void) setlocale(LC_ALL, "");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
    if ((cp = strrchr(argv[0], '/')) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	    cp = argv[0];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
    else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	    cp++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
    /* open the syslog() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
    openlog(cp, LOG_PID|LOG_NDELAY|LOG_NOWAIT, LOG_LPR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	SHELL = DEFAULT_SHELL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	LP_TRAY_UNMOUNT = getenv("LP_TRAY_UNMOUNT");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	LP_KILL_NO_PAPER = getenv("LP_KILL_NO_PAPER");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	LP_ALL_NEW = getenv("LP_ALL_NEW");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
    opterr = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
    while((c = getopt(argc, (char * const *)argv, "D:dsf:n:r:M:p:")) != EOF)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
        switch(c)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
        {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
# if defined (DEBUG)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	    case 'd':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
		debug = DB_ALL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
		syslog(LOG_DEBUG, "debug = DB_ALL\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
		goto SkipD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	    case 'D':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
		if (*optarg == '?') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
			note (
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
"-D flag[,flag...]    (all logs \"foo\" are in /var/lp/logs,\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
"                      although \"lpsched\" goes to stdout if SDB)\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
"\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
"  EXEC               (log all exec's in \"exec\")\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
"  DONE               (log just exec finishes in \"exec\")\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
"  INIT               (log initialization info in \"lpsched\" or stdout)\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
"  ABORT              (issue abort(2) on fatal error)\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
"  SCHEDLOG           (log additional debugging info in \"lpsched\")\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
"  SDB                (don't start lpsched as background process)\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
"  MESSAGES           (log all message traffic in \"messages\")\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
			);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
			note ("\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
  ALL                (all of the above; equivalent to -d)\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
			);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
			exit (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
		while ((cp = strtok(optarg, ", "))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
#define IFSETDB(P,S,F)	if (STREQU(P, S)) debug |= F
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
			IFSETDB (cp, "EXEC", DB_EXEC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
			else IFSETDB (cp, "DONE", DB_DONE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
			else IFSETDB (cp, "INIT", DB_INIT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
			else IFSETDB (cp, "ABORT", DB_ABORT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
			else IFSETDB (cp, "SCHEDLOG", DB_SCHEDLOG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
			else IFSETDB (cp, "SDB", DB_SDB);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
			else IFSETDB (cp, "MESSAGES", DB_MESSAGES);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
			else IFSETDB (cp, "ALL", DB_ALL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
			else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
				note ("-D flag not recognized; try -D?\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
				exit (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
			optarg = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
		syslog(LOG_DEBUG, "-D set\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
SkipD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	    case 's':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
		signals++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
# endif /* DEBUG */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	    case 'f':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
		if ((ET_SlowSize = atoi(optarg)) < 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
		    ET_SlowSize = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
		syslog(LOG_DEBUG, "-f option is %d\n", ET_SlowSize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	    case 'n':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
		if ((ET_NotifySize = atoi(optarg)) < 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
		    ET_NotifySize = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
		syslog(LOG_DEBUG, "-n option is %d\n", ET_NotifySize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	    case 'r':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
		if ((Reserve_Fds = atoi(optarg)) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
			Reserve_Fds = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
		syslog(LOG_DEBUG, "-r option is %d\n", Reserve_Fds);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	    case 'p':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
		if ((fd_limit = atoi(optarg)) < 16)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
			fd_limit = 4096;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
		syslog(LOG_DEBUG, "-p option is %d\n", fd_limit);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	    case '?':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
		if (optopt == '?') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
		    usage ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
		    exit (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
		} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
		    fail ("%s: illegal option -- %c\n", argv[0], optopt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	/* reset the fd resource limit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	rlim.rlim_max = rlim.rlim_cur = fd_limit;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	setrlimit(RLIMIT_NOFILE, &rlim);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	getrlimit(RLIMIT_NOFILE, &rlim);
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 831
diff changeset
   201
	(void) enable_extended_FILE_stdio(-1, -1);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	syslog(LOG_DEBUG, "file descriptor resource limit is %d (~%d printers)",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
		rlim.rlim_cur, (rlim.rlim_cur - 12)/ 2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
    
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
    lp_alloc_fail_handler = mallocfail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
    startup();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
    process();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
    lpshut(1);	/* one last time to clean up */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
    /*NOTREACHED*/
320
7e1ecf3ab9be 6264775 lpadmin expects to write into string constants
ceastha
parents: 0
diff changeset
   213
    return (0);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
startup()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
    struct passwd		*p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
    
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
    Starting = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
    getpaths();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
    /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
     * There must be a user named "lp".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
    if ((p = getpwnam(LPUSER)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
	fail ("Can't find the user \"lp\" on this system!\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
    Lp_Uid = p->pw_uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
    Lp_Gid = p->pw_gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
    /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
     * Only "root" is allowed to run us.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
    if ((getuid() != 0) && (geteuid() != 0))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
	fail ("You must be \"root\" to run this program.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
    setuid (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
831
3fb2679c47eb LSARC 2005/505 Selectable use of "localhost" for print server hostname.
wendyp
parents: 320
diff changeset
   242
    Local_System = Strdup("localhost");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
    /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
     * Make sure that all critical directories are present and that 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
     * symbolic links are correct.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
    lpfsck();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
    
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
    /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
     * Try setting the lock file to see if another Spooler is running.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
     * We'll release it immediately; this allows us to fork the child
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
     * that will run in the background. The child will relock the file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
    if ((lock_fd = open_locked(Lp_Schedlock, "a", 0664)) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
	if (errno == EAGAIN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	    fail ("Print services already active.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
	    fail ("Can't open file \"%s\" (%s).\n", NB(Lp_Schedlock), PERROR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
    close(lock_fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
    background();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
    /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
     * We are the child process now.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
    if ((lock_fd = open_locked(Lp_Schedlock, "w", 0664)) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	fail ("Failed to lock the file \"%s\" (%s).\n", NB(Lp_Schedlock), PERROR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
    Close (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
    Close (2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
    if (am_in_background)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
	Close (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
    if ((OpenMax = ulimit(4, 0L)) == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
	OpenMax = OPEN_MAX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
    disable_signals();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
    init_messages();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
    init_memory();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
    note ("Print services started.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
    Starting = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
lpshut(int immediate)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	int			i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
	extern MESG *		Net_md;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
	 * If this is the first time here, stop all running
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
	 * child processes, and shut off the alarm clock so
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
	 * it doesn't bug us.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	if (!Shutdown) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
		mputm (Net_md, S_SHUTDOWN, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
		for (i = 0; i < ET_Size; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
			terminate (&Exec_Table[i]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
		alarm (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
		Shutdown = (immediate? 2 : 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	 * If this is an express shutdown, or if all the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	 * child processes have been cleaned up, clean up
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	 * and get out.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	if (Shutdown == 2) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
		 * We don't shut down the message queues until
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
		 * now, to give the children a chance to answer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
		 * This means an LP command may have been snuck
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
		 * in while we were waiting for the children to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
		 * finish, but that's OK because we'll have
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
		 * stored the jobs on disk (that's part of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
		 * normal operation, not just during shutdown phase).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
		shutdown_messages();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
    
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
		(void) close(lock_fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
		(void) Unlink(Lp_Schedlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
		note ("Print services stopped.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
		exit (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
		/*NOTREACHED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
process()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
    register FSTATUS	*pfs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
    register PWSTATUS	*ppws;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
    /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
     * Call the "check_..._alert()" routines for each form/print-wheel;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
     * we need to do this at this point because these routines
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
     * short-circuit themselves while we are in startup mode.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
     * Calling them now will kick off any necessary alerts.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
    isStartingForms = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
    for (pfs = walk_ftable(1); pfs; pfs = walk_ftable(0))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	check_form_alert (pfs, (_FORM *)0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
    isStartingForms = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
    for (ppws = walk_pwtable(1); ppws; ppws = walk_pwtable(0))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	check_pwheel_alert (ppws, (PWHEEL *)0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
    
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
    /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
     * Clear the alarm, then schedule an EV_ALARM. This will clear
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
     * all events that had been scheduled for later without waiting
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
     * for the next tick.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
    alarm (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
    schedule (EV_ALARM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
    /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
     * Start the ball rolling.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
     */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
    schedule (EV_INTERF, (PSTATUS *)0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
    schedule (EV_NOTIFY, (RSTATUS *)0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
    schedule (EV_SLOWF, (RSTATUS *)0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
    for (EVER) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
	take_message ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
	if (Sig_Alrm)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
		schedule (EV_ALARM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
	if (DoneChildren)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
		dowait ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
	if (Shutdown)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
		check_children();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
	if (Shutdown == 2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
ticktock(int sig)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
	Sig_Alrm = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
	(void)signal (SIGALRM, ticktock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
	return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
			    
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
background()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
#if	defined(DEBUG)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
    if (debug & DB_SDB)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
	return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
    
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
    switch(fork())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
	case -1:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
	    fail ("Failed to fork child process (%s).\n", PERROR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
	    /*NOTREACHED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
	case 0:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
	    (void) setpgrp();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
	    am_in_background = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
	    return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
	    
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	    note ("Print services started.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
	    exit(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
	    /* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
usage()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
	note ("\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
usage: lpsched [ options ]\n\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
    [ -f #filter-slots ]    (increase no. concurrent slow filters)\n\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
    [ -n #notify-slots ]    (increase no. concurrent notifications)\n\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
    [ -r #reserved-fds ]    (increase margin of file descriptors)\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
	);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
#if	defined(DEBUG)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
	note ("\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
    [ -D flag[,flag...] ]   (debug modes; use -D? for usage info.)\n\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
    [ -d ]                  (same as -D ALL)\n\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
    [ -s ]                  (don't trap most signals)\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
	);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
	note ("\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
WARNING: all these options are currently unsupported\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
	);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
	return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
Exit(n)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
    int		n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
    fail ("Received unexpected signal %d; terminating.\n", n);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
disable_signals()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
    int		i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
# if defined(DEBUG)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
    if (!signals)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
# endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
	for (i = 0; i < NSIG; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
		if (signal(i, SIG_IGN) != SIG_IGN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
			signal (i, Exit);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
    
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
    (void) signal(SIGHUP, SIG_IGN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
    (void) signal(SIGINT, SIG_IGN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
    (void) signal(SIGQUIT, SIG_IGN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
    (void) signal(SIGALRM, ticktock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
    (void) signal(SIGTERM, lpshut);	/* needs arg, but sig# OK */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
    (void) signal(SIGCLD, SIG_IGN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
    (void) signal(SIGTSTP, SIG_IGN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
    (void) signal(SIGCONT, SIG_DFL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
    (void) signal(SIGTTIN, SIG_IGN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
    (void) signal(SIGTTOU, SIG_IGN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
    (void) signal(SIGXFSZ, SIG_IGN);	/* could be a problem */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
    (void) signal(SIGWINCH, SIG_IGN);   /* if started in a window   */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
    (void) signal(SIGTHAW, SIG_IGN);   /* used by CPR - energystar */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
#if	defined(DEBUG)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
    if (debug & DB_ABORT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
	(void) signal(SIGABRT, SIG_DFL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
}