diff mbox series

[2/4] qga: Use common time encoding for guest-get-devices 'driver-date'

Message ID 20201021071520.2168877-3-armbru@redhat.com
State New
Headers show
Series qga: Fix several guest-get-devices issues | expand

Commit Message

Markus Armbruster Oct. 21, 2020, 7:15 a.m. UTC
guest-get-devices returns 'driver-date' as string in the format
YYYY-MM-DD.  Goes back to recent commit 2e4211cee4 "qga: add command
guest-get-devices for reporting VirtIO devices".

We should avoid use of multiple encodings for the same kind of data.
Especially string encodings.  Change it to return nanoseconds since
the epoch, like guest-get-time does.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 qga/qapi-schema.json |  4 ++--
 qga/commands-win32.c | 19 +++++++++++--------
 2 files changed, 13 insertions(+), 10 deletions(-)

Comments

Marc-André Lureau Oct. 21, 2020, 7:42 a.m. UTC | #1
Hi

On Wed, Oct 21, 2020 at 11:18 AM Markus Armbruster <armbru@redhat.com>
wrote:

> guest-get-devices returns 'driver-date' as string in the format

> YYYY-MM-DD.  Goes back to recent commit 2e4211cee4 "qga: add command

> guest-get-devices for reporting VirtIO devices".

>

> We should avoid use of multiple encodings for the same kind of data.

> Especially string encodings.  Change it to return nanoseconds since

> the epoch, like guest-get-time does.

>

> Signed-off-by: Markus Armbruster <armbru@redhat.com>

>


I think I assumed it was free form human-friendly string, but it has a
strict YYYY-MM-DD format in the doc, so let's use the existing one instead.

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>




> ---

>  qga/qapi-schema.json |  4 ++--

>  qga/commands-win32.c | 19 +++++++++++--------

>  2 files changed, 13 insertions(+), 10 deletions(-)

>

> diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json

> index f2c81cda2b..c7bfb8bf6a 100644

> --- a/qga/qapi-schema.json

> +++ b/qga/qapi-schema.json

> @@ -1282,7 +1282,7 @@

>  # @GuestDeviceInfo:

>  #

>  # @driver-name: name of the associated driver

> -# @driver-date: driver release date in format YYYY-MM-DD

> +# @driver-date: driver release date, in nanoseconds since the epoch

>  # @driver-version: driver version

>  # @id: device ID

>  #

> @@ -1291,7 +1291,7 @@

>  { 'struct': 'GuestDeviceInfo',

>    'data': {

>        'driver-name': 'str',

> -      '*driver-date': 'str',

> +      '*driver-date': 'int',

>        '*driver-version': 'str',

>        '*id': 'GuestDeviceId'

>    } }

> diff --git a/qga/commands-win32.c b/qga/commands-win32.c

> index 879b02b6c3..b01616a992 100644

> --- a/qga/commands-win32.c

> +++ b/qga/commands-win32.c

> @@ -1641,6 +1641,12 @@ out:

>      return head;

>  }

>

> +static int64_t filetime_to_ns(const FILETIME *tf)

> +{

> +    return ((((int64_t)tf->dwHighDateTime << 32) | tf->dwLowDateTime)

> +            - W32_FT_OFFSET) * 100;

> +}

> +

>  int64_t qmp_guest_get_time(Error **errp)

>  {

>      SYSTEMTIME ts = {0};

> @@ -1657,8 +1663,7 @@ int64_t qmp_guest_get_time(Error **errp)

>          return -1;

>      }

>

> -    return ((((int64_t)tf.dwHighDateTime << 32) | tf.dwLowDateTime)

> -                - W32_FT_OFFSET) * 100;

> +    return filetime_to_ns(&tf);

>  }

>

>  void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp)

> @@ -2363,7 +2368,6 @@ GuestDeviceInfoList *qmp_guest_get_devices(Error

> **errp)

>      slog("enumerating devices");

>      for (i = 0; SetupDiEnumDeviceInfo(dev_info, i, &dev_info_data); i++) {

>          bool skip = true;

> -        SYSTEMTIME utc_date;

>          g_autofree LPWSTR name = NULL;

>          g_autofree LPFILETIME date = NULL;

>          g_autofree LPWSTR version = NULL;

> @@ -2434,13 +2438,12 @@ GuestDeviceInfoList *qmp_guest_get_devices(Error

> **errp)

>              slog("failed to get driver date");

>              continue;

>          }

> -        FileTimeToSystemTime(date, &utc_date);

> -        device->driver_date = g_strdup_printf("%04d-%02d-%02d",

> -            utc_date.wYear, utc_date.wMonth, utc_date.wDay);

