4 Commits
v1.12 ... v1.13

Author SHA1 Message Date
Godzil
788c45bd77 Update to lastest version 2012-01-18 14:47:25 +01:00
Godzil
a667d5412c Update some parts. 2012-01-18 14:46:38 +01:00
Godzil
8db24fbd1d small changes 2012-01-18 14:46:27 +01:00
Godzil
57dc545fad commit latest changes 2012-01-18 14:46:10 +01:00
17 changed files with 2473 additions and 2177 deletions

1
.gitattributes vendored Normal file
View File

@@ -0,0 +1 @@
* ident=true

23
.gitignore vendored Normal file
View File

@@ -0,0 +1,23 @@
# Ignore all generated files
*.o
*.ko
*.cmd
*.a
*.d
*.mod
*.mod.c
*.order
*.so*
*~
# Generated demo executables
examples/console-read
examples/drums
examples/drums2
examples/drums3
examples/echo
examples/helloworld
examples/ioctl
examples/logring
examples/pager
examples/uid-filter

View File

@@ -6,10 +6,10 @@ PREFIX = /usr/local
LIBDIR = $(PREFIX)/lib LIBDIR = $(PREFIX)/lib
INCDIR = $(PREFIX)/include INCDIR = $(PREFIX)/include
CC = gcc CC = $(CROSS_COMPILE)gcc
LD = gcc LD = $(CROSS_COMPILE)gcc
INSTALL = install INSTALL = install
STRIP = strip STRIP = $(CROSS_COMPILE)strip
PREFIX = /usr/local PREFIX = /usr/local
BINDIR = $(PREFIX)/bin BINDIR = $(PREFIX)/bin
ETCDIR = /etc/$(TARGET) ETCDIR = /etc/$(TARGET)

View File

@@ -40,7 +40,7 @@
* need a template from which to start on a real driver, use pager.c * need a template from which to start on a real driver, use pager.c
* instead. * instead.
* *
* $Id$ * $Id: console-read.c 12351 2007-01-19 07:22:54Z xiphmont $
*/ */
#include <stdio.h> #include <stdio.h>

View File

@@ -42,7 +42,7 @@
* directory: /dev/drums/bam, /dev/drums/bum, etc. If you cat one of * directory: /dev/drums/bam, /dev/drums/bum, etc. If you cat one of
* these devices, it returns a string that's the same as its name. * these devices, it returns a string that's the same as its name.
* *
* $Id$ * $Id: drums.c 12355 2007-01-19 17:44:17Z xiphmont $
*/ */
#include <stdio.h> #include <stdio.h>

View File

@@ -47,7 +47,7 @@
* to remember if this user has read before; cat /dev/drums/X will * to remember if this user has read before; cat /dev/drums/X will
* read infinitely * read infinitely
* *
* $Id$ * $Id: drums2.c 12355 2007-01-19 17:44:17Z xiphmont $
*/ */
#include <stdio.h> #include <stdio.h>

View File

@@ -43,7 +43,7 @@
* However, it also prints a prompt to the console, asking the user if * However, it also prints a prompt to the console, asking the user if
* how loud the drums should be. * how loud the drums should be.
* *
* $Id$ * $Id: drums3.c 12351 2007-01-19 07:22:54Z xiphmont $
*/ */
#include <stdio.h> #include <stdio.h>

View File

@@ -41,7 +41,7 @@
* stored. Then, when you read (e.g. "cat /dev/echo"), you get back * stored. Then, when you read (e.g. "cat /dev/echo"), you get back
* whatever you wrote most recently. * whatever you wrote most recently.
* *
* $Id$ * $Id: echo.c 12351 2007-01-19 07:22:54Z xiphmont $
*/ */
#include <stdio.h> #include <stdio.h>

View File

@@ -37,7 +37,7 @@
* hello-world: Simply creates a device called /dev/hello-world, which * hello-world: Simply creates a device called /dev/hello-world, which
* greets you when you try to get it. * greets you when you try to get it.
* *
* $Id$ * $Id: helloworld.c 12351 2007-01-19 07:22:54Z xiphmont $
*/ */
/* EXAMPLE START helloworld.c */ /* EXAMPLE START helloworld.c */

