On Fri, Aug 12, 2011 at 02:10:00PM +0200, Jiri Denemark wrote:
Eh, I forgot to add some more notes...
...
> diff --git a/src/util/virpidfile.c b/src/util/virpidfile.c
> index 25c3272..dc92868 100644
> --- a/src/util/virpidfile.c
> +++ b/src/util/virpidfile.c
> @@ -24,6 +24,7 @@
> #include <config.h>
>
> #include <fcntl.h>
> +#include <signal.h>
>
> #include "virpidfile.h"
> #include "virfile.h"
> @@ -164,6 +165,63 @@ int virPidFileRead(const char *dir,
> }
>
>
> +int virPidFileReadPathIfAlive(const char *path,
> + pid_t *pid,
> + const char *binpath)
> +{
> + int rc;
> + char *procpath = NULL;
> +
> + rc = virPidFileReadPath(path, pid);
> + if (rc < 0)
> + return rc;
> +
> + /* Check that it's still alive */
> + if (kill(*pid, 0) < 0) {
> + *pid = -1;
> + return 0;
> + }
> +
> + if (virAsprintf(&procpath, "/proc/%d/exe", *pid) < 0) {
> + *pid = -1;
> + return 0;
> + }
> +#ifdef __linux__
> + if (virFileLinkPointsTo(procpath, binpath) == 0)
> + *pid = -1;
> +#endif
> + VIR_FREE(procpath);
Indentation.
What's wrong with indentation ??
And anyway, what about implementing the second half of this function
as
follows:
#ifdef __linux__
if (binpath) {
char *procpath = NULL;
if (virAsprintf(&procpath, "/proc/%d/exe", *pid) < 0 ||
!virFileLinkPointsTo(procpath, binpath))
*pid = -1;
VIR_FREE(procpath);
}
#endif
I didn't do that since then 'binpath' will generate an compile
warning about unused parameters on non-linux. The extra alloc
isn't really worth worrying about IMHO.
> +
> + return 0;
> +}
I think we should also document that both *IfAlive functions return -errno if
the pid file cannot be read or doesn't contain integer value. If it contains a
number but such process is not running or doesn't correspond to binpath, the
return value is 0 but pid is -1.
Yep,
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|