From owner-p4-projects@FreeBSD.ORG Thu May 13 04:57:43 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4BC311065673; Thu, 13 May 2010 04:57:43 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E9924106564A for ; Thu, 13 May 2010 04:57:42 +0000 (UTC) (envelope-from gcooper@FreeBSD.org) Received: from repoman.freebsd.org (unknown [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id D7ADF8FC0A for ; Thu, 13 May 2010 04:57:42 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id o4D4vgMZ044464 for ; Thu, 13 May 2010 04:57:42 GMT (envelope-from gcooper@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id o4D4vgIp044462 for perforce@freebsd.org; Thu, 13 May 2010 04:57:42 GMT (envelope-from gcooper@FreeBSD.org) Date: Thu, 13 May 2010 04:57:42 GMT Message-Id: <201005130457.o4D4vgIp044462@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to gcooper@FreeBSD.org using -f From: Garrett Cooper To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 178192 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 13 May 2010 04:57:43 -0000 http://p4web.freebsd.org/@@178192?ac=10 Change 178192 by gcooper@starr-bastion on 2010/05/13 04:56:45 Add unpack_to_buffer API for unpacking a file from a package to a buffer. The way that this is called today is backwards, but it will be sorted out eventually. Also update comments here and there to remove implicitness and to make things more concrete. Affected files ... .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/lib/libpkg/file.c#7 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/lib/libpkg/pkg.h#3 edit Differences ... ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/lib/libpkg/file.c#7 (text+ko) ==== @@ -344,6 +344,58 @@ ARCHIVE_EXTRACT_FFLAGS|ARCHIVE_EXTRACT_XATTR) /* + * Unpack a single file, denoted by file, to a buffer; this call uses + * unpack_file_to_fd to first open the file, and once that has been completed + * it opens the file and proceeds to read it into the buffer -- either + * specified by buffer if buffer is not NULL, or attempts to allocate memory + * which will need to be freed by the user at a later date. + * + * Returns an address to a buffer with the contents of *file if successful, or + * returns NULL on failure. + */ +char* +unpack_file_to_buffer(char *buffer, const char *pkg, const char *file) +{ + + FILE *fd = NULL; + char *buf = buffer; + struct stat sb; + + if ((fd = unpack_file_to_fd(pkg, file)) != NULL) { + + if (fstat(fileno(fd), &sb) == 0) { + + /* + * User either passed in a non-NULL value or we need + * to malloc on the fly and let the user deal with it + * later. + */ + if (buf != NULL) + buf = malloc(sb.st_size); + if (buf != NULL) { + + if (fread(buf, sb.st_size, 1, fd) != + sb.st_size) { + + /* + * Don't try to free user specified + * memory. + */ + if (buffer == NULL) + free(buf); + + } + + } + + } + } + + return buffer; + +} + +/* * Unpack a single file from a tar-file to a file descriptor; this is written * like so as an optimization to abbreviate the extract to *open step, as well * as to reduce the number of required steps needed when unpacking a tarball on @@ -361,8 +413,7 @@ * * [The return code info will eventually be...] * - * Return -1 on failure, a value greater than 0 on success [in accordance with - * open(2)]. + * Return -1 on failure, a value greater than 0 on success. */ FILE* unpack_file_to_fd(const char *pkg, const char *file) @@ -474,7 +525,8 @@ * Return 0 on success, 1 on failure * * NOTE: the exit code is 0 / 1 so that this can be fed directly into exit - * when doing piped tar commands for copying hierarchies *hint*, *hint*. + * when doing piped tar commands for copying hierarchies *hint*, *hint* -- this + * use may be short-lived though, so don't depend on the return value, mmk? */ int unpack(const char *pkg, const char *file_expr) ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/lib/libpkg/pkg.h#3 (text+ko) ==== @@ -189,7 +189,8 @@ void copy_hierarchy(const char *, const char *, Boolean); int delete_hierarchy(const char *, Boolean, Boolean); int unpack(const char *, const char *); -FILE* unpack_file_to_fd(const char *pkg, const char *file); +char* unpack_file_to_buffer(char *, const char *, const char *); +FILE* unpack_file_to_fd(const char *, const char *); void format_cmd(char *, int, const char *, const char *, const char *); /* Msg */