diff usr/src/cmd/fm/fmadm/common/faulty.c @ 10928:eb060666c73f

6885689 syseventd: [daemon.error] Fatal:attempting to dump core on snv_124 6874078 fminject should always add __injected payload 6874080 fmd_case_add_ereport() should add any __injected payload from ereports into the suspect list 6796601 fmadm faulty doesn't show the year when events happen 6820523 fmdump -V should display the complete time for all files, not just errlog files 6881060 Subdirectories in /var/fm/fmd/ have overly restrictive permissions 6890955 oodles of FMA messages upon fmd start-up
author Stephen Hanson <Stephen.Hanson@Sun.COM>
date Mon, 02 Nov 2009 09:11:35 -0800
parents 217544b3cf73
children be69f645ce17
line wrap: on
line diff
--- a/usr/src/cmd/fm/fmadm/common/faulty.c	Mon Nov 02 06:49:25 2009 -0800
+++ b/usr/src/cmd/fm/fmadm/common/faulty.c	Mon Nov 02 09:11:35 2009 -0800
@@ -215,6 +215,7 @@
 	name_list_t *fru;
 	name_list_t *serial;
 	uint8_t not_suppressed;
+	uint8_t injected;
 } status_record_t;
 
 typedef struct sr_list {
@@ -229,6 +230,7 @@
 	sr_list_t *status_rec_list;
 	char *resource;
 	uint8_t not_suppressed;
+	uint8_t injected;
 	uint8_t max_pct;
 } resource_list_t;
 
@@ -259,7 +261,14 @@
 		(void) snprintf(buf, len, "0x%llx", sec);
 	} else {
 		time_t tod = (time_t)sec;
-		(void) strftime(buf, len, "%b %d %T", localtime(&tod));
+		time_t now = time(NULL);
+		if (tod > now+60 ||
+		    tod < now - 6L*30L*24L*60L*60L) { /* 6 months ago */
+			(void) strftime(buf, len, "%b %d %Y    ",
+			    localtime(&tod));
+		} else {
+			(void) strftime(buf, len, "%b %d %T", localtime(&tod));
+		}
 	}
 
 	return (buf);
@@ -612,7 +621,7 @@
 new_record_init(uurec_t *uurec_p, char *msgid, name_list_t *class,
     name_list_t *fru, name_list_t *asru, name_list_t *resource,
     name_list_t *serial, boolean_t not_suppressed,
-    hostid_t *hostid)
+    hostid_t *hostid, boolean_t injected)
 {
 	status_record_t *status_rec_p;
 
@@ -633,6 +642,7 @@
 	status_rec_p->serial = serial;
 	status_rec_p->msgid = strdup(msgid);
 	status_rec_p->not_suppressed = not_suppressed;
+	status_rec_p->injected = injected;
 	return (status_rec_p);
 }
 
