1 /* $OpenBSD: hfs.c,v 1.6 2015/03/14 20:52:41 miod Exp $ */
2 /* $NetBSD: hfs.c,v 1.1 2000/11/14 11:25:35 tsubai Exp $ */
3
4 /*-
5 * Copyright (c) 2000 Tsubai Masanari. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30 #include <sys/param.h>
31 #include <lib/libkern/libkern.h>
32 #include <lib/libsa/stand.h>
33
34 #include <openfirm.h>
35 #include <hfs.h>
36
37 static int OF_fd; /* XXX */
38
39 int
hfs_open(char * path,struct open_file * f)40 hfs_open(char *path, struct open_file *f)
41 {
42 int chosen;
43 char bootpath[128], *cp;
44
45 if ((chosen = OF_finddevice("/chosen")) == -1)
46 return ENXIO;
47 bzero(bootpath, sizeof bootpath);
48 OF_getprop(chosen, "bootpath", bootpath, sizeof bootpath);
49
50 cp = strrchr(bootpath, ',');
51 if (cp == NULL)
52 return ENXIO;
53
54 strlcpy(cp + 1, path, bootpath + sizeof bootpath - (cp + 1));
55 OF_fd = OF_open(bootpath);
56 if (OF_fd == -1)
57 return ENOENT;
58 return 0;
59 }
60
61 int
hfs_close(struct open_file * f)62 hfs_close(struct open_file *f)
63 {
64 OF_close(OF_fd);
65 return 0;
66 }
67
68 int
hfs_read(struct open_file * f,void * start,size_t size,size_t * resid)69 hfs_read(struct open_file *f, void *start, size_t size, size_t *resid)
70 {
71 int len;
72
73 len = OF_read(OF_fd, start, size);
74 if (len == -1)
75 return EIO;
76 size -= len;
77 if (resid)
78 *resid = size;
79 return 0;
80 }
81
82 int
hfs_write(struct open_file * f,void * start,size_t size,size_t * resid)83 hfs_write(struct open_file *f, void *start, size_t size, size_t *resid)
84 {
85 printf("hfs_write\n");
86 return ENXIO;
87 }
88
89 off_t
hfs_seek(struct open_file * f,off_t offset,int where)90 hfs_seek(struct open_file *f, off_t offset, int where)
91 {
92 switch (where) {
93 case SEEK_SET:
94 return OF_seek(OF_fd, offset);
95 case SEEK_CUR:
96 case SEEK_END:
97 default:
98 return -1;
99 }
100 }
101
102 int
hfs_stat(struct open_file * f,struct stat * sb)103 hfs_stat(struct open_file *f, struct stat *sb)
104 {
105 return 0;
106 }
107
108 int
hfs_readdir(struct open_file * f,char * name)109 hfs_readdir(struct open_file *f, char *name)
110 {
111 return ENXIO;
112 }
113