1*bf2f9846Snonaka /* $NetBSD: pathfs.c,v 1.1 2012/01/18 23:12:21 nonaka Exp $ */
2*bf2f9846Snonaka
3*bf2f9846Snonaka /*-
4*bf2f9846Snonaka * Copyright (C) 2012 NONAKA Kimihiro <nonaka@netbsd.org>
5*bf2f9846Snonaka * All rights reserved.
6*bf2f9846Snonaka *
7*bf2f9846Snonaka * Redistribution and use in source and binary forms, with or without
8*bf2f9846Snonaka * modification, are permitted provided that the following conditions
9*bf2f9846Snonaka * are met:
10*bf2f9846Snonaka * 1. Redistributions of source code must retain the above copyright
11*bf2f9846Snonaka * notice, this list of conditions and the following disclaimer.
12*bf2f9846Snonaka * 2. Redistributions in binary form must reproduce the above copyright
13*bf2f9846Snonaka * notice, this list of conditions and the following disclaimer in the
14*bf2f9846Snonaka * documentation and/or other materials provided with the distribution.
15*bf2f9846Snonaka *
16*bf2f9846Snonaka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17*bf2f9846Snonaka * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18*bf2f9846Snonaka * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19*bf2f9846Snonaka * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20*bf2f9846Snonaka * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21*bf2f9846Snonaka * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22*bf2f9846Snonaka * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23*bf2f9846Snonaka * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24*bf2f9846Snonaka * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25*bf2f9846Snonaka * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*bf2f9846Snonaka */
27*bf2f9846Snonaka
28*bf2f9846Snonaka #include "boot.h"
29*bf2f9846Snonaka #include "pathfs.h"
30*bf2f9846Snonaka #include "unixdev.h"
31*bf2f9846Snonaka #include "compat_linux.h"
32*bf2f9846Snonaka
33*bf2f9846Snonaka __compactcall int
pathfs_open(const char * path,struct open_file * fd)34*bf2f9846Snonaka pathfs_open(const char *path, struct open_file *fd)
35*bf2f9846Snonaka {
36*bf2f9846Snonaka
37*bf2f9846Snonaka if (strcmp(fd->f_dev->dv_name, "path"))
38*bf2f9846Snonaka return EINVAL;
39*bf2f9846Snonaka
40*bf2f9846Snonaka (void) ulseek((int)fd->f_devdata, 0L, SEEK_SET);
41*bf2f9846Snonaka return 0;
42*bf2f9846Snonaka }
43*bf2f9846Snonaka
44*bf2f9846Snonaka __compactcall int
pathfs_read(struct open_file * fd,void * vbuf,size_t nbyte,size_t * resid)45*bf2f9846Snonaka pathfs_read(struct open_file *fd, void *vbuf, size_t nbyte, size_t *resid)
46*bf2f9846Snonaka {
47*bf2f9846Snonaka char *buf = vbuf;
48*bf2f9846Snonaka size_t off = 0;
49*bf2f9846Snonaka ssize_t rsz;
50*bf2f9846Snonaka
51*bf2f9846Snonaka while (off < nbyte) {
52*bf2f9846Snonaka rsz = uread((int)fd->f_devdata, buf + off, nbyte - off);
53*bf2f9846Snonaka if (rsz < 0)
54*bf2f9846Snonaka return errno;
55*bf2f9846Snonaka if (rsz == 0)
56*bf2f9846Snonaka break;
57*bf2f9846Snonaka off += rsz;
58*bf2f9846Snonaka }
59*bf2f9846Snonaka
60*bf2f9846Snonaka *resid -= off;
61*bf2f9846Snonaka return 0;
62*bf2f9846Snonaka }
63*bf2f9846Snonaka
64*bf2f9846Snonaka __compactcall int
pathfs_write(struct open_file * fd,void * vbuf,size_t size,size_t * resid)65*bf2f9846Snonaka pathfs_write(struct open_file *fd, void *vbuf, size_t size, size_t *resid)
66*bf2f9846Snonaka {
67*bf2f9846Snonaka
68*bf2f9846Snonaka return EROFS;
69*bf2f9846Snonaka }
70*bf2f9846Snonaka
71*bf2f9846Snonaka __compactcall off_t
pathfs_seek(struct open_file * fd,off_t offset,int whence)72*bf2f9846Snonaka pathfs_seek(struct open_file *fd, off_t offset, int whence)
73*bf2f9846Snonaka {
74*bf2f9846Snonaka
75*bf2f9846Snonaka return ulseek((int)fd->f_devdata, offset, whence);
76*bf2f9846Snonaka }
77*bf2f9846Snonaka
78*bf2f9846Snonaka __compactcall int
pathfs_close(struct open_file * fd)79*bf2f9846Snonaka pathfs_close(struct open_file *fd)
80*bf2f9846Snonaka {
81*bf2f9846Snonaka
82*bf2f9846Snonaka return 0;
83*bf2f9846Snonaka }
84*bf2f9846Snonaka
85*bf2f9846Snonaka __compactcall int
pathfs_stat(struct open_file * fd,struct stat * sb)86*bf2f9846Snonaka pathfs_stat(struct open_file *fd, struct stat *sb)
87*bf2f9846Snonaka {
88*bf2f9846Snonaka struct linux_stat lsb;
89*bf2f9846Snonaka int rv;
90*bf2f9846Snonaka
91*bf2f9846Snonaka rv = ufstat((int)fd->f_devdata, &lsb);
92*bf2f9846Snonaka if (rv < 0)
93*bf2f9846Snonaka return errno;
94*bf2f9846Snonaka
95*bf2f9846Snonaka sb->st_ino = lsb.lst_ino;
96*bf2f9846Snonaka sb->st_mode = lsb.lst_mode;
97*bf2f9846Snonaka sb->st_nlink = lsb.lst_nlink;
98*bf2f9846Snonaka sb->st_uid = lsb.lst_uid;
99*bf2f9846Snonaka sb->st_gid = lsb.lst_gid;
100*bf2f9846Snonaka sb->st_size = lsb.lst_size;
101*bf2f9846Snonaka sb->st_blksize = lsb.lst_blksize;
102*bf2f9846Snonaka sb->st_blocks = lsb.lst_blocks;
103*bf2f9846Snonaka sb->st_atime = lsb.lst_atime;
104*bf2f9846Snonaka sb->st_mtime = lsb.lst_mtime;
105*bf2f9846Snonaka sb->st_ctime = lsb.lst_ctime;
106*bf2f9846Snonaka return 0;
107*bf2f9846Snonaka }
108*bf2f9846Snonaka
109*bf2f9846Snonaka __compactcall void
pathfs_ls(struct open_file * f,const char * pattern)110*bf2f9846Snonaka pathfs_ls(struct open_file *f, const char *pattern)
111*bf2f9846Snonaka {
112*bf2f9846Snonaka
113*bf2f9846Snonaka printf("Currently ls command is unsupported by pathfs.\n");
114*bf2f9846Snonaka }
115