static gpg_error_t cmd_getinfo (assuan_context_t ctx, char *line) { int rc = 0; if (!strcmp (line, "version")) { const char *s = VERSION; rc = assuan_send_data (ctx, s, strlen (s)); } else if (!strcmp (line, "pid")) { char numbuf[50]; snprintf (numbuf, sizeof numbuf, "%lu", (unsigned long)getpid ()); rc = assuan_send_data (ctx, numbuf, strlen (numbuf)); } else if (!strcmp (line, "agent-check")) { ctrl_t ctrl = assuan_get_pointer (ctx); rc = gpgsm_agent_send_nop (ctrl); } else if (!strncmp (line, "cmd_has_option", 14) && (line[14] == ' ' || line[14] == '\t' || !line[14])) { char *cmd, *cmdopt; line += 14; while (*line == ' ' || *line == '\t') line++; if (!*line) rc = gpg_error (GPG_ERR_MISSING_VALUE); else { cmd = line; while (*line && (*line != ' ' && *line != '\t')) line++; if (!*line) rc = gpg_error (GPG_ERR_MISSING_VALUE); else { *line++ = 0; while (*line == ' ' || *line == '\t') line++; if (!*line) rc = gpg_error (GPG_ERR_MISSING_VALUE); else { cmdopt = line; if (!command_has_option (cmd, cmdopt)) rc = gpg_error (GPG_ERR_GENERAL); } } } } else rc = set_error (GPG_ERR_ASS_PARAMETER, "unknown value for WHAT"); return rc; }
gboolean gkd_gpg_agent_ops_getinfo (GkdGpgAgentCall *call, gchar *request) { gchar *args; gboolean implemented = FALSE; args = strchr (request, ' '); if (args) { *args = 0; args++; while (isspace (*args)) args++; } if (!strcmp (request, "cmd_has_option")) { gchar *command = args; gchar *option; if (!command || !*command) return gkd_gpg_agent_send_reply (call, FALSE, "105 parameter error"); option = strchr(args, ' '); if (option) { *option = 0; option++; while (isspace (*option)) option++; } else { return gkd_gpg_agent_send_reply (call, FALSE, "105 parameter error"); } implemented = command_has_option (command, option); } /* else if (other info request) */ if (implemented) return gkd_gpg_agent_send_reply (call, TRUE, NULL); else return gkd_gpg_agent_send_reply (call, FALSE, "280 not implemented"); }