... | ... |
@@ -12,62 +12,3 @@ type DeviceSet interface { |
12 | 12 |
HasActivatedDevice(hash string) bool |
13 | 13 |
Shutdown() error |
14 | 14 |
} |
15 |
- |
|
16 |
-type DeviceSetWrapper struct { |
|
17 |
- wrapped DeviceSet |
|
18 |
- prefix string |
|
19 |
-} |
|
20 |
- |
|
21 |
-func (wrapper *DeviceSetWrapper) wrap(hash string) string { |
|
22 |
- if hash != "" { |
|
23 |
- hash = wrapper.prefix + "-" + hash |
|
24 |
- } |
|
25 |
- return hash |
|
26 |
-} |
|
27 |
- |
|
28 |
-func (wrapper *DeviceSetWrapper) AddDevice(hash, baseHash string) error { |
|
29 |
- return wrapper.wrapped.AddDevice(wrapper.wrap(hash), wrapper.wrap(baseHash)) |
|
30 |
-} |
|
31 |
- |
|
32 |
-func (wrapper *DeviceSetWrapper) SetInitialized(hash string) error { |
|
33 |
- return wrapper.wrapped.SetInitialized(wrapper.wrap(hash)) |
|
34 |
-} |
|
35 |
- |
|
36 |
-func (wrapper *DeviceSetWrapper) DeactivateDevice(hash string) error { |
|
37 |
- return wrapper.wrapped.DeactivateDevice(wrapper.wrap(hash)) |
|
38 |
-} |
|
39 |
- |
|
40 |
-func (wrapper *DeviceSetWrapper) Shutdown() error { |
|
41 |
- return nil |
|
42 |
-} |
|
43 |
- |
|
44 |
-func (wrapper *DeviceSetWrapper) RemoveDevice(hash string) error { |
|
45 |
- return wrapper.wrapped.RemoveDevice(wrapper.wrap(hash)) |
|
46 |
-} |
|
47 |
- |
|
48 |
-func (wrapper *DeviceSetWrapper) MountDevice(hash, path string) error { |
|
49 |
- return wrapper.wrapped.MountDevice(wrapper.wrap(hash), path) |
|
50 |
-} |
|
51 |
- |
|
52 |
-func (wrapper *DeviceSetWrapper) UnmountDevice(hash, path string) error { |
|
53 |
- return wrapper.wrapped.UnmountDevice(wrapper.wrap(hash), path) |
|
54 |
-} |
|
55 |
- |
|
56 |
-func (wrapper *DeviceSetWrapper) HasDevice(hash string) bool { |
|
57 |
- return wrapper.wrapped.HasDevice(wrapper.wrap(hash)) |
|
58 |
-} |
|
59 |
- |
|
60 |
-func (wrapper *DeviceSetWrapper) HasInitializedDevice(hash string) bool { |
|
61 |
- return wrapper.wrapped.HasInitializedDevice(wrapper.wrap(hash)) |
|
62 |
-} |
|
63 |
- |
|
64 |
-func (wrapper *DeviceSetWrapper) HasActivatedDevice(hash string) bool { |
|
65 |
- return wrapper.wrapped.HasActivatedDevice(wrapper.wrap(hash)) |
|
66 |
-} |
|
67 |
- |
|
68 |
-func NewDeviceSetWrapper(wrapped DeviceSet, prefix string) DeviceSet { |
|
69 |
- return &DeviceSetWrapper{ |
|
70 |
- wrapped: wrapped, |
|
71 |
- prefix: prefix, |
|
72 |
- } |
|
73 |
-} |
... | ... |
@@ -442,6 +442,7 @@ func (devices *DeviceSetDM) registerDevice(id int, hash string, size uint64) (*D |
442 | 442 |
} |
443 | 443 |
|
444 | 444 |
func (devices *DeviceSetDM) activateDeviceIfNeeded(hash string) error { |
445 |
+ utils.Debugf("activateDeviceIfNeeded()") |
|
445 | 446 |
info := devices.Devices[hash] |
446 | 447 |
if info == nil { |
447 | 448 |
return fmt.Errorf("Unknown device %s", hash) |
... | ... |
@@ -14,14 +14,13 @@ package devmapper |
14 | 14 |
#include <linux/fs.h> |
15 | 15 |
#include <errno.h> |
16 | 16 |
|
17 |
-static char * |
|
18 |
-attach_loop_device(const char *filename, int *loop_fd_out) |
|
17 |
+char* attach_loop_device(const char *filename, int *loop_fd_out) |
|
19 | 18 |
{ |
20 |
- struct loop_info64 loopinfo = { 0 }; |
|
21 |
- struct stat st; |
|
22 |
- char buf[64]; |
|
23 |
- int i, loop_fd, fd, start_index; |
|
24 |
- char *loopname; |
|
19 |
+ struct loop_info64 loopinfo = {0}; |
|
20 |
+ struct stat st; |
|
21 |
+ char buf[64]; |
|
22 |
+ int i, loop_fd, fd, start_index; |
|
23 |
+ char* loopname; |
|
25 | 24 |
|
26 | 25 |
*loop_fd_out = -1; |
27 | 26 |
|
... | ... |
@@ -37,6 +36,7 @@ attach_loop_device(const char *filename, int *loop_fd_out) |
37 | 37 |
|
38 | 38 |
fd = open(filename, O_RDWR); |
39 | 39 |
if (fd < 0) { |
40 |
+ perror("open"); |
|
40 | 41 |
return NULL; |
41 | 42 |
} |
42 | 43 |
|
... | ... |
@@ -44,6 +44,7 @@ attach_loop_device(const char *filename, int *loop_fd_out) |
44 | 44 |
for (i = start_index ; loop_fd < 0 ; i++ ) { |
45 | 45 |
if (sprintf(buf, "/dev/loop%d", i) < 0) { |
46 | 46 |
close(fd); |
47 |
+ perror("sprintf"); |
|
47 | 48 |
return NULL; |
48 | 49 |
} |
49 | 50 |
|
... | ... |
@@ -55,12 +56,14 @@ attach_loop_device(const char *filename, int *loop_fd_out) |
55 | 55 |
loop_fd = open(buf, O_RDWR); |
56 | 56 |
if (loop_fd < 0 && errno == ENOENT) { |
57 | 57 |
close(fd); |
58 |
+ perror("open"); |
|
58 | 59 |
fprintf (stderr, "no available loopback device!"); |
59 | 60 |
return NULL; |
60 | 61 |
} else if (loop_fd < 0) |
61 | 62 |
continue; |
62 | 63 |
|
63 | 64 |
if (ioctl (loop_fd, LOOP_SET_FD, (void *)(size_t)fd) < 0) { |
65 |
+ perror("ioctl"); |
|
64 | 66 |
close(loop_fd); |
65 | 67 |
loop_fd = -1; |
66 | 68 |
if (errno != EBUSY) { |
... | ... |
@@ -78,7 +81,10 @@ attach_loop_device(const char *filename, int *loop_fd_out) |
78 | 78 |
loopinfo.lo_flags = LO_FLAGS_AUTOCLEAR; |
79 | 79 |
|
80 | 80 |
if (ioctl(loop_fd, LOOP_SET_STATUS64, &loopinfo) < 0) { |
81 |
- ioctl(loop_fd, LOOP_CLR_FD, 0); |
|
81 |
+ perror("ioctl1"); |
|
82 |
+ if (ioctl(loop_fd, LOOP_CLR_FD, 0) < 0) { |
|
83 |
+ perror("ioctl2"); |
|
84 |
+ } |
|
82 | 85 |
close(loop_fd); |
83 | 86 |
fprintf (stderr, "cannot set up loopback device info"); |
84 | 87 |
return NULL; |
... | ... |
@@ -105,39 +111,19 @@ get_block_size(int fd) |
105 | 105 |
return (int64_t)size; |
106 | 106 |
} |
107 | 107 |
|
108 |
- |
|
109 | 108 |
*/ |
110 | 109 |
import "C" |
111 | 110 |
|
112 | 111 |
import ( |
112 |
+ "errors" |
|
113 | 113 |
"fmt" |
114 | 114 |
"github.com/dotcloud/docker/utils" |
115 | 115 |
"os" |
116 | 116 |
"runtime" |
117 |
+ "syscall" |
|
117 | 118 |
"unsafe" |
118 | 119 |
) |
119 | 120 |
|
120 |
-func SetDevDir(dir string) error { |
|
121 |
- c_dir := C.CString(dir) |
|
122 |
- defer C.free(unsafe.Pointer(c_dir)) |
|
123 |
- |
|
124 |
- if res := C.dm_set_dev_dir(c_dir); res != 1 { |
|
125 |
- utils.Debugf("Error dm_set_dev_dir") |
|
126 |
- return fmt.Errorf("dm_set_dev_dir failed") |
|
127 |
- } |
|
128 |
- return nil |
|
129 |
-} |
|
130 |
- |
|
131 |
-func GetLibraryVersion() (string, error) { |
|
132 |
- buffer := make([]byte, 128) |
|
133 |
- if res := C.dm_get_library_version((*C.char)(unsafe.Pointer(&buffer)), 128); res != 1 { |
|
134 |
- return "", fmt.Errorf("dm_get_library_version failed") |
|
135 |
- } |
|
136 |
- return string(buffer), nil |
|
137 |
-} |
|
138 |
- |
|
139 |
-type TaskType int |
|
140 |
- |
|
141 | 121 |
const ( |
142 | 122 |
DeviceCreate TaskType = iota |
143 | 123 |
DeviceReload |
... | ... |
@@ -160,22 +146,41 @@ const ( |
160 | 160 |
DeviceSetGeometry |
161 | 161 |
) |
162 | 162 |
|
163 |
-type Task struct { |
|
164 |
- unmanaged *C.struct_dm_task |
|
165 |
-} |
|
163 |
+var ( |
|
164 |
+ ErrTaskRun = errors.New("dm_task_run failed") |
|
165 |
+ ErrTaskSetName = errors.New("dm_task_set_name failed") |
|
166 |
+ ErrTaskSetMessage = errors.New("dm_task_set_message failed") |
|
167 |
+ ErrTaskSetAddNode = errors.New("dm_task_set_add_node failed") |
|
168 |
+ ErrTaskSetRO = errors.New("dm_task_set_ro failed") |
|
169 |
+ ErrTaskAddTarget = errors.New("dm_task_add_target failed") |
|
170 |
+ ErrGetDriverVersion = errors.New("dm_task_get_driver_version failed") |
|
171 |
+ ErrAttachLoopbackDevice = errors.New("loopback mounting failed") |
|
172 |
+ ErrGetBlockSize = errors.New("Can't get block size") |
|
173 |
+ ErrUdevWait = errors.New("wait on udev cookie failed") |
|
174 |
+ ErrSetDevDir = errors.New("dm_set_dev_dir failed") |
|
175 |
+ ErrGetLibraryVersion = errors.New("dm_get_library_version failed") |
|
176 |
+ ErrCreateRemoveTask = errors.New("Can't create task of type DeviceRemove") |
|
177 |
+ ErrRunRemoveDevice = errors.New("running removeDevice failed") |
|
178 |
+) |
|
166 | 179 |
|
167 |
-type Info struct { |
|
168 |
- Exists int |
|
169 |
- Suspended int |
|
170 |
- LiveTable int |
|
171 |
- InactiveTable int |
|
172 |
- OpenCount int32 |
|
173 |
- EventNr uint32 |
|
174 |
- Major uint32 |
|
175 |
- Minor uint32 |
|
176 |
- ReadOnly int |
|
177 |
- TargetCount int32 |
|
178 |
-} |
|
180 |
+type ( |
|
181 |
+ Task struct { |
|
182 |
+ unmanaged *C.struct_dm_task |
|
183 |
+ } |
|
184 |
+ Info struct { |
|
185 |
+ Exists int |
|
186 |
+ Suspended int |
|
187 |
+ LiveTable int |
|
188 |
+ InactiveTable int |
|
189 |
+ OpenCount int32 |
|
190 |
+ EventNr uint32 |
|
191 |
+ Major uint32 |
|
192 |
+ Minor uint32 |
|
193 |
+ ReadOnly int |
|
194 |
+ TargetCount int32 |
|
195 |
+ } |
|
196 |
+ TaskType int |
|
197 |
+) |
|
179 | 198 |
|
180 | 199 |
func (t *Task) destroy() { |
181 | 200 |
if t != nil { |
... | ... |
@@ -196,37 +201,37 @@ func TaskCreate(tasktype TaskType) *Task { |
196 | 196 |
|
197 | 197 |
func (t *Task) Run() error { |
198 | 198 |
if res := C.dm_task_run(t.unmanaged); res != 1 { |
199 |
- return fmt.Errorf("dm_task_run failed") |
|
199 |
+ return ErrTaskRun |
|
200 | 200 |
} |
201 | 201 |
return nil |
202 | 202 |
} |
203 | 203 |
|
204 | 204 |
func (t *Task) SetName(name string) error { |
205 | 205 |
c_name := C.CString(name) |
206 |
- defer C.free(unsafe.Pointer(c_name)) |
|
206 |
+ defer free(c_name) |
|
207 | 207 |
|
208 | 208 |
if res := C.dm_task_set_name(t.unmanaged, c_name); res != 1 { |
209 | 209 |
if os.Getenv("DEBUG") != "" { |
210 | 210 |
C.perror(C.CString(fmt.Sprintf("[debug] Error dm_task_set_name(%s, %#v)", name, t.unmanaged))) |
211 | 211 |
} |
212 |
- return fmt.Errorf("dm_task_set_name failed") |
|
212 |
+ return ErrTaskSetName |
|
213 | 213 |
} |
214 | 214 |
return nil |
215 | 215 |
} |
216 | 216 |
|
217 | 217 |
func (t *Task) SetMessage(message string) error { |
218 | 218 |
c_message := C.CString(message) |
219 |
- defer C.free(unsafe.Pointer(c_message)) |
|
219 |
+ defer free(c_message) |
|
220 | 220 |
|
221 | 221 |
if res := C.dm_task_set_message(t.unmanaged, c_message); res != 1 { |
222 |
- return fmt.Errorf("dm_task_set_message failed") |
|
222 |
+ return ErrTaskSetMessage |
|
223 | 223 |
} |
224 | 224 |
return nil |
225 | 225 |
} |
226 | 226 |
|
227 | 227 |
func (t *Task) SetSector(sector uint64) error { |
228 | 228 |
if res := C.dm_task_set_sector(t.unmanaged, C.uint64_t(sector)); res != 1 { |
229 |
- return fmt.Errorf("dm_task_set_add_node failed") |
|
229 |
+ return ErrTaskSetAddNode |
|
230 | 230 |
} |
231 | 231 |
return nil |
232 | 232 |
} |
... | ... |
@@ -234,7 +239,7 @@ func (t *Task) SetSector(sector uint64) error { |
234 | 234 |
func (t *Task) SetCookie(cookie *uint32, flags uint16) error { |
235 | 235 |
c_cookie := C.uint32_t(*cookie) |
236 | 236 |
if res := C.dm_task_set_cookie(t.unmanaged, &c_cookie, C.uint16_t(flags)); res != 1 { |
237 |
- return fmt.Errorf("dm_task_set_add_node failed") |
|
237 |
+ return ErrTaskSetAddNode |
|
238 | 238 |
} |
239 | 239 |
*cookie = uint32(c_cookie) |
240 | 240 |
return nil |
... | ... |
@@ -242,30 +247,30 @@ func (t *Task) SetCookie(cookie *uint32, flags uint16) error { |
242 | 242 |
|
243 | 243 |
func (t *Task) SetRo() error { |
244 | 244 |
if res := C.dm_task_set_ro(t.unmanaged); res != 1 { |
245 |
- return fmt.Errorf("dm_task_set_ro failed") |
|
245 |
+ return ErrTaskSetRO |
|
246 | 246 |
} |
247 | 247 |
return nil |
248 | 248 |
} |
249 | 249 |
|
250 | 250 |
func (t *Task) AddTarget(start uint64, size uint64, ttype string, params string) error { |
251 | 251 |
c_ttype := C.CString(ttype) |
252 |
- defer C.free(unsafe.Pointer(c_ttype)) |
|
252 |
+ defer free(c_ttype) |
|
253 | 253 |
|
254 | 254 |
c_params := C.CString(params) |
255 |
- defer C.free(unsafe.Pointer(c_params)) |
|
255 |
+ defer free(c_params) |
|
256 | 256 |
|
257 | 257 |
if res := C.dm_task_add_target(t.unmanaged, C.uint64_t(start), C.uint64_t(size), c_ttype, c_params); res != 1 { |
258 |
- return fmt.Errorf("dm_task_add_target failed") |
|
258 |
+ return ErrTaskAddTarget |
|
259 | 259 |
} |
260 | 260 |
return nil |
261 | 261 |
} |
262 | 262 |
|
263 | 263 |
func (t *Task) GetDriverVersion() (string, error) { |
264 |
- buffer := (*C.char)(C.malloc(128)) |
|
265 |
- defer C.free(unsafe.Pointer(buffer)) |
|
264 |
+ buffer := C.CString(string(make([]byte, 128))) |
|
265 |
+ defer free(buffer) |
|
266 | 266 |
|
267 | 267 |
if res := C.dm_task_get_driver_version(t.unmanaged, buffer, 128); res != 1 { |
268 |
- return "", fmt.Errorf("dm_task_get_driver_version") |
|
268 |
+ return "", ErrGetDriverVersion |
|
269 | 269 |
} |
270 | 270 |
return C.GoString(buffer), nil |
271 | 271 |
} |
... | ... |
@@ -273,7 +278,7 @@ func (t *Task) GetDriverVersion() (string, error) { |
273 | 273 |
func (t *Task) GetInfo() (*Info, error) { |
274 | 274 |
c_info := C.struct_dm_info{} |
275 | 275 |
if res := C.dm_task_get_info(t.unmanaged, &c_info); res != 1 { |
276 |
- return nil, fmt.Errorf("dm_task_get_driver_version") |
|
276 |
+ return nil, ErrGetDriverVersion |
|
277 | 277 |
} |
278 | 278 |
return &Info{ |
279 | 279 |
Exists: int(c_info.exists), |
... | ... |
@@ -301,29 +306,40 @@ func (t *Task) GetNextTarget(next uintptr) (uintptr, uint64, uint64, string, str |
301 | 301 |
|
302 | 302 |
func AttachLoopDevice(filename string) (*os.File, error) { |
303 | 303 |
c_filename := C.CString(filename) |
304 |
- defer C.free(unsafe.Pointer(c_filename)) |
|
304 |
+ defer free(c_filename) |
|
305 | 305 |
|
306 | 306 |
var fd C.int |
307 | 307 |
res := C.attach_loop_device(c_filename, &fd) |
308 | 308 |
if res == nil { |
309 |
- return nil, fmt.Errorf("error loopback mounting") |
|
309 |
+ return nil, ErrAttachLoopbackDevice |
|
310 | 310 |
} |
311 |
- defer C.free(unsafe.Pointer(res)) |
|
311 |
+ defer free(res) |
|
312 |
+ |
|
312 | 313 |
return os.NewFile(uintptr(fd), C.GoString(res)), nil |
313 | 314 |
} |
314 | 315 |
|
316 |
+func getBlockSize(fd uintptr) int { |
|
317 |
+ var size uint64 |
|
318 |
+ |
|
319 |
+ if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, C.BLKGETSIZE64, uintptr(unsafe.Pointer(&size))); err != 0 { |
|
320 |
+ utils.Debugf("Error ioctl: %s", err) |
|
321 |
+ return -1 |
|
322 |
+ } |
|
323 |
+ return int(size) |
|
324 |
+} |
|
325 |
+ |
|
315 | 326 |
func GetBlockDeviceSize(file *os.File) (uint64, error) { |
316 | 327 |
if size := C.get_block_size(C.int(file.Fd())); size == -1 { |
317 |
- return 0, fmt.Errorf("Can't get block size") |
|
328 |
+ return 0, ErrGetBlockSize |
|
318 | 329 |
} else { |
319 | 330 |
return uint64(size), nil |
320 | 331 |
} |
321 | 332 |
} |
322 | 333 |
|
323 | 334 |
func UdevWait(cookie uint32) error { |
324 |
- res := C.dm_udev_wait(C.uint32_t(cookie)) |
|
325 |
- if res != 1 { |
|
326 |
- return fmt.Errorf("Failed to wait on udev cookie %d", cookie) |
|
335 |
+ if res := C.dm_udev_wait(C.uint32_t(cookie)); res != 1 { |
|
336 |
+ utils.Debugf("Failed to wait on udev cookie %d", cookie) |
|
337 |
+ return ErrUdevWait |
|
327 | 338 |
} |
328 | 339 |
return nil |
329 | 340 |
} |
... | ... |
@@ -332,17 +348,43 @@ func LogInitVerbose(level int) { |
332 | 332 |
C.dm_log_init_verbose(C.int(level)) |
333 | 333 |
} |
334 | 334 |
|
335 |
+func SetDevDir(dir string) error { |
|
336 |
+ c_dir := C.CString(dir) |
|
337 |
+ defer free(c_dir) |
|
338 |
+ |
|
339 |
+ if res := C.dm_set_dev_dir(c_dir); res != 1 { |
|
340 |
+ utils.Debugf("Error dm_set_dev_dir") |
|
341 |
+ return ErrSetDevDir |
|
342 |
+ } |
|
343 |
+ return nil |
|
344 |
+} |
|
345 |
+ |
|
346 |
+func GetLibraryVersion() (string, error) { |
|
347 |
+ buffer := C.CString(string(make([]byte, 128))) |
|
348 |
+ defer free(buffer) |
|
349 |
+ |
|
350 |
+ if res := C.dm_get_library_version(buffer, 128); res != 1 { |
|
351 |
+ return "", ErrGetLibraryVersion |
|
352 |
+ } |
|
353 |
+ return C.GoString(buffer), nil |
|
354 |
+} |
|
355 |
+ |
|
335 | 356 |
// Useful helper for cleanup |
336 | 357 |
func RemoveDevice(name string) error { |
337 | 358 |
task := TaskCreate(DeviceRemove) |
338 | 359 |
if task == nil { |
339 |
- return fmt.Errorf("Can't create task of type DeviceRemove") |
|
360 |
+ return ErrCreateRemoveTask |
|
340 | 361 |
} |
341 | 362 |
if err := task.SetName(name); err != nil { |
342 |
- return fmt.Errorf("Can't set task name %s", name) |
|
363 |
+ utils.Debugf("Can't set task name %s", name) |
|
364 |
+ return err |
|
343 | 365 |
} |
344 | 366 |
if err := task.Run(); err != nil { |
345 |
- return fmt.Errorf("Error running removeDevice") |
|
367 |
+ return ErrRunRemoveDevice |
|
346 | 368 |
} |
347 | 369 |
return nil |
348 | 370 |
} |
371 |
+ |
|
372 |
+func free(p *C.char) { |
|
373 |
+ C.free(unsafe.Pointer(p)) |
|
374 |
+} |
... | ... |
@@ -319,3 +319,62 @@ func TestParseLxcConfOpt(t *testing.T) { |
319 | 319 |
} |
320 | 320 |
} |
321 | 321 |
} |
322 |
+ |
|
323 |
+type DeviceSetWrapper struct { |
|
324 |
+ wrapped DeviceSet |
|
325 |
+ prefix string |
|
326 |
+} |
|
327 |
+ |
|
328 |
+func (wrapper *DeviceSetWrapper) wrap(hash string) string { |
|
329 |
+ if hash != "" { |
|
330 |
+ hash = wrapper.prefix + "-" + hash |
|
331 |
+ } |
|
332 |
+ return hash |
|
333 |
+} |
|
334 |
+ |
|
335 |
+func (wrapper *DeviceSetWrapper) AddDevice(hash, baseHash string) error { |
|
336 |
+ return wrapper.wrapped.AddDevice(wrapper.wrap(hash), wrapper.wrap(baseHash)) |
|
337 |
+} |
|
338 |
+ |
|
339 |
+func (wrapper *DeviceSetWrapper) SetInitialized(hash string) error { |
|
340 |
+ return wrapper.wrapped.SetInitialized(wrapper.wrap(hash)) |
|
341 |
+} |
|
342 |
+ |
|
343 |
+func (wrapper *DeviceSetWrapper) DeactivateDevice(hash string) error { |
|
344 |
+ return wrapper.wrapped.DeactivateDevice(wrapper.wrap(hash)) |
|
345 |
+} |
|
346 |
+ |
|
347 |
+func (wrapper *DeviceSetWrapper) Shutdown() error { |
|
348 |
+ return nil |
|
349 |
+} |
|
350 |
+ |
|
351 |
+func (wrapper *DeviceSetWrapper) RemoveDevice(hash string) error { |
|
352 |
+ return wrapper.wrapped.RemoveDevice(wrapper.wrap(hash)) |
|
353 |
+} |
|
354 |
+ |
|
355 |
+func (wrapper *DeviceSetWrapper) MountDevice(hash, path string) error { |
|
356 |
+ return wrapper.wrapped.MountDevice(wrapper.wrap(hash), path) |
|
357 |
+} |
|
358 |
+ |
|
359 |
+func (wrapper *DeviceSetWrapper) UnmountDevice(hash, path string) error { |
|
360 |
+ return wrapper.wrapped.UnmountDevice(wrapper.wrap(hash), path) |
|
361 |
+} |
|
362 |
+ |
|
363 |
+func (wrapper *DeviceSetWrapper) HasDevice(hash string) bool { |
|
364 |
+ return wrapper.wrapped.HasDevice(wrapper.wrap(hash)) |
|
365 |
+} |
|
366 |
+ |
|
367 |
+func (wrapper *DeviceSetWrapper) HasInitializedDevice(hash string) bool { |
|
368 |
+ return wrapper.wrapped.HasInitializedDevice(wrapper.wrap(hash)) |
|
369 |
+} |
|
370 |
+ |
|
371 |
+func (wrapper *DeviceSetWrapper) HasActivatedDevice(hash string) bool { |
|
372 |
+ return wrapper.wrapped.HasActivatedDevice(wrapper.wrap(hash)) |
|
373 |
+} |
|
374 |
+ |
|
375 |
+func NewDeviceSetWrapper(wrapped DeviceSet, prefix string) DeviceSet { |
|
376 |
+ return &DeviceSetWrapper{ |
|
377 |
+ wrapped: wrapped, |
|
378 |
+ prefix: prefix, |
|
379 |
+ } |
|
380 |
+} |