commit: b1896f59a59c61a1fccdae99f7fc089be7b526b0
parent 09cb647879b12dd8fee8a220dc2609e55bb0731d
Author: Michael Forney <mforney@mforney.org>
Date: Mon, 4 Nov 2019 21:02:34 -0800
Add standalone rc shell
Diffstat:
10 files changed, 308 insertions(+), 28 deletions(-)
diff --git a/.gitmodules b/.gitmodules
@@ -224,6 +224,10 @@
path = pkg/qbe/src
url = git://c9x.me/qbe.git
ignore = all
+[submodule "pkg/rc/src"]
+ path = pkg/rc/src
+ url = https://github.com/benavento/rc.git
+ ignore = all
[submodule "pkg/samurai/src"]
path = pkg/samurai/src
url = https://github.com/michaelforney/samurai
diff --git a/README.md b/README.md
@@ -73,6 +73,7 @@ up from the following:
* [openssh](http://www.openssh.com/)
* [perp](http://b0llix.net/perp/) (process supervisor)
* [pigz](http://zlib.net/pigz/) (gzip)
+* [rc](https://github.com/benavento/rc)
* [tz](https://www.iana.org/time-zones)
* util-linux (fdisk, losetup)
* [xz](http://tukaani.org/xz/)
diff --git a/pkg/gen.lua b/pkg/gen.lua
@@ -76,6 +76,7 @@ subgen 'pixman'
subgen 'plan9port'
subgen 'python'
subgen 'qbe'
+subgen 'rc'
subgen 'samurai'
subgen 'sbase'
subgen 'sdhcp'
diff --git a/pkg/plan9port/gen.lua b/pkg/plan9port/gen.lua
@@ -354,34 +354,6 @@ lib('libmux.a', 'src/libmux/(io.c mux.c queue.c thread.c)')
-- src/src/libplumb/mkfile:/^OFILES
lib('libplumb.a', 'src/libplumb/(event.c fid.c mesg.c)')
--- src/src/cmd/rc/mkfile:/^OFILES
-yacc('rc/x', '$srcdir/src/cmd/rc/syn.y')
--- remove stdlib.h and string.h includes so that u.h comes first.
-build('grep', '$outdir/rc/syn.c', '$outdir/rc/x.tab.c', {
- expr=[[-F -x -v -e '#include <stdlib.h>' -e '#include <string.h>']],
-})
-exe('bin/rc', [[$outdir/rc/syn.c src/cmd/rc/(
- code.c
- exec.c
- getflags.c
- glob.c
- havefork.c
- here.c
- io.c
- lex.c
- pcmd.c
- pfnc.c
- plan9ish.c
- simple.c
- subr.c
- trap.c
- tree.c
- unixcrap.c
- var.c
-) lib9.a]], {'$outdir/rc/x.tab.h'})
-file('bin/rc', '755', '$outdir/bin/rc')
-file('lib/rcmain', '644', '$srcdir/rcmain')
-
-- src/src/cmd/sam/mkfile:/^OFILES
exe('bin/sam', [[src/cmd/sam/(
sam.c
diff --git a/pkg/rc/gen.lua b/pkg/rc/gen.lua
@@ -0,0 +1,29 @@
+cflags{
+ '-pedantic',
+ '-D PREFIX=',
+}
+
+exe('rc', {
+ 'code.c',
+ 'exec.c',
+ 'getflags.c',
+ 'glob.c',
+ 'here.c',
+ 'io.c',
+ 'lex.c',
+ 'pcmd.c',
+ 'pfnc.c',
+ 'simple.c',
+ 'subr.c',
+ 'trap.c',
+ 'tree.c',
+ 'var.c',
+ 'y.tab.c',
+ 'unix.c',
+ 'havefork.c',
+ 'prompt-null.c',
+})
+file('bin/rc', '755', '$outdir/rc')
+file('lib/rcmain', '644', '$srcdir/rcmain.unix')
+
+fetch 'git'
diff --git a/pkg/rc/patch/0001-Avoid-multiple-definitions-of-global-variables.patch b/pkg/rc/patch/0001-Avoid-multiple-definitions-of-global-variables.patch
@@ -0,0 +1,242 @@
+From 8d15541e85b391c1cd86907089d33f70d7ca0f65 Mon Sep 17 00:00:00 2001
+From: Michael Forney <mforney@mforney.org>
+Date: Mon, 4 Nov 2019 20:50:08 -0800
+Subject: [PATCH] Avoid multiple definitions of global variables
+
+---
+ exec.c | 9 ++++++++-
+ exec.h | 12 ++++++------
+ io.c | 1 +
+ io.h | 2 +-
+ lex.c | 3 +++
+ rc.h | 30 +++++++++++++++---------------
+ simple.c | 2 ++
+ subr.c | 1 +
+ var.c | 1 +
+ 9 files changed, 38 insertions(+), 23 deletions(-)
+
+diff --git a/exec.c b/exec.c
+index 3ad8a0d..268f429 100644
+--- a/exec.c
++++ b/exec.c
+@@ -3,10 +3,17 @@
+ #include "exec.h"
+ #include "io.h"
+ #include "fns.h"
++int mypid;
++thread *runq;
++code *codebuf;
++int ntrap;
++int trap[NSIG];
++int eflagok;
++
+ /*
+ * Start executing the given code at the given pc with the given redirection
+ */
+-char *argv0="rc";
++char *argv0 = "rc";
+
+ void
+ start(code *c, int pc, var *local)
+diff --git a/exec.h b/exec.h
+index 06d2991..ab0bfb4 100644
+--- a/exec.h
++++ b/exec.h
+@@ -56,18 +56,18 @@ struct thread{
+ tree *treenodes; /* tree nodes created by this process */
+ thread *ret; /* who continues when this finishes */
+ };
+-thread *runq;
++extern thread *runq;
+ code *codecopy(code*);
+-code *codebuf; /* compiler output */
+-int ntrap; /* number of outstanding traps */
+-int trap[NSIG]; /* number of outstanding traps per type */
++extern code *codebuf; /* compiler output */
++extern int ntrap; /* number of outstanding traps */
++extern int trap[NSIG]; /* number of outstanding traps per type */
+ struct builtin{
+ char *name;
+ void (*fnc)(void);
+ };
+ extern struct builtin Builtin[];
+-int eflagok; /* kludge flag so that -e doesn't exit in startup */
+-int havefork;
++extern int eflagok; /* kludge flag so that -e doesn't exit in startup */
++extern int havefork;
+
+ void execcd(void), execwhatis(void), execeval(void), execexec(void);
+ int execforkexec(void);
+diff --git a/io.c b/io.c
+index bb8af4a..228ec56 100644
+--- a/io.c
++++ b/io.c
+@@ -3,6 +3,7 @@
+ #include "exec.h"
+ #include "io.h"
+ #include "fns.h"
++io *err;
+ int pfmtnest = 0;
+
+ void
+diff --git a/io.h b/io.h
+index 21cc6b8..68b9e89 100644
+--- a/io.h
++++ b/io.h
+@@ -10,7 +10,7 @@ struct io{
+ int fd;
+ char *bufp, *ebuf, *strp, buf[NBUF];
+ };
+-io *err;
++extern io *err;
+ io *openfd(int), *openstr(void), *opencore(char *, int);
+ int emptybuf(io*);
+ void pchr(io*, int);
+diff --git a/lex.c b/lex.c
+index d2bef32..943112a 100644
+--- a/lex.c
++++ b/lex.c
+@@ -22,6 +22,7 @@ idchr(int c)
+ return c>' ' && !strchr("!\"#$%&'()+,-./:;<=>?@[\\]^`{|}~", c);
+ }
+ int future = EOF;
++char *promptstr;
+ int doprompt = 1;
+ int inquote;
+ int incomm;
+@@ -36,6 +37,7 @@ nextc(void)
+ future = getnext();
+ return future;
+ }
++int lastc;
+ /*
+ * Consume the lookahead character.
+ */
+@@ -131,6 +133,7 @@ nextis(int c)
+ }
+ return 0;
+ }
++char tok[NTOK];
+
+ char*
+ addtok(char *p, int val)
+diff --git a/rc.h b/rc.h
+index 8a6a5bb..cbec275 100644
+--- a/rc.h
++++ b/rc.h
+@@ -53,7 +53,7 @@ tree *mung1(tree*, tree*), *mung2(tree*, tree*, tree*);
+ tree *mung3(tree*, tree*, tree*, tree*), *epimung(tree*, tree*);
+ tree *simplemung(tree*), *heredoc(tree*);
+ void freetree(tree*);
+-tree *cmdtree;
++extern tree *cmdtree;
+ /*
+ * The first word of any code vector is a reference count.
+ * Always create a new reference to a code vector by calling codecopy(.).
+@@ -64,10 +64,10 @@ union code{
+ int i;
+ char *s;
+ };
+-char *promptstr;
+-int doprompt;
++extern char *promptstr;
++extern int doprompt;
+ #define NTOK 8192
+-char tok[NTOK];
++extern char tok[NTOK];
+ #define APPEND 1
+ #define WRITE 2
+ #define READ 3
+@@ -87,7 +87,7 @@ struct var{
+ };
+ var *vlook(char*), *gvlook(char*), *newvar(char*, var*);
+ #define NVAR 521
+-var *gvar[NVAR]; /* hash for globals */
++extern var *gvar[NVAR]; /* hash for globals */
+ #define new(type) ((type *)emalloc(sizeof(type)))
+ void *emalloc(long);
+ void *Malloc(ulong);
+@@ -98,7 +98,7 @@ struct here{
+ char *name;
+ struct here *next;
+ };
+-int mypid;
++extern int mypid;
+ /*
+ * Glob character escape in strings:
+ * In a string, GLOB must be followed by *?[ or GLOB.
+@@ -117,10 +117,10 @@ int mypid;
+ #define threebyte(c) ((c&0xf0)==0xe0)
+ #define fourbyte(c) ((c&0xf8)==0xf0)
+
+-char **argp;
+-char **args;
+-int nerror; /* number of errors encountered during compilation */
+-int doprompt; /* is it time for a prompt? */
++extern char **argp;
++extern char **args;
++extern int nerror; /* number of errors encountered during compilation */
++extern int doprompt; /* is it time for a prompt? */
+ /*
+ * Which fds are the reading/writing end of a pipe?
+ * Unfortunately, this can vary from system to system.
+@@ -129,14 +129,14 @@ int doprompt; /* is it time for a prompt? */
+ */
+ #define PRD 0
+ #define PWR 1
+-char *Rcmain, *Fdprefix;
++extern char *Rcmain, *Fdprefix;
+ #define register
+ /*
+ * How many dot commands have we executed?
+ * Used to ensure that -v flag doesn't print rcmain.
+ */
+-int ndot;
++extern int ndot;
+ char *getstatus(void);
+-int lastc;
+-int lastword;
+-int kidpid;
++extern int lastc;
++extern int lastword;
++extern int kidpid;
+diff --git a/simple.c b/simple.c
+index d587227..7f1ee12 100644
+--- a/simple.c
++++ b/simple.c
+@@ -6,6 +6,8 @@
+ #include "exec.h"
+ #include "io.h"
+ #include "fns.h"
++int ndot;
++
+ /*
+ * Search through the following code to see if we're just going to exit.
+ */
+diff --git a/subr.c b/subr.c
+index a2d8a18..f031be5 100644
+--- a/subr.c
++++ b/subr.c
+@@ -23,6 +23,7 @@ efree(void *p)
+ else pfmt(err, "free 0\n");
+ }
+ extern int lastword, lastdol;
++int nerror;
+
+ void
+ yyerror(char *m)
+diff --git a/var.c b/var.c
+index 2564ba2..b4a3ef5 100644
+--- a/var.c
++++ b/var.c
+@@ -1,6 +1,7 @@
+ #include "rc.h"
+ #include "exec.h"
+ #include "fns.h"
++var *gvar[NVAR];
+
+ int
+ hash(char *s, int n)
+--
+2.24.0
+
diff --git a/pkg/rc/patch/0002-Use-proc-self-fd-0-instead-of-dev-fd-0.patch b/pkg/rc/patch/0002-Use-proc-self-fd-0-instead-of-dev-fd-0.patch
@@ -0,0 +1,28 @@
+From 56359f53946306347ef9bb1f8f3c402adb8f8a5b Mon Sep 17 00:00:00 2001
+From: Michael Forney <mforney@mforney.org>
+Date: Mon, 4 Nov 2019 20:59:30 -0800
+Subject: [PATCH] Use /proc/self/fd/0 instead of /dev/fd/0
+
+---
+ rcmain.unix | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/rcmain.unix b/rcmain.unix
+index 42b3be4..1b5d6d2 100644
+--- a/rcmain.unix
++++ b/rcmain.unix
+@@ -25,9 +25,9 @@ if not if(flag i){
+ if(flag l && test -r $profile) . $profile
+ status=''
+ if(! ~ $#* 0) . $*
+- . -i /dev/fd/0
++ . -i /proc/self/fd/0
+ }
+-if not if(~ $#* 0) . /dev/fd/0
++if not if(~ $#* 0) . /proc/self/fd/0
+ if not{
+ status=''
+ . $*
+--
+2.24.0
+
diff --git a/pkg/rc/src b/pkg/rc/src
@@ -0,0 +1 @@
+Subproject commit 50b729e65d6f250ab9ab72487bd3c3d7c674e1fc
diff --git a/pkg/rc/ver b/pkg/rc/ver
@@ -0,0 +1 @@
+50b729e65d r0
diff --git a/sets.lua b/sets.lua
@@ -19,6 +19,7 @@ return {
'perp',
'pigz',
'plan9port',
+ 'rc',
'samurai',
'sbase',
'sdhcp',