<div dir="ltr">Thank u for reviewing. I will give patch v2 later.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jul 10, 2018 at 2:38 PM, Michal Privoznik <span dir="ltr"><<a href="mailto:mprivozn@redhat.com" target="_blank">mprivozn@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On 07/03/2018 04:29 AM, Han Han wrote:<br>
> This private API helps check cdrom drive status via ioctl().<br>
> <br>
> Signed-off-by: Han Han <<a href="mailto:hhan@redhat.com">hhan@redhat.com</a>><br>
> ---<br>
>  src/libvirt_private.syms |  1 +<br>
>  src/util/virfile.c       | 52 ++++++++++++++++++++++++++++++<wbr>++++++++++<br>
>  src/util/virfile.h       | 10 ++++++++<br>
>  3 files changed, 63 insertions(+)<br>
> <br>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms<br>
> index 5499a368c0..e9f79ad433 100644<br>
> --- a/src/libvirt_private.syms<br>
> +++ b/src/libvirt_private.syms<br>
> @@ -1797,6 +1797,7 @@ virFileActivateDirOverride;<br>
>  virFileBindMountDevice;<br>
>  virFileBuildPath;<br>
>  virFileCanonicalizePath;<br>
> +virFileCdromStatus;<br>
>  virFileChownFiles;<br>
>  virFileClose;<br>
>  virFileComparePaths;<br>
> diff --git a/src/util/virfile.c b/src/util/virfile.c<br>
> index 378d03ecf0..790d9448d2 100644<br>
> --- a/src/util/virfile.c<br>
> +++ b/src/util/virfile.c<br>
> @@ -2026,6 +2026,58 @@ virFileIsCDROM(const char *path)<br>
>      return ret;<br>
>  }<br>
>  <br>
> +/**<br>
> + * virFileCdromStatus:<br>
> + * @path: Cdrom path<br>
> + *<br>
> + * Returns:<br>
> + *      -1                              error happends.<br>
> + *      VIR_FILE_CDROM_DISC_OK          Cdrom is OK.<br>
> + *      VIR_FILE_CDROM_NO_INFO          Information not available.<br>
> + *      VIR_FILE_CDROM_NO_DISC          No disc in cdrom.<br>
> + *      VIR_FILE_CDROM_TREY_OPEN        Cdrom is trey-open.<br>
> + *      VIR_FILE_CDROM_DRIVE_NOT_READY  Cdrom is not ready.<br>
> + * reported.<br>
> + */<br>
> +int<br>
> +virFileCdromStatus(const char *path)<br>
<br>
</div></div>This is in "if defined(__linux__)" block. You need to provide non-Linux<br>
stub for this function too otherwise we will fail to build on such systems.<br>
<span class=""><br>
<br>
> +{<br>
> +    int ret = -1;<br>
> +    int fd;<br>
> +<br>
> +    if ((fd = open(path, O_RDONLY | O_NONBLOCK)) < 0)<br>
> +        goto cleanup;<br>
> +<br>
> +    /* Attempt to detect CDROM status via ioctl */<br>
> +    if ((ret = ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT)) >= 0) {<br>
<br>
</span>So virFileIsCDROM calls the same ioctl(). I wonder whether we should<br>
modify that function instead of inventing a new one. It would work like<br>
this:<br>
<br>
virFileISCDROM(const char *path, int *status);<br>
<br>
if @path is a CDROM, then @status is set to one of VIR_FILE_CDROM_*.<br>
However, caller can pass status = NULL which means they are not<br>
interested in status rather than plain is CDROM / isn't CDROM fact.<br>
<span class=""><br>
> +        switch (ret) {<br>
> +            case CDS_NO_INFO:<br>
> +                ret = VIR_FILE_CDROM_NO_INFO;<br>
> +                goto cleanup;<br>
> +                break;<br>
<br>
</span>There is no reason for this goto. break is sufficient.<br>
<div><div class="h5"><br>
> +            case CDS_NO_DISC:<br>
> +                ret = VIR_FILE_CDROM_NO_DISC;<br>
> +                goto cleanup;<br>
> +                break;<br>
> +            case CDS_TRAY_OPEN:<br>
> +                ret = VIR_FILE_CDROM_TREY_OPEN;<br>
> +                goto cleanup;<br>
> +                break;<br>
> +            case CDS_DRIVE_NOT_READY:<br>
> +                ret = VIR_FILE_CDROM_DRIVE_NOT_<wbr>READY;<br>
> +                goto cleanup;<br>
> +                break;<br>
> +            case CDS_DISC_OK:<br>
> +                ret = VIR_FILE_CDROM_DISC_OK;<br>
> +                goto cleanup;<br>
> +                break;<br>
> +        }<br>
> +    }<br>
> +<br>
> + cleanup:<br>
> +    VIR_FORCE_CLOSE(fd);<br>
> +    return ret;<br>
> +}<br>
>  #else<br>
>  <br>
>  int<br>
> diff --git a/src/util/virfile.h b/src/util/virfile.h<br>
> index 6f1e802fde..9d4701c8d2 100644<br>
> --- a/src/util/virfile.h<br>
> +++ b/src/util/virfile.h<br>
> @@ -212,6 +212,16 @@ int virFileIsSharedFS(const char *path) ATTRIBUTE_NONNULL(1);<br>
>  int virFileIsMountPoint(const char *file) ATTRIBUTE_NONNULL(1);<br>
>  int virFileIsCDROM(const char *path)<br>
>      ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;<br>
> +int virFileCdromStatus(const char *path)<br>
> +    ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;<br>
> +<br>
> +enum {<br>
> +    VIR_FILE_CDROM_DISC_OK = 1,<br>
> +    VIR_FILE_CDROM_NO_INFO,<br>
> +    VIR_FILE_CDROM_NO_DISC,<br>
> +    VIR_FILE_CDROM_TREY_OPEN,<br>
> +    VIR_FILE_CDROM_DRIVE_NOT_<wbr>READY,<br>
> +};<br>
<br>
</div></div>Nit pick, the enum should go before the function. The reason is that if<br>
we decide to give the enum a name [1], we don't have to move things around.<br>
<br>
1: which leads me to even better proposal. How about giving this enum a<br>
name, say virFileCDRomStatus and acknowledging this in function header:<br>
<br>
int virFileISCDROM(const char *path, virFileCDRomStatus *status);<br>
<br>
The set of return values of the function would remain the same as is now.<br>
<span class="HOEnZb"><font color="#888888"><br>
Michal<br>
</font></span></blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr">Best regards,</div><div dir="ltr">-----------------------------------<br></div><div dir="ltr">Han Han<br>Quality Engineer<br>Redhat.<br><br>Email: <a href="mailto:hhan@redhat.com" target="_blank">hhan@redhat.com</a><br>Phone: +861065339333<br></div></div></div></div></div></div>
</div>