View File

@@ -41,7 +41,7 @@
* the other examples, anyway), because this program is both an * the other examples, anyway), because this program is both an
* example and part of the regression test suite. * example and part of the regression test suite.
* *
* $Id$ * $Id: ioctl.c 12351 2007-01-19 07:22:54Z xiphmont $
*/ */
#include <stdio.h> #include <stdio.h>

View File

@@ -71,7 +71,7 @@
* but want to use it on a system that does not have FUSD, check out * but want to use it on a system that does not have FUSD, check out
* emlog at http://www.circlemud.org/~jelson/software/emlog. * emlog at http://www.circlemud.org/~jelson/software/emlog.
* *
* $Id$ * $Id: logring.c 12351 2007-01-19 07:22:54Z xiphmont $
*/ */
#include <stdio.h> #include <stdio.h>

View File

@@ -60,7 +60,7 @@
* If you close the FD and then reopen it, there will be a race (pages * If you close the FD and then reopen it, there will be a race (pages
* that arrive between the close and open will not be delivered). * that arrive between the close and open will not be delivered).
* *
* $Id$ * $Id: pager.c 12355 2007-01-19 17:44:17Z xiphmont $
*/ */
#include <stdio.h> #include <stdio.h>

View File

@@ -42,7 +42,7 @@
* not be read by anyone other than the driver owner (not even root!). * not be read by anyone other than the driver owner (not even root!).
* When you read from the device, it returns your PID to you. * When you read from the device, it returns your PID to you.
* *
* $Id$ * $Id: uid-filter.c 12351 2007-01-19 07:22:54Z xiphmont $
*/ */
#include <stdio.h> #include <stdio.h>

View File

