summaryrefslogtreecommitdiffstats
path: root/cmd-source-file.c
diff options
context:
space:
mode:
authornicm <nicm>2017-02-14 18:13:05 +0000
committernicm <nicm>2017-02-14 18:13:05 +0000
commite340df2034c04591e3bbdcbcc22af1301cf74b09 (patch)
treed3d92f1bb528ba42eb0ea663f5094d8920c3fdd0 /cmd-source-file.c
parent4c2a78029d0cb307899be42d94d3c255b97fb15f (diff)
Make source-file look for files relative to the client working directory
(like load-buffer and save-buffer), from Chris Pickel. Also break the where-is-this-file code out into its own function for loadb and saveb.
Diffstat (limited to 'cmd-source-file.c')
-rw-r--r--cmd-source-file.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/cmd-source-file.c b/cmd-source-file.c
index dce72c40..a367c7c2 100644
--- a/cmd-source-file.c
+++ b/cmd-source-file.c
@@ -22,6 +22,7 @@
#include <glob.h>
#include <stdlib.h>
#include <string.h>
+#include <vis.h>
#include "tmux.h"
@@ -48,22 +49,35 @@ static enum cmd_retval
cmd_source_file_exec(struct cmd *self, struct cmdq_item *item)
{
struct args *args = self->args;
+ int quiet = args_has(args, 'q');
struct client *c = item->client;
- int quiet;
struct cmdq_item *new_item;
enum cmd_retval retval;
+ char *pattern, *tmp;
+ const char *path = args->argv[0];
glob_t g;
u_int i;
- quiet = args_has(args, 'q');
- if (glob(args->argv[0], 0, NULL, &g) != 0) {
- if (quiet && errno == ENOENT)
- return (CMD_RETURN_NORMAL);
- cmdq_error(item, "%s: %s", args->argv[0], strerror(errno));
- return (CMD_RETURN_ERROR);
+ if (*path == '/')
+ pattern = xstrdup(path);
+ else {
+ utf8_stravis(&tmp, server_client_get_cwd(c), VIS_GLOB);
+ xasprintf(&pattern, "%s/%s", tmp, path);
+ free(tmp);
}
+ log_debug("%s: %s", __func__, pattern);
retval = CMD_RETURN_NORMAL;
+ if (glob(pattern, 0, NULL, &g) != 0) {
+ if (!quiet || errno != ENOENT) {
+ cmdq_error(item, "%s: %s", path, strerror(errno));
+ retval = CMD_RETURN_ERROR;
+ }
+ free(pattern);
+ return (retval);
+ }
+ free(pattern);
+
for (i = 0; i < (u_int)g.gl_pathc; i++) {
if (load_cfg(g.gl_pathv[i], c, item, quiet) != 0)
retval = CMD_RETURN_ERROR;