[PATCH 16/16] runopts: Re-introduce the `get_user_name()' function from `scp' development
Michael Witten
mfwitten at gmail.com
Tue Dec 8 07:03:01 AWST 2015
Date: Sun, 8 Nov 2015 04:15:38 -0000
The command `scp' originally handled user name parsing on its own, including
the retrieval of the current user's name when no user name is specified.
The `get_user_name()' function was developed to retrieve the current user's
name lazily (on demand), so as not to waste cycles when a user name is
*explicitly* specified. Furthermore, there was a warning message (actually,
a fatal error message) produced when it was impossible to retrieve the
current user's name; this message was eventually stripped out because it was
relatively useless and takes up space.
Ultimately, though, all of the `[user@]host' parsing machinery was ripped
out of `scp', because it is already handled by `dropbear/dbclient'. However,
as it turns out, this centralized machinery could also benefit from the same
changes that were made for `scp'; hence, this commit re-introduces the
`get_user_name()' function (albeit for use by `dropbear/dbclient' instead),
including the removal of the relatively useless warning message.
This function has been added to `cli-runopts.c', because the current user's
name represents part of the invocation context (i.e., part of the runtime
options); by including the declaration in `runopts.h', it automatically
becomes visible where it is needed.
---
cli-main.c | 2 +-
cli-runopts.c | 32 ++++++++++++--------------------
common-session.c | 1 +
runopts.h | 2 +-
4 files changed, 15 insertions(+), 22 deletions(-)
diff --git a/cli-main.c b/cli-main.c
index c7c9035..a811312 100644
--- a/cli-main.c
+++ b/cli-main.c
@@ -135,7 +135,7 @@ static void exec_proxy_cmd(void *user_data_cmd) {
static void cli_proxy_cmd(int *sock_in, int *sock_out) {
int ret;
- fill_passwd(cli_opts.own_user);
+ fill_passwd(get_user_name());
ret = spawn_command(exec_proxy_cmd, cli_opts.proxycmd,
sock_out, sock_in, NULL, NULL);
diff --git a/cli-runopts.c b/cli-runopts.c
index c4cd12c..34cad00 100644
--- a/cli-runopts.c
+++ b/cli-runopts.c
@@ -36,7 +36,6 @@ cli_runopts cli_opts; /* GLOBAL */
static void printhelp();
static void parse_hostname(const char* orighostarg);
static void parse_multihop_hostname(const char* orighostarg, const char* argv0);
-static void fill_own_user();
#ifdef ENABLE_CLI_PUBKEY_AUTH
static void loadidentityfile(const char* filename, int warnfail);
#endif
@@ -102,6 +101,17 @@ static void printhelp() {
}
+const char *get_user_name() {
+ static const char *user_name = NULL;
+
+ if (user_name == NULL) {
+ struct passwd *pwd = getpwuid(getuid());
+ user_name = pwd ? m_strdup(pwd->pw_name) : "unknown";
+ }
+
+ return user_name;
+}
+
void cli_getopts(int argc, char ** argv) {
unsigned int i, j;
char ** next = 0;
@@ -175,8 +185,6 @@ void cli_getopts(int argc, char ** argv) {
opts.keepalive_secs = DEFAULT_KEEPALIVE;
opts.idle_timeout_secs = DEFAULT_IDLE_TIMEOUT;
- fill_own_user();
-
for (i = 1; i < (unsigned int)argc; i++) {
/* Handle non-flag arguments such as hostname or commands for the remote host */
if (argv[i][0] != '-')
@@ -640,7 +648,7 @@ static void parse_hostname(const char* orighostarg) {
}
if (cli_opts.username == NULL) {
- cli_opts.username = m_strdup(cli_opts.own_user);
+ cli_opts.username = m_strdup(get_user_name());
}
port = strchr(cli_opts.remotehost, '^');
@@ -695,22 +703,6 @@ fail:
}
#endif
-static void fill_own_user() {
- uid_t uid;
- struct passwd *pw = NULL;
-
- uid = getuid();
-
- pw = getpwuid(uid);
- if (pw && pw->pw_name != NULL) {
- cli_opts.own_user = m_strdup(pw->pw_name);
- } else {
- dropbear_log(LOG_INFO, "Warning: failed to identify current user. Trying anyway.");
- cli_opts.own_user = "unknown";
- }
-
-}
-
#ifdef ENABLE_CLI_ANYTCPFWD
/* Turn a "[listenaddr:]listenport:remoteaddr:remoteport" string into into a forwarding
* set, and add it to the forwarding list */
diff --git a/common-session.c b/common-session.c
index 874d539..dd818b2 100644
--- a/common-session.c
+++ b/common-session.c
@@ -581,6 +581,7 @@ const char* get_user_shell() {
return ses.authstate.pw_shell;
}
}
+
void fill_passwd(const char* username) {
struct passwd *pw = NULL;
if (ses.authstate.pw_name)
diff --git a/runopts.h b/runopts.h
index 0a97937..654d6d4 100644
--- a/runopts.h
+++ b/runopts.h
@@ -127,7 +127,6 @@ typedef struct cli_runopts {
char *remotehost;
char *remoteport;
- const char *own_user;
char *username;
char *cmd;
@@ -165,6 +164,7 @@ typedef struct cli_runopts {
extern cli_runopts cli_opts;
void cli_getopts(int argc, char ** argv);
+const char *get_user_name();
#ifdef ENABLE_USER_ALGO_LIST
void parse_ciphers_macs();
More information about the Dropbear
mailing list