mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-25 09:12:24 +00:00
Unix Pageant: prepare to add client-side modes.
I've moved the setup and running of the actual agent server into run_agent(), so that main() is now only command-line parsing and validation. We recognise a collection of new command-line options for talking to an existing agent as a client (analogous to ssh-add), which go to a new run_client() function, but I haven't filled in that function itself yet.
This commit is contained in:
parent
66b5455b13
commit
da944972d8
250
unix/uxpgnt.c
250
unix/uxpgnt.c
@ -239,91 +239,67 @@ static void tty_life_timer(void *ctx, unsigned long now)
|
|||||||
schedule_timer(TTY_LIFE_POLL_INTERVAL, tty_life_timer, &dummy_timer_ctx);
|
schedule_timer(TTY_LIFE_POLL_INTERVAL, tty_life_timer, &dummy_timer_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
typedef enum {
|
||||||
|
KEYACT_AGENT_LOAD,
|
||||||
|
KEYACT_CLIENT_ADD,
|
||||||
|
KEYACT_CLIENT_DEL,
|
||||||
|
KEYACT_CLIENT_DEL_ALL,
|
||||||
|
KEYACT_CLIENT_LIST,
|
||||||
|
KEYACT_CLIENT_LIST_FULL,
|
||||||
|
} keyact;
|
||||||
|
struct cmdline_key_action {
|
||||||
|
struct cmdline_key_action *next;
|
||||||
|
keyact action;
|
||||||
|
const char *filename;
|
||||||
|
};
|
||||||
|
|
||||||
|
int is_agent_action(keyact action)
|
||||||
{
|
{
|
||||||
|
return action == KEYACT_AGENT_LOAD;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cmdline_key_action *keyact_head = NULL, *keyact_tail = NULL;
|
||||||
|
|
||||||
|
void add_keyact(keyact action, const char *filename)
|
||||||
|
{
|
||||||
|
struct cmdline_key_action *a = snew(struct cmdline_key_action);
|
||||||
|
a->action = action;
|
||||||
|
a->filename = filename;
|
||||||
|
a->next = NULL;
|
||||||
|
if (keyact_tail)
|
||||||
|
keyact_tail->next = a;
|
||||||
|
else
|
||||||
|
keyact_head = a;
|
||||||
|
keyact_tail = a;
|
||||||
|
}
|
||||||
|
|
||||||
|
char **exec_args = NULL;
|
||||||
|
enum {
|
||||||
|
LIFE_UNSPEC, LIFE_X11, LIFE_TTY, LIFE_DEBUG, LIFE_PERM, LIFE_EXEC
|
||||||
|
} life = LIFE_UNSPEC;
|
||||||
|
const char *display = NULL;
|
||||||
|
|
||||||
|
void run_client(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "NYI\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void run_agent(void)
|
||||||
|
{
|
||||||
|
const char *err;
|
||||||
|
char *username, *socketdir;
|
||||||
|
struct pageant_listen_state *pl;
|
||||||
|
Socket sock;
|
||||||
|
unsigned long now;
|
||||||
int *fdlist;
|
int *fdlist;
|
||||||
int fd;
|
int fd;
|
||||||
int i, fdcount, fdsize, fdstate;
|
int i, fdcount, fdsize, fdstate;
|
||||||
int errors;
|
|
||||||
unsigned long now;
|
|
||||||
char *username, *socketdir;
|
|
||||||
const char *err;
|
|
||||||
struct pageant_listen_state *pl;
|
|
||||||
Socket sock;
|
|
||||||
enum {
|
|
||||||
LIFE_UNSPEC, LIFE_X11, LIFE_TTY, LIFE_DEBUG, LIFE_PERM, LIFE_EXEC
|
|
||||||
} life = LIFE_UNSPEC;
|
|
||||||
const char *display = NULL;
|
|
||||||
int doing_opts = TRUE;
|
|
||||||
char **exec_args = NULL;
|
|
||||||
int termination_pid = -1;
|
int termination_pid = -1;
|
||||||
Conf *conf;
|
Conf *conf;
|
||||||
|
|
||||||
fdlist = NULL;
|
fdlist = NULL;
|
||||||
fdcount = fdsize = 0;
|
fdcount = fdsize = 0;
|
||||||
errors = FALSE;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Process the command line.
|
|
||||||
*/
|
|
||||||
while (--argc > 0) {
|
|
||||||
char *p = *++argv;
|
|
||||||
if (*p == '-' && doing_opts) {
|
|
||||||
if (!strcmp(p, "-V") || !strcmp(p, "--version")) {
|
|
||||||
version();
|
|
||||||
} else if (!strcmp(p, "--help")) {
|
|
||||||
usage();
|
|
||||||
exit(0);
|
|
||||||
} else if (!strcmp(p, "-v")) {
|
|
||||||
pageant_logfp = stderr;
|
|
||||||
} else if (!strcmp(p, "-X")) {
|
|
||||||
life = LIFE_X11;
|
|
||||||
} else if (!strcmp(p, "-T")) {
|
|
||||||
life = LIFE_TTY;
|
|
||||||
} else if (!strcmp(p, "--debug")) {
|
|
||||||
life = LIFE_DEBUG;
|
|
||||||
} else if (!strcmp(p, "--permanent")) {
|
|
||||||
life = LIFE_PERM;
|
|
||||||
} else if (!strcmp(p, "--exec")) {
|
|
||||||
life = LIFE_EXEC;
|
|
||||||
/* Now all subsequent arguments go to the exec command. */
|
|
||||||
if (--argc > 0) {
|
|
||||||
exec_args = ++argv;
|
|
||||||
argc = 0; /* force end of option processing */
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "pageant: expected a command "
|
|
||||||
"after --exec\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
} else if (!strcmp(p, "--")) {
|
|
||||||
doing_opts = FALSE;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "pageant: unexpected argument '%s'\n", p);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (errors)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (life == LIFE_UNSPEC) {
|
|
||||||
fprintf(stderr, "pageant: expected a lifetime option\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
if (life == LIFE_EXEC && !exec_args) {
|
|
||||||
fprintf(stderr, "pageant: expected a command with --exec\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Block SIGPIPE, so that we'll get EPIPE individually on
|
|
||||||
* particular network connections that go wrong.
|
|
||||||
*/
|
|
||||||
putty_signal(SIGPIPE, SIG_IGN);
|
|
||||||
|
|
||||||
sk_init();
|
|
||||||
uxsel_init();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up a listening socket and run Pageant on it.
|
* Set up a listening socket and run Pageant on it.
|
||||||
@ -581,6 +557,128 @@ int main(int argc, char **argv)
|
|||||||
fprintf(stderr, "pageant: %s: %s\n", socketname, strerror(errno));
|
fprintf(stderr, "pageant: %s: %s\n", socketname, strerror(errno));
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int doing_opts = TRUE;
|
||||||
|
keyact curr_keyact = KEYACT_AGENT_LOAD;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Process the command line.
|
||||||
|
*/
|
||||||
|
while (--argc > 0) {
|
||||||
|
char *p = *++argv;
|
||||||
|
if (*p == '-' && doing_opts) {
|
||||||
|
if (!strcmp(p, "-V") || !strcmp(p, "--version")) {
|
||||||
|
version();
|
||||||
|
} else if (!strcmp(p, "--help")) {
|
||||||
|
usage();
|
||||||
|
exit(0);
|
||||||
|
} else if (!strcmp(p, "-v")) {
|
||||||
|
pageant_logfp = stderr;
|
||||||
|
} else if (!strcmp(p, "-a")) {
|
||||||
|
curr_keyact = KEYACT_CLIENT_ADD;
|
||||||
|
} else if (!strcmp(p, "-d")) {
|
||||||
|
curr_keyact = KEYACT_CLIENT_DEL;
|
||||||
|
} else if (!strcmp(p, "-D")) {
|
||||||
|
add_keyact(KEYACT_CLIENT_DEL_ALL, NULL);
|
||||||
|
} else if (!strcmp(p, "-l")) {
|
||||||
|
add_keyact(KEYACT_CLIENT_LIST, NULL);
|
||||||
|
} else if (!strcmp(p, "-L")) {
|
||||||
|
add_keyact(KEYACT_CLIENT_LIST_FULL, NULL);
|
||||||
|
} else if (!strcmp(p, "-X")) {
|
||||||
|
life = LIFE_X11;
|
||||||
|
} else if (!strcmp(p, "-T")) {
|
||||||
|
life = LIFE_TTY;
|
||||||
|
} else if (!strcmp(p, "--debug")) {
|
||||||
|
life = LIFE_DEBUG;
|
||||||
|
} else if (!strcmp(p, "--permanent")) {
|
||||||
|
life = LIFE_PERM;
|
||||||
|
} else if (!strcmp(p, "--exec")) {
|
||||||
|
life = LIFE_EXEC;
|
||||||
|
/* Now all subsequent arguments go to the exec command. */
|
||||||
|
if (--argc > 0) {
|
||||||
|
exec_args = ++argv;
|
||||||
|
argc = 0; /* force end of option processing */
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "pageant: expected a command "
|
||||||
|
"after --exec\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
} else if (!strcmp(p, "--")) {
|
||||||
|
doing_opts = FALSE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Non-option arguments (apart from those after --exec,
|
||||||
|
* which are treated specially above) are interpreted as
|
||||||
|
* the names of private key files to either add or delete
|
||||||
|
* from an agent.
|
||||||
|
*/
|
||||||
|
add_keyact(curr_keyact, p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (life == LIFE_EXEC && !exec_args) {
|
||||||
|
fprintf(stderr, "pageant: expected a command with --exec\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Block SIGPIPE, so that we'll get EPIPE individually on
|
||||||
|
* particular network connections that go wrong.
|
||||||
|
*/
|
||||||
|
putty_signal(SIGPIPE, SIG_IGN);
|
||||||
|
|
||||||
|
sk_init();
|
||||||
|
uxsel_init();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now distinguish our two main running modes. Either we're
|
||||||
|
* actually starting up an agent, in which case we should have a
|
||||||
|
* lifetime mode, and no key actions of KEYACT_CLIENT_* type; or
|
||||||
|
* else we're contacting an existing agent to add or remove keys,
|
||||||
|
* in which case we should have no lifetime mode, and no key
|
||||||
|
* actions of KEYACT_AGENT_* type.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
int has_agent_actions = FALSE;
|
||||||
|
int has_client_actions = FALSE;
|
||||||
|
int has_lifetime = FALSE;
|
||||||
|
const struct cmdline_key_action *act;
|
||||||
|
|
||||||
|
for (act = keyact_head; act; act = act->next) {
|
||||||
|
if (is_agent_action(act->action))
|
||||||
|
has_agent_actions = TRUE;
|
||||||
|
else
|
||||||
|
has_client_actions = TRUE;
|
||||||
|
}
|
||||||
|
if (life != LIFE_UNSPEC)
|
||||||
|
has_lifetime = TRUE;
|
||||||
|
|
||||||
|
if (has_lifetime && has_client_actions) {
|
||||||
|
fprintf(stderr, "pageant: client key actions (-a, -d, -D, -l, -L)"
|
||||||
|
" do not go with an agent lifetime option\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (!has_lifetime && has_agent_actions) {
|
||||||
|
fprintf(stderr, "pageant: expected an agent lifetime option with"
|
||||||
|
" bare key file arguments\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (!has_lifetime && !has_client_actions) {
|
||||||
|
fprintf(stderr, "pageant: expected an agent lifetime option"
|
||||||
|
" or a client key action\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (has_lifetime) {
|
||||||
|
run_agent();
|
||||||
|
} else if (has_client_actions) {
|
||||||
|
run_client();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user