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
|
enum
|
||||||
{
|
{
|
||||||
Stack = 8*1024
|
Stack = 16*1024
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct Dirtab Dirtab;
|
typedef struct Dirtab Dirtab;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue