From: Jacob Moody <moody@mail.posixcafe.org>
To: 9front@9front.org
Subject: Re: [9front] Pitch for devskel
Date: Mon, 6 Jun 2022 00:41:48 -0600 [thread overview]
Message-ID: <d93b5e5c-fd7c-846f-3e53-ea5b465a8e1a@posixcafe.org> (raw)
In-Reply-To: <fbdfdf2e-dd29-cf92-594d-dd18537150b1@posixcafe.org>
nicer version of auth/box
---
diff df92301d8fc8310fbfdf3de91b97a156ca0504d4 uncommitted
--- /dev/null
+++ b//sys/src/cmd/auth/box.c
@@ -1,0 +1,197 @@
+#include <u.h>
+#include <libc.h>
+#include <auth.h>
+
+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\
next prev parent reply other threads:[~2022-06-06 6:44 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-05 0:57 Jacob Moody
2022-06-06 3:16 ` Jacob Moody
2022-06-06 6:41 ` Jacob Moody [this message]
2022-06-06 14:40 ` ori
2022-06-06 15:08 ` Jacob Moody
2022-06-06 15:24 ` ori
2022-06-06 15:31 ` Jacob Moody
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=d93b5e5c-fd7c-846f-3e53-ea5b465a8e1a@posixcafe.org \
--to=moody@mail.posixcafe.org \
--cc=9front@9front.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).