[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.2.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:
1.1.1.1.2.1! nbrk       30: /*
        !            31:  * devfs - device file system.
        !            32:  */
        !            33:
1.1       nbrk       34: #include <prex/prex.h>
                     35: #include <sys/stat.h>
                     36: #include <sys/vnode.h>
                     37: #include <sys/file.h>
                     38: #include <sys/mount.h>
                     39: #include <sys/syslog.h>
                     40:
                     41: #include <ctype.h>
                     42: #include <unistd.h>
                     43: #include <errno.h>
                     44: #include <string.h>
                     45: #include <stdlib.h>
                     46: #include <limits.h>
                     47: #include <fcntl.h>
                     48:
                     49: #include "devfs.h"
                     50:
                     51:
                     52: #define devfs_mount    ((vfsop_mount_t)vfs_nullop)
                     53: #define devfs_unmount  ((vfsop_umount_t)vfs_nullop)
                     54: #define devfs_sync     ((vfsop_sync_t)vfs_nullop)
                     55: #define devfs_vget     ((vfsop_vget_t)vfs_nullop)
                     56: #define devfs_statfs   ((vfsop_statfs_t)vfs_nullop)
                     57:
1.1.1.1.2.1! nbrk       58: static int devfs_open  (vnode_t, int);
        !            59: static int devfs_close (vnode_t, file_t);
        !            60: static int devfs_read  (vnode_t, file_t, void *, size_t, size_t *);
        !            61: static int devfs_write (vnode_t, file_t, void *, size_t, size_t *);
1.1       nbrk       62: #define devfs_seek     ((vnop_seek_t)vop_nullop)
1.1.1.1.2.1! nbrk       63: static int devfs_ioctl (vnode_t, file_t, u_long, void *);
1.1       nbrk       64: #define devfs_fsync    ((vnop_fsync_t)vop_nullop)
                     65: static int devfs_readdir(vnode_t, file_t, struct dirent *);
1.1.1.1.2.1! nbrk       66: static int devfs_lookup        (vnode_t, char *, vnode_t);
1.1       nbrk       67: #define devfs_create   ((vnop_create_t)vop_einval)
                     68: #define devfs_remove   ((vnop_remove_t)vop_einval)
                     69: #define devfs_rename   ((vnop_rename_t)vop_einval)
                     70: #define devfs_mkdir    ((vnop_mkdir_t)vop_einval)
                     71: #define devfs_rmdir    ((vnop_rmdir_t)vop_einval)
                     72: #define devfs_getattr  ((vnop_getattr_t)vop_nullop)
                     73: #define devfs_setattr  ((vnop_setattr_t)vop_nullop)
                     74: #define devfs_inactive ((vnop_inactive_t)vop_nullop)
                     75: #define devfs_truncate ((vnop_truncate_t)vop_nullop)
                     76:
                     77: struct vnops devfs_vnops;
                     78:
                     79: /*
                     80:  * File system operations
                     81:  */
                     82: struct vfsops devfs_vfsops = {
                     83:        devfs_mount,            /* mount */
                     84:        devfs_unmount,          /* unmount */
                     85:        devfs_sync,             /* sync */
                     86:        devfs_vget,             /* vget */
                     87:        devfs_statfs,           /* statfs */
                     88:        &devfs_vnops,           /* vnops */
                     89: };
                     90:
                     91: /*
                     92:  * vnode operations
                     93:  */
                     94: struct vnops devfs_vnops = {
                     95:        devfs_open,             /* open */
                     96:        devfs_close,            /* close */
                     97:        devfs_read,             /* read */
                     98:        devfs_write,            /* write */
                     99:        devfs_seek,             /* seek */
                    100:        devfs_ioctl,            /* ioctl */
                    101:        devfs_fsync,            /* fsync */
                    102:        devfs_readdir,          /* readdir */
                    103:        devfs_lookup,           /* lookup */
                    104:        devfs_create,           /* create */
                    105:        devfs_remove,           /* remove */
                    106:        devfs_rename,           /* remame */
                    107:        devfs_mkdir,            /* mkdir */
                    108:        devfs_rmdir,            /* rmdir */
                    109:        devfs_getattr,          /* getattr */
                    110:        devfs_setattr,          /* setattr */
                    111:        devfs_inactive,         /* inactive */
                    112:        devfs_truncate,         /* truncate */
                    113: };
                    114:
                    115: static int
1.1.1.1.2.1! nbrk      116: devfs_open(vnode_t vp, int flags)
1.1       nbrk      117: {
                    118:        char *path;
                    119:        device_t dev;
                    120:        int err;
                    121:
1.1.1.1.2.1! nbrk      122:        DPRINTF(("devfs_open: path=%s\n", vp->v_path));
1.1       nbrk      123:
                    124:        path = vp->v_path;
                    125:        if (!strcmp(path, "/")) /* root ? */
                    126:                return 0;
                    127:
                    128:        if (*path == '/')
                    129:                path++;
1.1.1.1.2.1! nbrk      130:        err = device_open(path, flags & DO_RWMASK, &dev);
1.1       nbrk      131:        if (err) {
1.1.1.1.2.1! nbrk      132:                DPRINTF(("devfs_open: can not open device = %s error=%d\n",
        !           133:                         path, err));
1.1       nbrk      134:                return err;
                    135:        }
                    136:        vp->v_data = (void *)dev;       /* Store private data */
                    137:        return 0;
                    138: }
                    139:
                    140: static int
                    141: devfs_close(vnode_t vp, file_t fp)
                    142: {
                    143:
1.1.1.1.2.1! nbrk      144:        DPRINTF(("devfs_close: fp=%x\n", fp));
1.1       nbrk      145:
                    146:        if (!strcmp(vp->v_path, "/"))   /* root ? */
                    147:                return 0;
                    148:
                    149:        return device_close((device_t)vp->v_data);
                    150: }
                    151:
                    152: static int
                    153: devfs_read(vnode_t vp, file_t fp, void *buf, size_t size, size_t *result)
                    154: {
                    155:        int err;
                    156:        size_t len;
                    157:
                    158:        len = size;
                    159:        err = device_read((device_t)vp->v_data, buf, &len, fp->f_offset);
                    160:        if (!err)
                    161:                *result = len;
                    162:        return err;
                    163: }
                    164:
                    165: static int
                    166: devfs_write(vnode_t vp, file_t fp, void *buf, size_t size, size_t *result)
                    167: {
                    168:        int err;
                    169:        size_t len;
                    170:
                    171:        len = size;
                    172:        err = device_write((device_t)vp->v_data, buf, &len, fp->f_offset);
                    173:        if (!err)
                    174:                *result = len;
1.1.1.1.2.1! nbrk      175:        DPRINTF(("devfs_write: err=%d len=%d\n", err, len));
1.1       nbrk      176:        return err;
                    177: }
                    178:
                    179: static int
1.1.1.1.2.1! nbrk      180: devfs_ioctl(vnode_t vp, file_t fp, u_long cmd, void *arg)
1.1       nbrk      181: {
1.1.1.1.2.1! nbrk      182:        DPRINTF(("devfs_ioctl\n"));
1.1       nbrk      183:        return EINVAL;
                    184: }
                    185:
                    186: static int
                    187: devfs_lookup(vnode_t dvp, char *name, vnode_t vp)
                    188: {
                    189:        struct info_device info;
                    190:        int err, i;
                    191:
1.1.1.1.2.1! nbrk      192:        DPRINTF(("devfs_lookup:%s\n", name));
1.1       nbrk      193:
                    194:        if (*name == '\0')
                    195:                return ENOENT;
                    196:
                    197:        i = 0;
                    198:        err = 0;
                    199:        info.cookie = 0;
                    200:        for (;;) {
                    201:                err = sys_info(INFO_DEVICE, &info);
                    202:                if (err)
                    203:                        return ENOENT;
                    204:                if (!strncmp(info.name, name, MAXDEVNAME))
                    205:                        break;
                    206:                i++;
                    207:        }
                    208:        vp->v_type = (info.flags & DF_CHR) ? VCHR : VBLK;
                    209:        vp->v_mode = (mode_t)(S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP
                    210:                              | S_IROTH | S_IWOTH);
                    211:        return 0;
                    212: }
                    213:
                    214: /*
                    215:  * @vp: vnode of the directory.
                    216:  */
                    217: static int
                    218: devfs_readdir(vnode_t vp, file_t fp, struct dirent *dir)
                    219: {
                    220:        struct info_device info;
                    221:        int err, i;
                    222:
1.1.1.1.2.1! nbrk      223:        DPRINTF(("devfs_readdir offset=%d\n", fp->f_offset));
1.1       nbrk      224:
                    225:        i = 0;
                    226:        err = 0;
                    227:        info.cookie = 0;
                    228:        do {
                    229:                err = sys_info(INFO_DEVICE, &info);
                    230:                if (err)
                    231:                        return ENOENT;
                    232:        } while (i++ != fp->f_offset);
                    233:
                    234:        dir->d_type = 0;
                    235:        if (info.flags & DF_CHR)
                    236:                dir->d_type = DT_CHR;
                    237:        else if (info.flags & DF_BLK)
                    238:                dir->d_type = DT_BLK;
                    239:        strcpy((char *)&dir->d_name, info.name);
                    240:        dir->d_fileno = fp->f_offset;
                    241:        dir->d_namlen = strlen(dir->d_name);
                    242:
1.1.1.1.2.1! nbrk      243:        DPRINTF(("devfs_readdir: %s\n", dir->d_name));
1.1       nbrk      244:        fp->f_offset++;
                    245:        return 0;
                    246: }
                    247:
                    248: int
                    249: devfs_init(void)
                    250: {
                    251:        return 0;
                    252: }

CVSweb