mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-10-30 09:53:10 +00:00
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:
parent
55bbc34218
commit
d1fd086eb4
@ -1816,6 +1816,7 @@ virPidFileBuildPath;
|
|||||||
virPidFileConstructPath;
|
virPidFileConstructPath;
|
||||||
virPidFileDelete;
|
virPidFileDelete;
|
||||||
virPidFileDeletePath;
|
virPidFileDeletePath;
|
||||||
|
virPidFileForceCleanupPath;
|
||||||
virPidFileRead;
|
virPidFileRead;
|
||||||
virPidFileReadIfAlive;
|
virPidFileReadIfAlive;
|
||||||
virPidFileReadPath;
|
virPidFileReadPath;
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
@ -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__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user