mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-22 04:25:18 +00:00
util: Add virPolkitAgentAvailable
With this function we can decide whether to try running the polkit text agent only if it is available, removing a potential needless error saying that the agent binary does not exist, which is useful especially when running the agent before knowing whether it is going to be needed. Signed-off-by: Martin Kletzander <mkletzan@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
e4ebe391d7
commit
32d100ca5c
@ -3078,6 +3078,7 @@ virPidFileWritePath;
|
||||
|
||||
|
||||
# util/virpolkit.h
|
||||
virPolkitAgentAvailable;
|
||||
virPolkitAgentCreate;
|
||||
virPolkitAgentDestroy;
|
||||
virPolkitCheckAuth;
|
||||
|
@ -20,6 +20,7 @@
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "virpolkit.h"
|
||||
@ -217,6 +218,42 @@ virPolkitAgentCreate(void)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* virPolkitAgentAvailable
|
||||
*
|
||||
* This function does some preliminary checking that the pkttyagent does not
|
||||
* fail starting so that it can be started without waiting for first failed
|
||||
* connection with VIR_ERR_AUTH_UNAVAILABLE.
|
||||
*/
|
||||
bool
|
||||
virPolkitAgentAvailable(void)
|
||||
{
|
||||
const char *termid = ctermid(NULL);
|
||||
VIR_AUTOCLOSE fd = -1;
|
||||
|
||||
if (!virFileIsExecutable(PKTTYAGENT))
|
||||
return false;
|
||||
|
||||
if (!termid)
|
||||
return false;
|
||||
|
||||
/*
|
||||
*The pkttyagent needs to open the controlling terminal.
|
||||
*
|
||||
* Just in case we are running without a ctty make sure this open() does not
|
||||
* change that.
|
||||
*
|
||||
* We could check if our session has a controlling terminal available
|
||||
* instead, but it would require parsing `/proc/self/stat` on Linux, which
|
||||
* is not portable and moreover requires way more work than just open().
|
||||
*/
|
||||
fd = open(termid, O_RDWR | O_NOCTTY);
|
||||
if (fd < 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#else /* ! WITH_POLKIT */
|
||||
|
||||
int virPolkitCheckAuth(const char *actionid G_GNUC_UNUSED,
|
||||
@ -247,4 +284,11 @@ virPolkitAgentCreate(void)
|
||||
_("polkit text authentication agent unavailable"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool
|
||||
virPolkitAgentAvailable(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif /* WITH_POLKIT */
|
||||
|
@ -37,3 +37,4 @@ typedef struct _virPolkitAgent virPolkitAgent;
|
||||
|
||||
void virPolkitAgentDestroy(virPolkitAgent *cmd);
|
||||
virPolkitAgent *virPolkitAgentCreate(void);
|
||||
bool virPolkitAgentAvailable(void);
|
||||
|
Loading…
x
Reference in New Issue
Block a user