[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH V5 3/6] block: Add WIN32 platform support for ba
From: |
Eric Blake |
Subject: |
Re: [Qemu-devel] [PATCH V5 3/6] block: Add WIN32 platform support for backing_file_loop_check() |
Date: |
Fri, 02 Aug 2013 16:27:25 -0600 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130625 Thunderbird/17.0.7 |
On 08/02/2013 03:02 AM, Xu Wang wrote:
> From: Xu Wang <address@hidden>
>
> Method of get_inode is different between Linux and WIN32 plateform.
s/plateform/platform/g (3 instances in the commit message)
> This patch added inode caculate method on Windows plateform so that
s/added/adds an/
s/caculate/calculation/
> backing file check could work on Windows plateform.
>
> Signed-off-by: Xu Wang <address@hidden>
> ---
> block.c | 156
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
> 1 file changed, 148 insertions(+), 8 deletions(-)
>
> }
>
> +#ifdef _WIN32
> +static int get_lnk_target_file(const char *lnk_file, char *filepath)
> +{
> + unsigned int flag, offset;
> + unsigned int sflag;
> + char uch;
> + int i = 0;
> +
> + FILE *fd = fopen(lnk_file, "rb");
> + if (!fd) {
> + error_report("Open file %s failed.", lnk_file);
Error messages should not include '.'; also, when it is due to a system
call failure, you should include strerror() information explaining the
failure.
> + return -1;
> + }
> +
> + /* Check if the file is shortcuts by reading first 4 bytes if it's 0x4c
> */
> + if (fread(&flag, 4, 1, fd) != 1) {
> + error_report("Read 0x4c field of %s failed.", lnk_file);
I don't know WIN32 programming well enough to know if this really how
you should be checking for infinite loops. But how is this supposed to
work? In POSIX, fopen() of a symlink opens its destination; to read a
symlink's contents, you have to use readlink() (that is, the API used to
read file contents is NOT the API used to chase link resolution). This
whole function feels like a horrible hack, unlikely to do what you meant.
> +
> +static long get_inode(const char *filename)
Again, 'long' and 'ino_t' are not necessarily compatible types. Use
ino_t. And again, 'ino_t' alone does not uniquely designate a file; it
is the combination of device and inode numbers together that give
uniqueness.
> +{
> + #ifdef _WIN32
We usually anchor # in the first column.
> + char pbuf[PATH_MAX + 1], *p;
> + long inode;
> + struct stat sbuf;
> + char path[PATH_MAX + 1];
> + int len;
> +
> + /* If filename contains .lnk, it's a shortcuts. Target file
> + * need to be parsed.
How does the rest of the qemu code base handle .lnk files? Are we
trying to dereference the target file automatically? If so, is there
already code that does that, which we can reuse here? It just seems
awkward that you are implementing this from scratch - either we support
reading through windows links (and should reuse that code) or we don't
(and hence it doesn't matter if the user passes us a .lnk file, we
aren't treating it any different than any other data file).
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature
- [Qemu-devel] [PATCH V5 0/6] Refine and export backing file loop check, Xu Wang, 2013/08/02
- [Qemu-devel] [PATCH V5 2/6] qemu-img: Add infinite loop checking in bdrv_new_open(), Xu Wang, 2013/08/02
- [Qemu-devel] [PATCH V5 3/6] block: Add WIN32 platform support for backing_file_loop_check(), Xu Wang, 2013/08/02
- Re: [Qemu-devel] [PATCH V5 3/6] block: Add WIN32 platform support for backing_file_loop_check(),
Eric Blake <=
- [Qemu-devel] [PATCH V5 4/6] block: Check infinite loop in bdrv_img_create(), Xu Wang, 2013/08/02
- [Qemu-devel] [PATCH V5 1/6] block/qemu-img: Refine and export infinite loop checking in collect_image_info_list(), Xu Wang, 2013/08/02
- [Qemu-devel] [PATCH V5 6/6] block: Add infinite loop check in drive_init(), Xu Wang, 2013/08/02
- [Qemu-devel] [PATCH V5 5/6] block: Add backing file loop check in change_backing_file(), Xu Wang, 2013/08/02