aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/plumb/match.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2003-12-11 17:48:38 +0000
committerrsc <devnull@localhost>2003-12-11 17:48:38 +0000
commit32f69c36e0eec1227934bbd34854bfebd88686f2 (patch)
tree1587e9de84816b77168afa81c1594cc686809910 /src/cmd/plumb/match.c
parentac244f8d287a6119155ea672c8fd13c487c5e4c7 (diff)
downloadplan9port-32f69c36e0eec1227934bbd34854bfebd88686f2.tar.gz
plan9port-32f69c36e0eec1227934bbd34854bfebd88686f2.tar.bz2
plan9port-32f69c36e0eec1227934bbd34854bfebd88686f2.zip
Add support for user-level 9P servers/clients and various bug fixes to go with them.
Diffstat (limited to 'src/cmd/plumb/match.c')
-rw-r--r--src/cmd/plumb/match.c32
1 files changed, 16 insertions, 16 deletions
diff --git a/src/cmd/plumb/match.c b/src/cmd/plumb/match.c
index 42a9232f..dc1abbb1 100644
--- a/src/cmd/plumb/match.c
+++ b/src/cmd/plumb/match.c
@@ -6,6 +6,7 @@
#include <plumb.h>
#include "plumber.h"
+/*
static char*
nonnil(char *s)
{
@@ -13,6 +14,7 @@ nonnil(char *s)
return "";
return s;
}
+*/
int
verbis(int obj, Plumbmsg *m, Rule *r)
@@ -44,10 +46,10 @@ setvar(Resub rs[10], char *match[10])
free(match[i]);
match[i] = nil;
}
- for(i=0; i<10 && rs[i].sp!=nil; i++){
- n = rs[i].ep-rs[i].sp;
+ for(i=0; i<10 && rs[i].s.sp!=nil; i++){
+ n = rs[i].e.ep-rs[i].s.sp;
match[i] = emalloc(n+1);
- memmove(match[i], rs[i].sp, n);
+ memmove(match[i], rs[i].s.sp, n);
match[i][n] = '\0';
}
}
@@ -66,7 +68,7 @@ clickmatch(Reprog *re, char *text, Resub rs[10], int click)
for(i=0; i<=click; i++){
memset(rs, 0, 10*sizeof(Resub));
if(regexec(re, text+i, rs, 10))
- if(rs[0].sp<=clickp && clickp<=rs[0].ep)
+ if(rs[0].s.sp<=clickp && clickp<=rs[0].e.ep)
return 1;
}
return 0;
@@ -94,8 +96,8 @@ verbmatches(int obj, Plumbmsg *m, Rule *r, Exec *e)
}
if(!clickmatch(r->regex, m->data, rs, atoi(clickval)))
break;
- p0 = rs[0].sp - m->data;
- p1 = rs[0].ep - m->data;
+ p0 = rs[0].s.sp - m->data;
+ p1 = rs[0].e.ep - m->data;
if(e->p0 >=0 && !(p0==e->p0 && p1==e->p1))
break;
e->clearclick = 1;
@@ -120,7 +122,7 @@ verbmatches(int obj, Plumbmsg *m, Rule *r, Exec *e)
/* must match full text */
if(ntext < 0)
ntext = strlen(alltext);
- if(!regexec(r->regex, alltext, rs, 10) || rs[0].sp!=alltext || rs[0].ep!=alltext+ntext)
+ if(!regexec(r->regex, alltext, rs, 10) || rs[0].s.sp!=alltext || rs[0].e.ep!=alltext+ntext)
break;
setvar(rs, e->match);
return 1;
@@ -389,7 +391,7 @@ enum
{
NARGS = 100,
NARGCHAR = 8*1024,
- EXECSTACK = 4096+(NARGS+1)*sizeof(char*)+NARGCHAR
+ EXECSTACK = 32*1024+(NARGS+1)*sizeof(char*)+NARGCHAR
};
/* copy argv to stack and free the incoming strings, so we don't leak argument vectors */
@@ -419,19 +421,17 @@ stackargv(char **inargv, char *argv[NARGS+1], char args[NARGCHAR])
void
execproc(void *v)
{
+ int fd[3];
char **av;
- char buf[1024], *args[NARGS+1], argc[NARGCHAR];
+ char *args[NARGS+1], argc[NARGCHAR];
- rfork(RFFDG);
- close(0);
- open("/dev/null", OREAD);
+ fd[0] = open("/dev/null", OREAD);
+ fd[1] = dup(1, -1);
+ fd[2] = dup(2, -1);
av = v;
stackargv(av, args, argc);
free(av);
- procexec(nil, args[0], args);
- if(args[0][0]!='/' && strncmp(args[0], "./", 2)!=0 && strncmp(args[0], "../", 3)!=0)
- snprint(buf, sizeof buf, "/bin/%s", args[0]);
- procexec(nil, buf, args);
+ procexec(nil, fd, args[0], args);
threadexits("can't exec");
}