> +        device->driver_date = filetime_to_ns(date);

>          device->has_driver_date = true;

>

> -        slog("driver: %s\ndriver version: %s,%s\n", device->driver_name,

> -            device->driver_date, device->driver_version);

> +        slog("driver: %s\ndriver version: %" PRId64 ",%s\n",

> +             device->driver_name, device->driver_date,

> +             device->driver_version);

>          item = g_new0(GuestDeviceInfoList, 1);

>          item->value = g_steal_pointer(&device);

>          if (!cur_item) {

> --

> 2.26.2

>

>

>


-- 
Marc-André Lureau
<div dir="ltr"><div>Hi<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Oct 21, 2020 at 11:18 AM Markus Armbruster &lt;<a href="mailto:armbru@redhat.com">armbru@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">guest-get-devices returns &#39;driver-date&#39; as string in the format<br>
YYYY-MM-DD.  Goes back to recent commit 2e4211cee4 &quot;qga: add command<br>
guest-get-devices for reporting VirtIO devices&quot;.<br>
<br>
We should avoid use of multiple encodings for the same kind of data.<br>
Especially string encodings.  Change it to return nanoseconds since<br>
the epoch, like guest-get-time does.<br>
<br>
Signed-off-by: Markus Armbruster &lt;<a href="mailto:armbru@redhat.com" target="_blank">armbru@redhat.com</a>&gt;<br></blockquote><div><br></div><div>I think I assumed it was free form human-friendly string, but it has a strict YYYY-MM-DD format in the doc, so let&#39;s use the existing one instead.<br></div><div><br></div><div><div>Reviewed-by: Marc-André Lureau &lt;<a href="mailto:marcandre.lureau@redhat.com">marcandre.lureau@redhat.com</a>&gt;</div><div> <br></div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

---<br>
 qga/qapi-schema.json |  4 ++--<br>
 qga/commands-win32.c | 19 +++++++++++--------<br>
 2 files changed, 13 insertions(+), 10 deletions(-)<br>
<br>
diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json<br>
index f2c81cda2b..c7bfb8bf6a 100644<br>
--- a/qga/qapi-schema.json<br>
+++ b/qga/qapi-schema.json<br>
@@ -1282,7 +1282,7 @@<br>
 # @GuestDeviceInfo:<br>
 #<br>
 # @driver-name: name of the associated driver<br>
-# @driver-date: driver release date in format YYYY-MM-DD<br>
+# @driver-date: driver release date, in nanoseconds since the epoch<br>
 # @driver-version: driver version<br>
 # @id: device ID<br>
 #<br>
@@ -1291,7 +1291,7 @@<br>
 { &#39;struct&#39;: &#39;GuestDeviceInfo&#39;,<br>
   &#39;data&#39;: {<br>
       &#39;driver-name&#39;: &#39;str&#39;,<br>
-      &#39;*driver-date&#39;: &#39;str&#39;,<br>
+      &#39;*driver-date&#39;: &#39;int&#39;,<br>
       &#39;*driver-version&#39;: &#39;str&#39;,<br>
       &#39;*id&#39;: &#39;GuestDeviceId&#39;<br>
   } }<br>
diff --git a/qga/commands-win32.c b/qga/commands-win32.c<br>
index 879b02b6c3..b01616a992 100644<br>
--- a/qga/commands-win32.c<br>
+++ b/qga/commands-win32.c<br>
@@ -1641,6 +1641,12 @@ out:<br>
     return head;<br>
 }<br>
<br>
+static int64_t filetime_to_ns(const FILETIME *tf)<br>
+{<br>
+    return ((((int64_t)tf-&gt;dwHighDateTime &lt;&lt; 32) | tf-&gt;dwLowDateTime)<br>
+            - W32_FT_OFFSET) * 100;<br>
+}<br>
+<br>
 int64_t qmp_guest_get_time(Error **errp)<br>
 {<br>
     SYSTEMTIME ts = {0};<br>
@@ -1657,8 +1663,7 @@ int64_t qmp_guest_get_time(Error **errp)<br>
         return -1;<br>
     }<br>
<br>
-    return ((((int64_t)tf.dwHighDateTime &lt;&lt; 32) | tf.dwLowDateTime)<br>
-                - W32_FT_OFFSET) * 100;<br>
+    return filetime_to_ns(&amp;tf);<br>
 }<br>
<br>
 void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp)<br>