@@ -37,28 +37,28 @@
* *
* Private header file used by the Linux Kernel Module * Private header file used by the Linux Kernel Module
* *
* $Id$ * $Id: kfusd.h 12351 2007-01-19 07:22:54Z xiphmont $
*/ */
#ifndef __KFUSD_H__ #ifndef __KFUSD_H__
#define __KFUSD_H__ # define __KFUSD_H__
#include "fusd_msg.h" # include "fusd_msg.h"
/* magic numbers for structure checking; unique w.r.t /* magic numbers for structure checking; unique w.r.t
* /usr/src/linux/Documentation/magic-number.txt */ * /usr/src/linux/Documentation/magic-number.txt */
#define FUSD_DEV_MAGIC 0x8b43a123 # define FUSD_DEV_MAGIC 0x8b43a123
#define FUSD_FILE_MAGIC 0x613aa8fe # define FUSD_FILE_MAGIC 0x613aa8fe
/* number of devices that can be created with fusd */ /* number of devices that can be created with fusd */
#define MAX_FUSD_DEVICES 128 # define MAX_FUSD_DEVICES 128
/* number of times each device can be opened simultaneously */ /* number of times each device can be opened simultaneously */
#define MIN_FILEARRAY_SIZE 8 /* initialize allocation */ # define MIN_FILEARRAY_SIZE 8 /* initialize allocation */
#define MAX_FILEARRAY_SIZE 1024 /* maximum it can grow to */ # define MAX_FILEARRAY_SIZE 1024 /* maximum it can grow to */
/* maximum read/write size we're willing to service */ /* maximum read/write size we're willing to service */
#define MAX_RW_SIZE (1024*128) # define MAX_RW_SIZE (1024*128)
/********************** Structure Definitions *******************************/ /********************** Structure Definitions *******************************/
@@ -88,7 +88,7 @@ struct fusd_transaction
struct fusd_dev_t_s; struct fusd_dev_t_s;
typedef struct fusd_dev_t_s fusd_dev_t; typedef struct fusd_dev_t_s fusd_dev_t;
struct CLASS; struct CLASS;
struct class_device; struct device;
/* state kept per opened file (i.e., an instance of a device) */ /* state kept per opened file (i.e., an instance of a device) */
typedef struct { typedef struct {
@@ -125,7 +125,7 @@ struct fusd_dev_t_s {
char *dev_name; char *dev_name;
struct CLASS *clazz; struct CLASS *clazz;
int owns_class; int owns_class;
struct class_device *class_device; struct device *device;
void *private_data; /* User's private data */ void *private_data; /* User's private data */
struct cdev* handle; struct cdev* handle;
@@ -174,34 +174,34 @@ STATIC struct fusd_transaction* fusd_find_transaction_by_pid(fusd_file_t *fusd_f
/**** Utility functions & macros ****/ /**** Utility functions & macros ****/
#ifdef CONFIG_FUSD_USE_WAKEUPSYNC # ifdef CONFIG_FUSD_USE_WAKEUPSYNC
#define WAKE_UP_INTERRUPTIBLE_SYNC(x) wake_up_interruptible_sync(x) # define WAKE_UP_INTERRUPTIBLE_SYNC(x) wake_up_interruptible_sync(x)
#else # else
#define WAKE_UP_INTERRUPTIBLE_SYNC(x) wake_up_interruptible(x) # define WAKE_UP_INTERRUPTIBLE_SYNC(x) wake_up_interruptible(x)
#endif /* CONFIG_FUSD_USE_WAKEUPSYNC */ # endif /* CONFIG_FUSD_USE_WAKEUPSYNC */
#ifdef CONFIG_FUSD_DEBUG # ifdef CONFIG_FUSD_DEBUG
static void rdebug_real(char *fmt, ...) static void rdebug_real(char *fmt, ...)
__attribute__ ((format (printf, 1, 2))); __attribute__ ((format (printf, 1, 2)));
#define RDEBUG(message_level, args...) do { \ # define RDEBUG(message_level, args...) do { \
if (fusd_debug_level >= message_level) rdebug_real(args); \ if (fusd_debug_level >= message_level) rdebug_real(args); \
} while(0) } while(0)
#else # else
#define RDEBUG(message_level, args...) # define RDEBUG(message_level, args...)
#endif /* CONFIG_FUSD_DEBUG */ # endif /* CONFIG_FUSD_DEBUG */
#define ZOMBIE(fusd_dev) ((fusd_dev)->zombie) # define ZOMBIE(fusd_dev) ((fusd_dev)->zombie)
#define GET_FUSD_DEV(candidate, fusd_dev) do { \ # define GET_FUSD_DEV(candidate, fusd_dev) do { \
fusd_dev = candidate; \ fusd_dev = candidate; \
if (fusd_dev == NULL || fusd_dev->magic != FUSD_DEV_MAGIC) \ if (fusd_dev == NULL || fusd_dev->magic != FUSD_DEV_MAGIC) \
goto invalid_dev; \ goto invalid_dev; \
} while (0) } while (0)
#define GET_FUSD_FILE_AND_DEV(candidate, fusd_file, fusd_dev) do { \ # define GET_FUSD_FILE_AND_DEV(candidate, fusd_file, fusd_dev) do { \
fusd_file = candidate; \ fusd_file = candidate; \
if (fusd_file == NULL || fusd_file->magic != FUSD_FILE_MAGIC) \ if (fusd_file == NULL || fusd_file->magic != FUSD_FILE_MAGIC) \
goto invalid_file; \ goto invalid_file; \
@@ -210,36 +210,40 @@ static void rdebug_real(char *fmt, ...)
goto invalid_file; \ goto invalid_file; \
} while (0) } while (0)
# define LOCK_FUSD_DEV(fusd_dev) \
#define LOCK_FUSD_DEV(fusd_dev) \
do { down(&fusd_dev->dev_sem); \ do { down(&fusd_dev->dev_sem); \
if (ZOMBIE(fusd_dev)) { up(&fusd_dev->dev_sem); goto zombie_dev; } \ if (ZOMBIE(fusd_dev)) { up(&fusd_dev->dev_sem); goto zombie_dev; } \
} while (0) } while (0)
/* rawlock does not do a zombie check */ /* rawlock does not do a zombie check */
#define RAWLOCK_FUSD_DEV(fusd_dev) \
# define RAWLOCK_FUSD_DEV(fusd_dev) \
do { down(&fusd_dev->dev_sem); } while (0) do { down(&fusd_dev->dev_sem); } while (0)
#define UNLOCK_FUSD_DEV(fusd_dev) \ # define UNLOCK_FUSD_DEV(fusd_dev) \
do { up(&fusd_dev->dev_sem); } while (0) do { up(&fusd_dev->dev_sem); } while (0)
# define LOCK_FUSD_FILE(fusd_file) \
#define LOCK_FUSD_FILE(fusd_file) \
do { down(&fusd_file->file_sem); \ do { down(&fusd_file->file_sem); \
} while (0) } while (0)
#define UNLOCK_FUSD_FILE(fusd_file) \ # define UNLOCK_FUSD_FILE(fusd_file) \
do { up(&fusd_file->file_sem); } while (0) do { up(&fusd_file->file_sem); } while (0)
#define FREE_FUSD_MSGC(fusd_msgc) do { \ # define FREE_FUSD_MSGC(fusd_msgc) do { \
if ((fusd_msgc)->fusd_msg.data != NULL) VFREE(fusd_msgc->fusd_msg.data); \ if ((fusd_msgc)->fusd_msg.data != NULL) VFREE(fusd_msgc->fusd_msg.data); \
KFREE(fusd_msgc); \ KFREE(fusd_msgc); \
} while (0) } while (0)
#define NAME(fusd_dev) ((fusd_dev)->name == NULL ? \ # define FREE_FUSD_MSGC(fusd_msgc) do { \
if ((fusd_msgc)->fusd_msg.data != NULL) VFREE(fusd_msgc->fusd_msg.data); \
KFREE(fusd_msgc); \
} while (0)
# define NAME(fusd_dev) ((fusd_dev)->name == NULL ? \
"<noname>" : (fusd_dev)->name) "<noname>" : (fusd_dev)->name)
#ifdef CONFIG_FUSD_MEMDEBUG # ifdef CONFIG_FUSD_MEMDEBUG
static int fusd_mem_init(void); static int fusd_mem_init(void);
static void fusd_mem_cleanup(void); static void fusd_mem_cleanup(void);
static void fusd_mem_add(void *ptr, int line, int size); static void fusd_mem_add(void *ptr, int line, int size);
@@ -248,22 +252,22 @@ static void *fusd_kmalloc(size_t size, int type, int line);
static void fusd_kfree(void *ptr); static void fusd_kfree(void *ptr);
static void *fusd_vmalloc(size_t size, int line); static void *fusd_vmalloc(size_t size, int line);
static void fusd_vfree(void *ptr); static void fusd_vfree(void *ptr);
# define KMALLOC(size, type) fusd_kmalloc(size, type, __LINE__) # define KMALLOC(size, type) fusd_kmalloc(size, type, __LINE__)
# define KFREE(ptr) fusd_kfree(ptr) # define KFREE(ptr) fusd_kfree(ptr)
# define VMALLOC(size) fusd_vmalloc(size, __LINE__) # define VMALLOC(size) fusd_vmalloc(size, __LINE__)
# define VFREE(ptr) fusd_vfree(ptr) # define VFREE(ptr) fusd_vfree(ptr)
#else /* no memory debugging */ # else /* no memory debugging */
# define KMALLOC(size, type) kmalloc(size, type) # define KMALLOC(size, type) kmalloc(size, type)
# define KFREE(ptr) kfree(ptr) # define KFREE(ptr) kfree(ptr)
/*# define VMALLOC(size) vmalloc(size)*/ /*# define VMALLOC(size) vmalloc(size)*/
# define VMALLOC(size) kmalloc(size, GFP_KERNEL) # define VMALLOC(size) kmalloc(size, GFP_KERNEL)
# define VFREE(ptr) kfree(ptr) # define VFREE(ptr) kfree(ptr)
#endif /* CONFIG_FUSD_MEMDEBUG */ # endif /* CONFIG_FUSD_MEMDEBUG */
/* Functions like this should be in the kernel, but they are not. Sigh. */ /* Functions like this should be in the kernel, but they are not. Sigh. */
#ifdef CONFIG_SMP # ifdef CONFIG_SMP
DECLARE_MUTEX(atomic_ops); DECLARE_MUTEX(atomic_ops);
@@ -276,12 +280,11 @@ static __inline__ int atomic_inc_and_ret(int *i)
up(&atomic_ops); up(&atomic_ops);
return val; return val;
} }
#else # else
static __inline__ int atomic_inc_and_ret(int *i) static __inline__ int atomic_inc_and_ret(int *i)
{ {
return (++(*i)); return (++(*i));
} }
#endif # endif
#endif /* __KFUSD_H__ */ #endif /* __KFUSD_H__ */

