Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=fwlive_pkgs.git;a=commitdiff;h=b5517f98e034ed093599912e74b266bbe1e2af5b
commit b5517f98e034ed093599912e74b266bbe1e2af5b Author: Janos Kovacs <[EMAIL PROTECTED]> Date: Thu Mar 6 19:29:39 2008 +0100 dazuko-fwlive-2.3.4-10-i686 * version bump diff --git a/source/apps-extra/dazuko-fwlive/0001-add-xp_set_path-function-necessary-for-RedirFS-su.patch b/source/apps-extra/dazuko-fwlive/0001-add-xp_set_path-function-necessary-for-RedirFS-su.patch new file mode 100644 index 0000000..3408b10 --- /dev/null +++ b/source/apps-extra/dazuko-fwlive/0001-add-xp_set_path-function-necessary-for-RedirFS-su.patch @@ -0,0 +1,196 @@ +From 8c31801270d4085bdf0704d572a0c3fbe8cf6a8f Mon Sep 17 00:00:00 2001 +From: ogman <ogman> +Date: Wed, 12 Dec 2007 16:08:39 +0000 +Subject: [PATCH] add xp_set_path() function (necessary for RedirFS support) + +--- + dazuko_call.h | 14 ++++++++++++++ + dazuko_core.c | 10 ++++++++++ + dazuko_core.h | 3 +++ + dazuko_dummyos.c | 8 ++++++++ + dazuko_freebsd.c | 8 ++++++++ + dazuko_freebsd5.c | 8 ++++++++ + dazuko_linux.c | 8 ++++++++ + dazuko_linux26.c | 8 ++++++++ + dazuko_rsbac.c | 8 ++++++++ + 9 files changed, 75 insertions(+), 0 deletions(-) + +diff --git a/dazuko_call.h b/dazuko_call.h +index ad0e8e8..68bd929 100644 +--- a/dazuko_call.h ++++ b/dazuko_call.h +@@ -484,4 +484,18 @@ static int call_xp_init_cache(unsigned long ttl) + return xp_init_cache(ttl); + } + ++ ++/* include/exclude paths */ ++ ++static int call_xp_set_path(const char *path, int type) ++{ ++ if (path == NULL) ++ { ++ xp_print("dazuko: warning: call_xp_set_path(path=NULL)\n"); ++ return -1; ++ } ++ ++ return xp_set_path(path, type); ++} ++ + #endif +diff --git a/dazuko_core.c b/dazuko_core.c +index 7585166..fa8ca8f 100644 +--- a/dazuko_core.c ++++ b/dazuko_core.c +@@ -1607,10 +1607,20 @@ static int dazuko_set_option(struct daemon_id *did, int opt, void *param, int le + + case ADD_INCLUDE_PATH: + error = dazuko_insert_path_fs(&(sl->incl_paths), &(sl->lock_lists), (char *)param, len); ++ if (!error) ++ { ++ if (call_xp_set_path((char *)param, ADD_INCLUDE_PATH) != 0) ++ error = XP_ERROR_INVALID; ++ } + break; + + case ADD_EXCLUDE_PATH: + error = dazuko_insert_path_fs(&(sl->excl_paths), &(sl->lock_lists), (char *)param, len); ++ if (!error) ++ { ++ if (call_xp_set_path((char *)param, ADD_EXCLUDE_PATH) != 0) ++ error = XP_ERROR_INVALID; ++ } + break; + + case REMOVE_ALL_PATHS: +diff --git a/dazuko_core.h b/dazuko_core.h +index 935ca63..e64bf3e 100644 +--- a/dazuko_core.h ++++ b/dazuko_core.h +@@ -178,6 +178,9 @@ int xp_set_event_properties(struct event_properties *event_p, struct xp_daemon_i + /* cache settings */ + int xp_init_cache(unsigned long ttl); + ++/* include/exclude paths */ ++int xp_set_path(const char *path, int type); ++ + /* output */ + int xp_print(const char *fmt, ...); + +diff --git a/dazuko_dummyos.c b/dazuko_dummyos.c +index d092581..6bdcf70 100644 +--- a/dazuko_dummyos.c ++++ b/dazuko_dummyos.c +@@ -350,6 +350,14 @@ int xp_init_cache(unsigned long ttl) + } + + ++/* include/exclude paths */ ++ ++int xp_set_path(const char *path, int type) ++{ ++ return 0; ++} ++ ++ + /* system calls */ + + static void dummy_dazuko_setid(const char *id) +diff --git a/dazuko_freebsd.c b/dazuko_freebsd.c +index f4cb535..c16412c 100644 +--- a/dazuko_freebsd.c ++++ b/dazuko_freebsd.c +@@ -825,6 +825,14 @@ int xp_init_cache(unsigned long ttl) + } + + ++/* include/exclude paths */ ++ ++int xp_set_path(const char *path, int type) ++{ ++ return 0; ++} ++ ++ + /* system calls */ + + static inline int check_fd(struct proc *p, int fd) +diff --git a/dazuko_freebsd5.c b/dazuko_freebsd5.c +index ff0994f..d26f030 100644 +--- a/dazuko_freebsd5.c ++++ b/dazuko_freebsd5.c +@@ -877,6 +877,14 @@ int xp_init_cache(unsigned long ttl) + } + + ++/* include/exclude paths */ ++ ++int xp_set_path(const char *path, int type) ++{ ++ return 0; ++} ++ ++ + /* system calls */ + + static inline int check_fd(struct proc *p, int fd) +diff --git a/dazuko_linux.c b/dazuko_linux.c +index f8bd860..d83bded 100644 +--- a/dazuko_linux.c ++++ b/dazuko_linux.c +@@ -1429,6 +1429,14 @@ int xp_init_cache(unsigned long ttl) + } + + ++/* include/exclude paths */ ++ ++int xp_set_path(const char *path, int type) ++{ ++ return 0; ++} ++ ++ + /* system calls */ + + #if defined(ON_OPEN_SUPPORT) +diff --git a/dazuko_linux26.c b/dazuko_linux26.c +index cdf0d43..a1676be 100644 +--- a/dazuko_linux26.c ++++ b/dazuko_linux26.c +@@ -579,6 +579,14 @@ int xp_init_cache(unsigned long ttl) + } + + ++/* include/exclude paths */ ++ ++int xp_set_path(const char *path, int type) ++{ ++ return 0; ++} ++ ++ + /* system hooks */ + + #ifndef DAZUKO_FIST +diff --git a/dazuko_rsbac.c b/dazuko_rsbac.c +index 9fa701b..6023bae 100644 +--- a/dazuko_rsbac.c ++++ b/dazuko_rsbac.c +@@ -518,6 +518,14 @@ int xp_init_cache(unsigned long ttl) + } + + ++/* include/exclude paths */ ++ ++int xp_set_path(const char *path, int type) ++{ ++ return 0; ++} ++ ++ + /* system hook */ + + inline int xp_sys_hook() +-- +1.5.4.rc4.25.g81cc-dirty + diff --git a/source/apps-extra/dazuko-fwlive/0002-source-code-to-compile-Dazuko-as-an-RedirFS-filter.patch b/source/apps-extra/dazuko-fwlive/0002-source-code-to-compile-Dazuko-as-an-RedirFS-filter.patch new file mode 100644 index 0000000..742965d --- /dev/null +++ b/source/apps-extra/dazuko-fwlive/0002-source-code-to-compile-Dazuko-as-an-RedirFS-filter.patch @@ -0,0 +1,1008 @@ +From 26176cf910f1c66979c74a5ca24e95efebc05310 Mon Sep 17 00:00:00 2001 +From: ogman <ogman> +Date: Wed, 12 Dec 2007 16:14:20 +0000 +Subject: [PATCH] source code to compile Dazuko as an RedirFS filter + +--- + dazuko_redirfs.c | 989 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 989 insertions(+), 0 deletions(-) + create mode 100644 dazuko_redirfs.c + +diff --git a/dazuko_redirfs.c b/dazuko_redirfs.c +new file mode 100644 +index 0000000..885242a +--- /dev/null ++++ b/dazuko_redirfs.c +@@ -0,0 +1,989 @@ ++/* Dazuko RedirFS. Allow Linux 2.6 file access control for 3rd-party applications. ++ Written by John Ogness <[EMAIL PROTECTED]> ++ ++ Copyright (c) 2007 Avira GmbH ++ All rights reserved. ++ ++ This program is free software; you can redistribute it and/or ++ modify it under the terms of the GNU General Public License ++ as published by the Free Software Foundation; either version 2 ++ of the License, or (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++*/ ++ ++#include "dazuko_linux26.h" ++#include "dazuko_core.h" ++#include "dazuko_linux26_device_def.h" ++ ++#ifdef USE_CONFIG_H ++#include <linux/config.h> ++#endif ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/init.h> ++#include <linux/vermagic.h> ++#include <linux/namei.h> ++#include <linux/dcache.h> ++#include <linux/mount.h> ++#include "../redirfs/redirfs.h" ++#ifdef DEVFS_SUPPORT ++#include <linux/devfs_fs_kernel.h> ++#endif ++#include <linux/device.h> ++#if !defined(USE_TRYTOFREEZEVOID) ++#include <linux/suspend.h> ++#endif ++#ifdef LINUX_USE_FREEZER_H ++#include <linux/freezer.h> ++#endif ++#include <asm/uaccess.h> ++ ++ ++#ifndef DAZUKO_DM ++#define DAZUKO_DM 0 ++#endif ++ ++ ++ssize_t linux_dazuko_device_read(struct file *, char __user *, size_t, loff_t *); ++ssize_t linux_dazuko_device_write(struct file *, const char __user *, size_t, loff_t *); ++int linux_dazuko_device_open(struct inode *, struct file *); ++int linux_dazuko_device_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long param); ++int linux_dazuko_device_release(struct inode *, struct file *); ++ ++#ifndef WITHOUT_UDEV ++#ifdef USE_CLASS ++static struct class *dazuko_class = NULL; ++#else ++static struct class_simple *dazuko_class = NULL; ++#endif ++#endif ++ ++static int dev_major = -1; ++ ++int dazukoflt_ctl(struct rfs_ctl *ctl); ++enum rfs_retv dazukoflt_permission(rfs_context context, struct rfs_args *args); ++static rfs_filter dazukoflt; ++static struct rfs_filter_info flt_info = {"dazukoflt", 1000, 1, dazukoflt_ctl}; ++static struct rfs_op_info op_info[] = { ++ { RFS_REG_IOP_PERMISSION, dazukoflt_permission, NULL }, ++ { RFS_OP_END, NULL, NULL } ++}; ++ ++static struct file_operations fops = { ++ .owner = THIS_MODULE, ++ .read = linux_dazuko_device_read, ++ .write = linux_dazuko_device_write, ++ .ioctl = linux_dazuko_device_ioctl, ++ .open = linux_dazuko_device_open, ++ .release = linux_dazuko_device_release, ++ }; ++ ++ ++/* mutex */ ++ ++inline void xp_init_mutex(struct xp_mutex *mutex) ++{ ++ init_MUTEX(&(mutex->mutex)); ++} ++ ++inline void xp_down(struct xp_mutex *mutex) ++{ ++ down(&(mutex->mutex)); ++} ++ ++inline void xp_up(struct xp_mutex *mutex) ++{ ++ up(&(mutex->mutex)); ++} ++ ++inline void xp_destroy_mutex(struct xp_mutex *mutex) ++{ ++} ++ ++ ++/* read-write lock */ ++ ++inline void xp_init_rwlock(struct xp_rwlock *rwlock) ++{ ++ rwlock_init(&(rwlock->rwlock)); ++} ++ ++inline void xp_write_lock(struct xp_rwlock *rwlock) ++{ ++ write_lock(&(rwlock->rwlock)); ++} ++ ++inline void xp_write_unlock(struct xp_rwlock *rwlock) ++{ ++ write_unlock(&(rwlock->rwlock)); ++} ++ ++inline void xp_read_lock(struct xp_rwlock *rlock) ++{ ++ read_lock(&(rlock->rwlock)); ++} ++ ++inline void xp_read_unlock(struct xp_rwlock *rlock) ++{ ++ read_unlock(&(rlock->rwlock)); ++} ++ ++inline void xp_destroy_rwlock(struct xp_rwlock *rwlock) ++{ ++} ++ ++ ++/* wait-notify queue */ ++ ++inline int xp_init_queue(struct xp_queue *queue) ++{ ++ init_waitqueue_head(&(queue->queue)); ++ return 0; ++} ++ ++inline int xp_wait_until_condition(struct xp_queue *queue, int (*cfunction)(void *), void *cparam, int allow_interrupt) ++{ ++ /* wait until cfunction(cparam) != 0 (condition is true) */ ++ int ret = 0; ++ ++ if (allow_interrupt) ++ { ++ while (1) ++ { ++ ret = wait_event_interruptible(queue->queue, cfunction(cparam) != 0); ++ ++#if defined (USE_TRYTOFREEZEVOID) ++ if (try_to_freeze() == 0) ++ break; ++#else ++ if (current->flags & PF_FREEZE) ++ { ++ refrigerator(PF_FREEZE); ++ } ++ else ++ { ++ break; ++ } ++#endif ++ } ++ } ++ else ++ { ++ wait_event(queue->queue, cfunction(cparam) != 0); ++ } ++ ++ return ret; ++} ++ ++inline int xp_notify(struct xp_queue *queue) ++{ ++ wake_up(&(queue->queue)); ++ return 0; ++} ++ ++inline int xp_destroy_queue(struct xp_queue *queue) ++{ ++ return 0; ++} ++ ++ ++/* memory */ ++ ++inline void* xp_malloc(size_t size) ++{ ++ return kmalloc(size, GFP_ATOMIC); ++} ++ ++inline int xp_free(void *ptr) ++{ ++ kfree(ptr); ++ return 0; ++} ++ ++inline int xp_copyin(const void *user_src, void *kernel_dest, size_t size) ++{ ++ return copy_from_user(kernel_dest, user_src, size); ++} ++ ++inline int xp_copyout(const void *kernel_src, void *user_dest, size_t size) ++{ ++ return copy_to_user(user_dest, kernel_src, size); ++} ++ ++inline int xp_verify_user_writable(const void *user_ptr, size_t size) ++{ ++ return 0; ++} ++ ++inline int xp_verify_user_readable(const void *user_ptr, size_t size) ++{ ++ return 0; ++} ++ ++ ++/* path attribute */ ++ ++inline int xp_is_absolute_path(const char *path) ++{ ++ if (path[0] == '/') ++ return 1; ++ ++ return 0; ++} ++ ++ ++/* atomic */ ++ ++inline int xp_atomic_set(struct xp_atomic *atomic, int value) ++{ ++ atomic_set(&(atomic->atomic), value); ++ return 0; ++} ++ ++inline int xp_atomic_inc(struct xp_atomic *atomic) ++{ ++ atomic_inc(&(atomic->atomic)); ++ return 0; ++} ++ ++inline int xp_atomic_dec(struct xp_atomic *atomic) ++{ ++ atomic_dec(&(atomic->atomic)); ++ return 0; ++} ++ ++inline int xp_atomic_read(struct xp_atomic *atomic) ++{ ++ return atomic_read(&(atomic->atomic)); ++} ++ ++ ++/* file structure */ ++ ++static int dazuko_get_full_filename(struct xp_file_struct *xfs) ++{ ++ char *temp; ++ ++ if (xfs == NULL) ++ return 0; ++ ++ if (xfs->inode == NULL) ++ return 0; ++ ++ if (S_ISDIR(xfs->inode->i_mode)) ++ return 0; ++ ++ if (xfs->nd == NULL || xfs->free_full_filename) ++ return 0; ++ ++ if (xfs->nd->mnt == NULL || xfs->nd->dentry == NULL) ++ return 0; ++ ++ /* check if we need to allocate a buffer */ ++ if (!xfs->free_page_buffer) ++ { ++ /* get pre-requisites for d_path function */ ++ xfs->buffer = (char *)__get_free_page(GFP_USER); ++ ++ /* make sure we got a page */ ++ if (xfs->buffer == NULL) ++ return 0; ++ ++ /* the buffer will need to be freed */ ++ xfs->free_page_buffer = 1; ++ } ++ ++ /* make sure we don't already have a vfsmount */ ++ if (!xfs->mntput_vfsmount) ++ { ++ xfs->vfsmount = mntget(xfs->nd->mnt); ++ ++ /* the vfsmount will need to be put back */ ++ xfs->mntput_vfsmount = 1; ++ } ++ ++ /* make sure we don't already have a dentry */ ++ if (!xfs->dput_dentry) ++ { ++ xfs->dentry = dget(xfs->nd->dentry); ++ ++ /* the dentry will need to be put back */ ++ xfs->dput_dentry = 1; ++ } ++ ++ temp = d_path(xfs->dentry, xfs->vfsmount, xfs->buffer, PAGE_SIZE); ++ ++ /* make sure we really got a new filename */ ++ if (temp == NULL) ++ return 0; ++ ++ xfs->full_filename_length = dazuko_strlen(temp); ++ ++ xfs->full_filename = (char *)xp_malloc(xfs->full_filename_length + 1); ++ if (xfs->full_filename == NULL) ++ return 0; ++ ++ /* the char array will need to be freed */ ++ xfs->free_full_filename = 1; ++ ++ memcpy(xfs->full_filename, temp, xfs->full_filename_length + 1); ++ ++ /* we have a filename with the full path */ ++ ++ return 1; ++} ++ ++static int dazuko_fill_file_struct_cleanup(struct dazuko_file_struct *dfs) ++{ ++ if (dfs == NULL) ++ return 0; ++ ++ if (dfs->extra_data == NULL) ++ return 0; ++ ++ if (dfs->extra_data->free_page_buffer) ++ { ++ free_page((unsigned long)dfs->extra_data->buffer); ++ dfs->extra_data->free_page_buffer = 0; ++ } ++ ++ if (dfs->extra_data->dput_dentry) ++ { ++ dput(dfs->extra_data->dentry); ++ dfs->extra_data->dput_dentry = 0; ++ } ++ ++ if (dfs->extra_data->mntput_vfsmount) ++ { ++ mntput(dfs->extra_data->vfsmount); ++ dfs->extra_data->mntput_vfsmount = 0; ++ } ++ ++ return 0; ++} ++ ++int xp_fill_file_struct(struct dazuko_file_struct *dfs) ++{ ++ int error = -1; ++ ++ if (dfs == NULL) ++ return error; ++ ++ /* check if filename has already been filled in */ ++ if (dfs->filename != NULL) ++ return 0; ++ ++ /* make sure we can get the full path */ ++ if (dazuko_get_full_filename(dfs->extra_data)) ++ { ++ /* reference copy of full path */ ++ dfs->filename = dfs->extra_data->full_filename; ++ ++ dfs->filename_length = dfs->extra_data->full_filename_length; ++ ++ dfs->file_p.size = dfs->extra_data->inode->i_size; ++ dfs->file_p.set_size = 1; ++ dfs->file_p.uid = dfs->extra_data->inode->i_uid; ++ dfs->file_p.set_uid = 1; ++ dfs->file_p.gid = dfs->extra_data->inode->i_gid; ++ dfs->file_p.set_gid = 1; ++ dfs->file_p.mode = dfs->extra_data->inode->i_mode; ++ dfs->file_p.set_mode = 1; ++ dfs->file_p.device_type = dfs->extra_data->inode->i_rdev; ++ dfs->file_p.set_device_type = 1; ++ ++ error = 0; ++ } ++ ++ dazuko_fill_file_struct_cleanup(dfs); ++ ++ return error; ++} ++ ++static int dazuko_file_struct_cleanup(struct dazuko_file_struct **dfs) ++{ ++ if (dfs == NULL) ++ return 0; ++ ++ if (*dfs == NULL) ++ return 0; ++ ++ if ((*dfs)->extra_data) ++ { ++ if ((*dfs)->extra_data->free_full_filename) ++ xp_free((*dfs)->extra_data->full_filename); ++ ++ xp_free((*dfs)->extra_data); ++ } ++ ++ xp_free(*dfs); ++ ++ *dfs = NULL; ++ ++ return 0; ++} ++ ++ ++/* daemon id */ ++ ++static inline int check_parent(struct task_struct *parent, struct task_struct *child) ++{ ++ struct task_struct *ts = child; ++ ++ if (parent == NULL || child == NULL) ++ return -1; ++ ++ while (1) ++ { ++ if (ts == parent) ++ return 0; ++ ++ if (ts->parent == NULL) ++ break; ++ ++ if (ts == ts->parent) ++ break; ++ ++ ts = ts->parent; ++ } ++ ++ return -1; ++} ++ ++inline int xp_id_compare(struct xp_daemon_id *id1, struct xp_daemon_id *id2, int check_related) ++{ ++ if (id1 == NULL || id2 == NULL) ++ return DAZUKO_DIFFERENT; ++ ++ /* If file's are available we do a special ++ * check ("file"'s are only used by daemons). ++ * Here we allow threads to look like one ++ * instance, if they pass around the handle. ++ * Note: this is a Linux-only "hack" */ ++ if (id1->file != NULL && id2->file != NULL) ++ { ++ if (id1->tgid == id2->tgid && id1->files == id2->files && id1->file == id2->file) ++ return DAZUKO_SAME; ++ } ++ ++ if (id1->pid == id2->pid && id1->current_p == id2->current_p && id1->files == id2->files) ++ return DAZUKO_SAME; ++ ++ if (check_related) ++ { ++ /* Same thread id and same file descriptors, ++ * looks like they could be the same process... ++ * We will treat two threads of the same process ++ * as the same (for relation checks). This is ++ * useful for the Trusted Application Framework, ++ * if we trust one thread, we can trust them all.*/ ++ if (id1->tgid == id2->tgid && id1->files == id2->files) ++ { ++ /* Two different threads of the same process will have different current pointers, ++ * but if process ids match, current pointers must too. */ ++ ++ if (id1->pid == id2->pid && id1->current_p == id2->current_p) ++ return DAZUKO_SAME; ++ ++ if (id1->pid != id2->pid && id1->current_p != id2->current_p) ++ return DAZUKO_SAME; ++ } ++ ++ if (check_parent(id1->current_p, id2->current_p) == 0) ++ { ++ return DAZUKO_CHILD; ++ } ++ else if (id1->pid == id2->pid || id1->current_p == id2->current_p || id1->files == id2->files) ++ { ++ return DAZUKO_SUSPICIOUS; ++ } ++ else if (id1->tgid == id2->tgid) ++ { ++ return DAZUKO_SUSPICIOUS; ++ } ++ } ++ ++ return DAZUKO_DIFFERENT; ++} ++ ++inline int xp_id_free(struct xp_daemon_id *id) ++{ ++ xp_free(id); ++ ++ return 0; ++} ++ ++inline struct xp_daemon_id* xp_id_copy(struct xp_daemon_id *id) ++{ ++ struct xp_daemon_id *ptr; ++ ++ if (id == NULL) ++ return NULL; ++ ++ ptr = (struct xp_daemon_id *)xp_malloc(sizeof(struct xp_daemon_id)); ++ ++ if (ptr != NULL) ++ { ++ ptr->pid = id->pid; ++ ptr->tgid = id->tgid; ++ ptr->file = id->file; ++ ptr->current_p = id->current_p; ++ ptr->files = id->files; ++ } ++ ++ return ptr; ++} ++ ++ ++/* event */ ++ ++int xp_set_event_properties(struct event_properties *event_p, struct xp_daemon_id *xp_id) ++{ ++ event_p->pid = xp_id->pid; ++ event_p->set_pid = 1; ++ ++ return 0; ++} ++ ++ ++/* cache settings */ ++ ++int xp_init_cache(unsigned long ttl) ++{ ++ return -1; ++} ++ ++ ++/* include/exclude paths */ ++ ++int xp_set_path(const char *path, int type) ++{ ++ int err; ++ struct rfs_path_info path_info; ++ ++ switch (type) ++ { ++ case ADD_INCLUDE_PATH: ++ path_info.flags = RFS_PATH_INCLUDE | RFS_PATH_SUBTREE; ++ break; ++ ++ case ADD_EXCLUDE_PATH: ++ path_info.flags = RFS_PATH_EXCLUDE | RFS_PATH_SUBTREE; ++ break; ++ ++ default: ++ return -1; ++ } ++ ++ path_info.path = dazuko_strdup(path, NULL); ++ err = rfs_set_path(dazukoflt, &path_info); ++ if (err) ++ { ++ xp_print("dazuko: failed to set RedirFS path, err=%d\n", err); ++ rfs_unregister_filter(dazukoflt); ++ return -1; ++ } ++ ++ return 0; ++} ++ ++ ++/* system hooks */ ++ ++int dazuko_sys_generic(struct inode *inode, int mask, struct nameidata *nd) ++{ ++ struct dazuko_file_struct *dfs = NULL; ++ int error = 0; ++ int check_error = 0; ++ struct event_properties event_p; ++ struct xp_daemon_id xp_id; ++ struct slot_list *sl = NULL; ++ int event = DAZUKO_ON_OPEN; ++ int daemon_is_allowed = 1; ++ ++ if (nd == NULL || inode == NULL) ++ return 0; ++ ++ dazuko_bzero(&event_p, sizeof(event_p)); ++ ++ if ((mask & MAY_EXEC) != 0) ++ { ++ event = DAZUKO_ON_EXEC; ++ daemon_is_allowed = 0; ++ } ++ else ++ { ++ /* mask == 0 is passed in when a file is created */ ++ if (mask == 0 || (mask & (MAY_WRITE|MAY_APPEND)) != 0) ++ { ++ if ((mask & MAY_READ) != 0) ++ { ++ event_p.flags = O_RDWR; ++ } ++ else ++ { ++ event_p.flags = O_WRONLY; ++ } ++ ++ event_p.set_flags = 1; ++ } ++ else if ((mask & MAY_READ) != 0) ++ { ++ event_p.flags = O_RDONLY; ++ event_p.set_flags = 1; ++ } ++ } ++ ++ xp_id.pid = current->pid; ++ xp_id.tgid = current->tgid; ++ xp_id.file = NULL; ++ xp_id.current_p = current; ++ xp_id.files = current->files; ++ ++ check_error = dazuko_check_access(event, daemon_is_allowed, &xp_id, &sl); ++ ++ if (!check_error) ++ { ++ event_p.mode = inode->i_mode; ++ event_p.set_mode = 1; ++ event_p.pid = current->pid; ++ event_p.set_pid = 1; ++ event_p.uid = current->uid; ++ event_p.set_uid = 1; ++ ++ dfs = (struct dazuko_file_struct *)xp_malloc(sizeof(struct dazuko_file_struct)); ++ if (dfs != NULL) ++ { ++ dazuko_bzero(dfs, sizeof(struct dazuko_file_struct)); ++ ++ dfs->extra_data = (struct xp_file_struct *)xp_malloc(sizeof(struct xp_file_struct)); ++ if (dfs->extra_data != NULL) ++ { ++ dazuko_bzero(dfs->extra_data, sizeof(struct xp_file_struct)); ++ ++ dfs->extra_data->nd = nd; ++ dfs->extra_data->inode = inode; ++ ++ error = dazuko_process_access(event, dfs, &event_p, sl); ++ } ++ else ++ { ++ xp_free(dfs); ++ dfs = NULL; ++ } ++ ++ dazuko_file_struct_cleanup(&dfs); ++ } ++ } ++ ++ if (error) ++ return XP_ERROR_PERMISSION; ++ ++ return 0; ++} ++ ++int dazukoflt_ctl(struct rfs_ctl *ctl) ++{ ++ return 0; ++} ++ ++enum rfs_retv dazukoflt_permission(rfs_context context, struct rfs_args *args) ++{ ++ if (!args->args.i_permission.inode) ++ return RFS_CONTINUE; ++ ++ if (!args->args.i_permission.mask) ++ return RFS_CONTINUE; ++ ++ if (!args->args.i_permission.nd) ++ return RFS_CONTINUE; ++ ++ if (dazuko_sys_generic(args->args.i_permission.inode, args->args.i_permission.mask, args->args.i_permission.nd) != 0) ++ { ++ args->retv.rv_int = -EACCES; ++ return RFS_STOP; ++ } ++ ++ return RFS_CONTINUE; ++} ++ ++inline int xp_sys_hook() ++{ ++ /* Make sure we have a valid task_struct. */ ++ ++ if (current == NULL) ++ { ++ xp_print("dazuko: panic (current == NULL)\n"); ++ return -1; ++ } ++ if (current->fs == NULL) ++ { ++ xp_print("dazuko: panic (current->fs == NULL)\n"); ++ return -1; ++ } ++ ++ { ++ int err; ++ ++ err = rfs_register_filter(&dazukoflt, &flt_info); ++ if (err) ++ { ++ xp_print("dazuko: unable to register with RedirFS, err=%d\n", err); ++ return -1; ++ } ++ ++ err = rfs_set_operations(dazukoflt, op_info); ++ if (err) ++ { ++ xp_print("dazuko: unable to set RedirFS options, err=%d\n", err); ++ rfs_unregister_filter(dazukoflt); ++ return -1; ++ } ++ } ++ ++ dev_major = register_chrdev(DAZUKO_DM, DEVICE_NAME, &fops); ++ if (dev_major < 0) ++ { ++ xp_print("dazuko: unable to register device, err=%d\n", dev_major); ++ return dev_major; ++ } ++ ++#ifdef DEVFS_SUPPORT ++ devfs_mk_cdev(MKDEV(dev_major, 0), S_IFCHR | S_IRUSR | S_IWUSR, DEVICE_NAME); ++#endif ++ ++#ifndef WITHOUT_UDEV ++#ifdef USE_CLASS ++ dazuko_class = class_create(THIS_MODULE, "dazuko"); ++#ifdef CLASS_class_device_create_2_6_15 ++ class_device_create(dazuko_class, NULL, MKDEV(dev_major, 0), NULL, "dazuko"); ++#else ++ class_device_create(dazuko_class, MKDEV(dev_major, 0), NULL, "dazuko"); ++#endif ++#else ++ dazuko_class = class_simple_create(THIS_MODULE, "dazuko"); ++ class_simple_device_add(dazuko_class, MKDEV(dev_major, 0), NULL, "dazuko"); ++#endif ++#endif ++ ++ return 0; ++} ++ ++inline int xp_sys_unhook() ++{ ++ unregister_chrdev(dev_major, DEVICE_NAME); ++ ++#ifdef DEVFS_SUPPORT ++ devfs_remove(DEVICE_NAME); ++#endif ++ ++#ifndef WITHOUT_UDEV ++#ifdef USE_CLASS ++ class_device_destroy(dazuko_class, MKDEV(dev_major, 0)); ++ class_destroy(dazuko_class); ++#else ++ class_simple_device_remove(MKDEV(dev_major, 0)); ++ class_simple_destroy(dazuko_class); ++#endif ++#endif ++ ++ { ++ int err; ++ ++ err = rfs_unregister_filter(dazukoflt); ++ if (err) ++ { ++ xp_print("dazuko: failed to unregister from RedirFS, err=%d\n", err); ++ } ++ } ++ ++ return 0; ++} ++ ++ ++/* output */ ++ ++int xp_print(const char *fmt, ...) ++{ ++ va_list args; ++ char *p; ++ size_t size = 1024; ++ int length; ++ ++ p = (char *)xp_malloc(size); ++ if (p == NULL) ++ return -1; ++ ++ length = dazuko_strlen(KERN_INFO); ++ ++ memcpy(p, KERN_INFO, length); ++ ++ va_start(args, fmt); ++ vsnprintf(p + length, size - length, fmt, args); ++ va_end(args); ++ ++ p[size-1] = 0; ++ ++ printk(p); ++ ++ xp_free(p); ++ ++ return 0; ++} ++ ++ ++/* ioctl's */ ++ ++int linux_dazuko_device_open(struct inode *inode, struct file *file) ++{ ++ DPRINT(("dazuko: linux_dazuko_device_open() [%d]\n", current->pid)); ++ ++ return 0; ++} ++ ++ssize_t linux_dazuko_device_read(struct file *file, char *buffer, size_t length, loff_t *pos) ++{ ++ /* Reading from the dazuko device simply ++ * returns the device number. This is to ++ * help out the daemon. */ ++ ++ char tmp[20]; ++ size_t dev_major_len; ++ ++ DPRINT(("dazuko: linux_dazuko_device_read() [%d]\n", current->pid)); ++ ++ if (*pos != 0) ++ return 0; ++ ++ if (dev_major < 0) ++ return XP_ERROR_NODEVICE; ++ ++ /* print dev_major to a string ++ * and get length (with terminator) */ ++ dazuko_bzero(tmp, sizeof(tmp)); ++ ++ dev_major_len = dazuko_snprintf(tmp, sizeof(tmp), "%d", dev_major) + 1; ++ ++ if (tmp[sizeof(tmp)-1] != 0) ++ { ++ xp_print("dazuko: failing device_read, device number overflow for dameon %d (dev_major=%d)\n", current->pid, dev_major); ++ return XP_ERROR_FAULT; ++ } ++ ++ if (length < dev_major_len) ++ return XP_ERROR_INVALID; ++ ++ /* copy dev_major string to userspace */ ++ if (xp_copyout(tmp, buffer, dev_major_len) != 0) ++ return XP_ERROR_FAULT; ++ ++ *pos += dev_major_len; ++ ++ return dev_major_len; ++} ++ ++ssize_t linux_dazuko_device_write(struct file *file, const char *buffer, size_t length, loff_t *pos) ++{ ++ struct xp_daemon_id xp_id; ++ char tmpbuffer[32]; ++ int size; ++ ++ size = length; ++ if (length >= sizeof(tmpbuffer)) ++ size = sizeof(tmpbuffer) -1; ++ ++ /* copy request pointer string to kernelspace */ ++ if (xp_copyin(buffer, tmpbuffer, size) != 0) ++ return XP_ERROR_FAULT; ++ ++ tmpbuffer[size] = 0; ++ ++ xp_id.pid = current->pid; ++ xp_id.tgid = current->tgid; ++ xp_id.file = file; ++ xp_id.current_p = current; ++ xp_id.files = current->files; ++ ++ if (dazuko_handle_user_request(tmpbuffer, &xp_id) == 0) ++ return size; ++ ++ return XP_ERROR_INTERRUPT; ++} ++ ++int linux_dazuko_device_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long param) ++{ ++ /* A daemon uses this function to interact with ++ * the kernel. A daemon can set scanning parameters, ++ * give scanning response, and get filenames to scan. */ ++ ++ struct xp_daemon_id xp_id; ++ int error = 0; ++ ++ if (param == 0) ++ { ++ xp_print("dazuko: error: linux_dazuko_device_ioctl(..., 0)\n"); ++ return XP_ERROR_INVALID; ++ } ++ ++ xp_id.pid = current->pid; ++ xp_id.tgid = current->tgid; ++ xp_id.file = file; ++ xp_id.current_p = current; ++ xp_id.files = current->files; ++ ++ error = dazuko_handle_user_request_compat1((void *)param, _IOC_NR(cmd), &xp_id); ++ ++ if (error != 0) ++ { ++ /* general error occurred */ ++ ++ return XP_ERROR_PERMISSION; ++ } ++ ++ return error; ++} ++ ++int linux_dazuko_device_release(struct inode *inode, struct file *file) ++{ ++ struct xp_daemon_id xp_id; ++ ++ DPRINT(("dazuko: dazuko_device_release() [%d]\n", current->pid)); ++ ++ xp_id.pid = current->pid; ++ xp_id.tgid = current->tgid; ++ xp_id.file = file; ++ xp_id.current_p = current; ++ xp_id.files = current->files; ++ ++ return dazuko_unregister_daemon(&xp_id); ++} ++ ++ ++/* init/exit */ ++ ++static int __init linux_dazuko_init(void) ++{ ++ return dazuko_init(); ++} ++ ++static void __exit linux_dazuko_exit(void) ++{ ++ dazuko_exit(); ++} ++ ++ ++MODULE_AUTHOR("Avira GmbH <[EMAIL PROTECTED]>"); ++MODULE_DESCRIPTION("allow 3rd-party file access control"); ++MODULE_LICENSE("GPL"); ++MODULE_INFO(vermagic, VERMAGIC_STRING); ++ ++module_init(linux_dazuko_init); ++module_exit(linux_dazuko_exit); +-- +1.5.4.rc4.25.g81cc-dirty + diff --git a/source/apps-extra/dazuko-fwlive/0003-add-enable-redirfs-to-build-Dazuko-as-a-RedirF.patch b/source/apps-extra/dazuko-fwlive/0003-add-enable-redirfs-to-build-Dazuko-as-a-RedirF.patch new file mode 100644 index 0000000..a2448e3 --- /dev/null +++ b/source/apps-extra/dazuko-fwlive/0003-add-enable-redirfs-to-build-Dazuko-as-a-RedirF.patch @@ -0,0 +1,127 @@ +From b39f2f1f24f1a508c30356b0ee64aaa68f54e8a1 Mon Sep 17 00:00:00 2001 +From: ogman <ogman> +Date: Wed, 12 Dec 2007 17:07:11 +0000 +Subject: [PATCH] - add "--enable-redirfs" to build Dazuko as a RedirFS filter + - change "--without-dep" to be the default + +--- + configure | 41 +++++++++++++++++++++++++++++++++-------- + 1 files changed, 33 insertions(+), 8 deletions(-) + +diff --git a/configure b/configure +index 17168f1..d300fce 100755 +--- a/configure ++++ b/configure +@@ -74,6 +74,7 @@ print_help() + echo " --disable-compat1 disable 1.x compatibility (IO/Linux only)" + echo " --enable-debug print extra debug information" + echo " --enable-syscalls hook syscalls, not LSM (Linux 2.6 only)" ++ echo " --enable-redirfs use RedirFS (Linux 2.6 only)" + echo "" + echo "optional packages" + echo " --with-PACKAGE use PACKAGE" +@@ -81,7 +82,7 @@ print_help() + echo " --without-module do not build kernel module" + echo " --without-library do not build library" + echo " --without-example-c do not build C example" +- echo " --without-dep do not build dependencies (Linux only)" ++ echo " --with-dep build dependencies (Linux only)" + echo " --with-example-java build Java example" + echo " --with-example-perl build Perl example" + echo " --with-example-python build Python example" +@@ -407,7 +408,18 @@ check_use_parent() + + do_linux26() + { +- if [ $LINUX26_USE_SYSCALLS -eq 0 ] ++ if [ $LINUX26_USE_SYSCALLS -eq 0 -a $LINUX26_USE_REDIRFS -eq 1 ] ++ then ++ echo -n "checking for RedirFS source code... " ++ if [ ! -f "../redirfs/redirfs.h" ] ++ then ++ echo "not found" ++ echo "error: please make sure the RedirFS code is available as ../redirfs/" ++ exit 1 ++ fi ++ echo "found (../redirfs)" ++ ++ elif [ $LINUX26_USE_SYSCALLS -eq 0 -a $LINUX26_USE_REDIRFS -eq 0 ] + then + echo -n "checking if security module support is enabled... " + if [ $CONFIG_SECURITY -eq 0 ] +@@ -690,25 +702,25 @@ do_linux26() + + if [ $ON_CLOSE -ne 0 -a $LINUX26_USE_SYSCALLS -eq 0 ] + then +- echo "disabling ON_CLOSE events (not available for Linux 2.6 LSM)" ++ echo "disabling ON_CLOSE events (not available for Linux 2.6 LSM/RedirFS)" + ON_CLOSE=0 + fi + + if [ ${ON_UNLINK} -ne 0 -a $LINUX26_USE_SYSCALLS -eq 0 ] + then +- echo "disabling ON_UNLINK events (not available for Linux 2.6 LSM)" ++ echo "disabling ON_UNLINK events (not available for Linux 2.6 LSM/RedirFS)" + ON_UNLINK=0 + fi + + if [ ${ON_RMDIR} -ne 0 -a $LINUX26_USE_SYSCALLS -eq 0 ] + then +- echo "disabling ON_RMDIR events (not available for Linux 2.6 LSM)" ++ echo "disabling ON_RMDIR events (not available for Linux 2.6 LSM/RedirFS)" + ON_RMDIR=0 + fi + + if [ ${ON_CLOSE_MODIFIED} -ne 0 -a $LINUX26_USE_SYSCALLS -eq 0 ] + then +- echo "disabling ON_CLOSE_MODIFIED events (not available for Linux 2.6 LSM)" ++ echo "disabling ON_CLOSE_MODIFIED events (not available for Linux 2.6 LSM/RedirFS)" + ON_CLOSE_MODIFIED=0 + fi + +@@ -716,7 +728,12 @@ do_linux26() + + if [ ${LINUX26_USE_SYSCALLS} -eq 0 ] + then +- LINUX26_OBJS="dazuko_linux26.o" ++ if [ ${LINUX26_USE_REDIRFS} -eq 0 ] ++ then ++ LINUX26_OBJS="dazuko_linux26.o" ++ else ++ LINUX26_OBJS="dazuko_redirfs.o" ++ fi + echo "EXTRA_CFLAGS += -Wall -DLINUX26_SUPPORT" > Makefile + else + LINUX26_OBJS="dazuko_linux.o" +@@ -1460,12 +1477,13 @@ LINUX26_USE_SYSCALLS=0 + PERFORM_SCT_CHECK=1 + LINUX26_SYSCALLTABLE_READONLY=0 + LINUX26_SYSCALL_CFLAGS="" +-WITH_LINUX_DEP=1 ++WITH_LINUX_DEP=0 + NO_CAPABILITIES=0 + SMP=0 + HIDDEN_SCT=0 + DUMMYOS=0 + LSM_STACKING=1 ++LINUX26_USE_REDIRFS=0 + LOCAL_DPATH=2 + LINUX_SRC="" + LINUX_OBJ="" +@@ -1549,6 +1567,13 @@ do + --disable-syscalls) + LINUX26_USE_SYSCALLS=0 + ;; ++ --enable-redirfs) ++ LINUX26_USE_REDIRFS=1 ++ LSM_STACKING=0 ++ ;; ++ --disable-redirfs) ++ LINUX26_USE_REDIRFS=0 ++ ;; + --sct-nocheck) + PERFORM_SCT_CHECK=0 + ;; +-- +1.5.4.rc4.25.g81cc-dirty + diff --git a/source/apps-extra/dazuko-fwlive/FrugalBuild b/source/apps-extra/dazuko-fwlive/FrugalBuild index 020252a..aeb1171 100644 --- a/source/apps-extra/dazuko-fwlive/FrugalBuild +++ b/source/apps-extra/dazuko-fwlive/FrugalBuild @@ -2,25 +2,37 @@ # Maintainer: Janny <[EMAIL PROTECTED]> pkgname=dazuko-fwlive +_F_archive_name=dazuko pkgver=2.3.4 -pkgrel=7 +redirver=0.2 +pkgrel=10 pkgdesc="On-access virus scanning kernel interface" url="http://www.dazuko.org" license="GPL-2 BSD" -_F_kernelmod_scriptlet=$pkgname.install +_F_kernelmod_scriptlet=$_F_archive_name.install Finclude kernel-module -kver=2.6.23-6 -depends=("kernel-fwlive=$kver") +kver=2.6.24-3 +depends=("kernel-fwlive=$kver" "redirfs-fwlive=$redirver") makedepends=("kernel-fwlive-source=$kver") archs=('i686' 'x86_64') groups=('apps-extra') up2date="lynx -dump '$url/files/?M=O' | grep -v source |grep -v birthday|grep -v pre|Flasttar" -source=(http://www.dazuko.org/files/dazuko-$pkgver.tar.gz README.Frugalware) +source=(http://www.dazuko.org/files/$_F_archive_name-$pkgver.tar.gz \ + http://www.redirfs.org/packages/redirfs-$redirver.tar.gz \ + README.Frugalware \ + 0001-add-xp_set_path-function-necessary-for-RedirFS-su.patch \ + 0002-source-code-to-compile-Dazuko-as-an-RedirFS-filter.patch \ + 0003-add-enable-redirfs-to-build-Dazuko-as-a-RedirF.patch) sha1sums=('271d0a23d7aed2555f023141504386b6042a5efa' \ - '8292447cba4bdab9dfbb8169c011e74559a00804') + 'c736b6a9b9cb0540010eb865febfd4f3b1fe6d82' \ + '8292447cba4bdab9dfbb8169c011e74559a00804' \ + 'eebf571563481dba5bce10900b02bff5d6e30b78' \ + '4f6b6b45a2be49a4e90fd7fb2ad4e40d9e50c436' \ + 'd45e7a44154f61d79f54c940ba6fa6085c88cbf6') build() { - Fcd dazuko-$pkgver/ + Fcd + ln -s redirfs-$redirver ../redirfs # Patch needed by some F-Secure softwares patch -p0 < patch_fsecure_init_event.diff || Fdie # no Fcheckkernel, crosscompilation verified @@ -28,10 +40,11 @@ build() { Fsed '`uname -r`' "$_F_kernelmod_uname" configure find . -type f -exec sed -i '/#include <linux\/config.h>/d' {} \; ./configure --system=linux26 --disable-chroot-support \ - --without-dep --enable-event-init-module || Fdie + --without-dep --enable-event-init-module --enable-redirfs || Fdie make || Fdie - Ffilerel $_F_kernelmod_dir/extra/dazuko.ko + Ffilerel $_F_kernelmod_dir/extra/$_F_archive_name.ko make -C library || Fdie - Ffile dazuko-${pkgver//_/-}/library/libdazuko.a /usr/lib/libdazuko.a + Ffile $_F_archive_name-${pkgver//_/-}/library/libdazuko.a /usr/lib/libdazuko.a Fdoc README.Frugalware + Fbuild_kernelmod_scriptlet } diff --git a/source/apps-extra/dazuko-fwlive/README.Frugalware b/source/apps-extra/dazuko-fwlive/README.Frugalware new file mode 100644 index 0000000..cd09da1 --- /dev/null +++ b/source/apps-extra/dazuko-fwlive/README.Frugalware @@ -0,0 +1,13 @@ +If you got errors saying: + +'dazuko: failed to register' + +then you need to do: + +------------------- +# rmmod capability +# modprobe dazuko +# modprobe capability +------------------- + +It will work. diff --git a/source/apps-extra/dazuko-fwlive/dazuko-fwlive.install b/source/apps-extra/dazuko-fwlive/dazuko-fwlive.install deleted file mode 100644 index 6726b94..0000000 --- a/source/apps-extra/dazuko-fwlive/dazuko-fwlive.install +++ /dev/null @@ -1,43 +0,0 @@ -post_install() -{ - if test `grep dazuko < /etc/sysconfig/modules|wc -l` -gt 1; then - sed -i '/^dazuko/d' /etc/sysconfig/modules - fi - if test `grep commoncap < /etc/sysconfig/modules|wc -l` -gt 1; then - sed -i '/^commoncap/d' /etc/sysconfig/modules - fi - if ! grep -q dazuko /etc/sysconfig/modules; then - echo "Adding dazuko to /etc/sysconfig/modules..." - sed -i 's/capability/dazuko\ncapability/' /etc/sysconfig/modules - fi - if ! grep -q commoncap /etc/sysconfig/modules; then - echo "Adding commoncap to /etc/sysconfig/modules..." - sed -i 's/dazuko/commoncap\ndazuko/' /etc/sysconfig/modules - fi - depmod -a $_F_kernelmod_uname - rmmod capability 2>/dev/null - if test `lsmod|grep commoncap|wc -l` -lt 1; then - modprobe commoncap - fi - if test `lsmod|grep dazuko|wc -l` -ge 1; then - rmmod dazuko 2>/dev/null - fi - modprobe dazuko - modprobe capability - echo "Dazuko loaded..." -} - -post_upgrade() -{ - post_install -} - -pre_remove() -{ - sed -i '/^dazuko/d' /etc/sysconfig/modules - sed -i '/^commoncap/d' /etc/sysconfig/modules -} - -op=$1 -shift -$op $* diff --git a/source/apps-extra/dazuko-fwlive/dazuko.install b/source/apps-extra/dazuko-fwlive/dazuko.install new file mode 100644 index 0000000..6004b01 --- /dev/null +++ b/source/apps-extra/dazuko-fwlive/dazuko.install @@ -0,0 +1,38 @@ +post_install() +{ + if ! grep -q dazuko /etc/sysconfig/modules; then + echo -n "adding dazuko to /etc/sysconfig/modules..." + echo dazuko >> /etc/sysconfig/modules + echo " done." + fi + depmod -a $_F_kernelmod_uname + if lsmod|grep -q dazuko; then + rmmod dazuko + fi + echo -n "loading dazuko..." + modprobe dazuko + echo " done." +} + +post_upgrade() +{ + post_install +} + +pre_remove() +{ + if grep -q dazuko /etc/sysconfig/modules; then + echo -n "removing dazuko from /etc/sysconfig/modules..." + sed -i '/^dazuko/d' /etc/sysconfig/modules + echo " done." + fi + if lsmod|grep -q dazuko; then + echo -n "unloading dazuko..." + rmmod dazuko + echo " done." + fi +} + +op=$1 +shift +$op $* _______________________________________________ Frugalware-git mailing list Frugalware-git@frugalware.org http://frugalware.org/mailman/listinfo/frugalware-git