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=-1.5 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, NICE_REPLY_A,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 22332 invoked from network); 6 Jun 2022 06:44:21 -0000 Received: from 9front.inri.net (168.235.81.73) by inbox.vuxu.org with ESMTPUTF8; 6 Jun 2022 06:44:21 -0000 Received: from mail.posixcafe.org ([45.76.19.58]) by 9front; Mon Jun 6 02:42:26 -0400 2022 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=posixcafe.org; s=20200506; t=1654497742; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qCUqKCUWgWJLAeNdmrb58Wbz7YJ7s6N0NubT4kfneL0=; b=DnGMUeWQndrOWhcO/a8I0ouL9Dp7MNYS5mSvYMkZwMcYJSiyf0NvwgwAHyVlAaMN0MMU5O iDTSdqcXq7nmzT7sK1z0oXQckGzAsOVUqY8gFGnR7sycbBZnBN1j7hXi2mMT05ldJbsruc 1xMtaZqtHjJh8aSNVXFRg4y6EuP/z+M= Received: from [192.168.168.200] (161-97-228-135.lpcnextlight.net [161.97.228.135]) by mail.posixcafe.org (OpenSMTPD) with ESMTPSA id 336de64c (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO) for <9front@9front.org>; Mon, 6 Jun 2022 01:42:21 -0500 (CDT) Message-ID: Date: Mon, 6 Jun 2022 00:41:48 -0600 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.8.1 Content-Language: en-US To: 9front@9front.org References: <59355e7b-9c12-90f8-d4b4-989f1fa30f26@posixcafe.org> From: Jacob Moody In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: singleton rails SVG lifecycle standard API Subject: Re: [9front] Pitch for devskel Reply-To: 9front@9front.org Precedence: bulk nicer version of auth/box --- diff df92301d8fc8310fbfdf3de91b97a156ca0504d4 uncommitted --- /dev/null +++ b//sys/src/cmd/auth/box.c @@ -1,0 +1,197 @@ +#include +#include +#include + +static int debug; +static int mountok; + +void +binderr(char *new, char *old, int flag) +{ + char dash[4] = { '-' }; + + if(debug){ + if(flag & MCREATE){ + dash[2] = 'c'; + flag &= ~MCREATE; + } + switch(flag){ + case MREPL: + dash[0] = ' '; + if(dash[2] == 'c') + dash[1] = '-'; + else + dash[1] = ' '; + break; + case MBEFORE: + dash[1] = 'b'; + break; + case MAFTER: + dash[1] = 'a'; + break; + } + print("bind %s %s %s\n", dash, new, old); + } + if(bind(new, old, flag) < 0) + sysfatal("bind: %r"); +} + +void +resolve(char **names, int nname) +{ + int i; + char buf[8192]; + int fd; + + fd = open(".", OREAD|OCEXEC); + if(fd < 0) + sysfatal("could not open .: %r"); + fd2path(fd, buf, sizeof buf); + for(i = 0; i < nname; i++){ + if(names[i] == nil) + continue; + cleanname(names[i]); + switch(names[i][0]){ + case '#': + case '/': + break; + case '.': + if(names[i][1] == '/') + break; + default: + names[i] = cleanname(smprint("%s/%s", buf, names[i])); + } + } + close(fd); +} + +char* +mimic(char **names, int *flags, int nname) +{ + char *parts[32]; + char devs[128]; + char rootskel[128]; + char src[8192], targ[8192], dir[8192], skel[8192]; + char mode; + char *newroot; + Dir *d; + int i, j, n; + + snprint(rootskel, sizeof rootskel, "#zd/newroot.%d", getpid()); + binderr(rootskel, "/", MBEFORE); + + memset(devs, 0, sizeof devs); + newroot = rootskel + strlen("#zd"); + + for(j = 0; j < nname; j++){ + if(names[j] == nil) + continue; + n = gettokens(strdup(names[j]), parts, nelem(parts), "/"); + snprint(targ, sizeof targ, "%s", newroot); + memset(src, 0, sizeof src); + for(i = 0; i < n; i++){ + snprint(dir, sizeof dir, "%s", targ); + snprint(targ, sizeof targ, "%s/%s", targ, parts[i]); + snprint(src, sizeof src, "%s/%s", src, parts[i]); + d = dirstat(src); + if(d == nil) + continue; + if(d->mode & DMDIR) + mode = 'd'; + else + mode = 'f'; + if(mountok || d->type != L'M') + if(utfrune(devs, d->type) == nil) + snprint(devs, sizeof devs, "%s%C", devs, d->type); + free(d); + snprint(skel, sizeof skel, "#z%c/%s", mode, parts[i]); + binderr(skel, dir, MBEFORE); + } + binderr(names[j], targ, flags[j]); + } + binderr(newroot, "/", MREPL); + return strdup(devs); +} + +void +run(char **a) +{ + exec(a[0], a); + + if(a[0][0] != '/' && a[0][0] != '#' && + (a[0][0] != '.' || (a[0][1] != '/' && + (a[0][1] != '.' || a[0][2] != '/')))) + exec(smprint("/bin/%s", a[0]), a); + + sysfatal("exec: %s: %r", a[0]); +} + +void +usage(void) +{ + fprint(2, "usage %s: [ -DM ] [ -r file ] [ -c dir ] [ -e devs ] cmd args...\n", argv0); + exits("usage"); +} + +void +main(int argc, char **argv) +{ + char devs[1024]; + char *reqdevs; + int dfd; + char *parts[256]; + int mflags[256]; + int nparts; + char *defargv[] = { "/bin/rc", "-i", nil }; + + mountok = 0; + nparts = 0; + memset(devs, 0, sizeof devs); + ARGBEGIN{ + case 'M': + mountok = 1; + snprint(devs, sizeof devs, "%s%c", devs, 'M'); + break; + case 'D': + debug = 1; + break; + case 'r': + parts[nparts] = EARGF(usage()); + mflags[nparts++] = MREPL; + break; + case 'c': + parts[nparts] = EARGF(usage()); + mflags[nparts++] = MCREATE|MREPL; + break; + case 'e': + snprint(devs, sizeof devs, "%s%s", devs, EARGF(usage())); + break; + default: + usage(); + break; + }ARGEND + + rfork(RFNAMEG|RFENVG); + dfd = open("/dev/drivers", OWRITE|OCEXEC); + resolve(parts, nparts); + + if(procsetuser("none") < 0) + sysfatal("cant become none: %r"); + putenv("user", "none"); + + reqdevs = mimic(parts, mflags, nparts); + snprint(devs, sizeof devs, "%s%s", devs, reqdevs); + + if(devs[0] != '\0'){ + if(debug) + print("chdev %s\n", devs); + if(dfd < 0) + sysfatal("could not open /dev/drivers: %r"); + if(fprint(dfd, "chdev & %s", devs) <= 0) + sysfatal("could not write chdev: %r"); + } + + if(argc == 0) + argv = defargv; + run(argv); +} --- a//sys/src/cmd/auth/mkfile +++ b//sys/src/cmd/auth/mkfile @@ -9,6 +9,7 @@ asn1dump\ asn12rsa\ authsrv\ + box\ changeuser\ convkeys\ cron\