plumber: use 16K stack, make libplumb thread safe
This commit is contained in:
parent
9b0fc40aee
commit
9e8b285562
2 changed files with 26 additions and 18 deletions
|
@ -10,7 +10,7 @@
|
|||
|
||||
enum
|
||||
{
|
||||
Stack = 8*1024
|
||||
Stack = 16*1024
|
||||
};
|
||||
|
||||
typedef struct Dirtab Dirtab;
|
||||
|
|
|
@ -2,8 +2,6 @@
|
|||
#include <libc.h>
|
||||
#include "plumb.h"
|
||||
|
||||
static char attrbuf[4096];
|
||||
|
||||
int
|
||||
plumbopen(char *name, int omode)
|
||||
{
|
||||
|
@ -70,20 +68,20 @@ Strcpy(char *s, char *t)
|
|||
|
||||
/* quote attribute value, if necessary */
|
||||
static char*
|
||||
quote(char *s)
|
||||
quote(char *s, char *buf, char *bufe)
|
||||
{
|
||||
char *t;
|
||||
int c;
|
||||
|
||||
if(s == nil){
|
||||
attrbuf[0] = '\0';
|
||||
return attrbuf;
|
||||
buf[0] = '\0';
|
||||
return buf;
|
||||
}
|
||||
if(strpbrk(s, " '=\t") == nil)
|
||||
return s;
|
||||
t = attrbuf;
|
||||
t = buf;
|
||||
*t++ = '\'';
|
||||
while(t < attrbuf+sizeof attrbuf-2){
|
||||
while(t < bufe-2){
|
||||
c = *s++;
|
||||
if(c == '\0')
|
||||
break;
|
||||
|
@ -93,7 +91,7 @@ quote(char *s)
|
|||
}
|
||||
*t++ = '\'';
|
||||
*t = '\0';
|
||||
return attrbuf;
|
||||
return buf;
|
||||
}
|
||||
|
||||
char*
|
||||
|
@ -101,13 +99,16 @@ plumbpackattr(Plumbattr *attr)
|
|||
{
|
||||
int n;
|
||||
Plumbattr *a;
|
||||
char *s, *t;
|
||||
char *s, *t, *buf, *bufe;
|
||||
|
||||
if(attr == nil)
|
||||
return nil;
|
||||
if((buf = malloc(4096)) == nil)
|
||||
return nil;
|
||||
bufe = buf + 4096;
|
||||
n = 0;
|
||||
for(a=attr; a!=nil; a=a->next)
|
||||
n += Strlen(a->name) + 1 + Strlen(quote(a->value)) + 1;
|
||||
n += Strlen(a->name) + 1 + Strlen(quote(a->value, buf, bufe)) + 1;
|
||||
s = malloc(n);
|
||||
if(s == nil)
|
||||
return nil;
|
||||
|
@ -118,11 +119,13 @@ plumbpackattr(Plumbattr *attr)
|
|||
*t++ = ' ';
|
||||
strcpy(t, a->name);
|
||||
strcat(t, "=");
|
||||
strcat(t, quote(a->value));
|
||||
strcat(t, quote(a->value, buf, bufe));
|
||||
t += strlen(t);
|
||||
}
|
||||
if(t > s+n)
|
||||
abort();
|
||||
free(buf);
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
|
@ -236,9 +239,12 @@ Plumbattr*
|
|||
plumbunpackattr(char *p)
|
||||
{
|
||||
Plumbattr *attr, *prev, *a;
|
||||
char *q, *v;
|
||||
char *q, *v, *buf, *bufe;
|
||||
int c, quoting;
|
||||
|
||||
if((buf = malloc(4096)) == nil)
|
||||
return nil;
|
||||
bufe = buf + 4096;
|
||||
attr = prev = nil;
|
||||
while(*p!='\0' && *p!='\n'){
|
||||
while(*p==' ' || *p=='\t')
|
||||
|
@ -262,10 +268,10 @@ plumbunpackattr(char *p)
|
|||
a->name[q-p] = '\0';
|
||||
/* process quotes in value */
|
||||
q++; /* skip '=' */
|
||||
v = attrbuf;
|
||||
v = buf;
|
||||
quoting = 0;
|
||||
while(*q!='\0' && *q!='\n'){
|
||||
if(v >= attrbuf+sizeof attrbuf)
|
||||
if(v >= bufe)
|
||||
break;
|
||||
c = *q++;
|
||||
if(quoting){
|
||||
|
@ -287,14 +293,14 @@ plumbunpackattr(char *p)
|
|||
}
|
||||
*v++ = c;
|
||||
}
|
||||
a->value = malloc(v-attrbuf+1);
|
||||
a->value = malloc(v-buf+1);
|
||||
if(a->value == nil){
|
||||
free(a->name);
|
||||
free(a);
|
||||
break;
|
||||
}
|
||||
memmove(a->value, attrbuf, v-attrbuf);
|
||||
a->value[v-attrbuf] = '\0';
|
||||
memmove(a->value, buf, v-buf);
|
||||
a->value[v-buf] = '\0';
|
||||
a->next = nil;
|
||||
if(prev == nil)
|
||||
attr = a;
|
||||
|
@ -303,6 +309,8 @@ plumbunpackattr(char *p)
|
|||
prev = a;
|
||||
p = q;
|
||||
}
|
||||
free(buf);
|
||||
|
||||
return attr;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue