diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2009-12-11 11:33:48 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2009-12-11 12:25:41 +0200 |
commit | bc30bd9c1be76432ae0b6dcae6f61a9ee323852b (patch) | |
tree | ae633cfc96c83f5d245349514f5a5b2028d40fb1 | |
parent | 3809390c3e8df46b85371957b2da42fabfda9788 (diff) | |
download | pies-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.y | 32 | ||||
-rw-r--r-- | src/url.c | 63 |
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; @@ -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); } |