util: Introduce virPidFileForceCleanupPath

This function is used to cleanup a pidfile doing whatever it takes, even
killing the owning process.

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
This commit is contained in:
Martin Kletzander 2014-10-12 13:40:36 +02:00
parent 55bbc34218
commit d1fd086eb4
3 changed files with 45 additions and 0 deletions

View File

@ -1816,6 +1816,7 @@ virPidFileBuildPath;
virPidFileConstructPath; virPidFileConstructPath;
virPidFileDelete; virPidFileDelete;
virPidFileDeletePath; virPidFileDeletePath;
virPidFileForceCleanupPath;
virPidFileRead; virPidFileRead;
virPidFileReadIfAlive; virPidFileReadIfAlive;
virPidFileReadPath; virPidFileReadPath;

View File

@ -37,6 +37,7 @@
#include "c-ctype.h" #include "c-ctype.h"
#include "areadlink.h" #include "areadlink.h"
#include "virstring.h" #include "virstring.h"
#include "virprocess.h"
#define VIR_FROM_THIS VIR_FROM_NONE #define VIR_FROM_THIS VIR_FROM_NONE
@ -567,3 +568,44 @@ virPidFileConstructPath(bool privileged,
VIR_FREE(rundir); VIR_FREE(rundir);
return ret; return ret;
} }
/**
* virPidFileForceCleanupPath:
*
* Check if the pidfile is left around and clean it up whatever it
* takes. This doesn't raise an error. This function must not be
* called multiple times with the same path, be it in threads or
* processes. This function does not raise any errors.
*
* Returns 0 if the pidfile was successfully cleaned up, -1 otherwise.
*/
int
virPidFileForceCleanupPath(const char *path)
{
pid_t pid = 0;
int fd = -1;
if (!virFileExists(path))
return 0;
if (virPidFileReadPath(path, &pid) < 0)
return -1;
if (virPidFileAcquirePath(path, false, 0) == 0) {
virPidFileReleasePath(path, fd);
} else {
virResetLastError();
/* Only kill the process if the pid is valid one. 0 means
* there is somebody else doing the same pidfile cleanup
* machinery. */
if (pid)
virProcessKillPainfully(pid, true);
if (virPidFileDeletePath(path) < 0)
return -1;
}
return 0;
}

View File

@ -74,4 +74,6 @@ int virPidFileConstructPath(bool privileged,
const char *progname, const char *progname,
char **pidfile); char **pidfile);
int virPidFileForceCleanupPath(const char *path) ATTRIBUTE_NONNULL(1);
#endif /* __VIR_PIDFILE_H__ */ #endif /* __VIR_PIDFILE_H__ */