aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2009-12-11 11:33:48 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2009-12-11 12:25:41 +0200
commitbc30bd9c1be76432ae0b6dcae6f61a9ee323852b (patch)
treeae633cfc96c83f5d245349514f5a5b2028d40fb1
parent3809390c3e8df46b85371957b2da42fabfda9788 (diff)
downloadpies-bc30bd9c1be76432ae0b6dcae6f61a9ee323852b.tar.gz
pies-bc30bd9c1be76432ae0b6dcae6f61a9ee323852b.tar.bz2
Bugfixes.
* src/meta1gram.y (xlat_listen_socket): Handle all relevant assignments in the listen_socket block. * src/url.c (url_parse_host): Always assign port_s. Handle arguments without preceding path. (url_parse_user): Parse path without preceding user/pass specs. (url_parse_scheme): Require exactly two slashes after 'scheme:'.
-rw-r--r--src/meta1gram.y32
-rw-r--r--src/url.c63
2 files changed, 64 insertions, 31 deletions
diff --git a/src/meta1gram.y b/src/meta1gram.y
index e18841b..31cb021 100644
--- a/src/meta1gram.y
+++ b/src/meta1gram.y
@@ -296,12 +296,7 @@ xlat_listen_socket (struct meta1_stmt *stmt, struct component *comp)
}
else if (strcmp (p->v.value->v.string, "unix") == 0)
{
- p = find_stmt (stmt->v.list, "path");
- if (!p || p->v.value->type != GRECS_TYPE_STRING)
- return 1;
- meta1_line_add (p->v.value->v.string, strlen (p->v.value->v.string));
- /* FIXME: Other substatements:
- listen_socket {
+ /* listen_socket {
type=unix;
path = /tmp/socket;
umask = 077;
@@ -309,6 +304,31 @@ xlat_listen_socket (struct meta1_stmt *stmt, struct component *comp)
group = group;
}
*/
+ p = find_stmt (stmt->v.list, "path");
+ if (!p || p->v.value->type != GRECS_TYPE_STRING)
+ return 1;
+ meta1_line_add (p->v.value->v.string, strlen (p->v.value->v.string));
+
+ p = find_stmt (stmt->v.list, "user");
+ if (p && p->v.value->type == GRECS_TYPE_STRING)
+ {
+ meta1_line_add (";user=", 6);
+ meta1_line_add (p->v.value->v.string, strlen (p->v.value->v.string));
+ }
+
+ p = find_stmt (stmt->v.list, "group");
+ if (p && p->v.value->type == GRECS_TYPE_STRING)
+ {
+ meta1_line_add (";group=", 7);
+ meta1_line_add (p->v.value->v.string, strlen (p->v.value->v.string));
+ }
+
+ p = find_stmt (stmt->v.list, "umask");
+ if (p && p->v.value->type == GRECS_TYPE_STRING)
+ {
+ meta1_line_add (";umask=", 7);
+ meta1_line_add (p->v.value->v.string, strlen (p->v.value->v.string));
+ }
}
val = xmalloc (sizeof (*val));
val->type = GRECS_TYPE_STRING;
diff --git a/src/url.c b/src/url.c
index 6bc28ad..9f1f92d 100644
--- a/src/url.c
+++ b/src/url.c
@@ -87,10 +87,10 @@ url_parse_host (struct pies_url *url, char **str)
unsigned long n = strtoul (start, &q, 10);
if (n > USHRT_MAX)
return 1;
- if ((*q && !strchr ("/;:", *q)))
+ if ((*q && !strchr ("/;", *q)))
{
char *proto = url->proto_s ? url->proto_s : "tcp";
- size_t size = strcspn (start, "/;:");
+ size_t size = strcspn (start, "/;");
struct servent *serv;
alloc_string_len (&url->port_s, start, size);
@@ -102,6 +102,7 @@ url_parse_host (struct pies_url *url, char **str)
}
else
{
+ alloc_string_len (&url->port_s, start, q - start);
url->port = n;
*str = q;
}
@@ -112,8 +113,10 @@ url_parse_host (struct pies_url *url, char **str)
return 1;
if (**str)
{
- ++*str;
- return url_parse_path (url, str);
+ if (*(*str)++ == '/')
+ return url_parse_path (url, str);
+ else
+ return url_parse_args (url, str);
}
return 0;
}
@@ -122,31 +125,36 @@ url_parse_host (struct pies_url *url, char **str)
static int
url_parse_user (struct pies_url *url, char **str)
{
- size_t len = strcspn (*str, ":;@/");
- char *p = *str + len;
-
- switch (*p)
+ if (**str == '/')
+ return url_parse_path (url, str);
+ else
{
- case ';':
- case ':':
- len = strcspn (p + 1, "@/:");
- if (p[len + 1] == '@')
+ size_t len = strcspn (*str, ":;@/");
+ char *p = *str + len;
+
+ switch (*p)
{
- if (alloc_string_len (&url->passwd, p + 1, len))
- return 1;
+ case ';':
+ case ':':
+ len = strcspn (p + 1, "@/:");
+ if (p[len + 1] == '@')
+ {
+ if (alloc_string_len (&url->passwd, p + 1, len))
+ return 1;
+ if (alloc_string (&url->user, *str, p))
+ return 1;
+ *str = p + len + 2;
+ }
+ break;
+
+ case '@':
if (alloc_string (&url->user, *str, p))
return 1;
- *str = p + len + 2;
+ url->passwd = NULL;
+ *str = p + 1;
}
- break;
-
- case '@':
- if (alloc_string (&url->user, *str, p))
- return 1;
- url->passwd = NULL;
- *str = p + 1;
+ return url_parse_host (url, str);
}
- return url_parse_host (url, str);
}
static int
@@ -196,8 +204,13 @@ url_parse_scheme (struct pies_url *url, const char *str)
url->proto = 0;
/* Skip slashes */
- for (p = (char*) str + 1; *p == '/'; p++)
- ;
+ p = (char*) str + 1;
+ if (memcmp (p, "//", 2))
+ {
+ errno = EINVAL;
+ return 1;
+ }
+ p += 2;
return url_parse_user (url, &p);
}

Return to:

Send suggestions and report system problems to the System administrator.