mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-28 19:41:16 +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
|
# util/virpolkit.h
|
||||||
|
virPolkitAgentAvailable;
|
||||||
virPolkitAgentCreate;
|
virPolkitAgentCreate;
|
||||||
virPolkitAgentDestroy;
|
virPolkitAgentDestroy;
|
||||||
virPolkitCheckAuth;
|
virPolkitCheckAuth;
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "virpolkit.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 */
|
#else /* ! WITH_POLKIT */
|
||||||
|
|
||||||
int virPolkitCheckAuth(const char *actionid G_GNUC_UNUSED,
|
int virPolkitCheckAuth(const char *actionid G_GNUC_UNUSED,
|
||||||
@ -247,4 +284,11 @@ virPolkitAgentCreate(void)
|
|||||||
_("polkit text authentication agent unavailable"));
|
_("polkit text authentication agent unavailable"));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
virPolkitAgentAvailable(void)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* WITH_POLKIT */
|
#endif /* WITH_POLKIT */
|
||||||
|
@ -37,3 +37,4 @@ typedef struct _virPolkitAgent virPolkitAgent;
|
|||||||
|
|
||||||
void virPolkitAgentDestroy(virPolkitAgent *cmd);
|
void virPolkitAgentDestroy(virPolkitAgent *cmd);
|
||||||
virPolkitAgent *virPolkitAgentCreate(void);
|
virPolkitAgent *virPolkitAgentCreate(void);
|
||||||
|
bool virPolkitAgentAvailable(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user