diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/gpg-card.c | 9 | ||||
-rw-r--r-- | tools/gpg-connect-agent.c | 12 |
2 files changed, 20 insertions, 1 deletions
diff --git a/tools/gpg-card.c b/tools/gpg-card.c index 7910a48fe..bf3663924 100644 --- a/tools/gpg-card.c +++ b/tools/gpg-card.c @@ -76,6 +76,7 @@ enum opt_values oNoKeyLookup, oNoHistory, + oChUid, oDummy }; @@ -104,6 +105,7 @@ static gpgrt_opt_t opts[] = { "use --no-key-lookup for \"list\""), ARGPARSE_s_n (oNoHistory,"no-history", "do not use the command history file"), + ARGPARSE_s_s (oChUid, "chuid", "@"), ARGPARSE_end () }; @@ -125,6 +127,8 @@ struct keyinfolabel_s }; typedef struct keyinfolabel_s *keyinfolabel_t; +/* Helper for --chuid. */ +static const char *changeuser; /* Limit of size of data we read from a file for certain commands. */ #define MAX_GET_DATA_FROM_FILE 16384 @@ -235,6 +239,8 @@ parse_arguments (gpgrt_argparse_t *pargs, gpgrt_opt_t *popts) case oNoKeyLookup: opt.no_key_lookup = 1; break; case oNoHistory: opt.no_history = 1; break; + case oChUid: changeuser = pargs->r.ret_str; break; + default: pargs->err = 2; break; } } @@ -279,6 +285,9 @@ main (int argc, char **argv) parse_arguments (&pargs, opts); gpgrt_argparse (NULL, &pargs, NULL); /* Release internal state. */ + if (changeuser && gnupg_chuid (changeuser, 0)) + log_inc_errorcount (); /* Force later termination. */ + if (log_get_errorcount (0)) exit (2); diff --git a/tools/gpg-connect-agent.c b/tools/gpg-connect-agent.c index cde086770..ac0bc89dc 100644 --- a/tools/gpg-connect-agent.c +++ b/tools/gpg-connect-agent.c @@ -71,8 +71,10 @@ enum cmd_and_opt_values oKeyboxd, oUIServer, oNoHistory, - oNoAutostart + oNoAutostart, + oChUid, + oNoop }; @@ -107,6 +109,7 @@ static gpgrt_opt_t opts[] = { ARGPARSE_s_s (oAgentProgram, "agent-program", "@"), ARGPARSE_s_s (oDirmngrProgram, "dirmngr-program", "@"), ARGPARSE_s_s (oKeyboxdProgram, "keyboxd-program", "@"), + ARGPARSE_s_s (oChUid, "chuid", "@"), ARGPARSE_end () }; @@ -1187,6 +1190,9 @@ main (int argc, char **argv) char **cmdline_commands = NULL; char *historyname = NULL; + static const char *changeuser; + + early_system_init (); gnupg_rl_initialize (); gpgrt_set_strusage (my_strusage); @@ -1233,12 +1239,16 @@ main (int argc, char **argv) opt.enable_varsubst = 1; opt.trim_leading_spaces = 1; break; + case oChUid: changeuser = pargs.r.ret_str; break; default: pargs.err = 2; break; } } gpgrt_argparse (NULL, &pargs, NULL); /* Release internal state. */ + if (changeuser && gnupg_chuid (changeuser, 0)) + log_inc_errorcount (); /* Force later termination. */ + if (log_get_errorcount (0)) exit (2); |