From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 14141 invoked from network); 12 Aug 2023 05:50:30 -0000 Received: from 9front.inri.net (168.235.81.73) by inbox.vuxu.org with ESMTPUTF8; 12 Aug 2023 05:50:30 -0000 Received: from mimir.eigenstate.org ([206.124.132.107]) by 9front; Sat Aug 12 01:46:38 -0400 2023 Received: from stockyard (ool-ae2cb074.dyn.optonline.net [174.44.176.116]) by mimir.eigenstate.org (OpenSMTPD) with ESMTPSA id 3f4ad18e (TLSv1.2:ECDHE-RSA-AES256-SHA:256:NO) for <9front@9front.org>; Fri, 11 Aug 2023 22:46:35 -0700 (PDT) Message-ID: <14FD1A161954B653928B89F61F9F7510@eigenstate.org> To: 9front@9front.org Date: Sat, 12 Aug 2023 01:46:33 -0400 From: ori@eigenstate.org In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: private virtual self-signing database Subject: Re: [9front] PATCH walk(1) to (optionally) quote name and path Reply-To: 9front@9front.org Precedence: bulk Quoth Romano : > I'm working with files on a backup drive that have spaces and > quotation marks in their names, using walk(1). I can pipe to sed > s/''''/''''''''''/g and do similarly for other characters requiring > escaping for rc(1), but figured patching walk(1) would be better. generally no objections, though it's usually relatively easy to structure scripts such that there's relatively little that is interpreted by rc; is this for interactive use? > I don't like how I just copied case 'p': the quoting "works", but isn't > as clean as the output for ls(1). I'll need to look at the code to see if there's a way to improve this; regardless, a few comments inline: > But it's better than what happens now, where there's no quoting. > > From: Romano > Date: Sat, 12 Aug 2023 03:18:22 +0000 > Subject: [PATCH] walk: quote name and paths using N and P > > --- > diff deb39a43ae5ed09c7971726cedeb06a9f65ccc6d 2da52094832662c533f60629813dbd5ac805e3ad > --- a/sys/man/1/walk > +++ b/sys/man/1/walk > @@ -81,8 +81,14 @@ > .B n > final path element (name) > .TP > +.B N > +final path element (name), rc (1) quoted when necessary > +.TP > .B p > path > +.TP > +.B P > +path, rc (1) quoted when necessary > .TP > .B q > qid path.version.type (see > --- a/sys/src/cmd/walk.c > +++ b/sys/src/cmd/walk.c > @@ -43,7 +43,7 @@ > void > dofile(char *path, Dir *f, int pathonly) > { > - char *p; > + char *p, *quoted; nitpicking on style; perhaps '*q' instead of '*quoted' > > if( > (f == dotdir) > @@ -60,6 +60,10 @@ > case 'a': Bprint(bout, "%uld", f->atime); break; > case 'm': Bprint(bout, "%uld", f->mtime); break; > case 'n': Bwrite(bout, f->name, strlen(f->name)); break; > + case 'N': > + quoted = quotestrdup(f->name); > + Bwrite(bout, quoted, strlen(quoted)); looks like this leaks 'quoted'; same with all other quotestrdup calls. > + break; > case 'p': > if(path != dotpath) > Bwrite(bout, path, strlen(path)); > @@ -69,6 +73,18 @@ > Bwrite(bout, f->name, strlen(f->name)); > } > break; > + case 'P': this quoting could be done by concating the path and the dotpath, possibly even with libstring. Not sure if it'd be cleaner to dedup the 'p' and 'P' cases or not yet. > + if(path != dotpath) { > + quoted = quotestrdup(path); > + Bwrite(bout, quoted, strlen(quoted)); > + } > + if(! (f->qid.type & QTDIR) && !pathonly){ > + if(path != dotpath) > + Bputc(bout, '/'); > + quoted = quotestrdup(f->name); > + Bwrite(bout, quoted, strlen(quoted)); > + } > + break; > case 'q': Bprint(bout, "%ullx.%uld.%.2uhhx", f->qid.path, f->qid.vers, f->qid.type); break; > case 's': Bprint(bout, "%lld", f->length); break; > case 'x': Bprint(bout, "%M", f->mode); break; > @@ -243,7 +259,7 @@ > if((stfmt = s_reset(stfmt)) == nil) > sysfatal("s_reset: %r"); > s_append(stfmt, EARGF(usage())); > - i = strspn(s_to_c(stfmt), "UGMamnpqsxDT"); > + i = strspn(s_to_c(stfmt), "UGMamnNpPqsxDT"); > if(i != s_len(stfmt)) > sysfatal("bad stfmt: %s", s_to_c(stfmt)); > break; >