1/* $NetBSD: stg.c,v 1.1 2011/03/06 13:55:12 phx Exp $ */
2
3/*-
4 * Copyright (c) 2011 Frank Wille.
5 * All rights reserved.
6 *
7 * Written by Frank Wille for The NetBSD Project.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#include <sys/param.h>
32
33#include <lib/libsa/stand.h>
34
35#include "globals.h"
36#include "memfs.h"
37
38struct memhandle {
39	char *base;
40	off_t off;
41};
42
43int
44mem_open(const char *path, struct open_file *f)
45{
46	struct memhandle *mh;
47
48	mh = alloc(sizeof(struct memhandle));
49	if (mh == NULL)
50		return ENOMEM;
51	mh->base = (char *)read_hex(path);
52	mh->off = 0;
53	f->f_fsdata = mh;
54	return 0;
55}
56
57#ifndef LIBSA_NO_FS_CLOSE
58int
59mem_close(struct open_file *f)
60{
61
62	dealloc(f->f_fsdata, sizeof(struct memhandle));
63	return 0;
64}
65#endif
66
67int
68mem_read(struct open_file *f, void *buf, size_t size, size_t *resid)
69{
70	struct memhandle *mh;
71
72	mh = f->f_fsdata;
73	memcpy(buf, mh->base + mh->off, size);
74	mh->off += size;
75	if (resid)
76		*resid = 0;
77	return 0;
78}
79
80#ifndef LIBSA_NO_FS_WRITE
81int
82mem_write(struct open_file *f, void *buf, size_t size, size_t *resid)
83{
84	struct memhandle *mh;
85
86	mh = f->f_fsdata;
87	memcpy(mh->base + mh->off, buf, size);
88	mh->off += size;
89	if (resid)
90		*resid = 0;
91	return 0;
92}
93#endif
94
95#ifndef LIBSA_NO_FS_SEEK
96off_t
97mem_seek(struct open_file *f, off_t offset, int where)
98{
99	struct memhandle *mh;
100
101	mh = f->f_fsdata;
102	switch (where) {
103	case SEEK_SET:
104		mh->off = offset;
105		break;
106	case SEEK_CUR:
107		mh->off += offset;
108		break;
109	default:
110		errno = EOFFSET;
111		return -1;
112	}
113	return mh->off;
114}
115#endif
116
117int
118mem_stat(struct open_file *f, struct stat *sb)
119{
120
121	return EIO;
122}
123