-"The child process generates events in some situations. Current events "
-"include: receiving a log message, the child process exits."
+"B<Note:> This section documents the generic event mechanism introduced in "
+"libguestfs 1.10, which you should use in new code if possible. The old "
+"functions C<guestfs_set_log_message_callback>, "
+"C<guestfs_set_subprocess_quit_callback>, "
+"C<guestfs_set_launch_done_callback>, C<guestfs_set_close_callback> and "
+"C<guestfs_set_progress_callback> are no longer documented in this manual "
+"page."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1694
+msgid ""
+"Handles generate events when certain things happen, such as log messages "
+"being generated, progress messages during long-running operations, or the "
+"handle being closed. The API calls described below let you register a "
+"callback to be called when events happen. You can register multiple "
+"callbacks (for the same, different or overlapping sets of events), and "
+"individually remove callbacks. If callbacks are not removed, then they "
+"remain in force until the handle is closed."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1702
+msgid ""
+"In the current implementation, events are only generated synchronously: that "
+"means that events (and hence callbacks) can only happen while you are in the "
+"middle of making another libguestfs call. The callback is called in the "
+"same thread."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1707
+msgid ""
+"Events may contain a payload, usually nothing (void), an array of 64 bit "
+"unsigned integers, or a message buffer. Payloads are discussed later on."
+msgstr ""
+
+#. type: =head3
+#: ../src/guestfs.pod:1711
+msgid "CLASSES OF EVENTS"
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:1715
+msgid "GUESTFS_EVENT_CLOSE (payload type: void)"
-"The callback also receives the procedure number and serial number of the "
-"call. These are only useful for debugging protocol issues, and the callback "
-"can normally ignore them. The callback may want to print these numbers in "
-"error messages or debugging messages."
+"Events associated with log messages are: C<GUESTFS_EVENT_LIBRARY>, "
+"C<GUESTFS_EVENT_APPLIANCE> and C<GUESTFS_EVENT_TRACE>. (Note that error "
+"messages are not events; you must capture error messages separately)."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1922
+msgid ""
+"Programs have to set up a callback to capture the classes of events of "
+"interest:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:1925
+#, no-wrap
+msgid ""
+" int eh =\n"
+" guestfs_set_event_callback\n"
+" (g, message_callback,\n"
+" GUESTFS_EVENT_LIBRARY|GUESTFS_EVENT_APPLIANCE|\n"
+" GUESTFS_EVENT_TRACE,\n"
+" 0, NULL) == -1)\n"
+" if (eh == -1) {\n"
+" // handle error in the usual way\n"
+" }\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1935
+msgid ""
+"The callback can then direct messages to the appropriate place. In this "
+"example, messages are directed to syslog:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:1938
+#, no-wrap
+msgid ""
+" static void\n"
+" message_callback (\n"
+" guestfs_h *g,\n"
+" void *opaque,\n"
+" uint64_t event,\n"
+" int event_handle,\n"
+" int flags,\n"
+" const char *buf, size_t buf_len,\n"
+" const uint64_t *array, size_t array_len)\n"
+" {\n"
+" const int priority = LOG_USER|LOG_INFO;\n"
+" if (buf_len > 0)\n"
+" syslog (priority, \"event 0x%lx: %s\", event, buf);\n"
+" }\n"
+"\n"
-"do it (see L</guestfs_set_close_callback>, and note that only one callback "
-"can be registered for a handle)."
+"do it (see L</GUESTFS_EVENT_CLOSE>)."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1988
+msgid "To walk over all entries, use these two functions:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:1990
+#, no-wrap
+msgid ""
+" void *guestfs_first_private (guestfs_h *g, const char **key_rtn);\n"
+"\n"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:1992
+#, no-wrap
+msgid ""
+" void *guestfs_next_private (guestfs_h *g, const char **key_rtn);\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1994
+msgid ""
+"C<guestfs_first_private> returns the first key, pointer pair (\"first\" does "
+"not have any particular meaning -- keys are not returned in any defined "
+"order). A pointer to the key is returned in C<*key_rtn> and the "
+"corresponding data pointer is returned from the function. C<NULL> is "
+"returned if there are no keys stored in the handle."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2000
+msgid ""
+"C<guestfs_next_private> returns the next key, pointer pair. The return "
+"value of this function is also C<NULL> is there are no further entries to "
+"return."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2004
+msgid "Notes about walking over entries:"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2010
+msgid ""
+"You must not call C<guestfs_set_private> while walking over the entries."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2015
+msgid ""
+"The handle maintains an internal iterator which is reset when you call "
+"C<guestfs_first_private>. This internal iterator is invalidated when you "
+"call C<guestfs_set_private>."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2021
+msgid "If you have set the data pointer associated with a key to C<NULL>, ie:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2023
+#, no-wrap
+msgid ""
+" guestfs_set_private (g, key, NULL);\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2025
+msgid "then that C<key> is not returned when walking."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2029
+msgid ""
+"C<*key_rtn> is only valid until the next call to C<guestfs_first_private>, "
+"C<guestfs_next_private> or C<guestfs_set_private>."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2035
+msgid ""
+"The following example code shows how to print all keys and data pointers "
+"that are associated with the handle C<g>:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2038
+#, no-wrap
+msgid ""
+" const char *key;\n"
+" void *data = guestfs_first_private (g, &key);\n"
+" while (data != NULL)\n"
+" {\n"
+" printf (\"key = %s, data = %p\\n\", key, data);\n"
+" data = guestfs_next_private (g, &key);\n"
+" }\n"
+"\n"
-"The private data area is implemented using a hash table, and should be "
-"reasonably efficient for moderate numbers of keys."
+" const char *key;\n"
+" void *data = guestfs_first_private (g, &key);\n"
+" while (data != NULL)\n"
+" {\n"
+" if (strncmp (key, \"foo_\", strlen (\"foo_\")) == 0)\n"
+" printf (\"key = %s, data = %p\\n\", key, data);\n"
+" data = guestfs_next_private (g, &key);\n"
+" }\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2058
+msgid ""
+"If you need to modify keys while walking, then you have to jump back to the "
+"beginning of the loop. For example, to delete all keys prefixed with "
+"C<foo_>:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2062
+#, no-wrap
+msgid ""
+" const char *key;\n"
+" void *data;\n"
+" again:\n"
+" data = guestfs_first_private (g, &key);\n"
+" while (data != NULL)\n"
+" {\n"
+" if (strncmp (key, \"foo_\", strlen (\"foo_\")) == 0)\n"
+" {\n"
+" guestfs_set_private (g, key, NULL);\n"
+" /* note that 'key' pointer is now invalid, and so is\n"
+" the internal iterator */\n"
+" goto again;\n"
+" }\n"
+" data = guestfs_next_private (g, &key);\n"
+" }\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2078
+msgid ""
+"Note that the above loop is guaranteed to terminate because the keys are "
+"being deleted, but other manipulations of keys within the loop might not "
+"terminate unless you also maintain an indication of which keys have been "
+"visited."
-#: ../src/guestfs-actions.pod:2501 ../src/guestfs-actions.pod:3336
-#: ../src/guestfs-actions.pod:3351 ../src/guestfs-actions.pod:3371
-#: ../src/guestfs-actions.pod:3526 ../src/guestfs-actions.pod:3540
-#: ../src/guestfs-actions.pod:3553 ../src/guestfs-actions.pod:3567
-#: ../src/guestfs-actions.pod:3582 ../src/guestfs-actions.pod:3618
-#: ../src/guestfs-actions.pod:3690 ../src/guestfs-actions.pod:3710
-#: ../src/guestfs-actions.pod:3727 ../src/guestfs-actions.pod:3750
-#: ../src/guestfs-actions.pod:3773 ../src/guestfs-actions.pod:3805
-#: ../src/guestfs-actions.pod:3824 ../src/guestfs-actions.pod:3843
-#: ../src/guestfs-actions.pod:3878 ../src/guestfs-actions.pod:3890
-#: ../src/guestfs-actions.pod:3926 ../src/guestfs-actions.pod:3942
-#: ../src/guestfs-actions.pod:3955 ../src/guestfs-actions.pod:3970
-#: ../src/guestfs-actions.pod:3987 ../src/guestfs-actions.pod:4080
-#: ../src/guestfs-actions.pod:4100 ../src/guestfs-actions.pod:4113
-#: ../src/guestfs-actions.pod:4164 ../src/guestfs-actions.pod:4182
-#: ../src/guestfs-actions.pod:4200 ../src/guestfs-actions.pod:4216
-#: ../src/guestfs-actions.pod:4230 ../src/guestfs-actions.pod:4244
-#: ../src/guestfs-actions.pod:4261 ../src/guestfs-actions.pod:4276
-#: ../src/guestfs-actions.pod:4296 ../src/guestfs-actions.pod:4354
-#: ../src/guestfs-actions.pod:4427 ../src/guestfs-actions.pod:4458
-#: ../src/guestfs-actions.pod:4477 ../src/guestfs-actions.pod:4496
-#: ../src/guestfs-actions.pod:4508 ../src/guestfs-actions.pod:4525
-#: ../src/guestfs-actions.pod:4538 ../src/guestfs-actions.pod:4553
-#: ../src/guestfs-actions.pod:4568 ../src/guestfs-actions.pod:4603
-#: ../src/guestfs-actions.pod:4618 ../src/guestfs-actions.pod:4638
-#: ../src/guestfs-actions.pod:4652 ../src/guestfs-actions.pod:4669
-#: ../src/guestfs-actions.pod:4718 ../src/guestfs-actions.pod:4755
-#: ../src/guestfs-actions.pod:4769 ../src/guestfs-actions.pod:4797
-#: ../src/guestfs-actions.pod:4814 ../src/guestfs-actions.pod:4832
-#: ../src/guestfs-actions.pod:4966 ../src/guestfs-actions.pod:5023
-#: ../src/guestfs-actions.pod:5045 ../src/guestfs-actions.pod:5063
-#: ../src/guestfs-actions.pod:5095 ../src/guestfs-actions.pod:5161
-#: ../src/guestfs-actions.pod:5178 ../src/guestfs-actions.pod:5191
-#: ../src/guestfs-actions.pod:5205 ../src/guestfs-actions.pod:5494
-#: ../src/guestfs-actions.pod:5513 ../src/guestfs-actions.pod:5532
-#: ../src/guestfs-actions.pod:5544 ../src/guestfs-actions.pod:5556
-#: ../src/guestfs-actions.pod:5570 ../src/guestfs-actions.pod:5582
-#: ../src/guestfs-actions.pod:5596 ../src/guestfs-actions.pod:5612
-#: ../src/guestfs-actions.pod:5633 ../src/guestfs-actions.pod:5652
-#: ../src/guestfs-actions.pod:5671 ../src/guestfs-actions.pod:5701
-#: ../src/guestfs-actions.pod:5717 ../src/guestfs-actions.pod:5740
-#: ../src/guestfs-actions.pod:5758 ../src/guestfs-actions.pod:5777
-#: ../src/guestfs-actions.pod:5798 ../src/guestfs-actions.pod:5817
-#: ../src/guestfs-actions.pod:5834 ../src/guestfs-actions.pod:5862
-#: ../src/guestfs-actions.pod:5886 ../src/guestfs-actions.pod:5905
-#: ../src/guestfs-actions.pod:5929 ../src/guestfs-actions.pod:5944
-#: ../src/guestfs-actions.pod:5959 ../src/guestfs-actions.pod:5978
-#: ../src/guestfs-actions.pod:6015 ../src/guestfs-actions.pod:6038
-#: ../src/guestfs-actions.pod:6064 ../src/guestfs-actions.pod:6172
-#: ../src/guestfs-actions.pod:6293 ../src/guestfs-actions.pod:6305
-#: ../src/guestfs-actions.pod:6318 ../src/guestfs-actions.pod:6331
-#: ../src/guestfs-actions.pod:6353 ../src/guestfs-actions.pod:6366
-#: ../src/guestfs-actions.pod:6379 ../src/guestfs-actions.pod:6392
-#: ../src/guestfs-actions.pod:6407 ../src/guestfs-actions.pod:6466
-#: ../src/guestfs-actions.pod:6483 ../src/guestfs-actions.pod:6499
-#: ../src/guestfs-actions.pod:6515 ../src/guestfs-actions.pod:6532
-#: ../src/guestfs-actions.pod:6545 ../src/guestfs-actions.pod:6565
-#: ../src/guestfs-actions.pod:6601 ../src/guestfs-actions.pod:6615
-#: ../src/guestfs-actions.pod:6656 ../src/guestfs-actions.pod:6669
-#: ../src/guestfs-actions.pod:6687 ../src/guestfs-actions.pod:6721
-#: ../src/guestfs-actions.pod:6757 ../src/guestfs-actions.pod:6876
-#: ../src/guestfs-actions.pod:6894 ../src/guestfs-actions.pod:6908
-#: ../src/guestfs-actions.pod:6963 ../src/guestfs-actions.pod:6976
-#: ../src/guestfs-actions.pod:7021 ../src/guestfs-actions.pod:7054
-#: ../src/guestfs-actions.pod:7108 ../src/guestfs-actions.pod:7134
-#: ../src/guestfs-actions.pod:7200 ../src/guestfs-actions.pod:7219
-#: ../src/guestfs-actions.pod:7248
+#: ../src/guestfs-actions.pod:2501 ../src/guestfs-actions.pod:3375
+#: ../src/guestfs-actions.pod:3390 ../src/guestfs-actions.pod:3410
+#: ../src/guestfs-actions.pod:3565 ../src/guestfs-actions.pod:3579
+#: ../src/guestfs-actions.pod:3592 ../src/guestfs-actions.pod:3606
+#: ../src/guestfs-actions.pod:3621 ../src/guestfs-actions.pod:3657
+#: ../src/guestfs-actions.pod:3729 ../src/guestfs-actions.pod:3749
+#: ../src/guestfs-actions.pod:3766 ../src/guestfs-actions.pod:3789
+#: ../src/guestfs-actions.pod:3812 ../src/guestfs-actions.pod:3844
+#: ../src/guestfs-actions.pod:3863 ../src/guestfs-actions.pod:3882
+#: ../src/guestfs-actions.pod:3917 ../src/guestfs-actions.pod:3929
+#: ../src/guestfs-actions.pod:3965 ../src/guestfs-actions.pod:3981
+#: ../src/guestfs-actions.pod:3994 ../src/guestfs-actions.pod:4009
+#: ../src/guestfs-actions.pod:4026 ../src/guestfs-actions.pod:4119
+#: ../src/guestfs-actions.pod:4139 ../src/guestfs-actions.pod:4152
+#: ../src/guestfs-actions.pod:4203 ../src/guestfs-actions.pod:4221
+#: ../src/guestfs-actions.pod:4239 ../src/guestfs-actions.pod:4255
+#: ../src/guestfs-actions.pod:4269 ../src/guestfs-actions.pod:4283
+#: ../src/guestfs-actions.pod:4300 ../src/guestfs-actions.pod:4315
+#: ../src/guestfs-actions.pod:4335 ../src/guestfs-actions.pod:4393
+#: ../src/guestfs-actions.pod:4466 ../src/guestfs-actions.pod:4497
+#: ../src/guestfs-actions.pod:4516 ../src/guestfs-actions.pod:4535
+#: ../src/guestfs-actions.pod:4547 ../src/guestfs-actions.pod:4564
+#: ../src/guestfs-actions.pod:4577 ../src/guestfs-actions.pod:4592
+#: ../src/guestfs-actions.pod:4607 ../src/guestfs-actions.pod:4642
+#: ../src/guestfs-actions.pod:4657 ../src/guestfs-actions.pod:4677
+#: ../src/guestfs-actions.pod:4691 ../src/guestfs-actions.pod:4708
+#: ../src/guestfs-actions.pod:4757 ../src/guestfs-actions.pod:4794
+#: ../src/guestfs-actions.pod:4808 ../src/guestfs-actions.pod:4836
+#: ../src/guestfs-actions.pod:4853 ../src/guestfs-actions.pod:4871
+#: ../src/guestfs-actions.pod:5005 ../src/guestfs-actions.pod:5062
+#: ../src/guestfs-actions.pod:5084 ../src/guestfs-actions.pod:5102
+#: ../src/guestfs-actions.pod:5134 ../src/guestfs-actions.pod:5200
+#: ../src/guestfs-actions.pod:5217 ../src/guestfs-actions.pod:5230
+#: ../src/guestfs-actions.pod:5244 ../src/guestfs-actions.pod:5533
+#: ../src/guestfs-actions.pod:5552 ../src/guestfs-actions.pod:5571
+#: ../src/guestfs-actions.pod:5583 ../src/guestfs-actions.pod:5595
+#: ../src/guestfs-actions.pod:5609 ../src/guestfs-actions.pod:5621
+#: ../src/guestfs-actions.pod:5635 ../src/guestfs-actions.pod:5651
+#: ../src/guestfs-actions.pod:5672 ../src/guestfs-actions.pod:5691
+#: ../src/guestfs-actions.pod:5710 ../src/guestfs-actions.pod:5740
+#: ../src/guestfs-actions.pod:5756 ../src/guestfs-actions.pod:5779
+#: ../src/guestfs-actions.pod:5797 ../src/guestfs-actions.pod:5816
+#: ../src/guestfs-actions.pod:5837 ../src/guestfs-actions.pod:5856
+#: ../src/guestfs-actions.pod:5873 ../src/guestfs-actions.pod:5901
+#: ../src/guestfs-actions.pod:5925 ../src/guestfs-actions.pod:5944
+#: ../src/guestfs-actions.pod:5968 ../src/guestfs-actions.pod:5987
+#: ../src/guestfs-actions.pod:6002 ../src/guestfs-actions.pod:6021
+#: ../src/guestfs-actions.pod:6058 ../src/guestfs-actions.pod:6081
+#: ../src/guestfs-actions.pod:6107 ../src/guestfs-actions.pod:6215
+#: ../src/guestfs-actions.pod:6336 ../src/guestfs-actions.pod:6348
+#: ../src/guestfs-actions.pod:6361 ../src/guestfs-actions.pod:6374
+#: ../src/guestfs-actions.pod:6396 ../src/guestfs-actions.pod:6409
+#: ../src/guestfs-actions.pod:6422 ../src/guestfs-actions.pod:6435
+#: ../src/guestfs-actions.pod:6450 ../src/guestfs-actions.pod:6509
+#: ../src/guestfs-actions.pod:6526 ../src/guestfs-actions.pod:6542
+#: ../src/guestfs-actions.pod:6558 ../src/guestfs-actions.pod:6575
+#: ../src/guestfs-actions.pod:6588 ../src/guestfs-actions.pod:6608
+#: ../src/guestfs-actions.pod:6644 ../src/guestfs-actions.pod:6658
+#: ../src/guestfs-actions.pod:6699 ../src/guestfs-actions.pod:6712
+#: ../src/guestfs-actions.pod:6730 ../src/guestfs-actions.pod:6764
+#: ../src/guestfs-actions.pod:6800 ../src/guestfs-actions.pod:6919
+#: ../src/guestfs-actions.pod:6937 ../src/guestfs-actions.pod:6951
+#: ../src/guestfs-actions.pod:7006 ../src/guestfs-actions.pod:7019
+#: ../src/guestfs-actions.pod:7064 ../src/guestfs-actions.pod:7097
+#: ../src/guestfs-actions.pod:7151 ../src/guestfs-actions.pod:7177
+#: ../src/guestfs-actions.pod:7243 ../src/guestfs-actions.pod:7262
+#: ../src/guestfs-actions.pod:7291
-#: ../src/guestfs-actions.pod:2604 ../src/guestfs-actions.pod:2671
-#: ../src/guestfs-actions.pod:2691 ../src/guestfs-actions.pod:2805
-#: ../src/guestfs-actions.pod:2836 ../src/guestfs-actions.pod:2860
-#: ../src/guestfs-actions.pod:2922 ../src/guestfs-actions.pod:2945
-#: ../src/guestfs-actions.pod:3512 ../src/guestfs-actions.pod:3862
-#: ../src/guestfs-actions.pod:4032 ../src/guestfs-actions.pod:4142
-#: ../src/guestfs-actions.pod:4887 ../src/guestfs-actions.pod:5080
-#: ../src/guestfs-actions.pod:5250 ../src/guestfs-actions.pod:5428
-#: ../src/guestfs-actions.pod:5477 ../src/guestfs-actions.pod:6085
-#: ../src/guestfs-actions.pod:6101 ../src/guestfs-actions.pod:6118
-#: ../src/guestfs-actions.pod:6142 ../src/guestfs-actions.pod:6816
-#: ../src/guestfs-actions.pod:6835 ../src/guestfs-actions.pod:6853
-#: ../src/guestfs-actions.pod:7033 ../src/guestfs-actions.pod:7305
+#: ../src/guestfs-actions.pod:2608 ../src/guestfs-actions.pod:2675
+#: ../src/guestfs-actions.pod:2695 ../src/guestfs-actions.pod:2809
+#: ../src/guestfs-actions.pod:2840 ../src/guestfs-actions.pod:2864
+#: ../src/guestfs-actions.pod:2901 ../src/guestfs-actions.pod:2961
+#: ../src/guestfs-actions.pod:2984 ../src/guestfs-actions.pod:3551
+#: ../src/guestfs-actions.pod:3901 ../src/guestfs-actions.pod:4071
+#: ../src/guestfs-actions.pod:4181 ../src/guestfs-actions.pod:4926
+#: ../src/guestfs-actions.pod:5119 ../src/guestfs-actions.pod:5289
+#: ../src/guestfs-actions.pod:5467 ../src/guestfs-actions.pod:5516
+#: ../src/guestfs-actions.pod:6128 ../src/guestfs-actions.pod:6144
+#: ../src/guestfs-actions.pod:6161 ../src/guestfs-actions.pod:6185
+#: ../src/guestfs-actions.pod:6859 ../src/guestfs-actions.pod:6878
+#: ../src/guestfs-actions.pod:6896 ../src/guestfs-actions.pod:7076
+#: ../src/guestfs-actions.pod:7348
-#: ../src/guestfs-actions.pod:2629 ../src/guestfs-actions.pod:2879
-#: ../src/guestfs-actions.pod:3147 ../src/guestfs-actions.pod:3432
-#: ../src/guestfs-actions.pod:3494 ../src/guestfs-actions.pod:3599
-#: ../src/guestfs-actions.pod:4004 ../src/guestfs-actions.pod:4702
-#: ../src/guestfs-actions.pod:5222 ../src/guestfs-actions.pod:5348
-#: ../src/guestfs-actions.pod:5462 ../src/guestfs-actions.pod:6158
-#: ../src/guestfs-actions.pod:6219 ../src/guestfs-actions.pod:6274
-#: ../src/guestfs-actions.pod:6420 ../src/guestfs-actions.pod:6444
-#: ../src/guestfs-actions.pod:6926 ../src/guestfs-actions.pod:6946
-#: ../src/guestfs-actions.pod:6993 ../src/guestfs-actions.pod:7158
-#: ../src/guestfs-actions.pod:7177 ../src/guestfs-actions.pod:7262
-#: ../src/guestfs-actions.pod:7281 ../src/guestfs-actions.pod:7327
-#: ../src/guestfs-actions.pod:7346
+#: ../src/guestfs-actions.pod:2633 ../src/guestfs-actions.pod:2918
+#: ../src/guestfs-actions.pod:3186 ../src/guestfs-actions.pod:3471
+#: ../src/guestfs-actions.pod:3533 ../src/guestfs-actions.pod:3638
+#: ../src/guestfs-actions.pod:4043 ../src/guestfs-actions.pod:4741
+#: ../src/guestfs-actions.pod:5261 ../src/guestfs-actions.pod:5387
+#: ../src/guestfs-actions.pod:5501 ../src/guestfs-actions.pod:6201
+#: ../src/guestfs-actions.pod:6262 ../src/guestfs-actions.pod:6317
+#: ../src/guestfs-actions.pod:6463 ../src/guestfs-actions.pod:6487
+#: ../src/guestfs-actions.pod:6969 ../src/guestfs-actions.pod:6989
+#: ../src/guestfs-actions.pod:7036 ../src/guestfs-actions.pod:7201
+#: ../src/guestfs-actions.pod:7220 ../src/guestfs-actions.pod:7305
+#: ../src/guestfs-actions.pod:7324 ../src/guestfs-actions.pod:7370
+#: ../src/guestfs-actions.pod:7389
-#: ../src/guestfs-actions.pod:2521 ../src/guestfs-actions.pod:2602
-#: ../src/guestfs-actions.pod:2669 ../src/guestfs-actions.pod:2689
-#: ../src/guestfs-actions.pod:2717 ../src/guestfs-actions.pod:2803
-#: ../src/guestfs-actions.pod:2834 ../src/guestfs-actions.pod:2858
-#: ../src/guestfs-actions.pod:2877 ../src/guestfs-actions.pod:2920
-#: ../src/guestfs-actions.pod:2943 ../src/guestfs-actions.pod:2963
-#: ../src/guestfs-actions.pod:2980 ../src/guestfs-actions.pod:2999
-#: ../src/guestfs-actions.pod:3102 ../src/guestfs-actions.pod:3143
-#: ../fish/guestfish-actions.pod:1698 ../fish/guestfish-actions.pod:1772
-#: ../fish/guestfish-actions.pod:1824 ../fish/guestfish-actions.pod:1839
-#: ../fish/guestfish-actions.pod:1860 ../fish/guestfish-actions.pod:1924
-#: ../fish/guestfish-actions.pod:1948 ../fish/guestfish-actions.pod:1965
-#: ../fish/guestfish-actions.pod:1978 ../fish/guestfish-actions.pod:2013
-#: ../fish/guestfish-actions.pod:2029 ../fish/guestfish-actions.pod:2042
-#: ../fish/guestfish-actions.pod:2055 ../fish/guestfish-actions.pod:2070
-#: ../fish/guestfish-actions.pod:2169 ../fish/guestfish-actions.pod:2203
+#: ../src/guestfs-actions.pod:2521 ../src/guestfs-actions.pod:2606
+#: ../src/guestfs-actions.pod:2673 ../src/guestfs-actions.pod:2693
+#: ../src/guestfs-actions.pod:2721 ../src/guestfs-actions.pod:2807
+#: ../src/guestfs-actions.pod:2838 ../src/guestfs-actions.pod:2862
+#: ../src/guestfs-actions.pod:2916 ../src/guestfs-actions.pod:2959
+#: ../src/guestfs-actions.pod:2982 ../src/guestfs-actions.pod:3002
+#: ../src/guestfs-actions.pod:3019 ../src/guestfs-actions.pod:3038
+#: ../src/guestfs-actions.pod:3141 ../src/guestfs-actions.pod:3182
+#: ../fish/guestfish-actions.pod:1698 ../fish/guestfish-actions.pod:1776
+#: ../fish/guestfish-actions.pod:1828 ../fish/guestfish-actions.pod:1843
+#: ../fish/guestfish-actions.pod:1864 ../fish/guestfish-actions.pod:1928
+#: ../fish/guestfish-actions.pod:1952 ../fish/guestfish-actions.pod:1969
+#: ../fish/guestfish-actions.pod:2012 ../fish/guestfish-actions.pod:2047
+#: ../fish/guestfish-actions.pod:2063 ../fish/guestfish-actions.pod:2076
+#: ../fish/guestfish-actions.pod:2089 ../fish/guestfish-actions.pod:2104
+#: ../fish/guestfish-actions.pod:2203 ../fish/guestfish-actions.pod:2237
+#. type: =head2
+#: ../src/guestfs-actions.pod:2869
+msgid "guestfs_inspect_get_product_variant"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs-actions.pod:2871
+#, no-wrap
+msgid ""
+" char *\n"
+" guestfs_inspect_get_product_variant (guestfs_h *g,\n"
+" const char *root);\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs-actions.pod:2878 ../fish/guestfish-actions.pod:1978
+msgid "This returns the product variant of the inspected operating system."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs-actions.pod:2881 ../fish/guestfish-actions.pod:1981
+msgid ""
+"For Windows guests, this returns the contents of the Registry key C<HKLM"
+"\\Software\\Microsoft\\Windows NT\\CurrentVersion> C<InstallationType> which "
+"is usually a string such as C<Client> or C<Server> (other values are "
+"possible). This can be used to distinguish consumer and enterprise versions "
+"of Windows that have the same version number (for example, Windows 7 and "
+"Windows 2008 Server are both version 6.1, but the former is C<Client> and "
+"the latter is C<Server>)."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs-actions.pod:2890 ../fish/guestfish-actions.pod:1990
+msgid ""
+"For enterprise Linux guests, in future we intend this to return the product "
+"variant such as C<Desktop>, C<Server> and so on. But this is not "
+"implemented at present."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs-actions.pod:2894 ../fish/guestfish-actions.pod:1994
+msgid ""
+"If the product variant could not be determined, then the string C<unknown> "
+"is returned."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs-actions.pod:2897
+msgid ""
+"Please read L<guestfs(3)/INSPECTION> for more details. See also "
+"C<guestfs_inspect_get_product_name>, C<guestfs_inspect_get_major_version>."
+msgstr ""
+