4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * * Neither the name of Red Hat nor the names of its contributors may be
16 * used to endorse or promote products derived from this software without
17 * specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
22 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
29 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37 "libguestfs.org/nbdkit"
42 var pluginName
= "ramdisk"
44 type RAMDiskPlugin
struct {
48 type RAMDiskConnection
struct {
56 func (p
*RAMDiskPlugin
) Config(key
string, value
string) error
{
59 size
, err
= strconv
.ParseUint(value
, 0, 64)
66 return nbdkit
.PluginError
{Errmsg
: "unknown parameter"}
70 func (p
*RAMDiskPlugin
) ConfigComplete() error
{
72 return nbdkit
.PluginError
{Errmsg
: "size parameter is required"}
77 func (p
*RAMDiskPlugin
) GetReady() error
{
78 // Allocate the RAM disk.
79 disk
= make([]byte, size
)
83 func (p
*RAMDiskPlugin
) Open(readonly
bool) (nbdkit
.ConnectionInterface
, error
) {
84 return &RAMDiskConnection
{}, nil
87 func (c
*RAMDiskConnection
) GetSize() (uint64, error
) {
91 // Clients are allowed to make multiple connections safely.
92 func (c
*RAMDiskConnection
) CanMultiConn() (bool, error
) {
96 func (c
*RAMDiskConnection
) PRead(buf
[]byte, offset
uint64,
98 copy(buf
, disk
[offset
:int(offset
)+len(buf
)])
102 // Note that CanWrite is required in golang plugins, otherwise PWrite
103 // will never be called.
104 func (c
*RAMDiskConnection
) CanWrite() (bool, error
) {
108 func (c
*RAMDiskConnection
) PWrite(buf
[]byte, offset
uint64,
109 flags
uint32) error
{
110 copy(disk
[offset
:int(offset
)+len(buf
)], buf
)
114 //----------------------------------------------------------------------
116 // The boilerplate below this line is required by all golang plugins,
117 // as well as importing "C" and "unsafe" modules at the top of the
121 func plugin_init() unsafe
.Pointer
{
122 // If your plugin needs to do any initialization, you can
123 // either put it here or implement a Load() method.
126 // Then you must call the following function.
127 return nbdkit
.PluginInitialize(pluginName
, &RAMDiskPlugin
{})
130 // This is never(?) called, but must exist.