f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * CDDL HEADER START
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * The contents of this file are subject to the terms of the
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Common Development and Distribution License (the "License").
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * You may not use this file except in compliance with the License.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * or http://www.opensolaris.org/os/licensing.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * See the License for the specific language governing permissions
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * and limitations under the License.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * When distributing Covered Code, include this CDDL HEADER in each
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * If applicable, add the following below this CDDL HEADER, with the
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * fields enclosed by brackets "[]" replaced with your own identifying
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * information: Portions Copyright [yyyy] [name of copyright owner]
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * CDDL HEADER END
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Simple-minded raw event publication from user context. See extensive
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * comments in libfmevent.h. These interfaces remain Project Private -
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * they have to evolve before rollout to Public levels.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Events are dispatched synchronously using the GPEC sysevent mechanism.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * The caller context must therefore be one in which a sysevent_evc_publish
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * (and possibly sysevent_evc_bind if not already bound) is safe. We will
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * also allocate and manipulate nvlists.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Since we use GPEC, which has no least privilege awareness, these interfaces
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * will only work for would-be producers running as root.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * There is no event rate throttling applied, so we rely on producers
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * to throttle themselves. A future refinement should apply mandatory
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * but tuneable throttling on a per-producer basis. In this first version
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * the only throttle is the publication event queue depth - we'll drop
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * events when the queue is full.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * We can publish over four channels, for privileged/non-privileged and
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * high/low priority. Since only privileged producers will work now
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * (see above) we hardcode priv == B_TRUE and so only two channels are
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * actually used, separating higher and lower value streams from privileged
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * producers.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby#include <stdarg.h>
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby#include <unistd.h>
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby#include <stdlib.h>
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby#include <atomic.h>
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby#include <errno.h>
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby#include <pthread.h>
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby#include <strings.h>
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby#include "fmev_impl.h"
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic struct {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby const char *name; /* channel name */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby evchan_t *binding; /* GPEC binding, once bound */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby const uint32_t flags; /* flags to use in binding */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby} chaninfo[] = {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby { FMEV_CHAN_USER_NOPRIV_LV, NULL, 0 },
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby { FMEV_CHAN_USER_NOPRIV_HV, NULL, 0 },
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby { FMEV_CHAN_USER_PRIV_LV, NULL, EVCH_HOLD_PEND_INDEF },
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby { FMEV_CHAN_USER_PRIV_HV, NULL, EVCH_HOLD_PEND_INDEF}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby};
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby#define CHANIDX(priv, pri) (2 * ((priv) != 0) + (pri == FMEV_HIPRI))
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby#define CHAN_NAME(priv, pri) (chaninfo[CHANIDX(priv, pri)].name)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby#define CHAN_BINDING(priv, pri) (chaninfo[CHANIDX(priv, pri)].binding)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby#define CHAN_FLAGS(priv, pri) (chaninfo[CHANIDX(priv, pri)].flags)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Called after fork in the new child. We clear the cached event
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * channel bindings which are only valid in the process that created
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * them.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic void
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyclear_bindings(void)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int i;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (i = 0; i < sizeof (chaninfo) / sizeof chaninfo[0]; i++)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby chaninfo[i].binding = NULL;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby#pragma init(_fmev_publish_init)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic void
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby_fmev_publish_init(void)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) pthread_atfork(NULL, NULL, clear_bindings);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic evchan_t *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbybind_channel(boolean_t priv, fmev_pri_t pri)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby evchan_t **evcpp = &CHAN_BINDING(priv, pri);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby evchan_t *evc;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (*evcpp != NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (*evcpp);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (sysevent_evc_bind(CHAN_NAME(priv, pri), &evc,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby EVCH_CREAT | CHAN_FLAGS(priv, pri)) != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (NULL);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (atomic_cas_ptr(evcpp, NULL, evc) != NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) sysevent_evc_unbind(evc);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (*evcpp);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic fmev_err_t
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyvrfy_ruleset(const char *ruleset)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (ruleset != NULL &&
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby strnlen(ruleset, FMEV_MAX_RULESET_LEN) == FMEV_MAX_RULESET_LEN)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (FMEVERR_STRING2BIG);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (FMEV_OK);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic fmev_err_t
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyvrfy_class(const char *class)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (class == NULL || *class == '\0')
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (FMEVERR_API);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (strnlen(class, FMEV_PUB_MAXCLASSLEN) == FMEV_PUB_MAXCLASSLEN)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (FMEVERR_STRING2BIG);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (FMEV_OK);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic fmev_err_t
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyvrfy_subclass(const char *subclass)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (subclass == NULL || *subclass == '\0')
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (FMEVERR_API);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (strnlen(subclass, FMEV_PUB_MAXSUBCLASSLEN) ==
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby FMEV_PUB_MAXSUBCLASSLEN)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (FMEVERR_STRING2BIG);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (FMEV_OK);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic fmev_err_t
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyvrfy_pri(fmev_pri_t pri)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (pri == FMEV_LOPRI || pri == FMEV_HIPRI ?
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby FMEV_OK : FMEVERR_API);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyconst char *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyfmev_pri_string(fmev_pri_t pri)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby static const char *pristr[] = { "low", "high" };
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (vrfy_pri(pri) != FMEV_OK)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (NULL);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (pristr[pri - FMEV_LOPRI]);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic fmev_err_t
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyvrfy(const char **rulesetp, const char **classp, const char **subclassp,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby fmev_pri_t *prip)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby fmev_err_t rc = FMEV_OK;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (rulesetp && (rc = vrfy_ruleset(*rulesetp)) != FMEV_OK)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (rc);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (classp && (rc = vrfy_class(*classp)) != FMEV_OK ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby subclassp && (rc = vrfy_subclass(*subclassp)) != FMEV_OK ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby prip && (rc = vrfy_pri(*prip)) != FMEV_OK)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (rc);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (FMEV_OK);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyuint_t fmev_va2nvl_maxtuples = 100;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyfmev_err_t
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyva2nvl(nvlist_t **nvlp, va_list ap, uint_t ntuples)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_t *nvl = NULL;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby uint_t processed = 0;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *name;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (ntuples == 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (FMEVERR_INTERNAL);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((name = va_arg(ap, char *)) == NULL || name == FMEV_ARG_TERM)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (FMEVERR_VARARGS_MALFORMED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (ntuples > fmev_va2nvl_maxtuples)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (FMEVERR_VARARGS_TOOLONG);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (FMEVERR_ALLOC);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby while (name != NULL && name != FMEV_ARG_TERM && processed <= ntuples) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby data_type_t type;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int err, nelem;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby type = va_arg(ap, data_type_t);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby switch (type) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_BYTE:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_byte(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, uint_t));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_BYTE_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nelem = va_arg(ap, int);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_byte_array(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, uchar_t *), nelem);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_BOOLEAN_VALUE:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_boolean_value(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, boolean_t));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_BOOLEAN_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nelem = va_arg(ap, int);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_boolean_array(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, boolean_t *), nelem);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT8:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_int8(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, int));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT8_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nelem = va_arg(ap, int);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_int8_array(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, int8_t *), nelem);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT8:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_uint8(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, uint_t));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT8_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nelem = va_arg(ap, int);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_uint8_array(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, uint8_t *), nelem);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT16:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_int16(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, int));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT16_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nelem = va_arg(ap, int);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_int16_array(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, int16_t *), nelem);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT16:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_uint16(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, uint_t));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT16_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nelem = va_arg(ap, int);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_uint16_array(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, uint16_t *), nelem);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT32:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_int32(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, int32_t));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT32_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nelem = va_arg(ap, int);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_int32_array(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, int32_t *), nelem);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT32:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_uint32(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, uint32_t));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT32_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nelem = va_arg(ap, int);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_uint32_array(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, uint32_t *), nelem);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT64:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_int64(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, int64_t));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT64_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nelem = va_arg(ap, int);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_int64_array(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, int64_t *), nelem);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT64:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_uint64(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, uint64_t));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT64_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nelem = va_arg(ap, int);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_uint64_array(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, uint64_t *), nelem);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_STRING:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_string(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, char *));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_STRING_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nelem = va_arg(ap, int);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_string_array(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, char **), nelem);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_NVLIST:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_nvlist(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, nvlist_t *));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_NVLIST_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nelem = va_arg(ap, int);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_nvlist_array(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, nvlist_t **), nelem);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_HRTIME:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_hrtime(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, hrtime_t));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_DOUBLE:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_double(nvl, name,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_arg(ap, double));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby default:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = EINVAL;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (err)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break; /* terminate on first error */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby processed++;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby name = va_arg(ap, char *);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (name != FMEV_ARG_TERM || processed != ntuples) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *nvlp = NULL;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_free(nvl);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (FMEVERR_VARARGS_MALFORMED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *nvlp = nvl;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (FMEV_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic fmev_err_t
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbydo_publish(const char *file, const char *func, int64_t line,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby const char *ruleset, const char *class, const char *subclass,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby fmev_pri_t pri, nvlist_t *nvl, uint_t ntuples, va_list ap)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby fmev_err_t rc = FMEVERR_INTERNAL;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby boolean_t priv = B_TRUE;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_t *tmpnvl = NULL;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_t *pub;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby evchan_t *evc;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (nvl) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby ASSERT(ntuples == 0);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Enforce NV_UNIQUE_NAME
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((nvlist_nvflag(nvl) & NV_UNIQUE_NAME) != NV_UNIQUE_NAME)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (FMEVERR_NVLIST);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby pub = nvl;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby } else if (ntuples != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby fmev_err_t err;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = va2nvl(&tmpnvl, ap, ntuples);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (err != FMEV_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (err);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby pub = tmpnvl;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby } else {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Even if the caller has no tuples to publish (just an event
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * class and subclass), we are going to add some detector
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * information so we need some nvlist.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (nvlist_alloc(&tmpnvl, NV_UNIQUE_NAME, 0) != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (FMEVERR_ALLOC);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby pub = tmpnvl;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby evc = bind_channel(priv, pri);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (evc == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby rc = FMEVERR_INTERNAL;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto done;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Add detector information
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (file && nvlist_add_string(pub, "__fmev_file", file) != 0 ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby func && nvlist_add_string(pub, "__fmev_func", func) != 0 ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby line != -1 && nvlist_add_int64(pub, "__fmev_line", line) != 0 ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_add_int32(pub, "__fmev_pid", getpid()) != 0 ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_add_string(pub, "__fmev_execname", getexecname()) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby rc = FMEVERR_ALLOC;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto done;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (ruleset == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby ruleset = FMEV_RULESET_DEFAULT;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * We abuse the GPEC publication arguments as follows:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * GPEC argument Our usage
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * -------------------- -----------------
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * const char *class Raw class
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * const char *subclass Raw subclass
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * const char *vendor Ruleset name
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * const char *pub_name Unused
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * nvlist_t *attr_list Event attributes
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby rc = (sysevent_evc_publish(evc, class, subclass, ruleset, "",
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby pub, EVCH_NOSLEEP) == 0) ? FMEV_SUCCESS : FMEVERR_TRANSPORT;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbydone:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /* Free a passed in nvlist iff success */
aab83bb83be7342f6cfccaed8d5fe0b2f404855dJosef 'Jeff' Sipek if (rc == FMEV_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_free(nvl);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
aab83bb83be7342f6cfccaed8d5fe0b2f404855dJosef 'Jeff' Sipek nvlist_free(tmpnvl);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (rc);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyfmev_err_t
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby_i_fmev_publish_nvl(
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby const char *file, const char *func, int64_t line,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby const char *ruleset, const char *class, const char *subclass,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby fmev_pri_t pri, nvlist_t *attr)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby fmev_err_t rc;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((rc = vrfy(&ruleset, &class, &subclass, &pri)) != FMEV_OK)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (rc); /* any attr not freed */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (do_publish(file, func, line,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby ruleset, class, subclass,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby pri, attr, 0, NULL)); /* any attr freed iff success */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyfmev_err_t
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby_i_fmev_publish(
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby const char *file, const char *func, int64_t line,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby const char *ruleset, const char *class, const char *subclass,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby fmev_pri_t pri,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby uint_t ntuples, ...)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_list ap;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby fmev_err_t rc;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((rc = vrfy(&ruleset, &class, &subclass, &pri)) != FMEV_OK)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (rc);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (ntuples != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_start(ap, ntuples);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby rc = do_publish(file, func, line,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby ruleset, class, subclass,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby pri, NULL, ntuples, ap);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (ntuples != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_end(ap);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (rc);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby#pragma weak fmev_publish = _fmev_publish
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby#pragma weak fmev_rspublish = _fmev_rspublish
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic fmev_err_t
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby_fmev_publish(const char *class, const char *subclass, fmev_pri_t pri,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby uint_t ntuples, ...)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby fmev_err_t rc;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_list ap;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((rc = vrfy(NULL, &class, &subclass, &pri)) != FMEV_OK)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (rc);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (ntuples != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_start(ap, ntuples);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby rc = do_publish(NULL, NULL, -1,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby FMEV_RULESET_DEFAULT, class, subclass,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby pri, NULL, ntuples, ap);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (ntuples != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_end(ap);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (rc);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic fmev_err_t
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby_fmev_rspublish(const char *ruleset, const char *class, const char *subclass,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby fmev_pri_t pri, uint_t ntuples, ...)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby fmev_err_t rc;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_list ap;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((rc = vrfy(&ruleset, &class, &subclass, &pri)) != FMEV_OK)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (rc);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (ntuples != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_start(ap, ntuples);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby rc = do_publish(NULL, NULL, -1,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby ruleset, class, subclass,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby pri, NULL, ntuples, ap);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (ntuples != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby va_end(ap);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (rc);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}