diff usr/src/cmd/svc/startd/protocol.c @ 12979:ab9ae749152f

PSARC/2009/617 Software Events Notification Parameters CLI PSARC/2009/618 snmp-notify: SNMP Notification Daemon for Software Events PSARC/2009/619 smtp-notify: Email Notification Daemon for Software Events PSARC/2010/225 fmd for non-global Solaris zones PSARC/2010/226 Solaris Instance UUID PSARC/2010/227 nvlist_nvflag(3NVPAIR) PSARC/2010/228 libfmevent additions PSARC/2010/257 sysevent_evc_setpropnvl and sysevent_evc_getpropnvl PSARC/2010/265 FMRI and FMA Event Stabilty, 'ireport' category 1 event class, and the 'sw' FMRI scheme PSARC/2010/278 FMA/SMF integration: instance state transitions PSARC/2010/279 Modelling panics within FMA PSARC/2010/290 logadm.conf upgrade 6392476 fmdump needs to pretty-print 6393375 userland ereport/ireport event generation interfaces 6445732 Add email notification agent for FMA and software events 6804168 RFE: Allow an efficient means to monitor SMF services status changes 6866661 scf_values_destroy(3SCF) will segfault if is passed NULL 6884709 Add snmp notification agent for FMA and software events 6884712 Add private interface to tap into libfmd_msg macro expansion capabilities 6897919 fmd to run in a non-global zone 6897937 fmd use of non-private doors is not safe 6900081 add a UUID to Solaris kernel image for use in crashdump identification 6914884 model panic events as a defect diagnosis in FMA 6944862 fmd_case_open_uuid, fmd_case_uuisresolved, fmd_nvl_create_defect 6944866 log legacy sysevents in fmd 6944867 enumerate svc scheme in topo 6944868 software-diagnosis and software-response fmd modules 6944870 model SMF maintenance state as a defect diagnosis in FMA 6944876 savecore runs in foreground for systems with zfs root and dedicated dump 6965796 Implement notification parameters for SMF state transitions and FMA events 6968287 SUN-FM-MIB.mib needs to be updated to reflect Oracle information 6972331 logadm.conf upgrade PSARC/2010/290
author Gavin Maltby <gavin.maltby@oracle.com>
date Fri, 30 Jul 2010 17:04:17 +1000
parents 48d14e1f550f
children
line wrap: on
line diff
--- a/usr/src/cmd/svc/startd/protocol.c	Thu Jul 29 22:45:58 2010 -0700
+++ b/usr/src/cmd/svc/startd/protocol.c	Fri Jul 30 17:04:17 2010 +1000
@@ -19,8 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
  */
 
 /*
@@ -215,7 +214,8 @@
  *   Enqueue a restarter event.
  */
 static void
-restarter_event_enqueue(const char *inst, restarter_event_type_t event)
+restarter_event_enqueue(const char *inst, restarter_event_type_t event,
+    int32_t reason)
 {
 	restarter_protocol_event_t *e;
 	int r;
@@ -226,6 +226,7 @@
 	e->rpe_inst = startd_alloc(strlen(inst) + 1);
 	(void) strlcpy(e->rpe_inst, inst, strlen(inst)+1);
 	e->rpe_type = event;
+	e->rpe_reason = reason;
 
 	MUTEX_LOCK(&restarter_queue->rpeq_lock);
 	uu_list_node_init(e, &e->rpe_link, restarter_protocol_event_queue_pool);
@@ -277,6 +278,7 @@
 {
 	char *fmri = (char *)cookie;
 	char *instance_name;
+	int32_t reason;
 	nvlist_t *attr_list = NULL;
 	int state, next_state;
 	char str_state[MAX_SCF_STATE_STRING_SZ];
@@ -298,13 +300,16 @@
 	    &next_state) != 0) ||
 	    (nvlist_lookup_int32(attr_list, RESTARTER_NAME_ERROR, &err) != 0) ||
 	    (nvlist_lookup_string(attr_list, RESTARTER_NAME_INSTANCE,
-	    &instance_name) != 0))
+	    &instance_name) != 0) ||
+	    (nvlist_lookup_int32(attr_list, RESTARTER_NAME_REASON, &reason) !=
+	    0))
 		uu_die("%s: can't decode nvlist\n", fmri);
 
 	states = startd_alloc(sizeof (protocol_states_t));
 	states->ps_state = state;
 	states->ps_state_next = next_state;
 	states->ps_err = err;
+	states->ps_reason = reason;
 
 	graph_protocol_send_event(instance_name, GRAPH_UPDATE_STATE_CHANGE,
 	    states);
@@ -415,7 +420,7 @@
 
 void
 restarter_protocol_send_event(const char *inst, evchan_t *chan,
-    restarter_event_type_t event)
+    restarter_event_type_t event, int32_t reason)
 {
 	nvlist_t *attr;
 	int ret;
@@ -425,7 +430,7 @@
 	 * queue the event locally.
 	 */
 	if (chan == NULL) {
-		restarter_event_enqueue(inst, event);
+		restarter_event_enqueue(inst, event, reason);
 		MUTEX_LOCK(&ru->restarter_update_lock);
 		ru->restarter_update_wakeup = 1;
 		(void) pthread_cond_broadcast(&ru->restarter_update_cv);
@@ -440,7 +445,9 @@
 	    event_names[event], chan, inst);
 	if (nvlist_alloc(&attr, NV_UNIQUE_NAME, 0) != 0 ||
 	    nvlist_add_uint32(attr, RESTARTER_NAME_TYPE, event) != 0 ||
-	    nvlist_add_string(attr, RESTARTER_NAME_INSTANCE, (char *)inst) != 0)
+	    nvlist_add_string(attr, RESTARTER_NAME_INSTANCE, (char *)inst) !=
+	    0 || nvlist_add_uint32(attr, RESTARTER_NAME_REASON,
+	    reason) != 0)
 		uu_die("Allocation failure\n");
 
 	if ((ret = restarter_event_publish_retry(chan, "protocol", "restarter",