xref: /onnv-gate/usr/src/cmd/fm/fminject/common/inj_main.c (revision 0:68f95e015346)
1*0Sstevel@tonic-gate /*
2*0Sstevel@tonic-gate  * CDDL HEADER START
3*0Sstevel@tonic-gate  *
4*0Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*0Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*0Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*0Sstevel@tonic-gate  * with the License.
8*0Sstevel@tonic-gate  *
9*0Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*0Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*0Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*0Sstevel@tonic-gate  * and limitations under the License.
13*0Sstevel@tonic-gate  *
14*0Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*0Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*0Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*0Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*0Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*0Sstevel@tonic-gate  *
20*0Sstevel@tonic-gate  * CDDL HEADER END
21*0Sstevel@tonic-gate  */
22*0Sstevel@tonic-gate /*
23*0Sstevel@tonic-gate  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24*0Sstevel@tonic-gate  * Use is subject to license terms.
25*0Sstevel@tonic-gate  */
26*0Sstevel@tonic-gate 
27*0Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
28*0Sstevel@tonic-gate 
29*0Sstevel@tonic-gate #include <sys/sysevent/eventdefs.h>
30*0Sstevel@tonic-gate #include <sys/fm/util.h>
31*0Sstevel@tonic-gate #include <fm/fmd_log.h>
32*0Sstevel@tonic-gate #include <libsysevent.h>
33*0Sstevel@tonic-gate 
34*0Sstevel@tonic-gate #include <inj.h>
35*0Sstevel@tonic-gate #include <inj_err.h>
36*0Sstevel@tonic-gate #include <inj_string.h>
37*0Sstevel@tonic-gate 
38*0Sstevel@tonic-gate int verbose;
39*0Sstevel@tonic-gate int quiet;
40*0Sstevel@tonic-gate 
41*0Sstevel@tonic-gate static int
42*0Sstevel@tonic-gate usage(void)
43*0Sstevel@tonic-gate {
44*0Sstevel@tonic-gate 	(void) fprintf(stderr, "Usage: %s [-nqv] [-c chan] [file]\n"
45*0Sstevel@tonic-gate 	    "\t-c  specify alternate channel to use for publication\n"
46*0Sstevel@tonic-gate 	    "\t-n  compile program but do not inject any events\n"
47*0Sstevel@tonic-gate 	    "\t-q  enable quiet mode (silence status messages)\n"
48*0Sstevel@tonic-gate 	    "\t-v  enable verbose output (display event details)\n",
49*0Sstevel@tonic-gate 	    getpname());
50*0Sstevel@tonic-gate 
51*0Sstevel@tonic-gate 	return (E_USAGE);
52*0Sstevel@tonic-gate }
53*0Sstevel@tonic-gate 
54*0Sstevel@tonic-gate /*
55*0Sstevel@tonic-gate  * Sysevent-based event delivery
56*0Sstevel@tonic-gate  */
57*0Sstevel@tonic-gate static void *
58*0Sstevel@tonic-gate sev_open(const char *chan)
59*0Sstevel@tonic-gate {
60*0Sstevel@tonic-gate 	evchan_t *hdl;
61*0Sstevel@tonic-gate 
62*0Sstevel@tonic-gate 	if (chan == NULL)
63*0Sstevel@tonic-gate 		chan = FM_ERROR_CHAN;
64*0Sstevel@tonic-gate 
65*0Sstevel@tonic-gate 	if ((errno = sysevent_evc_bind(chan, &hdl,
66*0Sstevel@tonic-gate 	    EVCH_CREAT | EVCH_HOLD_PEND)) != 0)
67*0Sstevel@tonic-gate 		die("can't bind to error channel %s", chan);
68*0Sstevel@tonic-gate 
69*0Sstevel@tonic-gate 	return (hdl);
70*0Sstevel@tonic-gate }
71*0Sstevel@tonic-gate 
72*0Sstevel@tonic-gate static void
73*0Sstevel@tonic-gate sev_send(void *arg, nvlist_t *msg)
74*0Sstevel@tonic-gate {
75*0Sstevel@tonic-gate 	if ((errno = sysevent_evc_publish(arg, EC_FM, ESC_FM_ERROR,
76*0Sstevel@tonic-gate 	    "com.sun", getpname(), msg, EVCH_SLEEP)) != 0)
77*0Sstevel@tonic-gate 		warn("failed to send event");
78*0Sstevel@tonic-gate }
79*0Sstevel@tonic-gate 
80*0Sstevel@tonic-gate static void
81*0Sstevel@tonic-gate sev_close(void *arg)
82*0Sstevel@tonic-gate {
83*0Sstevel@tonic-gate 	sysevent_evc_unbind(arg);
84*0Sstevel@tonic-gate }
85*0Sstevel@tonic-gate 
86*0Sstevel@tonic-gate static inj_mode_ops_t sysevent_ops = {
87*0Sstevel@tonic-gate 	sev_open,
88*0Sstevel@tonic-gate 	sev_send,
89*0Sstevel@tonic-gate 	sev_close
90*0Sstevel@tonic-gate };
91*0Sstevel@tonic-gate 
92*0Sstevel@tonic-gate /*
93*0Sstevel@tonic-gate  * Simulated delivery
94*0Sstevel@tonic-gate  */
95*0Sstevel@tonic-gate /*ARGSUSED*/
96*0Sstevel@tonic-gate static void *
97*0Sstevel@tonic-gate sim_open(const char *arg)
98*0Sstevel@tonic-gate {
99*0Sstevel@tonic-gate 	return ((void *)1);
100*0Sstevel@tonic-gate }
101*0Sstevel@tonic-gate 
102*0Sstevel@tonic-gate /*ARGSUSED*/
103*0Sstevel@tonic-gate static void
104*0Sstevel@tonic-gate sim_send(void *arg, nvlist_t *msg)
105*0Sstevel@tonic-gate {
106*0Sstevel@tonic-gate }
107*0Sstevel@tonic-gate 
108*0Sstevel@tonic-gate /*ARGSUSED*/
109*0Sstevel@tonic-gate static void
110*0Sstevel@tonic-gate sim_close(void *arg)
111*0Sstevel@tonic-gate {
112*0Sstevel@tonic-gate }
113*0Sstevel@tonic-gate 
114*0Sstevel@tonic-gate static inj_mode_ops_t simulate_ops = {
115*0Sstevel@tonic-gate 	sim_open,
116*0Sstevel@tonic-gate 	sim_send,
117*0Sstevel@tonic-gate 	sim_close
118*0Sstevel@tonic-gate };
119*0Sstevel@tonic-gate 
120*0Sstevel@tonic-gate int
121*0Sstevel@tonic-gate main(int argc, char *argv[])
122*0Sstevel@tonic-gate {
123*0Sstevel@tonic-gate 	const inj_mode_ops_t *mode = NULL;
124*0Sstevel@tonic-gate 	void *mode_arg = NULL;
125*0Sstevel@tonic-gate 	int c;
126*0Sstevel@tonic-gate 
127*0Sstevel@tonic-gate 	const char *file;
128*0Sstevel@tonic-gate 	inj_list_t *program;
129*0Sstevel@tonic-gate 	fmd_log_t *lp;
130*0Sstevel@tonic-gate 
131*0Sstevel@tonic-gate 	while ((c = getopt(argc, argv, "c:nqv")) != EOF) {
132*0Sstevel@tonic-gate 		switch (c) {
133*0Sstevel@tonic-gate 		case 'c':
134*0Sstevel@tonic-gate 			if (mode != NULL || mode_arg != NULL)
135*0Sstevel@tonic-gate 				return (usage());
136*0Sstevel@tonic-gate 
137*0Sstevel@tonic-gate 			mode = &sysevent_ops;
138*0Sstevel@tonic-gate 			mode_arg = optarg;
139*0Sstevel@tonic-gate 			break;
140*0Sstevel@tonic-gate 
141*0Sstevel@tonic-gate 		case 'n':
142*0Sstevel@tonic-gate 			if (mode != NULL)
143*0Sstevel@tonic-gate 				return (usage());
144*0Sstevel@tonic-gate 
145*0Sstevel@tonic-gate 			mode = &simulate_ops;
146*0Sstevel@tonic-gate 			break;
147*0Sstevel@tonic-gate 
148*0Sstevel@tonic-gate 		case 'q':
149*0Sstevel@tonic-gate 			quiet = 1;
150*0Sstevel@tonic-gate 			break;
151*0Sstevel@tonic-gate 
152*0Sstevel@tonic-gate 		case 'v':
153*0Sstevel@tonic-gate 			verbose = 1;
154*0Sstevel@tonic-gate 			break;
155*0Sstevel@tonic-gate 
156*0Sstevel@tonic-gate 		default:
157*0Sstevel@tonic-gate 			return (usage());
158*0Sstevel@tonic-gate 		}
159*0Sstevel@tonic-gate 	}
160*0Sstevel@tonic-gate 
161*0Sstevel@tonic-gate 	if (mode == NULL)
162*0Sstevel@tonic-gate 		mode = &sysevent_ops;
163*0Sstevel@tonic-gate 
164*0Sstevel@tonic-gate 	argc -= optind;
165*0Sstevel@tonic-gate 	argv += optind;
166*0Sstevel@tonic-gate 
167*0Sstevel@tonic-gate 	if (argc == 0)
168*0Sstevel@tonic-gate 		file = "-";
169*0Sstevel@tonic-gate 	else if (argc == 1)
170*0Sstevel@tonic-gate 		file = argv[0];
171*0Sstevel@tonic-gate 	else
172*0Sstevel@tonic-gate 		return (usage());
173*0Sstevel@tonic-gate 
174*0Sstevel@tonic-gate 	srand48(gethrtime());
175*0Sstevel@tonic-gate 
176*0Sstevel@tonic-gate 	if (argc > 0 && (lp = fmd_log_open(FMD_LOG_VERSION, file, &c)) != NULL)
177*0Sstevel@tonic-gate 		program = inj_logfile_read(lp);
178*0Sstevel@tonic-gate 	else
179*0Sstevel@tonic-gate 		program = inj_program_read(file);
180*0Sstevel@tonic-gate 
181*0Sstevel@tonic-gate 	inj_program_run(program, mode, mode_arg);
182*0Sstevel@tonic-gate 	return (0);
183*0Sstevel@tonic-gate }
184