plumber: use 16K stack, make libplumb thread safe

This commit is contained in:
cinap_lenrek 2012-03-09 09:11:12 +01:00
parent 9b0fc40aee
commit 9e8b285562
2 changed files with 26 additions and 18 deletions

View file

@ -10,7 +10,7 @@
enum enum
{ {
Stack = 8*1024 Stack = 16*1024
}; };
typedef struct Dirtab Dirtab; typedef struct Dirtab Dirtab;

View file

@ -2,8 +2,6 @@
#include <libc.h> #include <libc.h>
#include "plumb.h" #include "plumb.h"
static char attrbuf[4096];
int int
plumbopen(char *name, int omode) plumbopen(char *name, int omode)
{ {
@ -70,20 +68,20 @@ Strcpy(char *s, char *t)
/* quote attribute value, if necessary */ /* quote attribute value, if necessary */
static char* static char*
quote(char *s) quote(char *s, char *buf, char *bufe)
{ {
char *t; char *t;
int c; int c;
if(s == nil){ if(s == nil){
attrbuf[0] = '\0'; buf[0] = '\0';
return attrbuf; return buf;
} }
if(strpbrk(s, " '=\t") == nil) if(strpbrk(s, " '=\t") == nil)
return s; return s;
t = attrbuf; t = buf;
*t++ = '\''; *t++ = '\'';
while(t < attrbuf+sizeof attrbuf-2){ while(t < bufe-2){
c = *s++; c = *s++;
if(c == '\0') if(c == '\0')
break; break;
@ -93,7 +91,7 @@ quote(char *s)
} }
*t++ = '\''; *t++ = '\'';
*t = '\0'; *t = '\0';
return attrbuf; return buf;
} }
char* char*
@ -101,13 +99,16 @@ plumbpackattr(Plumbattr *attr)
{ {
int n; int n;
Plumbattr *a; Plumbattr *a;
char *s, *t; char *s, *t, *buf, *bufe;
if(attr == nil) if(attr == nil)
return nil; return nil;
if((buf = malloc(4096)) == nil)
return nil;
bufe = buf + 4096;
n = 0; n = 0;
for(a=attr; a!=nil; a=a->next) 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); s = malloc(n);
if(s == nil) if(s == nil)
return nil; return nil;
@ -118,11 +119,13 @@ plumbpackattr(Plumbattr *attr)
*t++ = ' '; *t++ = ' ';
strcpy(t, a->name); strcpy(t, a->name);
strcat(t, "="); strcat(t, "=");
strcat(t, quote(a->value)); strcat(t, quote(a->value, buf, bufe));
t += strlen(t); t += strlen(t);
} }
if(t > s+n) if(t > s+n)
abort(); abort();
free(buf);
return s; return s;
} }
@ -236,9 +239,12 @@ Plumbattr*
plumbunpackattr(char *p) plumbunpackattr(char *p)
{ {
Plumbattr *attr, *prev, *a; Plumbattr *attr, *prev, *a;
char *q, *v; char *q, *v, *buf, *bufe;
int c, quoting; int c, quoting;
if((buf = malloc(4096)) == nil)
return nil;
bufe = buf + 4096;
attr = prev = nil; attr = prev = nil;
while(*p!='\0' && *p!='\n'){ while(*p!='\0' && *p!='\n'){
while(*p==' ' || *p=='\t') while(*p==' ' || *p=='\t')
@ -262,10 +268,10 @@ plumbunpackattr(char *p)
a->name[q-p] = '\0'; a->name[q-p] = '\0';
/* process quotes in value */ /* process quotes in value */
q++; /* skip '=' */ q++; /* skip '=' */
v = attrbuf; v = buf;
quoting = 0; quoting = 0;
while(*q!='\0' && *q!='\n'){ while(*q!='\0' && *q!='\n'){
if(v >= attrbuf+sizeof attrbuf) if(v >= bufe)
break; break;
c = *q++; c = *q++;
if(quoting){ if(quoting){
@ -287,14 +293,14 @@ plumbunpackattr(char *p)
} }
*v++ = c; *v++ = c;
} }
a->value = malloc(v-attrbuf+1); a->value = malloc(v-buf+1);
if(a->value == nil){ if(a->value == nil){
free(a->name); free(a->name);
free(a); free(a);
break; break;
} }
memmove(a->value, attrbuf, v-attrbuf); memmove(a->value, buf, v-buf);
a->value[v-attrbuf] = '\0'; a->value[v-buf] = '\0';
a->next = nil; a->next = nil;
if(prev == nil) if(prev == nil)
attr = a; attr = a;
@ -303,6 +309,8 @@ plumbunpackattr(char *p)
prev = a; prev = a;
p = q; p = q;
} }
free(buf);
return attr; return attr;
} }