qemu-devel
[Top][All Lists]
Advanced

[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

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]