From 614f1d6268fd986fc628eec3754bd4599363ad13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20B=C3=B6hm?= Date: Mon, 29 Nov 2021 00:06:45 +0000 Subject: [PATCH] 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: % 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 The following invocation fails as well: % window -cd '/tmp/path with space' % pwd /tmp/path with space 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'. --- rc/bin/window | 2 +- sys/src/cmd/rio/wctl.c | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/rc/bin/window b/rc/bin/window index 06022a127..6f2c5003b 100755 --- a/rc/bin/window +++ b/rc/bin/window @@ -100,6 +100,6 @@ if not { } if(! ~ $#wdir 0) - spec=($spec -cd $wdir) + spec=($spec -cd `{a=$wdir whatis a|sed 's!^a=!!;q'}) echo new $spec $argv0 -x $cmd >>$wctl } 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;