version 1.1.1.1, 2008/06/03 10:38:51 |
version 1.1.1.1.2.1, 2008/08/13 17:12:44 |
|
|
* SUCH DAMAGE. |
* SUCH DAMAGE. |
*/ |
*/ |
|
|
|
/* |
|
* devfs - device file system. |
|
*/ |
|
|
#include <prex/prex.h> |
#include <prex/prex.h> |
#include <sys/stat.h> |
#include <sys/stat.h> |
#include <sys/vnode.h> |
#include <sys/vnode.h> |
|
|
#define devfs_vget ((vfsop_vget_t)vfs_nullop) |
#define devfs_vget ((vfsop_vget_t)vfs_nullop) |
#define devfs_statfs ((vfsop_statfs_t)vfs_nullop) |
#define devfs_statfs ((vfsop_statfs_t)vfs_nullop) |
|
|
static int devfs_open(vnode_t, mode_t); |
static int devfs_open (vnode_t, int); |
static int devfs_close(vnode_t, file_t); |
static int devfs_close (vnode_t, file_t); |
static int devfs_read(vnode_t, file_t, void *, size_t, size_t *); |
static int devfs_read (vnode_t, file_t, void *, size_t, size_t *); |
static int devfs_write(vnode_t, file_t, void *, size_t, size_t *); |
static int devfs_write (vnode_t, file_t, void *, size_t, size_t *); |
#define devfs_seek ((vnop_seek_t)vop_nullop) |
#define devfs_seek ((vnop_seek_t)vop_nullop) |
static int devfs_ioctl(vnode_t, file_t, int, u_long); |
static int devfs_ioctl (vnode_t, file_t, u_long, void *); |
#define devfs_fsync ((vnop_fsync_t)vop_nullop) |
#define devfs_fsync ((vnop_fsync_t)vop_nullop) |
static int devfs_readdir(vnode_t, file_t, struct dirent *); |
static int devfs_readdir(vnode_t, file_t, struct dirent *); |
static int devfs_lookup(vnode_t, char *, vnode_t); |
static int devfs_lookup (vnode_t, char *, vnode_t); |
#define devfs_create ((vnop_create_t)vop_einval) |
#define devfs_create ((vnop_create_t)vop_einval) |
#define devfs_remove ((vnop_remove_t)vop_einval) |
#define devfs_remove ((vnop_remove_t)vop_einval) |
#define devfs_rename ((vnop_rename_t)vop_einval) |
#define devfs_rename ((vnop_rename_t)vop_einval) |
|
|
}; |
}; |
|
|
static int |
static int |
devfs_open(vnode_t vp, mode_t mode) |
devfs_open(vnode_t vp, int flags) |
{ |
{ |
char *path; |
char *path; |
device_t dev; |
device_t dev; |
int err; |
int err; |
|
|
dprintf("devfs_open: path=%s\n", vp->v_path); |
DPRINTF(("devfs_open: path=%s\n", vp->v_path)); |
|
|
path = vp->v_path; |
path = vp->v_path; |
if (!strcmp(path, "/")) /* root ? */ |
if (!strcmp(path, "/")) /* root ? */ |
|
|
|
|
if (*path == '/') |
if (*path == '/') |
path++; |
path++; |
err = device_open(path, mode & DO_RWMASK, &dev); |
err = device_open(path, flags & DO_RWMASK, &dev); |
if (err) { |
if (err) { |
dprintf("devfs_open: can not open device = %s error=%d\n", |
DPRINTF(("devfs_open: can not open device = %s error=%d\n", |
path, err); |
path, err)); |
return err; |
return err; |
} |
} |
vp->v_data = (void *)dev; /* Store private data */ |
vp->v_data = (void *)dev; /* Store private data */ |
|
|
devfs_close(vnode_t vp, file_t fp) |
devfs_close(vnode_t vp, file_t fp) |
{ |
{ |
|
|
dprintf("devfs_close: fp=%x\n", fp); |
DPRINTF(("devfs_close: fp=%x\n", fp)); |
|
|
if (!strcmp(vp->v_path, "/")) /* root ? */ |
if (!strcmp(vp->v_path, "/")) /* root ? */ |
return 0; |
return 0; |
|
|
err = device_write((device_t)vp->v_data, buf, &len, fp->f_offset); |
err = device_write((device_t)vp->v_data, buf, &len, fp->f_offset); |
if (!err) |
if (!err) |
*result = len; |
*result = len; |
dprintf("devfs_write: err=%d len=%d\n", err, len); |
DPRINTF(("devfs_write: err=%d len=%d\n", err, len)); |
return err; |
return err; |
} |
} |
|
|
static int |
static int |
devfs_ioctl(vnode_t vp, file_t fp, int cmd, u_long arg) |
devfs_ioctl(vnode_t vp, file_t fp, u_long cmd, void *arg) |
{ |
{ |
dprintf("devfs_ioctl\n"); |
DPRINTF(("devfs_ioctl\n")); |
return EINVAL; |
return EINVAL; |
} |
} |
|
|
|
|
struct info_device info; |
struct info_device info; |
int err, i; |
int err, i; |
|
|
dprintf("devfs_lookup:%s\n", name); |
DPRINTF(("devfs_lookup:%s\n", name)); |
|
|
if (*name == '\0') |
if (*name == '\0') |
return ENOENT; |
return ENOENT; |
|
|
struct info_device info; |
struct info_device info; |
int err, i; |
int err, i; |
|
|
dprintf("devfs_readdir offset=%d\n", fp->f_offset); |
DPRINTF(("devfs_readdir offset=%d\n", fp->f_offset)); |
|
|
i = 0; |
i = 0; |
err = 0; |
err = 0; |
|
|
dir->d_fileno = fp->f_offset; |
dir->d_fileno = fp->f_offset; |
dir->d_namlen = strlen(dir->d_name); |
dir->d_namlen = strlen(dir->d_name); |
|
|
dprintf("devfs_readdir: %s\n", dir->d_name); |
DPRINTF(("devfs_readdir: %s\n", dir->d_name)); |
fp->f_offset++; |
fp->f_offset++; |
return 0; |
return 0; |
} |
} |