From: <da...@us...> - 2002-10-15 12:41:53
|
Update of /cvsroot/cerber/cerb-ng/kcerb In directory usw-pr-cvs1:/tmp/cvs-serv14469 Modified Files: cerb_action.c cerb_action.h cerb_desc.c cerb_desc.h cerb_macros.h cerb_main.c cerb_malloc.c cerb_malloc.h cerb_rules.c cerb_rules.h cerb_syscalls.c cerb_sysctl.c cerb_urules.c Log Message: Index: cerb_action.c =================================================================== RCS file: /cvsroot/cerber/cerb-ng/kcerb/cerb_action.c,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** cerb_action.c 8 Oct 2002 23:43:34 -0000 1.25 --- cerb_action.c 15 Oct 2002 12:41:47 -0000 1.26 *************** *** 10,13 **** --- 10,15 ---- #include <sys/param.h> #include <sys/proc.h> + #include <sys/file.h> + #include <sys/filedesc.h> #include <sys/sysent.h> #include <sys/malloc.h> *************** *** 93,96 **** --- 95,99 ---- fcb_op_finfo, /* ECB_GETNLINKS_O */ fcb_op_finfo, /* ECB_GETSIZE_O */ + fcb_op_fcache, /* ECB_FCACHE_O */ fcb_op_fd2, /* ECB_FD2NAME_O */ fcb_op_fd2, /* ECB_FD2INODE_O */ *************** *** 175,178 **** --- 178,182 ---- "getnlinks", /* ECB_GETNLINKS_O */ "getsize", /* ECB_GETSIZE_O */ + "fcache", /* ECB_FCACHE_O */ "fd2name", /* ECB_FD2NAME_O */ "fd2inode", /* ECB_FD2INODE_O */ *************** *** 1006,1009 **** --- 1010,1051 ---- retv->v_ret = groupmember(gid, proc->p_cred->pc_ucred); retv->v_size = 0; + + return (0); + } + + /* + * This function cache filename and descriptor. + */ + int + fcb_op_fcache(CB_OPARGS) + { + struct fileops *fo; + struct proc *proc; + char *path; + int fd; + + if (ccb_desc_cache != 1) + return (0); + + if (nvals == 2) { + proc = p; + fd = v[0]->v_val; + path = v[1]->v_str; + } else if (nvals == 3) { + if ((proc = pfind(v[0]->v_uval)) == NULL) + return (ESRCH); + fd = v[1]->v_val; + path = v[2]->v_str; + } else { + MCB_XDEBUG(EINVAL, "Invalid number of arguments."); + } + + if ((u_int)fd >= proc->p_fd->fd_nfiles) + MCB_XDEBUG(EBADF, "Invalid descriptor number."); + + fo = proc->p_fd->fd_ofiles[fd]->f_ops; + fcb_desc_add(proc, path, proc->p_fd->fd_ofiles[fd], fo->fo_read, + fo->fo_close, &(fo->fo_close)); + fo->fo_close = fcb_desc_close; return (0); Index: cerb_action.h =================================================================== RCS file: /cvsroot/cerber/cerb-ng/kcerb/cerb_action.h,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** cerb_action.h 8 Oct 2002 23:43:34 -0000 1.22 --- cerb_action.h 15 Oct 2002 12:41:47 -0000 1.23 *************** *** 88,91 **** --- 88,92 ---- ECB_GETNLINKS_O, /* getnlinks() */ ECB_GETSIZE_O, /* getsize() */ + ECB_FCACHE_O, /* fcache() */ ECB_FD2NAME_O, /* fd2name() */ ECB_FD2INODE_O, /* fd2inode() */ *************** *** 131,134 **** --- 132,136 ---- int fcb_op_getpinfo(CB_OPARGS); int fcb_op_ismember(CB_OPARGS); + int fcb_op_fcache(CB_OPARGS); int fcb_op_fd2(CB_OPARGS); int fcb_op_sysctl(CB_OPARGS); Index: cerb_desc.c =================================================================== RCS file: /cvsroot/cerber/cerb-ng/kcerb/cerb_desc.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** cerb_desc.c 22 Sep 2002 01:39:29 -0000 1.6 --- cerb_desc.c 15 Oct 2002 12:41:47 -0000 1.7 *************** *** 25,31 **** static SLIST_HEAD(, scb_desc) vcb_desc_head; static SLIST_HEAD(, scb_dclose) vcb_dclose_head; ! static char *vcb_desc_null = "[null]"; --- 25,33 ---- + u_int ccb_desc_cache = 1; static SLIST_HEAD(, scb_desc) vcb_desc_head; static SLIST_HEAD(, scb_dclose) vcb_dclose_head; ! char *vcb_desc_null = "[null]"; ! sy_call_t *vcb_desc_open; *************** *** 154,157 **** --- 156,160 ---- MCB_FREE(fd); } + SLIST_HEAD_INIT(&vcb_desc_head); } *************** *** 167,170 **** --- 170,174 ---- MCB_FREE(act); } + SLIST_HEAD_INIT(&vcb_dclose_head); } *************** *** 213,215 **** --- 217,238 ---- return (fd->d_name); + } + + /* + * This function is only turned on when we're caching every filename. + */ + int + fcb_desc_open(register struct proc *p, register struct open_args *uap) + { + struct fileops *fo; + int ret; + + if ((ret = open(p, uap)) == 0) { + fo = p->p_fd->fd_ofiles[p->p_retval[0]]->f_ops; + fcb_desc_add(p, uap->path, p->p_fd->fd_ofiles[p->p_retval[0]], + fo->fo_read, fo->fo_close, &(fo->fo_close)); + fo->fo_close = fcb_desc_close; + } + + return (ret); } Index: cerb_desc.h =================================================================== RCS file: /cvsroot/cerber/cerb-ng/kcerb/cerb_desc.h,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** cerb_desc.h 4 Oct 2002 18:12:05 -0000 1.7 --- cerb_desc.h 15 Oct 2002 12:41:47 -0000 1.8 *************** *** 14,20 **** --- 14,24 ---- #include <sys/proc.h> #include <sys/queue.h> + #include <sys/sysent.h> + #include <sys/sysproto.h> + extern u_int ccb_desc_cache; extern char *vcb_desc_null; + extern sy_call_t *vcb_desc_open; *************** *** 46,49 **** --- 50,54 ---- void fcb_desc_show(char *match); char *fcb_desc_getname(struct proc *p, int n); + int fcb_desc_open(register struct proc *p, register struct open_args *uap); #endif /* _CERB_DESC_H_ */ Index: cerb_macros.h =================================================================== RCS file: /cvsroot/cerber/cerb-ng/kcerb/cerb_macros.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** cerb_macros.h 26 Sep 2002 21:55:52 -0000 1.3 --- cerb_macros.h 15 Oct 2002 12:41:47 -0000 1.4 *************** *** 48,50 **** --- 48,56 ---- } while (0) + /* + * Macros returns 1 if some of tables with rules + * are active (this means that cerb is ON). + */ + #define MCB_ISCERBON (vcb_head != NULL) + #endif /* _CERB_MACROS_H_ */ Index: cerb_main.c =================================================================== RCS file: /cvsroot/cerber/cerb-ng/kcerb/cerb_main.c,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** cerb_main.c 11 Oct 2002 19:37:48 -0000 1.11 --- cerb_main.c 15 Oct 2002 12:41:47 -0000 1.12 *************** *** 33,52 **** static int - n_open(register struct proc *p, register struct open_args *uap) - { - struct fileops *fo; - int ret; - - if ((ret = open(p, uap)) == 0) { - fo = p->p_fd->fd_ofiles[p->p_retval[0]]->f_ops; - fcb_desc_add(p, uap->path, p->p_fd->fd_ofiles[p->p_retval[0]], - fo->fo_read, fo->fo_close, &(fo->fo_close)); - fo->fo_close = fcb_desc_close; - } - - return (ret); - } - - static int load (struct module *module, int cmd, void *arg) { --- 33,36 ---- *************** *** 57,63 **** fcb_malloc_init(); fcb_desc_init(); fcb_scall_cache(); fcb_rule_init(); - sysent[SYS_open].sy_call = (sy_call_t *)n_open; sysent[SYS_chmod].sy_call = (sy_call_t *)fcb_syscalls; sysent[SYS_socket].sy_call = (sy_call_t *)fcb_syscalls; --- 41,50 ---- fcb_malloc_init(); fcb_desc_init(); + if (ccb_desc_cache == 2) { + vcb_desc_open = (sy_call_t *)open; + sysent[SYS_open].sy_call = (sy_call_t *)fcb_desc_open; + } fcb_scall_cache(); fcb_rule_init(); sysent[SYS_chmod].sy_call = (sy_call_t *)fcb_syscalls; sysent[SYS_socket].sy_call = (sy_call_t *)fcb_syscalls; *************** *** 67,70 **** --- 54,59 ---- sysent[SYS_chmod].sy_call = (sy_call_t *)chmod; fcb_scall_restore(); + if (ccb_desc_cache == 2) + sysent[SYS_open].sy_call = vcb_desc_open; fcb_desc_clear(); fcb_dclose_clear(); Index: cerb_malloc.c =================================================================== RCS file: /cvsroot/cerber/cerb-ng/kcerb/cerb_malloc.c,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** cerb_malloc.c 26 Sep 2002 21:55:52 -0000 1.8 --- cerb_malloc.c 15 Oct 2002 12:41:47 -0000 1.9 *************** *** 32,36 **** ! u_int ccb_safemalloc = 1; --- 32,36 ---- ! u_int ccb_mem_safe_malloc = 1; *************** *** 84,88 **** uprintf("\n"); ! if (!ccb_safemalloc) { uprintf("Safemalloc is OFF.\n"); return; --- 84,88 ---- uprintf("\n"); ! if (!ccb_mem_safe_malloc) { uprintf("Safemalloc is OFF.\n"); return; *************** *** 115,119 **** return (NULL); ! if (!ccb_safemalloc) return (addr); --- 115,119 ---- return (NULL); ! if (!ccb_mem_safe_malloc) return (addr); *************** *** 141,145 **** return; ! if (!ccb_safemalloc) { free(addr, M_TEMP); return; --- 141,145 ---- return; ! if (!ccb_mem_safe_malloc) { free(addr, M_TEMP); return; Index: cerb_malloc.h =================================================================== RCS file: /cvsroot/cerber/cerb-ng/kcerb/cerb_malloc.h,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** cerb_malloc.h 13 Oct 2002 19:53:08 -0000 1.8 --- cerb_malloc.h 15 Oct 2002 12:41:47 -0000 1.9 *************** *** 15,19 **** ! extern u_int ccb_safemalloc; --- 15,19 ---- ! extern u_int ccb_mem_safe_malloc; Index: cerb_rules.c =================================================================== RCS file: /cvsroot/cerber/cerb-ng/kcerb/cerb_rules.c,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** cerb_rules.c 13 Oct 2002 19:53:08 -0000 1.20 --- cerb_rules.c 15 Oct 2002 12:41:47 -0000 1.21 *************** *** 28,32 **** struct scb_rule *vcb_head; struct scb_val tcb_regs[CB_NREGS_G]; ! u_int ccb_lockrules; int ccb_ntab; u_int vcb_nrules, vcb_step; --- 28,32 ---- struct scb_rule *vcb_head; struct scb_val tcb_regs[CB_NREGS_G]; ! u_int ccb_rules_lock; int ccb_ntab; u_int vcb_nrules, vcb_step; Index: cerb_rules.h =================================================================== RCS file: /cvsroot/cerber/cerb-ng/kcerb/cerb_rules.h,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** cerb_rules.h 13 Oct 2002 19:53:08 -0000 1.19 --- cerb_rules.h 15 Oct 2002 12:41:47 -0000 1.20 *************** *** 28,32 **** extern struct scb_rule *vcb_head; extern struct scb_val tcb_regs[CB_NREGS_G]; ! extern u_int ccb_lockrules; extern int ccb_ntab; extern u_int vcb_nrules, vcb_step; --- 28,32 ---- extern struct scb_rule *vcb_head; extern struct scb_val tcb_regs[CB_NREGS_G]; ! extern u_int ccb_rules_lock; extern int ccb_ntab; extern u_int vcb_nrules, vcb_step; Index: cerb_syscalls.c =================================================================== RCS file: /cvsroot/cerber/cerb-ng/kcerb/cerb_syscalls.c,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** cerb_syscalls.c 13 Oct 2002 19:53:08 -0000 1.17 --- cerb_syscalls.c 15 Oct 2002 12:41:47 -0000 1.18 *************** *** 72,76 **** vcb_syscall = MCB_GETSYSCALLNO(p); ! if (vcb_head == NULL) return (tcb_oldscall[vcb_syscall](p, uap)); --- 72,76 ---- vcb_syscall = MCB_GETSYSCALLNO(p); ! if (!MCB_ISCERBON) return (tcb_oldscall[vcb_syscall](p, uap)); Index: cerb_sysctl.c =================================================================== RCS file: /cvsroot/cerber/cerb-ng/kcerb/cerb_sysctl.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** cerb_sysctl.c 11 Oct 2002 19:37:49 -0000 1.7 --- cerb_sysctl.c 15 Oct 2002 12:41:47 -0000 1.8 *************** *** 14,17 **** --- 14,18 ---- #include <sys/sysent.h> #include <sys/sysctl.h> + #include <sys/syscall.h> #include "cerb_malloc.h" *************** *** 23,54 **** /* * List of defined sysctls: ! * cerb.misc.lockrules ! * cerb.misc.safemalloc ! * cerb.misc.memstat ! * cerb.misc.fdstat * cerb.rules.show * cerb.rules.set * cerb.rules.rm */ SYSCTL_NODE(, OID_AUTO, cerb, CTLFLAG_RW, 0, "cerb-level"); - SYSCTL_NODE(_cerb, OID_AUTO, misc, CTLFLAG_RW, 0, "cerb.misc-level"); SYSCTL_NODE(_cerb, OID_AUTO, rules, CTLFLAG_RW, 0, "cerb.rules-level"); /* ! * Sysctl name: cerb.misc.lockrules * Description: If this sysctl is 1, rules can't be modified. * This is "one-way" sysctl, if it is 1, it can't be set to 0. */ - u_int ccb_lockrules = 0; static int ! sysctl_cb_misc_lockrules(SYSCTL_HANDLER_ARGS) { int error; u_int lockrules; ! if (ccb_lockrules != 0) return (EPERM); ! lockrules = ccb_lockrules; error = sysctl_handle_int(oidp, &lockrules, 0, req); if (error != 0 || req->newptr == NULL) --- 24,57 ---- /* * List of defined sysctls: ! * cerb.rules.lock * cerb.rules.show * cerb.rules.set * cerb.rules.rm + * cerb.desc.stat + * cerb.desc.cache + * cerb.desc.clear_cache + * cerb.mem.stat + * cerb.mem.safe_malloc */ SYSCTL_NODE(, OID_AUTO, cerb, CTLFLAG_RW, 0, "cerb-level"); SYSCTL_NODE(_cerb, OID_AUTO, rules, CTLFLAG_RW, 0, "cerb.rules-level"); + SYSCTL_NODE(_cerb, OID_AUTO, desc, CTLFLAG_RW, 0, "cerb.desc-level"); + SYSCTL_NODE(_cerb, OID_AUTO, mem, CTLFLAG_RW, 0, "cerb.mem-level"); /* ! * Sysctl name: cerb.rules.lock * Description: If this sysctl is 1, rules can't be modified. * This is "one-way" sysctl, if it is 1, it can't be set to 0. */ static int ! sysctl_cb_rules_lock(SYSCTL_HANDLER_ARGS) { int error; u_int lockrules; ! if (ccb_rules_lock != 0) return (EPERM); ! lockrules = ccb_rules_lock; error = sysctl_handle_int(oidp, &lockrules, 0, req); if (error != 0 || req->newptr == NULL) *************** *** 56,123 **** if (lockrules != 1) return (EPERM); ! ccb_lockrules = lockrules; return (error); } ! SYSCTL_PROC(_cerb_misc, OID_AUTO, lockrules, CTLTYPE_UINT | CTLFLAG_RW, ! 0, 0, sysctl_cb_misc_lockrules, "I", "Locking rules modifications."); /* ! * Sysctl name: cerb.misc.safemalloc ! * Description: 1 - cerb will be using fcb_malloc() and fcb_free() functions ! * instead of malloc() and free() ! * 0 - cerb will be using standard malloc() and free() functions. */ static int ! sysctl_cb_misc_safemalloc(SYSCTL_HANDLER_ARGS) { ! int error; ! u_int safemalloc; ! safemalloc = ccb_safemalloc; ! error = sysctl_handle_int(oidp, &safemalloc, 0, req); if (error != 0 || req->newptr == NULL) return (error); - if (safemalloc > 1) - return (EPERM); - if (safemalloc == ccb_safemalloc) - return (error); ! ccb_safemalloc = safemalloc; ! if (ccb_safemalloc == 0) ! fcb_malloc_clearlist(); return (error); } ! ! SYSCTL_PROC(_cerb_misc, OID_AUTO, safemalloc, CTLTYPE_UINT | CTLFLAG_RW, ! 0, 0, sysctl_cb_misc_safemalloc, "I", ! "Turning on/off safe malloc() and free() functions."); /* ! * Sysctl name: cerb.misc.memstat ! * Description: this sysctl shows actualy allocated memory with fcb_malloc() ! * function. */ static int ! sysctl_cb_misc_memstat(SYSCTL_HANDLER_ARGS) { ! fcb_malloc_show(); ! return (0); ! } ! SYSCTL_PROC(_cerb_misc, OID_AUTO, memstat, CTLFLAG_RD, ! 0, 0, sysctl_cb_misc_memstat, "I", ! "Showing informations about memory allocated by fcb_malloc() function."); /* ! * Sysctl name: cerb.misc.fdstat * Description: this sysctl shows actualy cached file descriptors. */ static int ! sysctl_cb_misc_fdstat(SYSCTL_HANDLER_ARGS) { static char buf[256]; --- 59,136 ---- if (lockrules != 1) return (EPERM); ! ccb_rules_lock = lockrules; return (error); } ! SYSCTL_PROC(_cerb_rules, OID_AUTO, lock, CTLTYPE_UINT | CTLFLAG_RW, ! 0, 0, sysctl_cb_rules_lock, "I", "Locking rules modifications."); /* ! * Sysctl name: cerb.rules.show ! * Description: this sysctl shows tree with rules. */ static int ! sysctl_cb_rules_show(SYSCTL_HANDLER_ARGS) { ! int error, ntab; ! ntab = ccb_ntab; ! error = sysctl_handle_int(oidp, &ntab, 0, req); if (error != 0 || req->newptr == NULL) return (error); ! error = fcb_tree_gen(ntab); ! return (error); ! } ! SYSCTL_PROC(_cerb_rules, OID_AUTO, show, CTLTYPE_INT | CTLFLAG_RW, ! 0, 0, sysctl_cb_rules_show, "I", "Shwoing tree of loaded rules."); ! /* ! * Sysctl name: cerb.rules.set ! * Description: this sysctl set active table with rules. ! */ ! static int ! sysctl_cb_rules_set(SYSCTL_HANDLER_ARGS) ! { ! int error, ntab; + ntab = ccb_ntab; + error = sysctl_handle_int(oidp, &ntab, 0, req); + if (error != 0 || req->newptr == NULL) + return (error); + + error = fcb_rule_set(ntab); return (error); } ! SYSCTL_PROC(_cerb_rules, OID_AUTO, set, CTLTYPE_INT | CTLFLAG_RW, ! 0, 0, sysctl_cb_rules_set, "I", "Setting number of table with rules."); /* ! * Sysctl name: cerb.rules.rm ! * Description: this sysctl removing specified table with rules. */ static int ! sysctl_cb_rules_rm(SYSCTL_HANDLER_ARGS) { + int error, ntab; ! ntab = ccb_ntab; ! error = sysctl_handle_int(oidp, &ntab, 0, req); ! if (error != 0 || req->newptr == NULL) ! return (error); ! error = fcb_rule_rmtab(ntab); ! return (error); ! } ! SYSCTL_PROC(_cerb_rules, OID_AUTO, rm, CTLTYPE_INT | CTLFLAG_RW, ! 0, 0, sysctl_cb_rules_rm, "I", "Removing specified table with rules."); /* ! * Sysctl name: cerb.desc.stat * Description: this sysctl shows actualy cached file descriptors. */ static int ! sysctl_cb_desc_stat(SYSCTL_HANDLER_ARGS) { static char buf[256]; *************** *** 133,197 **** return (error); } ! SYSCTL_PROC(_cerb_misc, OID_AUTO, fdstat, CTLTYPE_STRING | CTLFLAG_RW, ! 0, 0, sysctl_cb_misc_fdstat, "A", "Showing informations about cached file descriptors."); /* ! * Sysctl name: cerb.rules.show ! * Description: this sysctl shows tree with rules. */ static int ! sysctl_cb_rules_show(SYSCTL_HANDLER_ARGS) { ! int error, ntab; ! ntab = ccb_ntab; ! error = sysctl_handle_int(oidp, &ntab, 0, req); if (error != 0 || req->newptr == NULL) return (error); - error = fcb_tree_gen(ntab); return (error); } ! SYSCTL_PROC(_cerb_rules, OID_AUTO, show, CTLTYPE_INT | CTLFLAG_RW, ! 0, 0, sysctl_cb_rules_show, "I", "Shwoing tree of loaded rules."); /* ! * Sysctl name: cerb.rules.set ! * Description: this sysctl set active table with rules. */ static int ! sysctl_cb_rules_set(SYSCTL_HANDLER_ARGS) { ! int error, ntab; ! ntab = ccb_ntab; ! error = sysctl_handle_int(oidp, &ntab, 0, req); if (error != 0 || req->newptr == NULL) return (error); - error = fcb_rule_set(ntab); return (error); } ! SYSCTL_PROC(_cerb_rules, OID_AUTO, set, CTLTYPE_INT | CTLFLAG_RW, ! 0, 0, sysctl_cb_rules_set, "I", "Setting number of table with rules."); /* ! * Sysctl name: cerb.rules.rm ! * Description: this sysctl removing specified table with rules. */ static int ! sysctl_cb_rules_rm(SYSCTL_HANDLER_ARGS) { - int error, ntab; ! ntab = ccb_ntab; ! error = sysctl_handle_int(oidp, &ntab, 0, req); if (error != 0 || req->newptr == NULL) return (error); - error = fcb_rule_rmtab(ntab); return (error); } ! SYSCTL_PROC(_cerb_rules, OID_AUTO, rm, CTLTYPE_INT | CTLFLAG_RW, ! 0, 0, sysctl_cb_rules_rm, "I", "Removing specified table with rules."); --- 146,271 ---- return (error); } ! SYSCTL_PROC(_cerb_desc, OID_AUTO, stat, CTLTYPE_STRING | CTLFLAG_RW, ! 0, 0, sysctl_cb_desc_stat, "A", "Showing informations about cached file descriptors."); /* ! * Sysctl name: cerb.desc.cache ! * Description: Caching filenames and descriptors. ! * 0 - caching is turned off ! * 1 - cache on operation fcache() ! * 2 - cache all on open() */ static int ! sysctl_cb_desc_cache(SYSCTL_HANDLER_ARGS) { ! int error; ! u_int cache; ! cache = ccb_desc_cache; ! error = sysctl_handle_int(oidp, &cache, 0, req); if (error != 0 || req->newptr == NULL) return (error); + if (cache > 2) + return (EINVAL); + if (cache == ccb_desc_cache) + return (error); + + switch(cache) { + case 0: + if (ccb_desc_cache == 2) + sysent[SYS_open].sy_call = vcb_desc_open; + break; + case 1: + if (ccb_desc_cache == 2) + sysent[SYS_open].sy_call = vcb_desc_open; + break; + case 2: + vcb_desc_open = sysent[SYS_open].sy_call; + sysent[SYS_open].sy_call = (sy_call_t *)fcb_desc_open; + } + + ccb_desc_cache = cache; return (error); } ! ! SYSCTL_PROC(_cerb_desc, OID_AUTO, cache, CTLTYPE_UINT | CTLFLAG_RW, ! 0, 0, sysctl_cb_desc_cache, "I", "Caching filenames and descriptors."); /* ! * Sysctl name: cerb.desc.clear_cache ! * Description: 1 - clear all cached filenames */ static int ! sysctl_cb_desc_clear_cache(SYSCTL_HANDLER_ARGS) { ! int error; ! int cache; ! cache = 0; ! error = sysctl_handle_int(oidp, &cache, 0, req); if (error != 0 || req->newptr == NULL) return (error); + if (cache != 1) + return (EINVAL); + + fcb_desc_clear(); + fcb_dclose_clear(); return (error); } ! ! SYSCTL_PROC(_cerb_desc, OID_AUTO, clear_cache, CTLTYPE_INT | CTLFLAG_RW, ! 0, 0, sysctl_cb_desc_clear_cache, "I", ! "Caching filenames and descriptors."); /* ! * Sysctl name: cerb.mem.stat ! * Description: this sysctl shows actualy allocated memory with fcb_malloc() ! * function. */ static int ! sysctl_cb_mem_stat(SYSCTL_HANDLER_ARGS) { ! fcb_malloc_show(); ! return (0); ! } ! ! SYSCTL_PROC(_cerb_mem, OID_AUTO, stat, CTLFLAG_RD, ! 0, 0, sysctl_cb_mem_stat, "I", ! "Showing informations about memory allocated by fcb_malloc() function."); ! ! /* ! * Sysctl name: cerb.mem.safe_malloc ! * Description: 1 - cerb will be using fcb_malloc() and fcb_free() functions ! * instead of malloc() and free() ! * 0 - cerb will be using standard malloc() and free() functions. ! */ ! static int ! sysctl_cb_mem_safe_malloc(SYSCTL_HANDLER_ARGS) ! { ! int error; ! u_int safe_malloc; ! ! safe_malloc = ccb_mem_safe_malloc; ! error = sysctl_handle_int(oidp, &safe_malloc, 0, req); if (error != 0 || req->newptr == NULL) return (error); + if (safe_malloc > 1) + return (EPERM); + if (safe_malloc == ccb_mem_safe_malloc) + return (error); + + ccb_mem_safe_malloc = safe_malloc; + + if (ccb_mem_safe_malloc == 0) + fcb_malloc_clearlist(); return (error); } ! ! SYSCTL_PROC(_cerb_mem, OID_AUTO, safe_malloc, CTLTYPE_UINT | CTLFLAG_RW, ! 0, 0, sysctl_cb_mem_safe_malloc, "I", ! "Turning on/off safe malloc() and free() functions."); Index: cerb_urules.c =================================================================== RCS file: /cvsroot/cerber/cerb-ng/kcerb/cerb_urules.c,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** cerb_urules.c 11 Oct 2002 19:37:49 -0000 1.24 --- cerb_urules.c 15 Oct 2002 12:41:47 -0000 1.25 *************** *** 68,72 **** int error; ! if (suser(p) || ccb_lockrules) MCB_XDEBUG(EPERM, "Operation not permitted."); --- 68,72 ---- int error; ! if (suser(p) || ccb_rules_lock) MCB_XDEBUG(EPERM, "Operation not permitted."); |