Device drivers use the ddi_log_sysevent(9F) interface to generate and log events with the system.
ddi_log_sysevent() uses the following syntax:
int ddi_log_sysevent(dev_info_t *dip, char *vendor, char *class, char *subclass, nvlist_t *attr-list, sysevent_id_t *eidp, int sleep-flag);
A pointer to the dev_info node for this driver.
A pointer to a string that defines the driver's vendor. Third-party drivers should use their company's stock symbol or a similarly enduring identifier. Sun-supplied drivers use DDI_VENDOR_SUNW.
A pointer to a string defining the event's class. class is a driver-specific value. An example of a class might be a string that represents a set of environmental conditions that affect a device. This value must be understood by the event consumer.
A driver-specific string that represents a subset of the class argument. For example, within a class that represents environmental conditions, an event subclass might refer to the device's temperature. This value must be intelligible to the event consumer.
A pointer to an nvlist_t structure that lists name-value attributes associated with the event. Name-value attributes are driver-defined and can refer to a specific attribute or condition of the device.
For example, consider a device that reads both CD-ROMs and DVDs. That device could have an attribute with the name disc_type and the value equal to either cd_rom or dvd.
As with class and subclass, an event consumer must be able to interpret the name-value pairs.
If the event has no attributes, then this argument should be set to NULL.
The address of a sysevent_id_t structure. The sysevent_id_t structure is used to provide a unique identification for the event. ddi_log_sysevent(9F) returns this structure with a system-provided event sequence number and time stamp. See the ddi_log_sysevent(9F) man page for more information on the sysevent_id_t structure.
A flag that indicates how the caller wants to handle the possibility of resources not being available. If sleep-flag is set to DDI_SLEEP, the driver blocks until the resources become available. With DDI_NOSLEEP, an allocation will not sleep and cannot be guaranteed to succeed. If DDI_ENOMEM is returned, the driver would need to retry the operation at a later time.
Even with DDI_SLEEP, other error returns are possible with this interface, such as system busy, the syseventd daemon not responding, or trying to log an event in interrupt context.
A device driver performs the following tasks to log events:
Allocate memory for the attribute list using nvlist_alloc(9F)
Add name-value pairs to the attribute list
Use the ddi_log_sysevent(9F) function to log the event in the sysevent queue
Call nvlist_free(9F) when the attribute list is no longer needed
The following example demonstrates how to use ddi_log_sysevent().
char *vendor_name = "DDI_VENDOR_JGJG" char *my_class = "JGJG_event"; char *my_subclass = "JGJG_alert"; nvlist_t *nvl; /* ... */ nvlist_alloc(&nvl, nvflag, kmflag); /* ... */ (void) nvlist_add_byte_array(nvl, propname, (uchar_t *)propval, proplen + 1); /* ... */ if (ddi_log_sysevent(dip, vendor_name, my_class, my_subclass, nvl, NULL, DDI_SLEEP)!= DDI_SUCCESS) cmn_err(CE_WARN, "error logging system event"); nvlist_free(nvl);