提交 d1fd086e 编写于 作者: M Martin Kletzander

util: Introduce virPidFileForceCleanupPath

This function is used to cleanup a pidfile doing whatever it takes, even
killing the owning process.
Signed-off-by: NMartin Kletzander <mkletzan@redhat.com>
上级 55bbc342
......@@ -1816,6 +1816,7 @@ virPidFileBuildPath;
virPidFileConstructPath;
virPidFileDelete;
virPidFileDeletePath;
virPidFileForceCleanupPath;
virPidFileRead;
virPidFileReadIfAlive;
virPidFileReadPath;
......
......@@ -37,6 +37,7 @@
#include "c-ctype.h"
#include "areadlink.h"
#include "virstring.h"
#include "virprocess.h"
#define VIR_FROM_THIS VIR_FROM_NONE
......@@ -567,3 +568,44 @@ virPidFileConstructPath(bool privileged,
VIR_FREE(rundir);
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,
char **pidfile);
int virPidFileForceCleanupPath(const char *path) ATTRIBUTE_NONNULL(1);
#endif /* __VIR_PIDFILE_H__ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册