void cmd_set_option_keys(struct cmd_ctx *ctx, struct options *oo, const struct set_option_entry *entry, char *value) { struct options_entry *o; struct keylist *keylist; char *copyvalue, *ptr, *str; int key; if (value == NULL) { ctx->error(ctx, "empty value"); return; } keylist = xmalloc(sizeof *keylist); ARRAY_INIT(keylist); ptr = copyvalue = xstrdup(value); while ((str = strsep(&ptr, ",")) != NULL) { if ((key = key_string_lookup_string(str)) == KEYC_NONE) { xfree(keylist); ctx->error(ctx, "unknown key: %s", str); xfree(copyvalue); return; } ARRAY_ADD(keylist, key); } xfree(copyvalue); o = options_set_data(oo, entry->name, keylist, xfree); ctx->info(ctx, "set option: %s -> %s", o->name, cmd_set_option_print(entry, o)); }
/* Set a keys option. */ struct options_entry * cmd_set_option_keys(struct cmd *self, struct cmd_ctx *ctx, const struct options_table_entry *oe, struct options *oo) { struct cmd_target_data *data = self->data; struct keylist *keylist; char *copy, *ptr, *s; int key; keylist = xmalloc(sizeof *keylist); ARRAY_INIT(keylist); ptr = copy = xstrdup(data->arg2); while ((s = strsep(&ptr, ",")) != NULL) { if ((key = key_string_lookup_string(s)) == KEYC_NONE) { ctx->error(ctx, "unknown key: %s", s); xfree(copy); xfree(keylist); return (NULL); } ARRAY_ADD(keylist, key); } xfree(copy); return (options_set_data(oo, oe->name, keylist, xfree)); }
int main(int argc, char **argv) { struct passwd *pw; struct keylist *keylist; char *s, *path, *label, *home, **var; int opt, flags, quiet, keys; #if defined(DEBUG) && defined(__OpenBSD__) malloc_options = (char *) "AFGJPX"; #endif quiet = flags = 0; label = path = NULL; login_shell = (**argv == '-'); while ((opt = getopt(argc, argv, "28c:df:lL:qS:uUvV")) != -1) { switch (opt) { case '2': flags |= IDENTIFY_256COLOURS; flags &= ~IDENTIFY_88COLOURS; break; case '8': flags |= IDENTIFY_88COLOURS; flags &= ~IDENTIFY_256COLOURS; break; case 'c': if (shell_cmd != NULL) xfree(shell_cmd); shell_cmd = xstrdup(optarg); break; case 'V': printf("%s %s\n", __progname, VERSION); exit(0); case 'f': if (cfg_file != NULL) xfree(cfg_file); cfg_file = xstrdup(optarg); break; case 'l': login_shell = 1; break; case 'L': if (label != NULL) xfree(label); label = xstrdup(optarg); break; case 'q': quiet = 1; break; case 'S': if (path != NULL) xfree(path); path = xstrdup(optarg); break; case 'u': flags |= IDENTIFY_UTF8; break; case 'v': debug_level++; break; default: usage(); } } argc -= optind; argv += optind; if (shell_cmd != NULL && argc != 0) usage(); log_open_tty(debug_level); if (!(flags & IDENTIFY_UTF8)) { /* * If the user has set whichever of LC_ALL, LC_CTYPE or LANG * exist (in that order) to contain UTF-8, it is a safe * assumption that either they are using a UTF-8 terminal, or * if not they know that output from UTF-8-capable programs may * be wrong. */ if ((s = getenv("LC_ALL")) == NULL) { if ((s = getenv("LC_CTYPE")) == NULL) s = getenv("LANG"); } if (s != NULL && (strcasestr(s, "UTF-8") != NULL || strcasestr(s, "UTF8") != NULL)) flags |= IDENTIFY_UTF8; } environ_init(&global_environ); for (var = environ; *var != NULL; var++) environ_put(&global_environ, *var); options_init(&global_options, NULL); options_table_populate_tree(server_options_table, &global_options); options_set_number(&global_options, "quiet", quiet); options_init(&global_s_options, NULL); options_table_populate_tree(session_options_table, &global_s_options); options_set_string(&global_s_options, "default-shell", "%s", getshell()); options_init(&global_w_options, NULL); options_table_populate_tree(window_options_table, &global_w_options); /* Set the prefix option (its a list, so not in the table). */ keylist = xmalloc(sizeof *keylist); ARRAY_INIT(keylist); ARRAY_ADD(keylist, '\002'); options_set_data(&global_s_options, "prefix", keylist, xfree); /* Enable UTF-8 if the first client is on UTF-8 terminal. */ if (flags & IDENTIFY_UTF8) { options_set_number(&global_s_options, "status-utf8", 1); options_set_number(&global_s_options, "mouse-utf8", 1); options_set_number(&global_w_options, "utf8", 1); } /* Override keys to vi if VISUAL or EDITOR are set. */ if ((s = getenv("VISUAL")) != NULL || (s = getenv("EDITOR")) != NULL) { if (strrchr(s, '/') != NULL) s = strrchr(s, '/') + 1; if (strstr(s, "vi") != NULL) keys = MODEKEY_VI; else keys = MODEKEY_EMACS; options_set_number(&global_s_options, "status-keys", keys); options_set_number(&global_w_options, "mode-keys", keys); } /* Locate the configuration file. */ if (cfg_file == NULL) { home = getenv("HOME"); if (home == NULL || *home == '\0') { pw = getpwuid(getuid()); if (pw != NULL) home = pw->pw_dir; } xasprintf(&cfg_file, "%s/%s", home, DEFAULT_CFG); if (access(cfg_file, R_OK) != 0 && errno == ENOENT) { xfree(cfg_file); cfg_file = NULL; } } /* * Figure out the socket path. If specified on the command-line with -S * or -L, use it, otherwise try $TMUX or assume -L default. */ parseenvironment(); if (path == NULL) { /* If no -L, use the environment. */ if (label == NULL) { if (environ_path != NULL) path = xstrdup(environ_path); else label = xstrdup("default"); } /* -L or default set. */ if (label != NULL) { if ((path = makesocketpath(label)) == NULL) { log_warn("can't create socket"); exit(1); } } } if (label != NULL) xfree(label); if (realpath(path, socket_path) == NULL) strlcpy(socket_path, path, sizeof socket_path); xfree(path); #ifdef HAVE_SETPROCTITLE /* Set process title. */ setproctitle("%s (%s)", __progname, socket_path); #endif /* Pass control to the client. */ ev_base = osdep_event_init(); exit(client_main(argc, argv, flags)); }