Annotation of src/usr.bin/tmux/cmd-set-environment.c, Revision 1.27
1.27 ! nicm 1: /* $OpenBSD: cmd-set-environment.c,v 1.26 2020/09/01 09:19:01 nicm Exp $ */
1.1 nicm 2:
3: /*
1.17 nicm 4: * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
1.1 nicm 5: *
6: * Permission to use, copy, modify, and distribute this software for any
7: * purpose with or without fee is hereby granted, provided that the above
8: * copyright notice and this permission notice appear in all copies.
9: *
10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14: * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15: * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16: * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17: */
18:
19: #include <sys/types.h>
20:
21: #include <stdlib.h>
22: #include <string.h>
23:
24: #include "tmux.h"
25:
26: /*
27: * Set an environment variable.
28: */
29:
1.21 nicm 30: static enum cmd_retval cmd_set_environment_exec(struct cmd *,
31: struct cmdq_item *);
1.1 nicm 32:
33: const struct cmd_entry cmd_set_environment_entry = {
1.14 nicm 34: .name = "set-environment",
35: .alias = "setenv",
36:
1.26 nicm 37: .args = { "Fhgrt:u", 1, 2 },
38: .usage = "[-Fhgru] " CMD_TARGET_SESSION_USAGE " name [value]",
1.14 nicm 39:
1.22 nicm 40: .target = { 't', CMD_FIND_SESSION, CMD_FIND_CANFAIL },
1.15 nicm 41:
1.20 nicm 42: .flags = CMD_AFTERHOOK,
1.14 nicm 43: .exec = cmd_set_environment_exec
1.1 nicm 44: };
45:
1.19 nicm 46: static enum cmd_retval
1.21 nicm 47: cmd_set_environment_exec(struct cmd *self, struct cmdq_item *item)
1.1 nicm 48: {
1.25 nicm 49: struct args *args = cmd_get_args(self);
50: struct cmd_find_state *target = cmdq_get_target(item);
51: struct environ *env;
1.27 ! nicm 52: const char *name = args_string(args, 0), *value;
! 53: const char *tflag;
! 54: char *expanded = NULL;
1.26 nicm 55: enum cmd_retval retval = CMD_RETURN_NORMAL;
1.1 nicm 56:
1.4 nicm 57: if (*name == '\0') {
1.21 nicm 58: cmdq_error(item, "empty variable name");
1.6 nicm 59: return (CMD_RETURN_ERROR);
1.1 nicm 60: }
1.4 nicm 61: if (strchr(name, '=') != NULL) {
1.21 nicm 62: cmdq_error(item, "variable name contains =");
1.6 nicm 63: return (CMD_RETURN_ERROR);
1.1 nicm 64: }
65:
1.27 ! nicm 66: if (args_count(args) < 2)
1.4 nicm 67: value = NULL;
68: else
1.27 ! nicm 69: value = args_string(args, 1);
! 70: if (value != NULL && args_has(args, 'F')) {
! 71: expanded = format_single_from_target(item, value);
! 72: value = expanded;
! 73: }
1.24 nicm 74: if (args_has(args, 'g'))
1.11 nicm 75: env = global_environ;
1.18 nicm 76: else {
1.25 nicm 77: if (target->s == NULL) {
78: tflag = args_get(args, 't');
79: if (tflag != NULL)
80: cmdq_error(item, "no such session: %s", tflag);
1.18 nicm 81: else
1.21 nicm 82: cmdq_error(item, "no current session");
1.26 nicm 83: retval = CMD_RETURN_ERROR;
84: goto out;
1.18 nicm 85: }
1.25 nicm 86: env = target->s->environ;
1.18 nicm 87: }
1.1 nicm 88:
1.24 nicm 89: if (args_has(args, 'u')) {
1.4 nicm 90: if (value != NULL) {
1.21 nicm 91: cmdq_error(item, "can't specify a value with -u");
1.26 nicm 92: retval = CMD_RETURN_ERROR;
93: goto out;
1.1 nicm 94: }
1.4 nicm 95: environ_unset(env, name);
1.24 nicm 96: } else if (args_has(args, 'r')) {
1.4 nicm 97: if (value != NULL) {
1.21 nicm 98: cmdq_error(item, "can't specify a value with -r");
1.26 nicm 99: retval = CMD_RETURN_ERROR;
100: goto out;
1.1 nicm 101: }
1.12 nicm 102: environ_clear(env, name);
1.1 nicm 103: } else {
1.4 nicm 104: if (value == NULL) {
1.21 nicm 105: cmdq_error(item, "no value specified");
1.26 nicm 106: retval = CMD_RETURN_ERROR;
107: goto out;
1.1 nicm 108: }
1.26 nicm 109:
1.23 nicm 110: if (args_has(args, 'h'))
111: environ_set(env, name, ENVIRON_HIDDEN, "%s", value);
112: else
113: environ_set(env, name, 0, "%s", value);
1.1 nicm 114: }
115:
1.26 nicm 116: out:
1.27 ! nicm 117: free(expanded);
1.26 nicm 118: return (retval);
1.1 nicm 119: }