1*381a2a9aSdr146992 /* 2*381a2a9aSdr146992 * CDDL HEADER START 3*381a2a9aSdr146992 * 4*381a2a9aSdr146992 * The contents of this file are subject to the terms of the 5*381a2a9aSdr146992 * Common Development and Distribution License (the "License"). 6*381a2a9aSdr146992 * You may not use this file except in compliance with the License. 7*381a2a9aSdr146992 * 8*381a2a9aSdr146992 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*381a2a9aSdr146992 * or http://www.opensolaris.org/os/licensing. 10*381a2a9aSdr146992 * See the License for the specific language governing permissions 11*381a2a9aSdr146992 * and limitations under the License. 12*381a2a9aSdr146992 * 13*381a2a9aSdr146992 * When distributing Covered Code, include this CDDL HEADER in each 14*381a2a9aSdr146992 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*381a2a9aSdr146992 * If applicable, add the following below this CDDL HEADER, with the 16*381a2a9aSdr146992 * fields enclosed by brackets "[]" replaced with your own identifying 17*381a2a9aSdr146992 * information: Portions Copyright [yyyy] [name of copyright owner] 18*381a2a9aSdr146992 * 19*381a2a9aSdr146992 * CDDL HEADER END 20*381a2a9aSdr146992 */ 21*381a2a9aSdr146992 /* 22*381a2a9aSdr146992 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 23*381a2a9aSdr146992 * Use is subject to license terms. 24*381a2a9aSdr146992 */ 25*381a2a9aSdr146992 26*381a2a9aSdr146992 /* 27*381a2a9aSdr146992 * This file includes definitions of kernel hook framework components 28*381a2a9aSdr146992 */ 29*381a2a9aSdr146992 30*381a2a9aSdr146992 #ifndef _SYS_HOOK_H 31*381a2a9aSdr146992 #define _SYS_HOOK_H 32*381a2a9aSdr146992 33*381a2a9aSdr146992 #pragma ident "%Z%%M% %I% %E% SMI" 34*381a2a9aSdr146992 35*381a2a9aSdr146992 #include <sys/queue.h> 36*381a2a9aSdr146992 37*381a2a9aSdr146992 #ifdef __cplusplus 38*381a2a9aSdr146992 extern "C" { 39*381a2a9aSdr146992 #endif 40*381a2a9aSdr146992 41*381a2a9aSdr146992 /* 42*381a2a9aSdr146992 * Definition exposed to hook provider and consumer 43*381a2a9aSdr146992 */ 44*381a2a9aSdr146992 45*381a2a9aSdr146992 #define HOOK_VERSION 1 46*381a2a9aSdr146992 47*381a2a9aSdr146992 typedef uintptr_t hook_data_t; 48*381a2a9aSdr146992 49*381a2a9aSdr146992 struct hook_event_int; 50*381a2a9aSdr146992 typedef struct hook_event_int *hook_event_token_t; 51*381a2a9aSdr146992 52*381a2a9aSdr146992 typedef int (* hook_func_t)(hook_event_token_t, hook_data_t); 53*381a2a9aSdr146992 54*381a2a9aSdr146992 /* 55*381a2a9aSdr146992 * Hook 56*381a2a9aSdr146992 */ 57*381a2a9aSdr146992 typedef struct hook { 58*381a2a9aSdr146992 int32_t h_version; /* version number */ 59*381a2a9aSdr146992 hook_func_t h_func; /* callback func */ 60*381a2a9aSdr146992 char *h_name; /* name of this hook */ 61*381a2a9aSdr146992 int h_flags; /* extra hook properties */ 62*381a2a9aSdr146992 } hook_t; 63*381a2a9aSdr146992 64*381a2a9aSdr146992 #define HOOK_INIT(x, fn, r) \ 65*381a2a9aSdr146992 do { \ 66*381a2a9aSdr146992 (x)->h_version = HOOK_VERSION; \ 67*381a2a9aSdr146992 (x)->h_func = (fn); \ 68*381a2a9aSdr146992 (x)->h_name = (r); \ 69*381a2a9aSdr146992 (x)->h_flags = 0; \ 70*381a2a9aSdr146992 _NOTE(CONSTCOND) \ 71*381a2a9aSdr146992 } while (0) 72*381a2a9aSdr146992 73*381a2a9aSdr146992 /* 74*381a2a9aSdr146992 * Family 75*381a2a9aSdr146992 */ 76*381a2a9aSdr146992 typedef struct hook_family { 77*381a2a9aSdr146992 int32_t hf_version; /* version number */ 78*381a2a9aSdr146992 char *hf_name; /* family name */ 79*381a2a9aSdr146992 } hook_family_t; 80*381a2a9aSdr146992 81*381a2a9aSdr146992 #define HOOK_FAMILY_INIT(x, y) \ 82*381a2a9aSdr146992 do { \ 83*381a2a9aSdr146992 (x)->hf_version = HOOK_VERSION; \ 84*381a2a9aSdr146992 (x)->hf_name = (y); \ 85*381a2a9aSdr146992 _NOTE(CONSTCOND) \ 86*381a2a9aSdr146992 } while (0) 87*381a2a9aSdr146992 88*381a2a9aSdr146992 /* 89*381a2a9aSdr146992 * Event 90*381a2a9aSdr146992 */ 91*381a2a9aSdr146992 typedef struct hook_event { 92*381a2a9aSdr146992 int32_t he_version; /* version number */ 93*381a2a9aSdr146992 char *he_name; /* name of this hook list */ 94*381a2a9aSdr146992 int he_flags; /* 1 = multiple entries allowed */ 95*381a2a9aSdr146992 boolean_t he_interested; /* true if callback exist */ 96*381a2a9aSdr146992 } hook_event_t; 97*381a2a9aSdr146992 98*381a2a9aSdr146992 #define HOOK_RDONLY 0x1 /* Callbacks must not change data */ 99*381a2a9aSdr146992 /* Multiple callbacks are allowed */ 100*381a2a9aSdr146992 101*381a2a9aSdr146992 #define HOOK_EVENT_INIT(x, y) \ 102*381a2a9aSdr146992 do { \ 103*381a2a9aSdr146992 (x)->he_version = HOOK_VERSION; \ 104*381a2a9aSdr146992 (x)->he_name = (y); \ 105*381a2a9aSdr146992 (x)->he_flags = 0; \ 106*381a2a9aSdr146992 (x)->he_interested = B_FALSE; \ 107*381a2a9aSdr146992 _NOTE(CONSTCOND) \ 108*381a2a9aSdr146992 } while (0) 109*381a2a9aSdr146992 110*381a2a9aSdr146992 111*381a2a9aSdr146992 #ifdef __cplusplus 112*381a2a9aSdr146992 } 113*381a2a9aSdr146992 #endif 114*381a2a9aSdr146992 115*381a2a9aSdr146992 #endif /* _SYS_HOOK_H */ 116