xref: /netbsd/external/cddl/osnet/sys/kern/kobj.c (revision 6550d01e)
1 /*	$NetBSD: kobj.c,v 1.2 2011/01/21 12:24:24 pooka Exp $	*/
2 
3 /*-
4  * Copyright (c) 2009 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Andrew Doran.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 /*-
33  * Copyright (c) 2007 Pawel Jakub Dawidek <pjd@FreeBSD.org>
34  * All rights reserved.
35  *
36  * Redistribution and use in source and binary forms, with or without
37  * modification, are permitted provided that the following conditions
38  * are met:
39  * 1. Redistributions of source code must retain the above copyright
40  *    notice, this list of conditions and the following disclaimer.
41  * 2. Redistributions in binary form must reproduce the above copyright
42  *    notice, this list of conditions and the following disclaimer in the
43  *    documentation and/or other materials provided with the distribution.
44  *
45  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
46  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
47  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
48  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
49  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
50  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
51  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
52  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
53  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
54  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
55  * SUCH DAMAGE.
56  */
57 
58 #include <sys/cdefs.h>
59 /* __FBSDID("$FreeBSD: src/sys/compat/opensolaris/kern/opensolaris_kobj.c,v 1.4 2007/05/31 11:51:49 kib Exp $"); */
60 __KERNEL_RCSID(0, "$NetBSD: kobj.c,v 1.2 2011/01/21 12:24:24 pooka Exp $");
61 
62 #include <sys/types.h>
63 #include <sys/systm.h>
64 #include <sys/kernel.h>
65 #include <sys/systm.h>
66 #include <sys/kthread.h>
67 #include <sys/namei.h>
68 #include <sys/proc.h>
69 #include <sys/filedesc.h>
70 #include <sys/fcntl.h>
71 #include <sys/kobj.h>
72 #include <sys/namei.h>
73 
74 void
75 kobj_free(void *address, size_t size)
76 {
77 
78 	kmem_free(address, size);
79 }
80 
81 void *
82 kobj_alloc(size_t size, int flag)
83 {
84 
85 	return (kmem_alloc(size, (flag & KM_NOWAIT) ? KM_NOSLEEP : KM_SLEEP));
86 }
87 
88 void *
89 kobj_zalloc(size_t size, int flag)
90 {
91 
92 	return (kmem_zalloc(size, (flag & KM_NOWAIT) ? KM_NOSLEEP : KM_SLEEP));
93 }
94 
95 static void *
96 kobj_open_file_vnode(const char *file)
97 {
98 	vnode_t *vp;
99 
100 	if (vn_open(file, UIO_SYSSPACE, FCREAT, 0, &vp, CRCREAT, 0) != 0) {
101 		return NULL;
102 	}
103 	return vp;
104 }
105 
106 struct _buf *
107 kobj_open_file(const char *file)
108 {
109 	struct _buf *out;
110 
111 	out = kmem_alloc(sizeof(*out), KM_SLEEP);
112 	out->mounted = 1;
113 	out->ptr = kobj_open_file_vnode(file);
114 	if (out->ptr == NULL) {
115 		kmem_free(out, sizeof(*out));
116 		return ((struct _buf *)-1);
117 	}
118 	return (out);
119 }
120 
121 static int
122 kobj_get_filesize_vnode(struct _buf *file, uint64_t *size)
123 {
124 	struct vattr va;
125 	int error;
126 
127 	error = VOP_GETATTR(file->ptr, &va, 0, kauth_cred_get(), NULL);
128 	if (error == 0)
129 		*size = (uint64_t)va.va_size;
130 	return (error);
131 }
132 
133 int
134 kobj_get_filesize(struct _buf *file, uint64_t *size)
135 {
136 
137 	return (kobj_get_filesize_vnode(file, size));
138 }
139 
140 int
141 kobj_read_file_vnode(struct _buf *file, char *buf, unsigned size, unsigned off)
142 {
143 	int error;
144 	size_t resid;
145 
146 	error = vn_rdwr(UIO_READ, file->ptr, buf, size, off, UIO_SYSSPACE, 0,
147 	    RLIM64_INFINITY, kauth_cred_get(), &resid);
148 	return (error != 0 ? -1 : size - resid);
149 }
150 
151 int
152 kobj_read_file(struct _buf *file, char *buf, unsigned size, unsigned off)
153 {
154 
155 	return (kobj_read_file_vnode(file, buf, size, off));
156 }
157 
158 void
159 kobj_close_file(struct _buf *file)
160 {
161 
162 	if (file->mounted) {
163 		vn_close(file->ptr, FREAD, kauth_cred_get());
164 	}
165 	kmem_free(file, sizeof(*file));
166 }
167