diff options
author | kib <kib@FreeBSD.org> | 2010-03-19 10:56:30 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2010-03-19 10:56:30 +0000 |
commit | d19a162142eef526ef1ad29b8939ef0b7a92d04c (patch) | |
tree | c3b82f25093a43e8d9ad116599e3b6d881c14e85 /sys/kern/kern_syscalls.c | |
parent | 7932a1f757993966de97162cc026b99b93fd4d1c (diff) | |
download | FreeBSD-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.c | 30 |
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); +} |