Commit: de0c1b311884c98218974ec214f8d50bf3779ece
Parent: fe72fcbcee13d1f48ec1d70105ab974c60780724
Author: hovercats
Date: Sat, 25 Apr 2026 20:04:41 +0200
rc: port conversion of $PATH to $path from benavento/rc
this makes rc inherit the value of $PATH and keep it sync with $path
Diffstat:
2 files changed, 194 insertions(+), 1 deletion(-)
diff --git a/pkg/rc/patch/0004-keep-PATH-and-path-in-sync.patch b/pkg/rc/patch/0004-keep-PATH-and-path-in-sync.patch
@@ -0,0 +1,193 @@
+From 4a4ebe30b0b2a46027451bc8b86459961f30bbd1 Mon Sep 17 00:00:00 2001
+From: hovercats <hovercatswithlasereyes@protonmail.com>
+Date: Sat, 25 Apr 2026 16:54:31 +0200
+Subject: [PATCH] keep $PATH and $path in sync
+
+---
+ exec.c | 12 ++++----
+ fns.h | 1 +
+ rc.h | 1 +
+ var.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
+ 4 files changed, 99 insertions(+), 8 deletions(-)
+
+diff --git a/exec.c b/exec.c
+index e499d9f..ba11796 100644
+--- a/exec.c
++++ b/exec.c
+@@ -244,6 +244,7 @@ main(int argc, char *argv[])
+ Trapinit();
+ Vinit();
+ inttoascii(num, mypid = getpid());
++ pathinit();
+ setvar("pid", newword(num, (word *)0));
+ setvar("cflag", flag['c']?newword(flag['c'][0], (word *)0)
+ :(word *)0);
+@@ -737,16 +738,15 @@ void
+ Xassign(void)
+ {
+ var *v;
++ word *w;
+
+- if(count(runq->argv->words)!=1){
++ w = Poplist();
++ if(count(w)!=1){
+ Xerror1("= variable name not singleton!");
+ return;
+ }
+- v = vlook(runq->argv->words->word);
+- poplist();
+- freewords(v->val);
+- v->val = Poplist();
+- v->changed = 1;
++ setvar(w->word, Poplist());
++ freewords(w);
+ }
+
+ /*
+diff --git a/fns.h b/fns.h
+index 1644d1e..a99f6fa 100644
+--- a/fns.h
++++ b/fns.h
+@@ -49,6 +49,7 @@ int mapfd(int);
+ int match(char*, char*, int);
+ char* makepath(char*, char*);
+ void panic(char*, int);
++void pathinit(void);
+ void pfln(io*, char*, int);
+ void poplist(void);
+ void popword(void);
+diff --git a/rc.h b/rc.h
+index a688663..3f48cce 100644
+--- a/rc.h
++++ b/rc.h
+@@ -117,6 +117,7 @@ struct var{
+ int pc; /* pc of start of function */
+ char fnchanged;
+ char changed;
++ void (*changefn)(var*);
+ char name[];
+ };
+ var *vlook(char*), *gvlook(char*), *newvar(char*, var*);
+diff --git a/var.c b/var.c
+index 73b01fa..e132a7b 100644
+--- a/var.c
++++ b/var.c
+@@ -70,6 +70,7 @@ newvar(char *name, var *next)
+ v->fn = 0;
+ v->changed = 0;
+ v->fnchanged = 0;
++ v->changefn = 0;
+ return v;
+ }
+
+@@ -92,13 +93,21 @@ vlook(char *name)
+ return gvlook(name);
+ }
+
+-void
+-setvar(char *name, word *val)
++static void
++setvar_(char *name, word *val, int callfn)
+ {
+ var *v = vlook(name);
+ freewords(v->val);
+ v->val = val;
+ v->changed = 1;
++ if(callfn && v->changefn)
++ v->changefn(v);
++}
++
++void
++setvar(char *name, word *val)
++{
++ setvar_(name, val, 1);
+ }
+
+ void
+@@ -107,3 +116,83 @@ freevar(var *v)
+ freewords(v->val);
+ free(v);
+ }
++
++static void
++bigpath(var *v)
++{
++ /* convert $PATH to $path */
++ char *p, *q;
++ word **l, *w;
++
++ if(v->val == 0){
++ setvar_("path", 0, 0);
++ return;
++ }
++ p = v->val->word;
++ w = 0;
++ l = &w;
++ /*
++ * Doesn't handle escaped colon nonsense.
++ */
++ if(p[0] == 0)
++ p = 0;
++ while(p){
++ q = strchr(p, ':');
++ if(q)
++ *q = 0;
++ *l = newword(p[0] ? p : ".", 0);
++ l = &(*l)->next;
++ if(q){
++ *q = ':';
++ p = q+1;
++ }else
++ p = 0;
++ }
++ setvar_("path", w, 0);
++}
++
++static char *
++list2strcolon(word *words)
++{
++ char *value, *s, *t;
++ int len = 0;
++ word *ap;
++ for(ap = words;ap;ap = ap->next)
++ len+=1+strlen(ap->word);
++ value = emalloc(len+1);
++ s = value;
++ for(ap = words;ap;ap = ap->next){
++ for(t = ap->word;*t;) *s++=*t++;
++ *s++=':';
++ }
++ if(s==value)
++ *s='\0';
++ else s[-1]='\0';
++ return value;
++}
++
++static void
++littlepath(var *v)
++{
++ /* convert $path to $PATH */
++ char *p;
++ word *w;
++
++ p = list2strcolon(v->val);
++ w = new(word);
++ w->word = p;
++ w->next = 0;
++ setvar_("PATH", w, 1); /* 1: recompute $path to expose colon problems */
++}
++
++void
++pathinit(void)
++{
++ var *v;
++
++ v = gvlook("path");
++ v->changefn = littlepath;
++ v = gvlook("PATH");
++ v->changefn = bigpath;
++ bigpath(v);
++}
+--
+2.49.0
+
diff --git a/pkg/rc/ver b/pkg/rc/ver
@@ -1 +1 @@
-3e907e648d r1
+3e907e648d r2