aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xextra/rc/build33
-rw-r--r--extra/rc/checksums3
-rw-r--r--extra/rc/patches/0001-Avoid-multiple-definitions-of-global-variables.patch242
-rw-r--r--extra/rc/patches/0002-Use-proc-self-fd-0-instead-of-dev-fd-0.patch28
-rw-r--r--extra/rc/sources3
-rw-r--r--extra/rc/version1
6 files changed, 310 insertions, 0 deletions
diff --git a/extra/rc/build b/extra/rc/build
new file mode 100755
index 00000000..caaeb043
--- /dev/null
+++ b/extra/rc/build
@@ -0,0 +1,33 @@
+#!/bin/sh -e
+
+for patch in *.patch; do
+ patch -p1 < "$patch"
+done
+
+# Change the location of rcmain to the /etc directory.
+sed -i 's|/lib/rcmain|/etc/rcmain|;s|PREFIX||' unix.c
+
+mkdir -p "$1/usr/bin"
+"${CC:-cc}" -o "$1/usr/bin/rc" \
+ $CFLAGS -static \
+ 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
+
+install -Dm644 rc.1 "$1/usr/share/man/man1/rc.1"
+install -Dm644 rcmain.unix "$1/etc/rcmain"
diff --git a/extra/rc/checksums b/extra/rc/checksums
new file mode 100644
index 00000000..33c6e215
--- /dev/null
+++ b/extra/rc/checksums
@@ -0,0 +1,3 @@
+97f01ecc496e1130e20c0b49bb259a926c018c3f81336c194d09bdf7d9bd7d95 50b729e65d6f250ab9ab72487bd3c3d7c674e1fc.tar.gz
+32a3ca9f25acf363a981eadf9fc52a522fe68ae1bbe96ac8ad6bc238f8daa6f6 0001-Avoid-multiple-definitions-of-global-variables.patch
+cb560db5fd5c5a5a95113fcf77f736a97449c8b68b9e371c28751bd364b0fa65 0002-Use-proc-self-fd-0-instead-of-dev-fd-0.patch
diff --git a/extra/rc/patches/0001-Avoid-multiple-definitions-of-global-variables.patch b/extra/rc/patches/0001-Avoid-multiple-definitions-of-global-variables.patch
new file mode 100644
index 00000000..d8ca6e98
--- /dev/null
+++ b/extra/rc/patches/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/extra/rc/patches/0002-Use-proc-self-fd-0-instead-of-dev-fd-0.patch b/extra/rc/patches/0002-Use-proc-self-fd-0-instead-of-dev-fd-0.patch
new file mode 100644
index 00000000..20edd9b6
--- /dev/null
+++ b/extra/rc/patches/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/extra/rc/sources b/extra/rc/sources
new file mode 100644
index 00000000..39df9510
--- /dev/null
+++ b/extra/rc/sources
@@ -0,0 +1,3 @@
+https://github.com/benavento/rc/archive/50b729e65d6f250ab9ab72487bd3c3d7c674e1fc.tar.gz
+patches/0001-Avoid-multiple-definitions-of-global-variables.patch
+patches/0002-Use-proc-self-fd-0-instead-of-dev-fd-0.patch
diff --git a/extra/rc/version b/extra/rc/version
new file mode 100644
index 00000000..5aee2628
--- /dev/null
+++ b/extra/rc/version
@@ -0,0 +1 @@
+50b729e65d 1