[BACK]Return to devfs_vnops.c CVS log [TXT][DIR] Up to [local] / prex-old / usr / server / fs / devfs

Annotation of prex-old/usr/server/fs/devfs/devfs_vnops.c, Revision 1.1.1.1

1.1       nbrk        1: /*
                      2:  * Copyright (c) 2005-2007, Kohsuke Ohtani
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms, with or without
                      6:  * modification, are permitted provided that the following conditions
                      7:  * are met:
                      8:  * 1. Redistributions of source code must retain the above copyright
                      9:  *    notice, this list of conditions and the following disclaimer.
                     10:  * 2. Redistributions in binary form must reproduce the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer in the
                     12:  *    documentation and/or other materials provided with the distribution.
                     13:  * 3. Neither the name of the author nor the names of any co-contributors
                     14:  *    may be used to endorse or promote products derived from this software
                     15:  *    without specific prior written permission.
                     16:  *
                     17:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
                     18:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     19:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     20:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
                     21:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     22:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     23:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     24:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     25:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     26:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     27:  * SUCH DAMAGE.
                     28:  */
                     29:
                     30: #include <prex/prex.h>
                     31: #include <sys/stat.h>
                     32: #include <sys/vnode.h>
                     33: #include <sys/file.h>
                     34: #include <sys/mount.h>
                     35: #include <sys/syslog.h>
                     36:
                     37: #include <ctype.h>
                     38: #include <unistd.h>
                     39: #include <errno.h>
                     40: #include <string.h>
                     41: #include <stdlib.h>
                     42: #include <limits.h>
                     43: #include <fcntl.h>
                     44:
                     45: #include "devfs.h"
                     46:
                     47:
                     48: #define devfs_mount    ((vfsop_mount_t)vfs_nullop)
                     49: #define devfs_unmount  ((vfsop_umount_t)vfs_nullop)
                     50: #define devfs_sync     ((vfsop_sync_t)vfs_nullop)
                     51: #define devfs_vget     ((vfsop_vget_t)vfs_nullop)
                     52: #define devfs_statfs   ((vfsop_statfs_t)vfs_nullop)
                     53:
                     54: static int devfs_open(vnode_t, mode_t);
                     55: static int devfs_close(vnode_t, file_t);
                     56: static int devfs_read(vnode_t, file_t, void *, size_t, size_t *);
                     57: static int devfs_write(vnode_t, file_t, void *, size_t, size_t *);
                     58: #define devfs_seek     ((vnop_seek_t)vop_nullop)
                     59: static int devfs_ioctl(vnode_t, file_t, int, u_long);
                     60: #define devfs_fsync    ((vnop_fsync_t)vop_nullop)
                     61: static int devfs_readdir(vnode_t, file_t, struct dirent *);
                     62: static int devfs_lookup(vnode_t, char *, vnode_t);
                     63: #define devfs_create   ((vnop_create_t)vop_einval)
                     64: #define devfs_remove   ((vnop_remove_t)vop_einval)
                     65: #define devfs_rename   ((vnop_rename_t)vop_einval)
                     66: #define devfs_mkdir    ((vnop_mkdir_t)vop_einval)
                     67: #define devfs_rmdir    ((vnop_rmdir_t)vop_einval)
                     68: #define devfs_getattr  ((vnop_getattr_t)vop_nullop)
                     69: #define devfs_setattr  ((vnop_setattr_t)vop_nullop)
                     70: #define devfs_inactive ((vnop_inactive_t)vop_nullop)
                     71: #define devfs_truncate ((vnop_truncate_t)vop_nullop)
                     72:
                     73: struct vnops devfs_vnops;
                     74:
                     75: /*
                     76:  * File system operations
                     77:  */
                     78: struct vfsops devfs_vfsops = {
                     79:        devfs_mount,            /* mount */
                     80:        devfs_unmount,          /* unmount */
                     81:        devfs_sync,             /* sync */
                     82:        devfs_vget,             /* vget */
                     83:        devfs_statfs,           /* statfs */
                     84:        &devfs_vnops,           /* vnops */
                     85: };
                     86:
                     87: /*
                     88:  * vnode operations
                     89:  */
                     90: struct vnops devfs_vnops = {
                     91:        devfs_open,             /* open */
                     92:        devfs_close,            /* close */
                     93:        devfs_read,             /* read */
                     94:        devfs_write,            /* write */
                     95:        devfs_seek,             /* seek */
                     96:        devfs_ioctl,            /* ioctl */
                     97:        devfs_fsync,            /* fsync */
                     98:        devfs_readdir,          /* readdir */
                     99:        devfs_lookup,           /* lookup */
                    100:        devfs_create,           /* create */
                    101:        devfs_remove,           /* remove */
                    102:        devfs_rename,           /* remame */
                    103:        devfs_mkdir,            /* mkdir */
                    104:        devfs_rmdir,            /* rmdir */
                    105:        devfs_getattr,          /* getattr */
                    106:        devfs_setattr,          /* setattr */
                    107:        devfs_inactive,         /* inactive */
                    108:        devfs_truncate,         /* truncate */
                    109: };
                    110:
                    111: static int
                    112: devfs_open(vnode_t vp, mode_t mode)
                    113: {
                    114:        char *path;
                    115:        device_t dev;
                    116:        int err;
                    117:
                    118:        dprintf("devfs_open: path=%s\n", vp->v_path);
                    119:
                    120:        path = vp->v_path;
                    121:        if (!strcmp(path, "/")) /* root ? */
                    122:                return 0;
                    123:
                    124:        if (*path == '/')
                    125:                path++;
                    126:        err = device_open(path, mode & DO_RWMASK, &dev);
                    127:        if (err) {
                    128:                dprintf("devfs_open: can not open device = %s error=%d\n",
                    129:                        path, err);
                    130:                return err;
                    131:        }
                    132:        vp->v_data = (void *)dev;       /* Store private data */
                    133:        return 0;
                    134: }
                    135:
                    136: static int
                    137: devfs_close(vnode_t vp, file_t fp)
                    138: {
                    139:
                    140:        dprintf("devfs_close: fp=%x\n", fp);
                    141:
                    142:        if (!strcmp(vp->v_path, "/"))   /* root ? */
                    143:                return 0;
                    144:
                    145:        return device_close((device_t)vp->v_data);
                    146: }
                    147:
                    148: static int
                    149: devfs_read(vnode_t vp, file_t fp, void *buf, size_t size, size_t *result)
                    150: {
                    151:        int err;
                    152:        size_t len;
                    153:
                    154:        len = size;
                    155:        err = device_read((device_t)vp->v_data, buf, &len, fp->f_offset);
                    156:        if (!err)
                    157:                *result = len;
                    158:        return err;
                    159: }
                    160:
                    161: static int
                    162: devfs_write(vnode_t vp, file_t fp, void *buf, size_t size, size_t *result)
                    163: {
                    164:        int err;
                    165:        size_t len;
                    166:
                    167:        len = size;
                    168:        err = device_write((device_t)vp->v_data, buf, &len, fp->f_offset);
                    169:        if (!err)
                    170:                *result = len;
                    171:        dprintf("devfs_write: err=%d len=%d\n", err, len);
                    172:        return err;
                    173: }
                    174:
                    175: static int
                    176: devfs_ioctl(vnode_t vp, file_t fp, int cmd, u_long arg)
                    177: {
                    178:        dprintf("devfs_ioctl\n");
                    179:        return EINVAL;
                    180: }
                    181:
                    182: static int
                    183: devfs_lookup(vnode_t dvp, char *name, vnode_t vp)
                    184: {
                    185:        struct info_device info;
                    186:        int err, i;
                    187:
                    188:        dprintf("devfs_lookup:%s\n", name);
                    189:
                    190:        if (*name == '\0')
                    191:                return ENOENT;
                    192:
                    193:        i = 0;
                    194:        err = 0;
                    195:        info.cookie = 0;
                    196:        for (;;) {
                    197:                err = sys_info(INFO_DEVICE, &info);
                    198:                if (err)
                    199:                        return ENOENT;
                    200:                if (!strncmp(info.name, name, MAXDEVNAME))
                    201:                        break;
                    202:                i++;
                    203:        }
                    204:        vp->v_type = (info.flags & DF_CHR) ? VCHR : VBLK;
                    205:        vp->v_mode = (mode_t)(S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP
                    206:                              | S_IROTH | S_IWOTH);
                    207:        return 0;
                    208: }
                    209:
                    210: /*
                    211:  * @vp: vnode of the directory.
                    212:  */
                    213: static int
                    214: devfs_readdir(vnode_t vp, file_t fp, struct dirent *dir)
                    215: {
                    216:        struct info_device info;
                    217:        int err, i;
                    218:
                    219:        dprintf("devfs_readdir offset=%d\n", fp->f_offset);
                    220:
                    221:        i = 0;
                    222:        err = 0;
                    223:        info.cookie = 0;
                    224:        do {
                    225:                err = sys_info(INFO_DEVICE, &info);
                    226:                if (err)
                    227:                        return ENOENT;
                    228:        } while (i++ != fp->f_offset);
                    229:
                    230:        dir->d_type = 0;
                    231:        if (info.flags & DF_CHR)
                    232:                dir->d_type = DT_CHR;
                    233:        else if (info.flags & DF_BLK)
                    234:                dir->d_type = DT_BLK;
                    235:        strcpy((char *)&dir->d_name, info.name);
                    236:        dir->d_fileno = fp->f_offset;
                    237:        dir->d_namlen = strlen(dir->d_name);
                    238:
                    239:        dprintf("devfs_readdir: %s\n", dir->d_name);
                    240:        fp->f_offset++;
                    241:        return 0;
                    242: }
                    243:
                    244: int
                    245: devfs_init(void)
                    246: {
                    247:        return 0;
                    248: }

CVSweb