1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_SYSEVENT_CONF_MOD_H
28 #define	_SYSEVENT_CONF_MOD_H
29 
30 #ifdef	__cplusplus
31 extern "C" {
32 #endif
33 
34 
35 /*
36  * syseventd_print debug levels for sysevent_conf_mod
37  */
38 #define	DBG_TEST	1	/* info of interest when testing */
39 #define	DBG_EXEC	2	/* path and args to exec */
40 #define	DBG_EVENTS	3	/* received events */
41 #define	DBG_MATCHES	4	/* dump specs for matching events */
42 #define	DBG_MACRO	5	/* macro expansion */
43 #define	DBG_CONF_FILE	6	/* sysevent.conf parsing */
44 #define	DBG_DETAILED	7	/* all the above and more */
45 
46 
47 /*
48  * Directory where sysevent.conf files reside
49  */
50 #define	SYSEVENT_CONFIG_DIR		"/etc/sysevent/config"
51 
52 /*
53  * Lock file name to serialize registry updates
54  */
55 #define	LOCK_FILENAME			"/var/run/syseventconf.lock"
56 
57 /*
58  * sysevent.conf files list
59  */
60 typedef struct conftab {
61 	char		*cf_conf_file;		/* source conf file */
62 	struct conftab	*cf_next;
63 } conftab_t;
64 
65 /*
66  * sysevent.conf table
67  */
68 typedef struct syseventtab {
69 	char	*se_conf_file;			/* source conf file */
70 	int	se_lineno;			/* line number */
71 	char	*se_vendor;			/* vendor */
72 	char	*se_publisher;			/* publisher */
73 	char	*se_class;			/* event class */
74 	char	*se_subclass;			/* event subclass */
75 	char	*se_user;			/* user */
76 	char	*se_reserved1;			/* reserved1 */
77 	char	*se_reserved2;			/* reserved2 */
78 	char	*se_path;			/* event path */
79 	char	*se_args;			/* optional args */
80 	uid_t	se_uid;				/* user id */
81 	gid_t	se_gid;				/* group id */
82 	struct	syseventtab *se_next;
83 } syseventtab_t;
84 
85 typedef struct sysevent_hdr_info {
86 	char	*class;
87 	char	*subclass;
88 	char	*vendor;
89 	char	*publisher;
90 } sysevent_hdr_info_t;
91 
92 
93 /*
94  * Structures for building arbitarily long strings and argument lists
95  */
96 typedef struct str {
97 	char	*s_str;
98 	int	s_len;
99 	int	s_alloc;
100 	int	s_hint;
101 } str_t;
102 
103 /*
104  * Queue of commands ready to be transported to syseventconfd
105  */
106 typedef struct cmdqueue {
107 	sysevent_t	*event;
108 	struct cmdqueue	*next;
109 } cmdqueue_t;
110 
111 /*
112  * syseventconfd state
113  */
114 enum {
115 	CONFD_STATE_OK,
116 	CONFD_STATE_NOT_RUNNING,
117 	CONFD_STATE_STARTED,
118 	CONFD_STATE_ERR,
119 	CONFD_STATE_DISABLED
120 };
121 
122 
123 /*
124  * Prototypes
125  */
126 static char *skip_spaces(char **cpp);
127 static char *next_field(char **cpp);
128 static void *sc_malloc(size_t n);
129 static void *sc_realloc(void *p, size_t current, size_t n);
130 static void sc_free(void *p, size_t n);
131 static char *sc_strdup(char *cp);
132 static void sc_strfree(char *s);
133 
134 static str_t *initstr(int hint);
135 static void freestr(str_t *str);
136 static void resetstr(str_t *str);
137 static int strcopys(str_t *str, char *s);
138 static int strcats(str_t *str, char *s);
139 static int strcatc(str_t *str, int c);
140 static char *fstrgets(str_t *str, FILE *fp);
141 static void strtrunc(str_t *str, int pos);
142 
143 static void build_event_table(void);
144 static void free_event_table(void);
145 static int enter_lock(char *lock_file);
146 static void exit_lock(int lock_fd, char *lock_file);
147 static str_t *snip_identifier(char *id, char **end);
148 static str_t *snip_delimited_identifier(char *id, char **end);
149 static char *se_attr_type_to_str(int se_attr_type);
150 static str_t *find_macro_definition(sysevent_t *ev, nvlist_t *nvlist,
151 	syseventtab_t *sep, char *token, sysevent_hdr_info_t *hdr);
152 static int expand_macros(sysevent_t *ev, nvlist_t *nvlist,
153 	syseventtab_t *sep, str_t *line, sysevent_hdr_info_t *hdr);
154 static void start_syseventconfd(void);
155 static int system1(const char *s_path, const char *s);
156 static void abort_cmd_queue(void);
157 static int queue_event(sysevent_t *ev, syseventtab_t *sep,
158 	sysevent_hdr_info_t *hdr);
159 static int transport_event(sysevent_t *cmd);
160 static void transport_queued_events(void);
161 static int sysevent_conf_event(sysevent_t *ev, int flag);
162 
163 
164 #ifdef	__cplusplus
165 }
166 #endif
167 
168 #endif	/* _SYSEVENT_CONF_MOD_H */
169