version 1.9, 2014/10/20 22:29:25 |
version 1.10, 2015/07/13 13:36:29 |
|
|
* Show environment. |
* Show environment. |
*/ |
*/ |
|
|
enum cmd_retval cmd_show_environment_exec(struct cmd *, struct cmd_q *); |
enum cmd_retval cmd_show_environment_exec(struct cmd *, struct cmd_q *); |
|
|
|
char *cmd_show_environment_escape(struct environ_entry *); |
|
void cmd_show_environment_print(struct cmd *, struct cmd_q *, |
|
struct environ_entry *); |
|
|
const struct cmd_entry cmd_show_environment_entry = { |
const struct cmd_entry cmd_show_environment_entry = { |
"show-environment", "showenv", |
"show-environment", "showenv", |
"gt:", 0, 1, |
"gst:", 0, 1, |
"[-g] " CMD_TARGET_SESSION_USAGE " [name]", |
"[-gs] " CMD_TARGET_SESSION_USAGE " [name]", |
0, |
0, |
cmd_show_environment_exec |
cmd_show_environment_exec |
}; |
}; |
|
|
|
char * |
|
cmd_show_environment_escape(struct environ_entry *envent) |
|
{ |
|
const char *value = envent->value; |
|
char c, *out, *ret; |
|
|
|
out = ret = xmalloc(strlen(value) * 2 + 1); /* at most twice the size */ |
|
while ((c = *value++) != '\0') { |
|
/* POSIX interprets $ ` " and \ in double quotes. */ |
|
if (c == '$' || c == '`' || c == '"' || c == '\\') |
|
*out++ = '\\'; |
|
*out++ = c; |
|
} |
|
*out = '\0'; |
|
|
|
return ret; |
|
} |
|
|
|
void |
|
cmd_show_environment_print(struct cmd *self, struct cmd_q *cmdq, |
|
struct environ_entry *envent) |
|
{ |
|
char *escaped; |
|
|
|
if (!args_has(self->args, 's')) { |
|
if (envent->value != NULL) |
|
cmdq_print(cmdq, "%s=%s", envent->name, envent->value); |
|
else |
|
cmdq_print(cmdq, "-%s", envent->name); |
|
return; |
|
} |
|
|
|
if (envent->value != NULL) { |
|
escaped = cmd_show_environment_escape(envent); |
|
cmdq_print(cmdq, "%s=\"%s\"; export %s;", envent->name, escaped, |
|
envent->name); |
|
free(escaped); |
|
} else |
|
cmdq_print(cmdq, "unset %s;", envent->name); |
|
} |
|
|
enum cmd_retval |
enum cmd_retval |
cmd_show_environment_exec(struct cmd *self, struct cmd_q *cmdq) |
cmd_show_environment_exec(struct cmd *self, struct cmd_q *cmdq) |
{ |
{ |
|
|
if (args_has(self->args, 'g')) |
if (args_has(self->args, 'g')) |
env = &global_environ; |
env = &global_environ; |
else { |
else { |
if ((s = cmd_find_session(cmdq, args_get(args, 't'), 0)) == NULL) |
s = cmd_find_session(cmdq, args_get(args, 't'), 0); |
|
if (s == NULL) |
return (CMD_RETURN_ERROR); |
return (CMD_RETURN_ERROR); |
env = &s->environ; |
env = &s->environ; |
} |
} |
|
|
cmdq_error(cmdq, "unknown variable: %s", args->argv[0]); |
cmdq_error(cmdq, "unknown variable: %s", args->argv[0]); |
return (CMD_RETURN_ERROR); |
return (CMD_RETURN_ERROR); |
} |
} |
if (envent->value != NULL) |
cmd_show_environment_print(self, cmdq, envent); |
cmdq_print(cmdq, "%s=%s", envent->name, envent->value); |
|
else |
|
cmdq_print(cmdq, "-%s", envent->name); |
|
return (CMD_RETURN_NORMAL); |
return (CMD_RETURN_NORMAL); |
} |
} |
|
|
RB_FOREACH(envent, environ, env) { |
RB_FOREACH(envent, environ, env) |
if (envent->value != NULL) |
cmd_show_environment_print(self, cmdq, envent); |
cmdq_print(cmdq, "%s=%s", envent->name, envent->value); |
|
else |
|
cmdq_print(cmdq, "-%s", envent->name); |
|
} |
|
|
|
return (CMD_RETURN_NORMAL); |
return (CMD_RETURN_NORMAL); |
} |
} |