[...]
> + err = virGetLastError();
> + if (err && strstr(err->message,
> + _("no agent is available to authenticate"))) {
> + if (!pkagent) {
> + if (!(pkagent = virPolkitAgentCreate()))
> + goto cleanup;
> + }
> + agentstart++;
> + } else if (err && strstr(err->message, _("authentication
failed:"))) {
String matching is pretty unpleasant. I think we can match on
err->domain == VIR_FROM_POLKIT && err->code == VIR_ERR_AUTH_FAILED
for this.
Using VIR_ERR_AUTH_FAILED I cannot distinguish between the failure of
available agent or access denied by policy from virPolkitCheckAuth.
Adjusting what virPolkitCheckAuth returns means more code modification
since the assumption is -2 has 3 possible issues of which 2 currently
are tested by a err->message comparison.
I would think in this case, I wouldn't want to create a text agent if
access is denied by policy. So should I bite the bullet and adjust the
return value checking? Or should I add a new error code
"VIR_ERR_AUTH_DENY" and likewise adjust the code/tests to use that
rather than the current string comparisons.
John
Also instead of trying to match for the agent message, you can just
do
if (!virDBusIsServiceRegistered('....polkit service name....'))
to decide whether to then start the agent after an auth failure