From 4bf9f3289bd2f79108b0f79707eede824339b2a8 Mon Sep 17 00:00:00 2001 From: obrien Date: Wed, 6 Nov 2002 08:57:03 +0000 Subject: Break fileGetURL() out into its own file so that pkg_install/lib consumers pkg_{create,delete} don't need to needlessly link with libfetch. --- usr.sbin/pkg_install/create/Makefile | 4 +- usr.sbin/pkg_install/delete/Makefile | 4 +- usr.sbin/pkg_install/lib/Makefile | 2 +- usr.sbin/pkg_install/lib/file.c | 112 --------------------------- usr.sbin/pkg_install/lib/url.c | 144 +++++++++++++++++++++++++++++++++++ 5 files changed, 149 insertions(+), 117 deletions(-) create mode 100644 usr.sbin/pkg_install/lib/url.c (limited to 'usr.sbin') diff --git a/usr.sbin/pkg_install/create/Makefile b/usr.sbin/pkg_install/create/Makefile index 4128517..08173e5 100644 --- a/usr.sbin/pkg_install/create/Makefile +++ b/usr.sbin/pkg_install/create/Makefile @@ -7,8 +7,8 @@ CFLAGS+= ${DEBUG} -I${.CURDIR}/../lib WARNS?= 2 -DPADD= ${LIBINSTALL} ${LIBFETCH} ${LIBMD} -LDADD= ${LIBINSTALL} -lfetch -lmd +DPADD= ${LIBINSTALL} ${LIBMD} +LDADD= ${LIBINSTALL} -lmd .if !defined(NOCRYPT) && !defined(NOSECURE) && !defined(NO_OPENSSL) DPADD+= ${LIBSSL} ${LIBCRYPTO} diff --git a/usr.sbin/pkg_install/delete/Makefile b/usr.sbin/pkg_install/delete/Makefile index 47642cc..7002e75 100644 --- a/usr.sbin/pkg_install/delete/Makefile +++ b/usr.sbin/pkg_install/delete/Makefile @@ -7,8 +7,8 @@ CFLAGS+= ${DEBUG} -I${.CURDIR}/../lib WARNS?= 2 -DPADD= ${LIBINSTALL} ${LIBFETCH} ${LIBMD} -LDADD= ${LIBINSTALL} -lfetch -lmd +DPADD= ${LIBINSTALL} ${LIBMD} +LDADD= ${LIBINSTALL} -lmd .if !defined(NOCRYPT) && !defined(NOSECURE) && !defined(NO_OPENSSL) DPADD+= ${LIBSSL} ${LIBCRYPTO} diff --git a/usr.sbin/pkg_install/lib/Makefile b/usr.sbin/pkg_install/lib/Makefile index 7b0e2f8..2a79f71 100644 --- a/usr.sbin/pkg_install/lib/Makefile +++ b/usr.sbin/pkg_install/lib/Makefile @@ -3,7 +3,7 @@ LIB= install INTERNALLIB= YES SRCS= file.c msg.c plist.c str.c exec.c global.c pen.c match.c \ - deps.c version.c pkgwrap.c + deps.c version.c pkgwrap.c url.c CFLAGS+= ${DEBUG} diff --git a/usr.sbin/pkg_install/lib/file.c b/usr.sbin/pkg_install/lib/file.c index a51e8be..94b058e 100644 --- a/usr.sbin/pkg_install/lib/file.c +++ b/usr.sbin/pkg_install/lib/file.c @@ -137,118 +137,6 @@ isURL(const char *fname) * Try and fetch a file by URL, returning the directory name for where * it's unpacked, if successful. */ -char * -fileGetURL(const char *base, const char *spec) -{ - char *cp, *rp; - char fname[FILENAME_MAX]; - char pen[FILENAME_MAX]; - char buf[8192]; - FILE *ftp; - pid_t tpid; - int pfd[2], pstat, r, w; - char *hint; - int fd; - - rp = NULL; - /* Special tip that sysinstall left for us */ - hint = getenv("PKG_ADD_BASE"); - if (!isURL(spec)) { - if (!base && !hint) - return NULL; - /* - * We've been given an existing URL (that's known-good) and now we need - * to construct a composite one out of that and the basename we were - * handed as a dependency. - */ - if (base) { - strcpy(fname, base); - /* - * Advance back two slashes to get to the root of the package - * hierarchy - */ - cp = strrchr(fname, '/'); - if (cp) { - *cp = '\0'; /* chop name */ - cp = strrchr(fname, '/'); - } - if (cp) { - *(cp + 1) = '\0'; - strcat(cp, "All/"); - strcat(cp, spec); - /* XXX: need to handle .tgz also */ - strcat(cp, ".tbz"); - } - else - return NULL; - } - else { - /* - * Otherwise, we've been given an environment variable hinting - * at the right location from sysinstall - */ - strcpy(fname, hint); - strcat(fname, spec); - /* XXX: need to handle .tgz also */ - strcat(fname, ".tbz"); - } - } - else - strcpy(fname, spec); - - if ((ftp = fetchGetURL(fname, Verbose ? "v" : NULL)) == NULL) { - printf("Error: FTP Unable to get %s: %s\n", - fname, fetchLastErrString); - return NULL; - } - - if (isatty(0) || Verbose) - printf("Fetching %s...", fname), fflush(stdout); - pen[0] = '\0'; - if ((rp = make_playpen(pen, 0)) == NULL) { - printf("Error: Unable to construct a new playpen for FTP!\n"); - fclose(ftp); - return NULL; - } - if (pipe(pfd) == -1) { - warn("pipe()"); - cleanup(0); - exit(2); - } - if ((tpid = fork()) == -1) { - warn("pipe()"); - cleanup(0); - exit(2); - } - if (!tpid) { - dup2(pfd[0], 0); - for (fd = getdtablesize() - 1; fd >= 3; --fd) - close(fd); - /* XXX: need to handle .tgz also */ - execl("/usr/bin/tar", "tar", Verbose ? "-xjvf" : "-xjf", "-", - (char *)0); - _exit(2); - } - close(pfd[0]); - for (;;) { - if ((r = fread(buf, 1, sizeof buf, ftp)) < 1) - break; - if ((w = write(pfd[1], buf, r)) != r) - break; - } - if (ferror(ftp)) - warn("warning: error reading from server"); - fclose(ftp); - close(pfd[1]); - if (w == -1) - warn("warning: error writing to tar"); - tpid = waitpid(tpid, &pstat, 0); - if (Verbose) - printf("tar command returns %d status\n", WEXITSTATUS(pstat)); - if (rp && (isatty(0) || Verbose)) - printf(" Done.\n"); - return rp; -} char * fileFindByPath(const char *base, const char *fname) diff --git a/usr.sbin/pkg_install/lib/url.c b/usr.sbin/pkg_install/lib/url.c new file mode 100644 index 0000000..5ee33f3 --- /dev/null +++ b/usr.sbin/pkg_install/lib/url.c @@ -0,0 +1,144 @@ +/* + * FreeBSD install - a package for the installation and maintainance + * of non-core utilities. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Jordan K. Hubbard + * 18 July 1993 + * + * URL file access utilities. + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "lib.h" +#include +#include +#include + +/* + * Try and fetch a file by URL, returning the directory name for where + * it's unpacked, if successful. + */ +char * +fileGetURL(const char *base, const char *spec) +{ + char *cp, *rp; + char fname[FILENAME_MAX]; + char pen[FILENAME_MAX]; + char buf[8192]; + FILE *ftp; + pid_t tpid; + int pfd[2], pstat, r, w; + char *hint; + int fd; + + rp = NULL; + /* Special tip that sysinstall left for us */ + hint = getenv("PKG_ADD_BASE"); + if (!isURL(spec)) { + if (!base && !hint) + return NULL; + /* + * We've been given an existing URL (that's known-good) and now we need + * to construct a composite one out of that and the basename we were + * handed as a dependency. + */ + if (base) { + strcpy(fname, base); + /* + * Advance back two slashes to get to the root of the package + * hierarchy + */ + cp = strrchr(fname, '/'); + if (cp) { + *cp = '\0'; /* chop name */ + cp = strrchr(fname, '/'); + } + if (cp) { + *(cp + 1) = '\0'; + strcat(cp, "All/"); + strcat(cp, spec); + /* XXX: need to handle .tgz also */ + strcat(cp, ".tbz"); + } + else + return NULL; + } + else { + /* + * Otherwise, we've been given an environment variable hinting + * at the right location from sysinstall + */ + strcpy(fname, hint); + strcat(fname, spec); + /* XXX: need to handle .tgz also */ + strcat(fname, ".tbz"); + } + } + else + strcpy(fname, spec); + + if ((ftp = fetchGetURL(fname, Verbose ? "v" : NULL)) == NULL) { + printf("Error: FTP Unable to get %s: %s\n", + fname, fetchLastErrString); + return NULL; + } + + if (isatty(0) || Verbose) + printf("Fetching %s...", fname), fflush(stdout); + pen[0] = '\0'; + if ((rp = make_playpen(pen, 0)) == NULL) { + printf("Error: Unable to construct a new playpen for FTP!\n"); + fclose(ftp); + return NULL; + } + if (pipe(pfd) == -1) { + warn("pipe()"); + cleanup(0); + exit(2); + } + if ((tpid = fork()) == -1) { + warn("pipe()"); + cleanup(0); + exit(2); + } + if (!tpid) { + dup2(pfd[0], 0); + for (fd = getdtablesize() - 1; fd >= 3; --fd) + close(fd); + /* XXX: need to handle .tgz also */ + execl("/usr/bin/tar", "tar", Verbose ? "-xjvf" : "-xjf", "-", + (char *)0); + _exit(2); + } + close(pfd[0]); + for (;;) { + if ((r = fread(buf, 1, sizeof buf, ftp)) < 1) + break; + if ((w = write(pfd[1], buf, r)) != r) + break; + } + if (ferror(ftp)) + warn("warning: error reading from server"); + fclose(ftp); + close(pfd[1]); + if (w == -1) + warn("warning: error writing to tar"); + tpid = waitpid(tpid, &pstat, 0); + if (Verbose) + printf("tar command returns %d status\n", WEXITSTATUS(pstat)); + if (rp && (isatty(0) || Verbose)) + printf(" Done.\n"); + return rp; +} -- cgit v1.1