View File

@@ -1,16 +1,21 @@
ifneq ($(KERNELRELEASE),) ifneq ($(KERNELRELEASE),)
obj-m := kfusd.o obj-m := kfusd.o
KERNEL_VER ?= $(KERNELRELEASE)
else else
KDIR ?= /lib/modules/$(shell uname -r)/build KDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd) PWD := $(shell pwd)
ROOTFS ?=
KERNEL_VER ?= 2.6.32.7
default: default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) EXTRA_CFLAGS=-I$(PWD)/../include modules $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) EXTRA_CFLAGS=-I$(PWD)/../include modules
install: install:
$(INSTALL) -d -m 0755 /lib/modules/$(shell uname -r)/kernel/drivers/misc install -d -m 0755 $(ROOTFS)/lib/modules/$(KERNEL_VER)/kernel/drivers/misc
$(INSTALL) -m 0755 kfusd.ko /lib/modules/$(shell uname -r)/kernel/drivers/misc install -m 0755 kfusd.ko $(ROOTFS)/lib/modules/$(KERNEL_VER)/kernel/drivers/misc
/sbin/depmod -a
# /sbin/depmod -a
clean: clean:
rm -f .kfusd* Modules.symvers \ rm -f .kfusd* Modules.symvers \

File diff suppressed because it is too large Load Diff

