diff options
author | Igor Böhm <igor@9lab.org> | 2021-11-29 00:06:45 +0000 |
---|---|---|
committer | Igor Böhm <igor@9lab.org> | 2021-11-29 00:06:45 +0000 |
commit | 614f1d6268fd986fc628eec3754bd4599363ad13 (patch) | |
tree | 0468672e3476e511a7b585f4f47f39cbae5f48bc /sys/src/cmd/rio | |
parent | 5d69d42ee3ac87861b7cf8767cc7755c173e6c2c (diff) |
rio: allow spaces in working directory path (-cd) when creating a new window via wctl
The initial working directory of a new window may be set by a
`-cd directory` option. However, the `-cd directory` option is
not capable of handling paths with spaces when used via wctl.
To enable paths with spaces the function
/sys/src/cmd/rio/wctl.c:/^parsewctl is extended to handle quoted
directory paths.
Before applying the patch the following will fail to open a new
window by writing to /dev/wctl:
<snip>
% rio -i window
% mkdir '/tmp/path with space'
% echo new -cd '''/tmp/path with space''' window -x rc >> /dev/wctl
% pwd
/tmp/path with space
<snap>
The following invocation fails as well:
<snip>
% window -cd '/tmp/path with space'
% pwd
/tmp/path with space
<snap>
After applying the patch the above sequences work as expected,
opening a window running rc with the working directory set to
'/tmp/path with space'.
Diffstat (limited to 'sys/src/cmd/rio')
-rw-r--r-- | sys/src/cmd/rio/wctl.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/sys/src/cmd/rio/wctl.c b/sys/src/cmd/rio/wctl.c index b2de73e86..7a3762646 100644 --- a/sys/src/cmd/rio/wctl.c +++ b/sys/src/cmd/rio/wctl.c @@ -203,7 +203,7 @@ int parsewctl(char **argp, Rectangle r, Rectangle *rp, int *pidp, int *idp, int *hiddenp, int *scrollingp, char **cdp, char *s, char *err) { int cmd, param, xy, sign; - char *t; + char *f[2], *t; *pidp = 0; *hiddenp = 0; @@ -252,10 +252,13 @@ parsewctl(char **argp, Rectangle r, Rectangle *rp, int *pidp, int *idp, int *hid s++; if(param == Cd){ *cdp = s; - while(*s && !isspace(*s)) - s++; - if(*s != '\0') - *s++ = '\0'; + gettokens(*cdp, f, nelem(f), " \t\r\n\v\f"); + s += strlen(*cdp); + if((*cdp)[0] == '\'' && s[-1] == '\''){ + /* drop quotes */ + *cdp += 1; + s[-1] = '\0'; + } continue; } sign = 0; |