diff options
-rw-r--r-- | lib/libfetch/fetch.3 | 9 | ||||
-rw-r--r-- | lib/libfetch/fetch.c | 44 | ||||
-rw-r--r-- | lib/libfetch/fetch.h | 1 |
3 files changed, 51 insertions, 3 deletions
diff --git a/lib/libfetch/fetch.3 b/lib/libfetch/fetch.3 index 7c0ca079f39f..4b6af268ea3c 100644 --- a/lib/libfetch/fetch.3 +++ b/lib/libfetch/fetch.3 @@ -28,6 +28,7 @@ .Dt FETCH 3 .Os .Sh NAME +.Nm fetchMakeURL , .Nm fetchParseURL , .Nm fetchFreeURL , .Nm fetchGetURL , @@ -58,6 +59,8 @@ .Fd #include <stdio.h> .Fd #include <fetch.h> .Ft struct url * +.Fn fetchMakeURL "char *scheme" "char *host" "int port" "char *doc" "char *user" "char *pwd" +.Ft struct url * .Fn fetchParseURL "char *URL" .Ft void .Fn fetchFreeURL "struct url *URL" @@ -120,8 +123,10 @@ all URL schemes. For instance, the file scheme only needs the <scheme> and <document> components. .Pp +.Fn fetchMakeURL +and .Fn fetchParseURL -returns a pointer to a +return a pointer to a .Fa url structure, which is defined as follows in .Aq Pa fetch.h : @@ -143,6 +148,8 @@ struct url { .Ed .Pp The pointer returned by +.Fn fetchMakeURL +or .Fn fetchParseURL should be freed using .Fn fetchFreeURL . diff --git a/lib/libfetch/fetch.c b/lib/libfetch/fetch.c index 08efeb8bb344..5d83db5b5de8 100644 --- a/lib/libfetch/fetch.c +++ b/lib/libfetch/fetch.c @@ -237,6 +237,48 @@ fetchListURL(char *URL, char *flags) } /* + * Make a URL + */ +struct url * +fetchMakeURL(char *scheme, char *host, int port, char *doc, + char *user, char *pwd) +{ + struct url *u; + + if (!scheme || (!host && !doc)) { + _url_seterr(URL_MALFORMED); + return NULL; + } + + if (port < 0 || port > 65535) { + _url_seterr(URL_BAD_PORT); + return NULL; + } + + /* allocate struct url */ + if ((u = calloc(1, sizeof *u)) == NULL) { + _fetch_syserr(); + return NULL; + } + + if ((u->doc = strdup(doc ? doc : "/")) == NULL) { + _fetch_syserr(); + free(u); + return NULL; + } + +#define seturl(x) snprintf(u->x, sizeof u->x, "%s", x) + seturl(scheme); + seturl(host); + seturl(user); + seturl(pwd); +#undef seturl + u->port = port; + + return u; +} + +/* * Split an URL into components. URL syntax is: * method:[//[user[:pwd]@]host[:port]]/[document] * This almost, but not quite, RFC1738 URL syntax. @@ -250,7 +292,6 @@ fetchParseURL(char *URL) /* allocate struct url */ if ((u = calloc(1, sizeof *u)) == NULL) { - errno = ENOMEM; _fetch_syserr(); return NULL; } @@ -320,7 +361,6 @@ nohost: p = "/"; if ((u->doc = strdup(p)) == NULL) { - errno = ENOMEM; _fetch_syserr(); goto ouch; } diff --git a/lib/libfetch/fetch.h b/lib/libfetch/fetch.h index beb43e6a395f..2395220af8ef 100644 --- a/lib/libfetch/fetch.h +++ b/lib/libfetch/fetch.h @@ -110,6 +110,7 @@ int fetchStat(struct url *, struct url_stat *, char *); struct url_ent *fetchList(struct url *, char *); /* URL parsing */ +struct url *fetchMakeURL(char *, char *, int, char *, char *, char *); struct url *fetchParseURL(char *); void fetchFreeURL(struct url *); |