From: Richard W.M. Jones Date: Sun, 26 Sep 2010 17:00:11 +0000 (+0100) Subject: New API: pwrite-device X-Git-Tag: 1.5.20~1 X-Git-Url: http://git.annexia.org/?a=commitdiff_plain;h=eeaab2ba84441a96977281a4472b1bccb9ec80a9;p=libguestfs.git New API: pwrite-device This is the same as the existing 'pwrite' API call, but allows you to write to a device. --- diff --git a/daemon/file.c b/daemon/file.c index 0849456..9403100 100644 --- a/daemon/file.c +++ b/daemon/file.c @@ -463,11 +463,32 @@ do_pread (const char *path, int count, int64_t offset, size_t *size_r) return buf; } +static int +pwrite_fd (int fd, const char *content, size_t size, int64_t offset, + const char *display_path) +{ + ssize_t r; + + r = pwrite (fd, content, size, offset); + if (r == -1) { + reply_with_perror ("pwrite: %s", display_path); + close (fd); + return -1; + } + + if (close (fd) == -1) { + reply_with_perror ("close: %s", display_path); + close (fd); + return -1; + } + + return r; +} + int do_pwrite (const char *path, const char *content, size_t size, int64_t offset) { int fd; - ssize_t r; if (offset < 0) { reply_with_error ("offset is negative"); @@ -483,20 +504,25 @@ do_pwrite (const char *path, const char *content, size_t size, int64_t offset) return -1; } - r = pwrite (fd, content, size, offset); - if (r == -1) { - reply_with_perror ("pwrite: %s", path); - close (fd); + return pwrite_fd (fd, content, size, offset, path); +} + +int +do_pwrite_device (const char *device, const char *content, size_t size, + int64_t offset) +{ + if (offset < 0) { + reply_with_error ("offset is negative"); return -1; } - if (close (fd) == -1) { - reply_with_perror ("close: %s", path); - close (fd); + int fd = open (device, O_WRONLY); + if (fd == -1) { + reply_with_perror ("open: %s", device); return -1; } - return r; + return pwrite_fd (fd, content, size, offset, device); } /* This runs the 'file' command. */ diff --git a/generator/generator_actions.ml b/generator/generator_actions.ml index ac8dab2..e94fcbd 100644 --- a/generator/generator_actions.ml +++ b/generator/generator_actions.ml @@ -4812,7 +4812,7 @@ return value is the number of bytes that were actually written to the file. This could even be 0, although short writes are unlikely for regular files in ordinary circumstances. -See also C."); +See also C, C."); ("resize2fs_size", (RErr, [Device "device"; Int64 "size"]), 248, [], [], @@ -5166,6 +5166,23 @@ error occurs. See also C, C."); + ("pwrite_device", (RInt "nbytes", [Device "device"; BufferIn "content"; Int64 "offset"]), 275, [ProtocolLimitWarning], + [InitPartition, Always, TestOutputList ( + [["pwrite_device"; "/dev/sda"; "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"; "446"]; + ["blockdev_rereadpt"; "/dev/sda"]; + ["list_partitions"]], [])], + "write to part of a device", + "\ +This command writes to part of a device. It writes the data +buffer C to C starting at offset C. + +This command implements the L system call, and like +that system call it may not write the full data requested +(although short writes to disk devices and partitions are +probably impossible with standard Linux kernels). + +See also C."); + ] let all_functions = non_daemon_functions @ daemon_functions diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR index d4d5a4b..4c738e3 100644 --- a/src/MAX_PROC_NR +++ b/src/MAX_PROC_NR @@ -1 +1 @@ -274 +275