Print this page
NEX-18417 bring back UUID-based OIDs for FM traps
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
NEX-17772 libfmd_snmp should learn about new FmProblem fields
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
NEX-16536 SUN-IREPORT-MIB is broken
NEX-16537 enhance FM traps
NEX-16545 SMF dict should have obsolete entries removed
Reviewed by: Dan Fields <dan.fields@nexenta.com>
Reviewed by: Cynthia Eastham <cynthia.eastham@nexenta.com>
Reviewed by: Alexander Eremin <alexander.eremin@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-14494 FMA related SNMP traps should add description
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/fm/notify/snmp-notify/common/snmp-notify.c
          +++ new/usr/src/cmd/fm/notify/snmp-notify/common/snmp-notify.c
↓ open down ↓ 15 lines elided ↑ open up ↑
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
  24   24   */
  25   25  
       26 +/*
       27 + * Copyright 2018 Nexenta Systems, Inc.
       28 + */
       29 +
  26   30  #include <sys/fm/protocol.h>
       31 +
  27   32  #include <fm/fmd_snmp.h>
  28   33  #include <fm/fmd_msg.h>
  29   34  #include <fm/libfmevent.h>
       35 +
  30   36  #include <net-snmp/net-snmp-config.h>
  31   37  #include <net-snmp/net-snmp-includes.h>
  32   38  #include <net-snmp/agent/net-snmp-agent-includes.h>
       39 +
       40 +#include <alloca.h>
  33   41  #include <errno.h>
       42 +#include <limits.h>
  34   43  #include <locale.h>
  35   44  #include <netdb.h>
       45 +#include <priv_utils.h>
  36   46  #include <signal.h>
  37      -#include <strings.h>
  38   47  #include <stdlib.h>
       48 +#include <strings.h>
  39   49  #include <unistd.h>
  40      -#include <limits.h>
  41      -#include <alloca.h>
  42      -#include <priv_utils.h>
  43   50  #include <zone.h>
       51 +
  44   52  #include "libfmnotify.h"
  45   53  
  46   54  /*
  47   55   * Debug messages can be enabled by setting the debug property to true
  48   56   *
  49   57   * # svccfg -s svc:/system/fm/snmp-notify setprop config/debug=true
  50   58   */
  51   59  #define SVCNAME         "system/fm/snmp-notify"
  52   60  
  53   61  typedef struct ireport_trap {
       62 +        long long tstamp;
  54   63          char *host;
  55   64          char *msgid;
       65 +        char *severity;
  56   66          char *desc;
  57      -        long long tstamp;
  58   67          char *fmri;
  59   68          uint32_t from_state;
  60   69          uint32_t to_state;
  61   70          char *reason;
  62   71          boolean_t is_stn_event;
  63   72  } ireport_trap_t;
  64   73  
       74 +typedef struct fmproblem_trap {
       75 +        char *uuid;
       76 +        char *host;
       77 +        char *code;
       78 +        char *type;
       79 +        char *severity;
       80 +        char *url;
       81 +        char *descr;
       82 +        char *fmri;
       83 +} fmproblem_trap_t;
       84 +
  65   85  static nd_hdl_t *nhdl;
  66   86  static const char optstr[] = "dfR:";
  67   87  static const char SNMP_SUPPCONF[] = "fmd-trapgen";
  68   88  static char hostname[MAXHOSTNAMELEN + 1];
  69   89  
  70   90  static int
  71   91  usage(const char *pname)
  72   92  {
  73   93          (void) fprintf(stderr, "Usage: %s [-df] [-R <altroot>]\n", pname);
  74   94  
↓ open down ↓ 83 lines elided ↑ open up ↑
 158  178  {
 159  179          static const oid sunIreportTrap_oid[] =
 160  180              { SUNIREPORTTRAP_OID };
 161  181          const size_t sunIreportTrap_len =
 162  182              OID_LENGTH(sunIreportTrap_oid);
 163  183  
 164  184          static const oid sunIreportHostname_oid[] =
 165  185              { SUNIREPORTHOSTNAME_OID };
 166  186          static const oid sunIreportMsgid_oid[] =
 167  187              { SUNIREPORTMSGID_OID };
      188 +        static const oid sunIreportSeverity_oid[] =
      189 +            { SUNIREPORTSEVERITY_OID };
 168  190          static const oid sunIreportDescription_oid[] =
 169  191              { SUNIREPORTDESCRIPTION_OID };
 170  192          static const oid sunIreportTime_oid[] =
 171  193              { SUNIREPORTTIME_OID };
 172  194  
 173  195          static const oid sunIreportSmfFmri_oid[] =
 174  196              { SUNIREPORTSMFFMRI_OID };
 175  197          static const oid sunIreportSmfFromState_oid[] =
 176  198              { SUNIREPORTSMFFROMSTATE_OID };
 177  199          static const oid sunIreportSmfToState_oid[] =
 178  200              { SUNIREPORTSMFTOSTATE_OID };
 179  201          static const oid sunIreportSmfTransitionReason_oid[] =
 180  202              { SUNIREPORTTRANSITIONREASON_OID };
 181  203          const size_t
 182  204              sunIreport_base_len = OID_LENGTH(sunIreportHostname_oid);
 183  205  
      206 +        size_t oid_len = sunIreport_base_len * sizeof (oid);
 184  207          size_t var_len = sunIreport_base_len + 1;
 185      -        oid var_name[MAX_OID_LEN];
      208 +        oid var_name[MAX_OID_LEN] = { 0 };
 186  209  
 187  210          netsnmp_variable_list *notification_vars = NULL;
 188  211  
 189  212          size_t dt_len;
 190  213          uchar_t dt[11], *tdt;
 191  214          time_t ts = t->tstamp;
 192  215  
 193  216          tdt = date_n_time(&ts, &dt_len);
 194  217          /*
 195  218           * We know date_n_time is broken, it returns a buffer from
↓ open down ↓ 1 lines elided ↑ open up ↑
 197  220           */
 198  221          for (int i = 0; i < dt_len; ++i)
 199  222                  dt[i] = tdt[i];
 200  223  
 201  224          if (var_len > MAX_OID_LEN) {
 202  225                  nd_error(nhdl, "var_len %d > MAX_OID_LEN %d\n", var_len,
 203  226                      MAX_OID_LEN);
 204  227                  return;
 205  228          }
 206  229  
 207      -        (void) memcpy(var_name, sunIreportHostname_oid, sunIreport_base_len *
 208      -            sizeof (oid));
      230 +        (void) memcpy(var_name, sunIreportHostname_oid, oid_len);
 209  231          (void) snmp_varlist_add_variable(&notification_vars, var_name,
 210      -            sunIreport_base_len + 1, ASN_OCTET_STR, (uchar_t *)t->host,
 211      -            strlen(t->host));
      232 +            var_len, ASN_OCTET_STR, (uchar_t *)t->host, strlen(t->host));
 212  233  
 213      -        (void) memcpy(var_name, sunIreportMsgid_oid,
 214      -            sunIreport_base_len * sizeof (oid));
      234 +        (void) memcpy(var_name, sunIreportMsgid_oid, oid_len);
 215  235          (void) snmp_varlist_add_variable(&notification_vars, var_name,
 216      -            sunIreport_base_len + 1, ASN_OCTET_STR, (uchar_t *)t->msgid,
 217      -            strlen(t->msgid));
      236 +            var_len, ASN_OCTET_STR, (uchar_t *)t->msgid, strlen(t->msgid));
 218  237  
 219      -        (void) memcpy(var_name, sunIreportDescription_oid,
 220      -            sunIreport_base_len * sizeof (oid));
      238 +        (void) memcpy(var_name, sunIreportSeverity_oid, oid_len);
 221  239          (void) snmp_varlist_add_variable(&notification_vars, var_name,
 222      -            sunIreport_base_len + 1, ASN_OCTET_STR, (uchar_t *)t->desc,
 223      -            strlen(t->desc));
      240 +            var_len, ASN_OCTET_STR, (uchar_t *)t->severity,
      241 +            strlen(t->severity));
 224  242  
 225      -        (void) memcpy(var_name, sunIreportTime_oid, sunIreport_base_len *
 226      -            sizeof (oid));
      243 +        (void) memcpy(var_name, sunIreportDescription_oid, oid_len);
 227  244          (void) snmp_varlist_add_variable(&notification_vars, var_name,
 228      -            sunIreport_base_len + 1, ASN_OCTET_STR, dt, dt_len);
      245 +            var_len, ASN_OCTET_STR, (uchar_t *)t->desc, strlen(t->desc));
 229  246  
      247 +        (void) memcpy(var_name, sunIreportTime_oid, oid_len);
      248 +        (void) snmp_varlist_add_variable(&notification_vars, var_name,
      249 +            var_len, ASN_OCTET_STR, dt, dt_len);
      250 +
 230  251          if (t->is_stn_event) {
 231      -                (void) memcpy(var_name, sunIreportSmfFmri_oid,
 232      -                    sunIreport_base_len * sizeof (oid));
      252 +                (void) memcpy(var_name, sunIreportSmfFmri_oid, oid_len);
 233  253                  (void) snmp_varlist_add_variable(&notification_vars, var_name,
 234      -                    sunIreport_base_len + 1, ASN_OCTET_STR, (uchar_t *)t->fmri,
      254 +                    var_len, ASN_OCTET_STR, (uchar_t *)t->fmri,
 235  255                      strlen(t->fmri));
 236  256  
 237      -                (void) memcpy(var_name, sunIreportSmfFromState_oid,
 238      -                    sunIreport_base_len * sizeof (oid));
      257 +                (void) memcpy(var_name, sunIreportSmfFromState_oid, oid_len);
 239  258                  (void) snmp_varlist_add_variable(&notification_vars, var_name,
 240      -                    sunIreport_base_len + 1, ASN_INTEGER,
 241      -                    (uchar_t *)&t->from_state, sizeof (uint32_t));
      259 +                    var_len, ASN_INTEGER, (uchar_t *)&t->from_state,
      260 +                    sizeof (uint32_t));
 242  261  
 243      -                (void) memcpy(var_name, sunIreportSmfToState_oid,
 244      -                    sunIreport_base_len * sizeof (oid));
      262 +                (void) memcpy(var_name, sunIreportSmfToState_oid, oid_len);
 245  263                  (void) snmp_varlist_add_variable(&notification_vars, var_name,
 246      -                    sunIreport_base_len + 1, ASN_INTEGER,
 247      -                    (uchar_t *)&t->to_state, sizeof (uint32_t));
      264 +                    var_len, ASN_INTEGER, (uchar_t *)&t->to_state,
      265 +                    sizeof (uint32_t));
 248  266  
 249  267                  (void) memcpy(var_name, sunIreportSmfTransitionReason_oid,
 250      -                    sunIreport_base_len * sizeof (oid));
      268 +                    oid_len);
 251  269                  (void) snmp_varlist_add_variable(&notification_vars, var_name,
 252      -                    sunIreport_base_len + 1, ASN_OCTET_STR,
 253      -                    (uchar_t *)t->reason, strlen(t->reason));
      270 +                    var_len, ASN_OCTET_STR, (uchar_t *)t->reason,
      271 +                    strlen(t->reason));
 254  272          }
 255  273  
 256  274          /*
 257  275           * This function is capable of sending both v1 and v2/v3 traps.
 258  276           * Which is sent to a specific destination is determined by the
 259  277           * configuration file(s).
 260  278           */
 261  279          send_enterprise_trap_vars(SNMP_TRAP_ENTERPRISESPECIFIC,
 262  280              sunIreportTrap_oid[sunIreportTrap_len - 1],
 263  281              (oid *)sunIreportTrap_oid, sunIreportTrap_len - 2,
 264  282              notification_vars);
 265  283          nd_debug(nhdl, "Sent SNMP trap for %s", t->msgid);
 266  284  
 267  285          snmp_free_varbind(notification_vars);
 268      -
 269  286  }
 270  287  
 271      -/*ARGSUSED*/
 272  288  static void
 273      -send_fm_trap(const char *uuid, const char *code, const char *url)
      289 +send_fm_trap(fmproblem_trap_t *t)
 274  290  {
 275  291          static const oid sunFmProblemTrap_oid[] = { SUNFMPROBLEMTRAP_OID };
 276  292          const size_t sunFmProblemTrap_len = OID_LENGTH(sunFmProblemTrap_oid);
 277  293  
 278  294          static const oid sunFmProblemUUID_oid[] =
 279  295              { SUNFMPROBLEMTABLE_OID, 1, SUNFMPROBLEM_COL_UUID };
      296 +        static const oid sunFmProblemHostname_oid[] =
      297 +            { SUNFMPROBLEMTABLE_OID, 1, SUNFMPROBLEM_COL_HOSTNAME };
 280  298          static const oid sunFmProblemCode_oid[] =
 281  299              { SUNFMPROBLEMTABLE_OID, 1, SUNFMPROBLEM_COL_CODE };
      300 +        static const oid sunFmProblemType_oid[] =
      301 +            { SUNFMPROBLEMTABLE_OID, 1, SUNFMPROBLEM_COL_TYPE };
      302 +        static const oid sunFmProblemSeverity_oid[] =
      303 +            { SUNFMPROBLEMTABLE_OID, 1, SUNFMPROBLEM_COL_SEVERITY };
 282  304          static const oid sunFmProblemURL_oid[] =
 283  305              { SUNFMPROBLEMTABLE_OID, 1, SUNFMPROBLEM_COL_URL };
      306 +        static const oid sunFmProblemDescr_oid[] =
      307 +            { SUNFMPROBLEMTABLE_OID, 1, SUNFMPROBLEM_COL_DESC };
      308 +        static const oid sunFmProblemFMRI_oid[] =
      309 +            { SUNFMPROBLEMTABLE_OID, 1, SUNFMPROBLEM_COL_FMRI };
 284  310  
 285  311          const size_t sunFmProblem_base_len = OID_LENGTH(sunFmProblemUUID_oid);
 286  312  
 287      -        size_t uuid_len = strlen(uuid);
      313 +        size_t oid_len = sunFmProblem_base_len * sizeof (oid);
      314 +        size_t uuid_len = strlen(t->uuid);
 288  315          size_t var_len = sunFmProblem_base_len + 1 + uuid_len;
 289  316          oid var_name[MAX_OID_LEN];
 290  317  
 291  318          netsnmp_variable_list *notification_vars = NULL;
 292  319  
 293  320          /*
 294  321           * The format of our trap varbinds' oids is as follows:
 295  322           *
 296  323           * +-----------------------+---+--------+----------+------+
 297  324           * | SUNFMPROBLEMTABLE_OID | 1 | column | uuid_len | uuid |
↓ open down ↓ 5 lines elided ↑ open up ↑
 303  330           * all the oids are the same length, so the only thing we need to
 304  331           * do for each varbind is set the table and column parts of the
 305  332           * variable name.
 306  333           */
 307  334  
 308  335          if (var_len > MAX_OID_LEN)
 309  336                  return;
 310  337  
 311  338          var_name[sunFmProblem_base_len] = (oid)uuid_len;
 312  339          for (int i = 0; i < uuid_len; i++)
 313      -                var_name[i + sunFmProblem_base_len + 1] = (oid)uuid[i];
      340 +                var_name[i + sunFmProblem_base_len + 1] = (oid)t->uuid[i];
 314  341  
 315  342          /*
 316  343           * Ordinarily, we would need to add the OID of the trap itself
 317  344           * to the head of the variable list; this is required by SNMP v2.
 318  345           * However, send_enterprise_trap_vars does this for us as a part
 319  346           * of converting between v1 and v2 traps, so we skip directly to
 320  347           * the objects we're sending.
 321  348           */
 322  349  
 323      -        (void) memcpy(var_name, sunFmProblemUUID_oid,
 324      -            sunFmProblem_base_len * sizeof (oid));
      350 +        (void) memcpy(var_name, sunFmProblemUUID_oid, oid_len);
 325  351          (void) snmp_varlist_add_variable(&notification_vars, var_name, var_len,
 326      -            ASN_OCTET_STR, (uchar_t *)uuid, strlen(uuid));
 327      -        (void) memcpy(var_name, sunFmProblemCode_oid,
 328      -            sunFmProblem_base_len * sizeof (oid));
      352 +            ASN_OCTET_STR, (uchar_t *)t->uuid, strlen(t->uuid));
      353 +
      354 +        (void) memcpy(var_name, sunFmProblemHostname_oid, oid_len);
 329  355          (void) snmp_varlist_add_variable(&notification_vars, var_name, var_len,
 330      -            ASN_OCTET_STR, (uchar_t *)code, strlen(code));
 331      -        (void) memcpy(var_name, sunFmProblemURL_oid,
 332      -            sunFmProblem_base_len * sizeof (oid));
      356 +            ASN_OCTET_STR, (uchar_t *)t->host, strlen(t->host));
      357 +
      358 +        (void) memcpy(var_name, sunFmProblemCode_oid, oid_len);
 333  359          (void) snmp_varlist_add_variable(&notification_vars, var_name, var_len,
 334      -            ASN_OCTET_STR, (uchar_t *)url, strlen(url));
      360 +            ASN_OCTET_STR, (uchar_t *)t->code, strlen(t->code));
 335  361  
      362 +        (void) memcpy(var_name, sunFmProblemType_oid, oid_len);
      363 +        (void) snmp_varlist_add_variable(&notification_vars, var_name, var_len,
      364 +            ASN_OCTET_STR, (uchar_t *)t->type, strlen(t->type));
      365 +
      366 +        (void) memcpy(var_name, sunFmProblemSeverity_oid, oid_len);
      367 +        (void) snmp_varlist_add_variable(&notification_vars, var_name, var_len,
      368 +            ASN_OCTET_STR, (uchar_t *)t->severity, strlen(t->severity));
      369 +
      370 +        (void) memcpy(var_name, sunFmProblemURL_oid, oid_len);
      371 +        (void) snmp_varlist_add_variable(&notification_vars, var_name, var_len,
      372 +            ASN_OCTET_STR, (uchar_t *)t->url, strlen(t->url));
      373 +
      374 +        (void) memcpy(var_name, sunFmProblemDescr_oid, oid_len);
      375 +        (void) snmp_varlist_add_variable(&notification_vars, var_name, var_len,
      376 +            ASN_OCTET_STR, (uchar_t *)t->descr, strlen(t->descr));
      377 +
      378 +        if (strcmp(t->fmri, ND_UNKNOWN) != 0) {
      379 +                (void) memcpy(var_name, sunFmProblemFMRI_oid, oid_len);
      380 +                (void) snmp_varlist_add_variable(&notification_vars, var_name,
      381 +                    var_len, ASN_OCTET_STR, (uchar_t *)t->fmri,
      382 +                    strlen(t->fmri));
      383 +        }
      384 +
 336  385          /*
 337  386           * This function is capable of sending both v1 and v2/v3 traps.
 338  387           * Which is sent to a specific destination is determined by the
 339  388           * configuration file(s).
 340  389           */
 341  390          send_enterprise_trap_vars(SNMP_TRAP_ENTERPRISESPECIFIC,
 342  391              sunFmProblemTrap_oid[sunFmProblemTrap_len - 1],
 343  392              (oid *)sunFmProblemTrap_oid, sunFmProblemTrap_len - 2,
 344  393              notification_vars);
 345      -        nd_debug(nhdl, "Sent SNMP trap for %s", code);
      394 +        nd_debug(nhdl, "Sent SNMP trap for %s", t->code);
 346  395  
 347  396          snmp_free_varbind(notification_vars);
 348  397  }
 349  398  
 350  399  /*
 351  400   * The SUN-IREPORT-MIB declares the following enum to represent SMF service
 352  401   * states.
 353  402   *
 354  403   * offline(0), online(1), degraded(2), disabled(3), maintenance(4),
 355  404   * uninitialized(5)
 356  405   *
 357  406   * This function converts a string representation of an SMF service state
 358      - * to it's corresponding enum val.
      407 + * to its corresponding enum val.
 359  408   */
 360  409  static int
 361  410  state_to_val(char *statestr, uint32_t *stateval)
 362  411  {
 363  412          if (strcmp(statestr, "offline") == 0)
 364  413                  *stateval = 0;
 365  414          else if (strcmp(statestr, "online") == 0)
 366  415                  *stateval = 1;
 367  416          else if (strcmp(statestr, "degraded") == 0)
 368  417                  *stateval = 2;
↓ open down ↓ 34 lines elided ↑ open up ↑
 403  452          }
 404  453  
 405  454          if (get_snmp_prefs(nhdl, pref_nvl, npref) != 0)
 406  455                  goto irpt_done;
 407  456  
 408  457          if (nd_get_event_info(nhdl, class, ev, &ev_info) != 0)
 409  458                  goto irpt_done;
 410  459  
 411  460          swtrap.host = hostname;
 412  461          swtrap.msgid = ev_info->ei_diagcode;
      462 +        swtrap.severity = ev_info->ei_severity;
 413  463          swtrap.desc = ev_info->ei_descr;
 414  464          swtrap.tstamp = (time_t)fmev_time_sec(ev);
 415  465  
 416  466          if (strncmp(class, "ireport.os.smf", 14) == 0) {
 417  467                  swtrap.fmri = ev_info->ei_fmri;
 418  468                  if (state_to_val(ev_info->ei_from_state, &swtrap.from_state)
 419  469                      < 0 ||
 420  470                      state_to_val(ev_info->ei_to_state, &swtrap.to_state) < 0) {
 421  471                          nd_error(nhdl, "Malformed event - invalid svc state");
 422  472                          nd_dump_nvlist(nhdl, ev_info->ei_payload);
↓ open down ↓ 6 lines elided ↑ open up ↑
 429  479  irpt_done:
 430  480          if (ev_info)
 431  481                  nd_free_event_info(ev_info);
 432  482          nd_free_nvlarray(pref_nvl, npref);
 433  483  }
 434  484  
 435  485  /*ARGSUSED*/
 436  486  static void
 437  487  list_cb(fmev_t ev, const char *class, nvlist_t *nvl, void *arg)
 438  488  {
 439      -        char *uuid;
 440  489          uint8_t version;
 441  490          nd_ev_info_t *ev_info = NULL;
 442  491          nvlist_t **pref_nvl = NULL;
      492 +        fmproblem_trap_t fmtrap;
 443  493          uint_t npref;
 444  494          int ret;
 445  495          boolean_t domsg;
 446  496  
 447  497          nd_debug(nhdl, "Received event of class %s", class);
 448  498  
 449  499          ret = nd_get_notify_prefs(nhdl, "snmp", ev, &pref_nvl, &npref);
 450  500          if (ret == SCF_ERROR_NOT_FOUND) {
 451  501                  /*
 452  502                   * No snmp notification preferences specified for this type of
↓ open down ↓ 15 lines elided ↑ open up ↑
 468  518          /*
 469  519           * If the message payload member is set to 0, then it's an event we
 470  520           * typically suppress messaging on, so we won't send a trap for it.
 471  521           */
 472  522          if (nvlist_lookup_boolean_value(ev_info->ei_payload, FM_SUSPECT_MESSAGE,
 473  523              &domsg) == 0 && !domsg) {
 474  524                  nd_debug(nhdl, "Messaging suppressed for this event");
 475  525                  goto listcb_done;
 476  526          }
 477  527  
 478      -        if (nvlist_lookup_uint8(ev_info->ei_payload, FM_VERSION, &version)
 479      -            != 0 || version > FM_SUSPECT_VERSION) {
      528 +        if (nvlist_lookup_uint8(ev_info->ei_payload, FM_VERSION,
      529 +            &version) != 0 || version > FM_SUSPECT_VERSION) {
 480  530                  nd_error(nhdl, "invalid event version: %u", version);
 481  531                  goto listcb_done;
 482  532          }
 483  533  
 484      -        (void) nvlist_lookup_string(ev_info->ei_payload, FM_SUSPECT_UUID,
 485      -            &uuid);
      534 +        fmtrap.uuid = ev_info->ei_uuid;
      535 +        fmtrap.host = hostname;
      536 +        fmtrap.code = ev_info->ei_diagcode;
      537 +        fmtrap.type = ev_info->ei_type;
      538 +        fmtrap.severity = ev_info->ei_severity;
      539 +        fmtrap.url = ev_info->ei_url;
      540 +        fmtrap.descr = ev_info->ei_descr;
      541 +        fmtrap.fmri = ev_info->ei_fmri;
 486  542  
 487      -        if (strcmp(ev_info->ei_url, ND_UNKNOWN) != 0)
 488      -                send_fm_trap(uuid, ev_info->ei_diagcode, ev_info->ei_url);
 489      -        else
 490      -                nd_error(nhdl, "failed to format url for %s", uuid);
      543 +        send_fm_trap(&fmtrap);
 491  544  listcb_done:
 492  545          nd_free_nvlarray(pref_nvl, npref);
 493  546          if (ev_info)
 494  547                  nd_free_event_info(ev_info);
 495  548  }
 496  549  
 497  550  static int
 498  551  init_sma(void)
 499  552  {
 500  553          int err;
↓ open down ↓ 187 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX