cmd-source-file.c revision 1.1.1.5.2.1 1 /* $OpenBSD$ */
2
3 /*
4 * Copyright (c) 2008 Tiago Cunha <me (at) tiagocunha.org>
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 <errno.h>
22 #include <glob.h>
23 #include <stdlib.h>
24 #include <string.h>
25
26 #include "tmux.h"
27
28 /*
29 * Sources a configuration file.
30 */
31
32 static enum cmd_retval cmd_source_file_exec(struct cmd *, struct cmdq_item *);
33
34 static enum cmd_retval cmd_source_file_done(struct cmdq_item *, void *);
35
36 const struct cmd_entry cmd_source_file_entry = {
37 .name = "source-file",
38 .alias = "source",
39
40 .args = { "q", 1, 1 },
41 .usage = "[-q] path",
42
43 .flags = 0,
44 .exec = cmd_source_file_exec
45 };
46
47 static enum cmd_retval
48 cmd_source_file_exec(struct cmd *self, struct cmdq_item *item)
49 {
50 struct args *args = self->args;
51 int quiet = args_has(args, 'q');
52 struct client *c = item->client;
53 struct cmdq_item *new_item;
54 enum cmd_retval retval;
55 char *pattern, *tmp;
56 const char *path = args->argv[0];
57 glob_t g;
58 u_int i;
59
60 if (*path == '/')
61 pattern = xstrdup(path);
62 else {
63 utf8_stravis(&tmp, server_client_get_cwd(c), VIS_GLOB);
64 xasprintf(&pattern, "%s/%s", tmp, path);
65 free(tmp);
66 }
67 log_debug("%s: %s", __func__, pattern);
68
69 retval = CMD_RETURN_NORMAL;
70 if (glob(pattern, 0, NULL, &g) != 0) {
71 if (!quiet || errno != ENOENT) {
72 cmdq_error(item, "%s: %s", path, strerror(errno));
73 retval = CMD_RETURN_ERROR;
74 }
75 free(pattern);
76 return (retval);
77 }
78 free(pattern);
79
80 for (i = 0; i < (u_int)g.gl_pathc; i++) {
81 if (load_cfg(g.gl_pathv[i], c, item, quiet) < 0)
82 retval = CMD_RETURN_ERROR;
83 }
84 if (cfg_finished) {
85 new_item = cmdq_get_callback(cmd_source_file_done, NULL);
86 cmdq_insert_after(item, new_item);
87 }
88
89 globfree(&g);
90 return (retval);
91 }
92
93 static enum cmd_retval
94 cmd_source_file_done(struct cmdq_item *item, __unused void *data)
95 {
96 cfg_print_causes(item);
97 return (CMD_RETURN_NORMAL);
98 }
99