201
202 nvl = (nvlist_t *)(uintptr_t)SE_ATTR_PTR(ev);
203 if (nvl && nvlist_dup(nvl, &cnvl, 0) != 0) {
204 free(copy);
205 return (NULL);
206 }
207
208 SE_ATTR_PTR(copy) = (uintptr_t)cnvl;
209 SE_FLAG(copy) = 0; /* unpacked */
210 return (copy);
211 }
212
213 /*
214 * sysevent_free - Free memory allocated for an event buffer
215 */
216 void
217 sysevent_free(sysevent_t *ev)
218 {
219 nvlist_t *attr_list = (nvlist_t *)(uintptr_t)SE_ATTR_PTR(ev);
220
221 if (attr_list)
222 nvlist_free(attr_list);
223 free(ev);
224 }
225
226 /*
227 * The following routines are used to extract attribute data from a sysevent
228 * handle.
229 */
230
231 /*
232 * sysevent_get_attr_list - allocate and return an attribute associated with
233 * the given sysevent buffer.
234 */
235 int
236 sysevent_get_attr_list(sysevent_t *ev, nvlist_t **nvlist)
237 {
238 int error;
239 caddr_t attr;
240 size_t attr_len;
241 uint64_t attr_offset;
1445 * Check next nvpair - either subclass or
1446 * class
1447 */
1448 if ((nvpair = nvlist_next_nvpair(nvl, nvpair))
1449 == NULL) {
1450 new_class = 0;
1451 break;
1452 } else if (strcmp(nvpair_name(nvpair),
1453 CLASS_NAME) == 0) {
1454 break;
1455 }
1456 }
1457 }
1458 nvlist_free(nvl);
1459 }
1460 return (0);
1461
1462 create_failed:
1463 dealloc_subscribers(shp);
1464 free_cached_registration(shp);
1465 if (nvl)
1466 nvlist_free(nvl);
1467 return (-1);
1468
1469 }
1470
1471 /*
1472 * cache_update_service - generic event publisher service routine. This routine
1473 * is called in response to a registration cache update.
1474 *
1475 */
1476 /*ARGSUSED*/
1477 static void
1478 cache_update_service(void *cookie, char *args, size_t alen,
1479 door_desc_t *ddp, uint_t ndid)
1480 {
1481 int ret = 0;
1482 uint_t num_elem;
1483 char *class, **event_list;
1484 size_t datalen;
1485 uint32_t sub_id;
|
201
202 nvl = (nvlist_t *)(uintptr_t)SE_ATTR_PTR(ev);
203 if (nvl && nvlist_dup(nvl, &cnvl, 0) != 0) {
204 free(copy);
205 return (NULL);
206 }
207
208 SE_ATTR_PTR(copy) = (uintptr_t)cnvl;
209 SE_FLAG(copy) = 0; /* unpacked */
210 return (copy);
211 }
212
213 /*
214 * sysevent_free - Free memory allocated for an event buffer
215 */
216 void
217 sysevent_free(sysevent_t *ev)
218 {
219 nvlist_t *attr_list = (nvlist_t *)(uintptr_t)SE_ATTR_PTR(ev);
220
221 nvlist_free(attr_list);
222 free(ev);
223 }
224
225 /*
226 * The following routines are used to extract attribute data from a sysevent
227 * handle.
228 */
229
230 /*
231 * sysevent_get_attr_list - allocate and return an attribute associated with
232 * the given sysevent buffer.
233 */
234 int
235 sysevent_get_attr_list(sysevent_t *ev, nvlist_t **nvlist)
236 {
237 int error;
238 caddr_t attr;
239 size_t attr_len;
240 uint64_t attr_offset;
1444 * Check next nvpair - either subclass or
1445 * class
1446 */
1447 if ((nvpair = nvlist_next_nvpair(nvl, nvpair))
1448 == NULL) {
1449 new_class = 0;
1450 break;
1451 } else if (strcmp(nvpair_name(nvpair),
1452 CLASS_NAME) == 0) {
1453 break;
1454 }
1455 }
1456 }
1457 nvlist_free(nvl);
1458 }
1459 return (0);
1460
1461 create_failed:
1462 dealloc_subscribers(shp);
1463 free_cached_registration(shp);
1464 nvlist_free(nvl);
1465 return (-1);
1466
1467 }
1468
1469 /*
1470 * cache_update_service - generic event publisher service routine. This routine
1471 * is called in response to a registration cache update.
1472 *
1473 */
1474 /*ARGSUSED*/
1475 static void
1476 cache_update_service(void *cookie, char *args, size_t alen,
1477 door_desc_t *ddp, uint_t ndid)
1478 {
1479 int ret = 0;
1480 uint_t num_elem;
1481 char *class, **event_list;
1482 size_t datalen;
1483 uint32_t sub_id;
|