xref: /netbsd-src/sys/arch/zaurus/stand/zboot/pathfs.c (revision bf2f9846a3b59f41a63d9c6afe67feadc0a99723)
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