summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_syscalls.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2010-03-19 10:56:30 +0000
committerkib <kib@FreeBSD.org>2010-03-19 10:56:30 +0000
commitd19a162142eef526ef1ad29b8939ef0b7a92d04c (patch)
treec3b82f25093a43e8d9ad116599e3b6d881c14e85 /sys/kern/kern_syscalls.c
parent7932a1f757993966de97162cc026b99b93fd4d1c (diff)
downloadFreeBSD-src-d19a162142eef526ef1ad29b8939ef0b7a92d04c.zip
FreeBSD-src-d19a162142eef526ef1ad29b8939ef0b7a92d04c.tar.gz
Introduce SYSCALL_INIT_HELPER and SYSCALL32_INIT_HELPER macros and
neccessary support functions to allow registering dynamically loaded syscalls from the MOD_LOAD handlers. Helpers handle registration failures semi-automatically. Reviewed by: jhb MFC after: 2 weeks
Diffstat (limited to 'sys/kern/kern_syscalls.c')
-rw-r--r--sys/kern/kern_syscalls.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/sys/kern/kern_syscalls.c b/sys/kern/kern_syscalls.c
index 077aedc..9cb7b68 100644
--- a/sys/kern/kern_syscalls.c
+++ b/sys/kern/kern_syscalls.c
@@ -135,3 +135,33 @@ syscall_module_handler(struct module *mod, int what, void *arg)
else
return (0);
}
+
+int
+syscall_helper_register(struct syscall_helper_data *sd)
+{
+ struct syscall_helper_data *sd1;
+ int error;
+
+ for (sd1 = sd; sd1->syscall_no != NO_SYSCALL; sd1++) {
+ error = syscall_register(&sd1->syscall_no, &sd1->new_sysent,
+ &sd1->old_sysent);
+ if (error != 0) {
+ syscall_helper_unregister(sd);
+ return (error);
+ }
+ sd1->registered = 1;
+ }
+ return (0);
+}
+
+int
+syscall_helper_unregister(struct syscall_helper_data *sd)
+{
+ struct syscall_helper_data *sd1;
+
+ for (sd1 = sd; sd1->registered != 0; sd1++) {
+ syscall_deregister(&sd1->syscall_no, &sd1->old_sysent);
+ sd1->registered = 0;
+ }
+ return (0);
+}
OpenPOWER on IntegriCloud