View File

@@ -35,10 +35,10 @@
* *
* authors: jelson and girod * authors: jelson and girod
* *
* $Id$ * $Id: libfusd.c 12351 2007-01-19 07:22:54Z xiphmont $
*/ */
char libfusd_c_id[] = "$Id$"; char libfusd_c_id[] = "$Id: libfusd.c 12351 2007-01-19 07:22:54Z xiphmont $";
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@@ -328,8 +328,6 @@ void fusd_fdset_add(fd_set *set, int *max)
} }
} }
/* /*
* fusd_dispatch_fdset: given an fd_set full of descriptors, call * fusd_dispatch_fdset: given an fd_set full of descriptors, call
* fusd_dispatch on every descriptor in the set which is a valid FUSD * fusd_dispatch on every descriptor in the set which is a valid FUSD
@@ -410,16 +408,21 @@ static int fusd_dispatch_one(int fd, fusd_file_operations_t *fops)
/* dispatch on operation type */ /* dispatch on operation type */
user_retval = -ENOSYS; user_retval = -ENOSYS;
//printf("dispatch_one: subcmd: %d - ", msg->subcmd);
switch (msg->subcmd) { switch (msg->subcmd) {
case FUSD_OPEN: case FUSD_OPEN:
//printf("FUSD_OPEN\n");
if (fops && fops->open) if (fops && fops->open)
user_retval = fops->open(file); user_retval = fops->open(file);
break; break;
case FUSD_CLOSE: case FUSD_CLOSE:
//printf("FUSD_CLOSE\n");
if (fops && fops->close) if (fops && fops->close)
user_retval = fops->close(file); user_retval = fops->close(file);
break; break;
case FUSD_READ: case FUSD_READ:
//printf("FUSD_READ\n");
/* allocate a buffer and make the call */ /* allocate a buffer and make the call */
if (fops && fops->read) { if (fops && fops->read) {
if ((msg->data = malloc(msg->parm.fops_msg.length)) == NULL) { if ((msg->data = malloc(msg->parm.fops_msg.length)) == NULL) {
@@ -433,11 +436,13 @@ static int fusd_dispatch_one(int fd, fusd_file_operations_t *fops)
} }
break; break;
case FUSD_WRITE: case FUSD_WRITE:
//printf("FUSD_WRITE\n");
if (fops && fops->write) if (fops && fops->write)
user_retval = fops->write(file, msg->data, msg->datalen, user_retval = fops->write(file, msg->data, msg->datalen,
&msg->parm.fops_msg.offset); &msg->parm.fops_msg.offset);
break; break;
case FUSD_MMAP: case FUSD_MMAP:
//printf("FUSD_MMAP\n");
if (fops && fops->mmap) if (fops && fops->mmap)
{ {
user_retval = fops->mmap(file, msg->parm.fops_msg.offset, msg->parm.fops_msg.length, msg->parm.fops_msg.flags, user_retval = fops->mmap(file, msg->parm.fops_msg.offset, msg->parm.fops_msg.length, msg->parm.fops_msg.flags,
@@ -445,6 +450,7 @@ static int fusd_dispatch_one(int fd, fusd_file_operations_t *fops)
} }
break; break;
case FUSD_IOCTL: case FUSD_IOCTL:
//printf("FUSD_IOCTL\n");
if (fops && fops->ioctl) { if (fops && fops->ioctl) {
/* in the case of an ioctl read, allocate a buffer for the /* in the case of an ioctl read, allocate a buffer for the
* driver to write to, IF there isn't already a buffer. (there * driver to write to, IF there isn't already a buffer. (there
@@ -466,6 +472,7 @@ static int fusd_dispatch_one(int fd, fusd_file_operations_t *fops)
break; break;
case FUSD_POLL_DIFF: case FUSD_POLL_DIFF:
//printf("FUSD_POLL_DIFF\n");
/* This callback requests notification when an event occurs on a file, /* This callback requests notification when an event occurs on a file,
* e.g. becoming readable or writable */ * e.g. becoming readable or writable */
if (fops && fops->poll_diff) if (fops && fops->poll_diff)
@@ -473,6 +480,7 @@ static int fusd_dispatch_one(int fd, fusd_file_operations_t *fops)
break; break;
case FUSD_UNBLOCK: case FUSD_UNBLOCK:
//printf("FUSD_UNBLOCK\n");
/* This callback is called when a system call is interrupted */ /* This callback is called when a system call is interrupted */
if (fops && fops->unblock) if (fops && fops->unblock)
user_retval = fops->unblock(file); user_retval = fops->unblock(file);
@@ -533,6 +541,7 @@ void fusd_dispatch(int fd)
if (!FUSD_FD_VALID(fd)) { if (!FUSD_FD_VALID(fd)) {
errno = EBADF; errno = EBADF;
retval = -1; retval = -1;
fprintf(stderr, "libfusd: not a valid FUSD FD\n");
goto out; goto out;
} }
fops = FUSD_GET_FOPS(fd); fops = FUSD_GET_FOPS(fd);
@@ -555,7 +564,7 @@ void fusd_dispatch(int fd)
out: out:
if (retval < 0 && errno != EPIPE) if (retval < 0 && errno != EPIPE)
fprintf(stderr, "libfusd: fusd_dispatch error on fd %d: %m\n", fd); fprintf(stderr, "libfusd: fusd_dispatch error on fd %d: [%d] %m \n", fd, retval);
} }
@@ -648,11 +657,16 @@ int fusd_return(fusd_file_info_t *file, ssize_t retval)
/* send message to kernel */ /* send message to kernel */
if (msg->datalen && msg->data != NULL) { if (msg->datalen && msg->data != NULL) {
//printf("(msg->datalen [%d] && msg->data != NULL [%p]", msg->datalen, msg->data);
iov[0].iov_base = msg; iov[0].iov_base = msg;
iov[0].iov_len = sizeof(fusd_msg_t); iov[0].iov_len = sizeof(fusd_msg_t);
iov[1].iov_base = msg->data; iov[1].iov_base = msg->data;
iov[1].iov_len = msg->datalen; iov[1].iov_len = msg->datalen;
#if 0
driver_retval = writev(fd, iov, 2); driver_retval = writev(fd, iov, 2);
#else
driver_retval = ioctl(fd, 0xb16b00b5, iov);
#endif
} }
else { else {
driver_retval = write(fd, msg, sizeof(fusd_msg_t)); driver_retval = write(fd, msg, sizeof(fusd_msg_t));