[virt-tools-list] [PATCH rhsrvany] add a tool to wait for PnP installations to complete

Richard W.M. Jones rjones at redhat.com
Fri Aug 12 10:27:33 UTC 2016


On Fri, Aug 12, 2016 at 12:48:52PM +0300, Roman Kagan wrote:
> Windows PnP manager may start driver installations asynchronously upon
> receiving notifications from kernel mode PnP system about discovery of
> new devices.
> 
> Those installations may interact destructively with other
> installation/uninstallation activities, either initiated by a user or
> started from another service.
> 
> Add a tool which can wait until the installations initiated by the PnP
> manager are finished (or the timeout elapses), which allows to serialize
> them with user- or script- initiated ones.
> 
> A foreseen user of this tool is libguestfs/v2v.
> 
> Signed-off-by: Roman Kagan <rkagan at virtuozzo.com>

I've added you as a committer on github.com/rwmjones/rhsrvany (which
given the confusion here I'm not sure is the true upstream, or if it
should be).

Anyway you can commit this if you like.

Perhaps we should make / choose a better upstream for this?

Rich.

>  Makefile.am                         |   2 +-
>  configure.ac                        |   2 +-
>  Makefile.am => pnp_wait/Makefile.am |  14 ++---
>  pnp_wait/pnp_wait.c                 | 109 ++++++++++++++++++++++++++++++++++++
>  4 files changed, 117 insertions(+), 10 deletions(-)
>  copy Makefile.am => pnp_wait/Makefile.am (63%)
>  create mode 100644 pnp_wait/pnp_wait.c
> 
> diff --git a/Makefile.am b/Makefile.am
> index e853ff1..43b68ba 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -21,4 +21,4 @@
>  # the Fedora Windows cross-compiler and invoke 'mingw32-configure'
>  # instead of the normal './configure' command.
>  
> -SUBDIRS = RHSrvAny
> +SUBDIRS = RHSrvAny pnp_wait
> diff --git a/configure.ac b/configure.ac
> index 07cc982..81484a0 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -43,5 +43,5 @@ AC_CHECK_FUNCS([StringCchPrintf])
>  
>  dnl Produce output files.
>  AC_CONFIG_HEADERS([config.h])
> -AC_CONFIG_FILES([Makefile RHSrvAny/Makefile])
> +AC_CONFIG_FILES([Makefile RHSrvAny/Makefile pnp_wait/Makefile])
>  AC_OUTPUT
> diff --git a/Makefile.am b/pnp_wait/Makefile.am
> similarity index 63%
> copy from Makefile.am
> copy to pnp_wait/Makefile.am
> index e853ff1..a9a81b3 100644
> --- a/Makefile.am
> +++ b/pnp_wait/Makefile.am
> @@ -1,6 +1,6 @@
> -# RHSrvAny - Turn any Windows program into a Windows service.
> -# Written by Yuval Kashtan.
> -# Copyright (C) 2010 Red Hat Inc.
> +# pnp_wait - wait for PnP installation activities to complete.
> +# Author: Roman Kagan <rkagan at virtuozzo.com>
> +# Copyright (C) 2016 Parallels IP Holdings GmbH.
>  #
>  # This program is free software; you can redistribute it and/or modify
>  # it under the terms of the GNU General Public License as published by
> @@ -16,9 +16,7 @@
>  # along with this program; if not, write to the Free Software
>  # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
>  
> -# Note that this program only makes sense when cross-compiled as a
> -# Windows program.  Therefore you probably need to use something like
> -# the Fedora Windows cross-compiler and invoke 'mingw32-configure'
> -# instead of the normal './configure' command.
> +bin_PROGRAMS = pnp_wait$(EXEEXT)
>  
> -SUBDIRS = RHSrvAny
> +pnp_wait_SOURCES = pnp_wait.c
> +pnp_wait_LDADD = -lcfgmgr32
> diff --git a/pnp_wait/pnp_wait.c b/pnp_wait/pnp_wait.c
> new file mode 100644
> index 0000000..5e5ed10
> --- /dev/null
> +++ b/pnp_wait/pnp_wait.c
> @@ -0,0 +1,109 @@
> +/* pnp_wait - wait for PnP installation activities to complete.
> + * Author: Roman Kagan <rkagan at virtuozzo.com>
> + * Copyright (C) 2016 Parallels IP Holdings GmbH.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
> + */
> +
> +#include <stdio.h>
> +#include <string.h>
> +#include <time.h>
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <windows.h>
> +#include <cfgmgr32.h>
> +
> +#define RET_SUCCESS	0
> +#define RET_TIMEOUT	1
> +#define RET_ERROR	2
> +
> +static const char *waitres2str(int res)
> +{
> +	switch (res) {
> +	case WAIT_OBJECT_0:
> +		return "done";
> +	case WAIT_TIMEOUT:
> +		return "timed out";
> +	default:
> +		return "error";
> +	}
> +}
> +
> +static int waitres2retcode(int res)
> +{
> +	switch (res) {
> +	case WAIT_OBJECT_0:
> +		return RET_SUCCESS;
> +	case WAIT_TIMEOUT:
> +		return RET_TIMEOUT;
> +	default:
> +		return RET_ERROR;
> +	}
> +}
> +
> +void usage(FILE *fp, const char *cmd)
> +{
> +	fprintf(fp,
> +		"Usage: %s [-h|--help] [TIMEOUT]\n"
> +		"Wait for PnP activities to complete\n"
> +		"\n"
> +		"  -h,--help   show this message\n"
> +		"  TIMEOUT     timeout in ms (default: wait forever)\n"
> +		"\n"
> +		"exit code:\n"
> +		"  %d          %s\n"
> +		"  %d          %s\n"
> +		"  %d          %s\n",
> +		cmd,
> +		waitres2retcode(WAIT_OBJECT_0), waitres2str(WAIT_OBJECT_0),
> +		waitres2retcode(WAIT_TIMEOUT), waitres2str(WAIT_TIMEOUT),
> +		waitres2retcode(WAIT_FAILED), waitres2str(WAIT_FAILED));
> +}
> +
> +int main(int argc, char **argv)
> +{
> +	int ret, i;
> +	time_t t;
> +	unsigned tmo = INFINITE;
> +	const char *prog = argv[0];
> +
> +	for (i = 1; i < argc; i++) {
> +		const char *s = argv[i];
> +		char *e;
> +
> +		if (!strcmp(s, "-h") || !strcmp(s, "--help")) {
> +			usage(stdout, prog);
> +			return RET_SUCCESS;
> +		}
> +
> +		tmo = strtoul(s, &e, 0);
> +		if (*e == '\0' && e != s)
> +			continue;
> +
> +		fprintf(stderr, "failed to parse parameter: \"%s\"\n", s);
> +		usage(stderr, prog);
> +		return RET_ERROR;
> +	}
> +
> +	t = time(NULL);
> +	printf("start waiting for PnP to complete @ %s", ctime(&t));
> +
> +	ret = CMP_WaitNoPendingInstallEvents(tmo);
> +
> +	t = time(NULL);
> +	printf("%s waiting for PnP to complete @ %s", waitres2str(ret),
> +	       ctime(&t));
> +	return waitres2retcode(ret);
> +}
> -- 
> 2.7.4

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
libguestfs lets you edit virtual machines.  Supports shell scripting,
bindings from many languages.  http://libguestfs.org




More information about the virt-tools-list mailing list