From 4bafa681feb2b902553e26fd88df0f06b0c0778a Mon Sep 17 00:00:00 2001 From: Timo Teras Date: Fri, 28 Nov 2008 15:03:27 +0200 Subject: io: prepartions for url handling --- src/url.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/url.c (limited to 'src/url.c') diff --git a/src/url.c b/src/url.c new file mode 100644 index 0000000..0999399 --- /dev/null +++ b/src/url.c @@ -0,0 +1,75 @@ +/* url.c - Alpine Package Keeper (APK) + * + * Copyright (C) 2005-2008 Natanael Copa + * Copyright (C) 2008 Timo Teräs + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. See http://www.gnu.org/ for details. + */ + +#include +#include +#include +#include + +#include "apk_io.h" + +static const char *url_is_file(const char *url) +{ + if (strncmp(url, "file:", 5) == 0) + return &url[5]; + + if (strncmp(url, "http:", 5) != 0 && + strncmp(url, "https:", 6) != 0 && + strncmp(url, "ftp:", 4) != 0) + return url; + + return NULL; +} + +static int fork_wget(const char *url) +{ + pid_t pid; + int fds[2]; + + if (pipe(fds) < 0) + return -1; + + pid = fork(); + if (pid == -1) { + close(fds[0]); + close(fds[1]); + return -1; + } + + if (pid == 0) { + setsid(); + close(fds[0]); + dup2(open("/dev/null", O_WRONLY), STDERR_FILENO); + dup2(open("/dev/null", O_RDONLY), STDIN_FILENO); + dup2(fds[1], STDOUT_FILENO); + execlp("wget", "wget", "-O", "-", url, NULL); + exit(0); + } + + close(fds[1]); + return fds[0]; +} + +struct apk_istream *apk_istream_from_url(const char *url) +{ + if (url_is_file(url) != NULL) + return apk_istream_from_file(url_is_file(url)); + + return apk_istream_from_fd(fork_wget(url)); +} + +struct apk_bstream *apk_bstream_from_url(const char *url) +{ + if (url_is_file(url)) + return apk_bstream_from_file(url); + + return apk_bstream_from_fd(fork_wget(url)); +} -- cgit v1.2.3-60-g2f50