@@ -732,6 +742,7 @@
 	while (np) {
 		if (strcmp(fp->name, np->resource) == 0) {
 			np->not_suppressed |= status_rec_p->not_suppressed;
+			np->injected |= status_rec_p->injected;
 			srp = np->status_rec_list->status_record;
 			order = cmp_priority(status_rec_p->severity,
 			    srp->severity, status_rec_p->uurec->sec,
@@ -761,6 +772,7 @@
 		np = malloc(sizeof (resource_list_t));
 		np->resource = fp->name;
 		np->not_suppressed = status_rec_p->not_suppressed;
+		np->injected = status_rec_p->injected;
 		np->status_rec_list = NULL;
 		np->max_pct = fp->max_pct;
 		add_resource(status_rec_p, rpp, np);
@@ -790,12 +802,12 @@
 catalog_new_record(uurec_t *uurec_p, char *msgid, name_list_t *class,
     name_list_t *fru, name_list_t *asru, name_list_t *resource,
     name_list_t *serial, boolean_t not_suppressed,
-    hostid_t *hostid)
+    hostid_t *hostid, boolean_t injected)
 {
 	status_record_t *status_rec_p;
 
 	status_rec_p = new_record_init(uurec_p, msgid, class, fru, asru,
-	    resource, serial, not_suppressed, hostid);
+	    resource, serial, not_suppressed, hostid, injected);
 	add_rec_list(status_rec_p, &status_rec_list);
 	if (status_rec_p->fru)
 		add_list(status_rec_p, status_rec_p->fru, &status_fru_list);
@@ -924,11 +936,13 @@
 	hostid_t *host;
 	boolean_t not_suppressed = 1;
 	boolean_t any_present = 0;
+	boolean_t injected = 0;
 
 	(void) nvlist_lookup_string(nvl, FM_SUSPECT_DIAG_CODE, &msgid);
 	(void) nvlist_lookup_uint32(nvl, FM_SUSPECT_FAULT_SZ, &size);
 	(void) nvlist_lookup_boolean_value(nvl, FM_SUSPECT_MESSAGE,
 	    &not_suppressed);
+	(void) nvlist_lookup_boolean_value(nvl, FM_SUSPECT_INJECTED, &injected);
 
 	if (size != 0) {
 		(void) nvlist_lookup_nvlist_array(nvl, FM_SUSPECT_FAULT_LIST,
@@ -957,7 +971,7 @@
 	(void) nvlist_dup(nvl, &uurec_p->event, 0);
 	host = find_hostid(nvl);
 	catalog_new_record(uurec_p, msgid, class, fru, asru,
-	    resource, serial, not_suppressed, host);
+	    resource, serial, not_suppressed, host, injected);
 }
 
 static void
@@ -1423,15 +1437,17 @@
 	if (opt_i) {
 		ari_list = uurp->ari_uuid_list;
 		while (ari_list) {
-			(void) printf("%-15s %-37s %-14s %-9s\n",
+			(void) printf("%-15s %-37s %-14s %-9s %s\n",
 			    format_date(buf, sizeof (buf), uurp->sec),
-			    ari_list->ari_uuid, srp->msgid, srp->severity);
+			    ari_list->ari_uuid, srp->msgid, srp->severity,
+			    srp->injected ? dgettext("FMD", "injected") : "");
 			ari_list = ari_list->next;
 		}
 	} else {
-		(void) printf("%-15s %-37s %-14s %-9s\n",
+		(void) printf("%-15s %-37s %-14s %-9s %s\n",
 		    format_date(buf, sizeof (buf), uurp->sec),
-		    uurp->uuid, srp->msgid, srp->severity);
+		    uurp->uuid, srp->msgid, srp->severity,
+		    srp->injected ? dgettext("FMD", "injected") : "");
 	}
 
 	if (!summary)
@@ -1551,18 +1567,23 @@
 				slp = slp->next;
 			} while (slp != end);
 			if (status & FM_SUSPECT_NOT_PRESENT)
-				(void) printf(dgettext("FMD", "not present\n"));
+				(void) printf(dgettext("FMD", "not present"));
 			else if (status & FM_SUSPECT_FAULTY)
-				(void) printf(dgettext("FMD", "faulty\n"));
+				(void) printf(dgettext("FMD", "faulty"));
 			else if (status & FM_SUSPECT_REPLACED)
-				(void) printf(dgettext("FMD", "replaced\n"));
+				(void) printf(dgettext("FMD", "replaced"));
 			else if (status & FM_SUSPECT_REPAIRED)
 				(void) printf(dgettext("FMD",
-				    "repair attempted\n"));
+				    "repair attempted"));
 			else if (status & FM_SUSPECT_ACQUITTED)
-				(void) printf(dgettext("FMD", "acquitted\n"));
+				(void) printf(dgettext("FMD", "acquitted"));
 			else
-				(void) printf(dgettext("FMD", "removed\n"));
+				(void) printf(dgettext("FMD", "removed"));
+
+			if (tp->injected)
+				(void) printf(dgettext("FMD", " injected\n"));
+			else
+				(void) printf(dgettext("FMD", "\n"));
 
 			slp = tp->status_rec_list;
 			end = slp;
@@ -1663,7 +1684,11 @@
 				msg = "";
 				break;
 			}
-			(void) printf("%-69s %s\n", tp->resource, msg);
+			(void) printf("%-69s %s", tp->resource, msg);
+			if (tp->injected)
+				(void) printf(dgettext("FMD", " injected\n"));
+			else
+				(void) printf(dgettext("FMD", "\n"));
 		}
 		tp = tp->next;
 		if (tp == status_asru_list)