Esempio n. 1
0
/* Try to connect to the agent via socket or fork it off and work by
   pipes.  Handle the server's initial greeting.  */
static gpg_error_t
start_agent (void)
{
  gpg_error_t err;

  /* Fixme: This code is not thread safe, thus we don't build it with
     pth.  We will need a context for each thread or serialize the
     access to the agent.  */
  if (agent_ctx)
    return 0;

  err = start_new_gpg_agent (&agent_ctx,
                             agentargs.errsource,
                             agentargs.homedir,
                             agentargs.agent_program,
                             agentargs.lc_ctype,
                             agentargs.lc_messages,
                             agentargs.session_env,
                             1, agentargs.verbosity, 0, NULL, NULL);
  if (!err)
    {
      /* Tell the agent that we support Pinentry notifications.  No
         error checking so that it will work with older agents.  */
      assuan_transact (agent_ctx, "OPTION allow-pinentry-notify",
                       NULL, NULL, NULL, NULL, NULL, NULL);
    }

  return err;
}
Esempio n. 2
0
/* Try to connect to the agent via socket or fork it off and work by
   pipes.  Handle the server's initial greeting */
static int
start_agent (int for_card)
{
    int rc;

    /* Fixme: We need a context for each thread or serialize the access
       to the agent. */
    if (agent_ctx)
        rc = 0;
    else
    {
        rc = start_new_gpg_agent (&agent_ctx,
                                  GPG_ERR_SOURCE_DEFAULT,
                                  opt.homedir,
                                  opt.agent_program,
                                  opt.lc_ctype, opt.lc_messages,
                                  opt.session_env,
                                  opt.verbose, DBG_ASSUAN,
                                  NULL, NULL);
        if (!rc)
        {
            /* Tell the agent that we support Pinentry notifications.
               No error checking so that it will work also with older
               agents.  */
            assuan_transact (agent_ctx, "OPTION allow-pinentry-notify",
                             NULL, NULL, NULL, NULL, NULL, NULL);
        }
    }

    if (!rc && for_card && !did_early_card_test)
    {
        /* Request the serial number of the card for an early test.  */
        struct agent_card_info_s info;

        memset (&info, 0, sizeof info);
        rc = assuan_transact (agent_ctx, "SCD SERIALNO openpgp",
                              NULL, NULL, NULL, NULL,
                              learn_status_cb, &info);
        if (rc)
        {
            switch (gpg_err_code (rc))
            {
            case GPG_ERR_NOT_SUPPORTED:
            case GPG_ERR_NO_SCDAEMON:
                write_status_text (STATUS_CARDCTRL, "6");
                break;
            default:
                write_status_text (STATUS_CARDCTRL, "4");
                log_info ("selecting openpgp failed: %s\n", gpg_strerror (rc));
                break;
            }
        }

        if (!rc && is_status_enabled () && info.serialno)
        {
            char *buf;

            buf = xasprintf ("3 %s", info.serialno);
            write_status_text (STATUS_CARDCTRL, buf);
            xfree (buf);
        }

        agent_release_card_info (&info);

        if (!rc)
            did_early_card_test = 1;
    }


    return rc;
}