mirror of
git://git.gnupg.org/gnupg.git
synced 2024-12-22 10:19:57 +01:00
card: New commands "gpg" and "gpgsm".
* tools/gpg-card.c: Include exechelp.h (cmd_gpg): New. (enum cmdids): Add cmdGPG and cmdGPGSM. (cmds): Add commands "gpg" and "gpgsm" (dispatch_command, interactive_loop): Call them. -- It is too cumbersome to leave the gpg-card shell just for running a quick gpg or gpgsm command. Thus we add these new commands. Take care: As of now we don't have proper shell-quoting rules implemented. This will eventually be done.
This commit is contained in:
parent
f3198f9d70
commit
9c4691c73e
@ -1,5 +1,5 @@
|
|||||||
/* gpg-card.c - An interactive tool to work with cards.
|
/* gpg-card.c - An interactive tool to work with cards.
|
||||||
* Copyright (C) 2019, 2020, 2021 g10 Code GmbH
|
* Copyright (C) 2019--2022 g10 Code GmbH
|
||||||
*
|
*
|
||||||
* This file is part of GnuPG.
|
* This file is part of GnuPG.
|
||||||
*
|
*
|
||||||
@ -39,6 +39,7 @@
|
|||||||
#include "../common/userids.h"
|
#include "../common/userids.h"
|
||||||
#include "../common/ccparray.h"
|
#include "../common/ccparray.h"
|
||||||
#include "../common/exectool.h"
|
#include "../common/exectool.h"
|
||||||
|
#include "../common/exechelp.h"
|
||||||
#include "../common/ttyio.h"
|
#include "../common/ttyio.h"
|
||||||
#include "../common/server-help.h"
|
#include "../common/server-help.h"
|
||||||
#include "../common/openpgpdefs.h"
|
#include "../common/openpgpdefs.h"
|
||||||
@ -3633,6 +3634,60 @@ cmd_apdu (card_info_t info, char *argstr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static gpg_error_t
|
||||||
|
cmd_gpg (card_info_t info, char *argstr, int use_gpgsm)
|
||||||
|
{
|
||||||
|
gpg_error_t err;
|
||||||
|
char **argarray;
|
||||||
|
ccparray_t ccp;
|
||||||
|
const char **argv = NULL;
|
||||||
|
pid_t pid;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!info)
|
||||||
|
return print_help
|
||||||
|
("GPG[SM] <commands_and_options>\n"
|
||||||
|
"\n"
|
||||||
|
"Run gpg/gpgsm directly from this shell.\n",
|
||||||
|
0);
|
||||||
|
|
||||||
|
/* Fixme: We need to write and use a version of strtokenize which
|
||||||
|
* takes care of shell-style quoting. */
|
||||||
|
argarray = strtokenize (argstr, " \t\n\v");
|
||||||
|
if (!argarray)
|
||||||
|
{
|
||||||
|
err = gpg_error_from_syserror ();
|
||||||
|
goto leave;
|
||||||
|
}
|
||||||
|
ccparray_init (&ccp, 0);
|
||||||
|
for (i=0; argarray[i]; i++)
|
||||||
|
ccparray_put (&ccp, argarray[i]);
|
||||||
|
argv = ccparray_get (&ccp, NULL);
|
||||||
|
if (!argv)
|
||||||
|
{
|
||||||
|
err = gpg_error_from_syserror ();
|
||||||
|
goto leave;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gnupg_spawn_process (use_gpgsm? opt.gpgsm_program:opt.gpg_program,
|
||||||
|
argv, NULL, (GNUPG_SPAWN_KEEP_STDOUT
|
||||||
|
|GNUPG_SPAWN_KEEP_STDERR),
|
||||||
|
NULL, NULL, NULL, &pid);
|
||||||
|
if (!err)
|
||||||
|
{
|
||||||
|
err = gnupg_wait_process (use_gpgsm? opt.gpgsm_program:opt.gpg_program,
|
||||||
|
pid, 1, NULL);
|
||||||
|
gnupg_release_process (pid);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
leave:
|
||||||
|
xfree (argv);
|
||||||
|
xfree (argarray);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static gpg_error_t
|
static gpg_error_t
|
||||||
cmd_history (card_info_t info, char *argstr)
|
cmd_history (card_info_t info, char *argstr)
|
||||||
{
|
{
|
||||||
@ -3670,7 +3725,7 @@ enum cmdids
|
|||||||
cmdNAME, cmdURL, cmdFETCH, cmdLOGIN, cmdLANG, cmdSALUT, cmdCAFPR,
|
cmdNAME, cmdURL, cmdFETCH, cmdLOGIN, cmdLANG, cmdSALUT, cmdCAFPR,
|
||||||
cmdFORCESIG, cmdGENERATE, cmdPASSWD, cmdPRIVATEDO, cmdWRITECERT,
|
cmdFORCESIG, cmdGENERATE, cmdPASSWD, cmdPRIVATEDO, cmdWRITECERT,
|
||||||
cmdREADCERT, cmdWRITEKEY, cmdUNBLOCK, cmdFACTRST, cmdKDFSETUP,
|
cmdREADCERT, cmdWRITEKEY, cmdUNBLOCK, cmdFACTRST, cmdKDFSETUP,
|
||||||
cmdUIF, cmdAUTH, cmdYUBIKEY, cmdAPDU, cmdHISTORY,
|
cmdUIF, cmdAUTH, cmdYUBIKEY, cmdAPDU, cmdGPG, cmdGPGSM, cmdHISTORY,
|
||||||
cmdINVCMD
|
cmdINVCMD
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -3711,6 +3766,8 @@ static struct
|
|||||||
{ "writecert", cmdWRITECERT, N_("store a certificate to a data object")},
|
{ "writecert", cmdWRITECERT, N_("store a certificate to a data object")},
|
||||||
{ "writekey", cmdWRITEKEY, N_("store a private key to a data object")},
|
{ "writekey", cmdWRITEKEY, N_("store a private key to a data object")},
|
||||||
{ "yubikey", cmdYUBIKEY, N_("Yubikey management commands")},
|
{ "yubikey", cmdYUBIKEY, N_("Yubikey management commands")},
|
||||||
|
{ "gpg", cmdGPG, NULL},
|
||||||
|
{ "gpgsm", cmdGPGSM, NULL},
|
||||||
{ "apdu", cmdAPDU, NULL},
|
{ "apdu", cmdAPDU, NULL},
|
||||||
{ "history", cmdHISTORY, N_("manage the command history")},
|
{ "history", cmdHISTORY, N_("manage the command history")},
|
||||||
{ NULL, cmdINVCMD, NULL }
|
{ NULL, cmdINVCMD, NULL }
|
||||||
@ -3841,6 +3898,8 @@ dispatch_command (card_info_t info, const char *orig_command)
|
|||||||
case cmdUIF: err = cmd_uif (info, argstr); break;
|
case cmdUIF: err = cmd_uif (info, argstr); break;
|
||||||
case cmdYUBIKEY: err = cmd_yubikey (info, argstr); break;
|
case cmdYUBIKEY: err = cmd_yubikey (info, argstr); break;
|
||||||
case cmdAPDU: err = cmd_apdu (info, argstr); break;
|
case cmdAPDU: err = cmd_apdu (info, argstr); break;
|
||||||
|
case cmdGPG: err = cmd_gpg (info, argstr, 0); break;
|
||||||
|
case cmdGPGSM: err = cmd_gpg (info, argstr, 1); break;
|
||||||
case cmdHISTORY: err = 0; break; /* Only used in interactive mode. */
|
case cmdHISTORY: err = 0; break; /* Only used in interactive mode. */
|
||||||
|
|
||||||
case cmdINVCMD:
|
case cmdINVCMD:
|
||||||
@ -4098,6 +4157,8 @@ interactive_loop (void)
|
|||||||
case cmdUIF: err = cmd_uif (info, argstr); break;
|
case cmdUIF: err = cmd_uif (info, argstr); break;
|
||||||
case cmdYUBIKEY: err = cmd_yubikey (info, argstr); break;
|
case cmdYUBIKEY: err = cmd_yubikey (info, argstr); break;
|
||||||
case cmdAPDU: err = cmd_apdu (info, argstr); break;
|
case cmdAPDU: err = cmd_apdu (info, argstr); break;
|
||||||
|
case cmdGPG: err = cmd_gpg (info, argstr, 0); break;
|
||||||
|
case cmdGPGSM: err = cmd_gpg (info, argstr, 1); break;
|
||||||
case cmdHISTORY: err = cmd_history (info, argstr); break;
|
case cmdHISTORY: err = cmd_history (info, argstr); break;
|
||||||
|
|
||||||
case cmdINVCMD:
|
case cmdINVCMD:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user