aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/libfetch/fetch.39
-rw-r--r--lib/libfetch/fetch.c44
-rw-r--r--lib/libfetch/fetch.h1
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 *);