2 Unix SMB/CIFS implementation.
4 Copyright (C) Andrew Tridgell 2006
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 abstract the various kernel interfaces to change notify into a
23 single Samba friendly interface
27 #include "system/filesys.h"
28 #include "ntvfs/sysdep/sys_notify.h"
29 #include "lib/events/events.h"
30 #include "lib/util/dlinklist.h"
33 /* list of registered backends */
34 static struct sys_notify_backend
*backends
;
35 static uint32_t num_backends
;
37 #define NOTIFY_BACKEND "notify-backend"
40 initialise a system change notify backend
42 _PUBLIC_
struct sys_notify_context
*sys_notify_context_create(struct share_config
*scfg
,
44 struct event_context
*ev
)
46 struct sys_notify_context
*ctx
;
50 if (num_backends
== 0) {
55 ev
= event_context_find(mem_ctx
);
58 ctx
= talloc_zero(mem_ctx
, struct sys_notify_context
);
65 bname
= share_string_option(scfg
, NOTIFY_BACKEND
, NULL
);
68 bname
= backends
[0].name
;
70 bname
= "__unknown__";
74 for (i
=0;i
<num_backends
;i
++) {
75 if (strcasecmp(backends
[i
].name
, bname
) == 0) {
76 bname
= backends
[i
].name
;
82 ctx
->notify_watch
= NULL
;
84 if (i
< num_backends
) {
85 ctx
->notify_watch
= backends
[i
].notify_watch
;
94 note that this call must modify the e->filter and e->subdir_filter
95 bits to remove ones handled by this backend. Any remaining bits will
96 be handled by the generic notify layer
98 _PUBLIC_ NTSTATUS
sys_notify_watch(struct sys_notify_context
*ctx
,
99 struct notify_entry
*e
,
100 sys_notify_callback_t callback
,
101 void *private_data
, void *handle
)
103 if (!ctx
->notify_watch
) {
104 return NT_STATUS_INVALID_SYSTEM_SERVICE
;
106 return ctx
->notify_watch(ctx
, e
, callback
, private_data
, handle
);
110 register a notify backend
112 _PUBLIC_ NTSTATUS
sys_notify_register(struct sys_notify_backend
*backend
)
114 struct sys_notify_backend
*b
;
115 b
= talloc_realloc(talloc_autofree_context(), backends
,
116 struct sys_notify_backend
, num_backends
+1);
117 NT_STATUS_HAVE_NO_MEMORY(b
);
119 backends
[num_backends
] = *backend
;
124 _PUBLIC_ NTSTATUS
sys_notify_init(void)
126 static BOOL initialized
= False
;
128 init_module_fn static_init
[] = STATIC_sys_notify_MODULES
;
129 init_module_fn
*shared_init
;
131 if (initialized
) return NT_STATUS_OK
;
134 shared_init
= load_samba_modules(NULL
, "sys_notify");
136 run_init_functions(static_init
);
137 run_init_functions(shared_init
);
139 talloc_free(shared_init
);