@@ -2363,7 +2368,6 @@ GuestDeviceInfoList *qmp_guest_get_devices(Error **errp)<br>
     slog(&quot;enumerating devices&quot;);<br>
     for (i = 0; SetupDiEnumDeviceInfo(dev_info, i, &amp;dev_info_data); i++) {<br>
         bool skip = true;<br>
-        SYSTEMTIME utc_date;<br>
         g_autofree LPWSTR name = NULL;<br>
         g_autofree LPFILETIME date = NULL;<br>
         g_autofree LPWSTR version = NULL;<br>
@@ -2434,13 +2438,12 @@ GuestDeviceInfoList *qmp_guest_get_devices(Error **errp)<br>
             slog(&quot;failed to get driver date&quot;);<br>
             continue;<br>
         }<br>
-        FileTimeToSystemTime(date, &amp;utc_date);<br>
-        device-&gt;driver_date = g_strdup_printf(&quot;%04d-%02d-%02d&quot;,<br>
-            utc_date.wYear, utc_date.wMonth, utc_date.wDay);<br>
+        device-&gt;driver_date = filetime_to_ns(date);<br>
         device-&gt;has_driver_date = true;<br>
<br>
-        slog(&quot;driver: %s\ndriver version: %s,%s\n&quot;, device-&gt;driver_name,<br>
-            device-&gt;driver_date, device-&gt;driver_version);<br>
+        slog(&quot;driver: %s\ndriver version: %&quot; PRId64 &quot;,%s\n&quot;,<br>
+             device-&gt;driver_name, device-&gt;driver_date,<br>
+             device-&gt;driver_version);<br>
         item = g_new0(GuestDeviceInfoList, 1);<br>
         item-&gt;value = g_steal_pointer(&amp;device);<br>
         if (!cur_item) {<br>
-- <br>
2.26.2<br>
<br>
<br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature">Marc-André Lureau<br></div></div>
diff mbox series

Patch

diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json
index f2c81cda2b..c7bfb8bf6a 100644
--- a/qga/qapi-schema.json
+++ b/qga/qapi-schema.json
@@ -1282,7 +1282,7 @@ 
 # @GuestDeviceInfo:
 #
 # @driver-name: name of the associated driver
-# @driver-date: driver release date in format YYYY-MM-DD
+# @driver-date: driver release date, in nanoseconds since the epoch
 # @driver-version: driver version
 # @id: device ID
 #
@@ -1291,7 +1291,7 @@ 
 { 'struct': 'GuestDeviceInfo',
   'data': {
       'driver-name': 'str',
-      '*driver-date': 'str',
+      '*driver-date': 'int',
       '*driver-version': 'str',
       '*id': 'GuestDeviceId'
   } }
diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 879b02b6c3..b01616a992 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -1641,6 +1641,12 @@  out:
     return head;
 }
 
+static int64_t filetime_to_ns(const FILETIME *tf)
+{
+    return ((((int64_t)tf->dwHighDateTime << 32) | tf->dwLowDateTime)
+            - W32_FT_OFFSET) * 100;
+}
+
 int64_t qmp_guest_get_time(Error **errp)
 {
     SYSTEMTIME ts = {0};
@@ -1657,8 +1663,7 @@  int64_t qmp_guest_get_time(Error **errp)
         return -1;
     }
 
-    return ((((int64_t)tf.dwHighDateTime << 32) | tf.dwLowDateTime)
-                - W32_FT_OFFSET) * 100;
+    return filetime_to_ns(&tf);
 }
 
 void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp)
@@ -2363,7 +2368,6 @@  GuestDeviceInfoList *qmp_guest_get_devices(Error **errp)
     slog("enumerating devices");
     for (i = 0; SetupDiEnumDeviceInfo(dev_info, i, &dev_info_data); i++) {
         bool skip = true;
-        SYSTEMTIME utc_date;
         g_autofree LPWSTR name = NULL;
         g_autofree LPFILETIME date = NULL;
         g_autofree LPWSTR version = NULL;
@@ -2434,13 +2438,12 @@  GuestDeviceInfoList *qmp_guest_get_devices(Error **errp)
             slog("failed to get driver date");
             continue;
         }
-        FileTimeToSystemTime(date, &utc_date);
-        device->driver_date = g_strdup_printf("%04d-%02d-%02d",
-            utc_date.wYear, utc_date.wMonth, utc_date.wDay);
+        device->driver_date = filetime_to_ns(date);
         device->has_driver_date = true;
 
-        slog("driver: %s\ndriver version: %s,%s\n", device->driver_name,
-            device->driver_date, device->driver_version);
+        slog("driver: %s\ndriver version: %" PRId64 ",%s\n",
+             device->driver_name, device->driver_date,
+             device->driver_version);
         item = g_new0(GuestDeviceInfoList, 1);
         item->value = g_steal_pointer(&device);
         if (!cur_item) {