Annotation of src/usr.bin/tmux/cmd-set-environment.c, Revision 1.26
1.26 ! nicm 1: /* $OpenBSD: cmd-set-environment.c,v 1.25 2020/04/13 10:59:58 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;
52: const char *name, *value, *tflag;
1.26 ! nicm 53: char *expand = NULL;
! 54: enum cmd_retval retval = CMD_RETURN_NORMAL;
1.1 nicm 55:
1.4 nicm 56: name = args->argv[0];
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.7 okan 66: if (args->argc < 2)
1.4 nicm 67: value = NULL;
1.26 ! nicm 68: else if (args_has(args, 'F'))
! 69: value = expand = format_single_from_target(item, args->argv[1]);
1.4 nicm 70: else
71: value = args->argv[1];
72:
1.24 nicm 73: if (args_has(args, 'g'))
1.11 nicm 74: env = global_environ;
1.18 nicm 75: else {
1.25 nicm 76: if (target->s == NULL) {
77: tflag = args_get(args, 't');
78: if (tflag != NULL)
79: cmdq_error(item, "no such session: %s", tflag);
1.18 nicm 80: else
1.21 nicm 81: cmdq_error(item, "no current session");
1.26 ! nicm 82: retval = CMD_RETURN_ERROR;
! 83: goto out;
1.18 nicm 84: }
1.25 nicm 85: env = target->s->environ;
1.18 nicm 86: }
1.1 nicm 87:
1.24 nicm 88: if (args_has(args, 'u')) {
1.4 nicm 89: if (value != NULL) {
1.21 nicm 90: cmdq_error(item, "can't specify a value with -u");
1.26 ! nicm 91: retval = CMD_RETURN_ERROR;
! 92: goto out;
1.1 nicm 93: }
1.4 nicm 94: environ_unset(env, name);
1.24 nicm 95: } else if (args_has(args, 'r')) {
1.4 nicm 96: if (value != NULL) {
1.21 nicm 97: cmdq_error(item, "can't specify a value with -r");
1.26 ! nicm 98: retval = CMD_RETURN_ERROR;
! 99: goto out;
1.1 nicm 100: }
1.12 nicm 101: environ_clear(env, name);
1.1 nicm 102: } else {
1.4 nicm 103: if (value == NULL) {
1.21 nicm 104: cmdq_error(item, "no value specified");
1.26 ! nicm 105: retval = CMD_RETURN_ERROR;
! 106: goto out;
1.1 nicm 107: }
1.26 ! nicm 108:
1.23 nicm 109: if (args_has(args, 'h'))
110: environ_set(env, name, ENVIRON_HIDDEN, "%s", value);
111: else
112: environ_set(env, name, 0, "%s", value);
1.1 nicm 113: }
114:
1.26 ! nicm 115: out:
! 116: free(expand);
! 117: return (retval);
1.1 nicm 118: }