opkg: switch to own fork to improve memory usage

Switch to our own fork of opkg to significantly reduce the required amount
of memory when updating lists or installing packages.

Preliminary tests showed a usage drop of about 90% during these operations,
from ~3.7MB with unmodified opkg to ~360KB with our custom fork.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
Jo-Philipp Wich 2017-02-16 17:36:47 +01:00
parent 84ceca5148
commit b65dc04712
30 changed files with 22 additions and 3493 deletions

View File

@ -11,15 +11,13 @@ include $(INCLUDE_DIR)/version.mk
include $(INCLUDE_DIR)/feeds.mk include $(INCLUDE_DIR)/feeds.mk
PKG_NAME:=opkg PKG_NAME:=opkg
PKG_RELEASE:=17 PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=http://git.yoctoproject.org/git/opkg PKG_SOURCE_URL:=https://git.lede-project.org/project/opkg-lede.git
PKG_SOURCE_DATE:=2011-04-08 PKG_SOURCE_DATE:=2017-02-18
PKG_SOURCE_VERSION:=9c97d5ecd795709c8584e972bfdf3aee3a5b846d PKG_SOURCE_VERSION:=db3fc0ce879bfe784d32ffe5a70e057459039dd5
PKG_MIRROR_HASH:=55e05270f3eb2f3aff5d3791463ce3d13b8197ca7b301cd58e731a249552c48f PKG_MIRROR_HASH:=
PKG_FIXUP:=autoreconf
PKG_REMOVE_FILES = autogen.sh aclocal.m4
PKG_LICENSE:=GPL-2.0 PKG_LICENSE:=GPL-2.0
PKG_LICENSE_FILES:=COPYING PKG_LICENSE_FILES:=COPYING
@ -33,15 +31,18 @@ PKG_BUILD_PARALLEL:=1
HOST_BUILD_PARALLEL:=1 HOST_BUILD_PARALLEL:=1
PKG_INSTALL:=1 PKG_INSTALL:=1
HOST_BUILD_DEPENDS:=libubox/host
include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/host-build.mk include $(INCLUDE_DIR)/host-build.mk
include $(INCLUDE_DIR)/cmake.mk
define Package/opkg define Package/opkg
SECTION:=base SECTION:=base
CATEGORY:=Base system CATEGORY:=Base system
TITLE:=opkg package manager TITLE:=opkg package manager
DEPENDS:=+uclient-fetch +libpthread DEPENDS:=+uclient-fetch +libpthread +libubox
URL:=http://wiki.openmoko.org/wiki/Opkg URL:=https://git.lede-project.org/?p=project/opkg-lede.git
MENU:=1 MENU:=1
endef endef
@ -55,16 +56,6 @@ define Package/opkg/description
opkg knows how to install both .ipk and .deb packages. opkg knows how to install both .ipk and .deb packages.
endef endef
define Package/opkg/config
config OPKG_SUPPORT_MD5
bool
default n
depends on PACKAGE_opkg
prompt "Support reading old md5 hashes."
help
Old opkg used md5s, new uses sha. This options enables understanding both while prefering sha.
endef
define Package/opkg/conffiles define Package/opkg/conffiles
/etc/opkg.conf /etc/opkg.conf
/etc/opkg/keys/ /etc/opkg/keys/
@ -74,29 +65,19 @@ endef
TARGET_CFLAGS += -ffunction-sections -fdata-sections TARGET_CFLAGS += -ffunction-sections -fdata-sections
EXTRA_CFLAGS += $(TARGET_CPPFLAGS) EXTRA_CFLAGS += $(TARGET_CPPFLAGS)
CONFIGURE_ARGS += \ CMAKE_OPTIONS += \
--disable-curl \ -DBUILD_TESTS=OFF \
--disable-gpg \ -DHOST_CPU=$(PKGARCH) \
--enable-sha256 \ -DVERSION="$(PKG_SOURCE_VERSION) ($(PKG_SOURCE_DATE))"
--with-opkgetcdir=/etc \
--with-opkglockfile=/var/lock/opkg.lock
ifndef CONFIG_SIGNED_PACKAGES CMAKE_HOST_OPTIONS += \
CONFIGURE_ARGS += --disable-usign -DSTATIC_UBOX=ON \
endif -DBUILD_TESTS=OFF \
ifeq ($(CONFIG_OPKG_SUPPORT_MD5),y) -DHOST_CPU=$(PKGARCH) \
CONFIGURE_ARGS += --enable-md5 -DLOCK_FILE=/tmp/opkg.lock \
else -DVERSION="$(PKG_SOURCE_VERSION) ($(PKG_SOURCE_DATE))"
CONFIGURE_ARGS += --disable-md5
endif
MAKE_FLAGS = \ define Package/opkg/install
CC="$(TARGET_CC)" \
DESTDIR="$(PKG_INSTALL_DIR)" \
HOST_CPU="$(PKGARCH)" \
LDFLAGS="-Wl,--gc-sections" \
define Package/opkg/Default/install
$(INSTALL_DIR) $(1)/usr/lib/opkg $(INSTALL_DIR) $(1)/usr/lib/opkg
$(INSTALL_DIR) $(1)/bin $(INSTALL_DIR) $(1)/bin
$(INSTALL_DIR) $(1)/etc/opkg $(INSTALL_DIR) $(1)/etc/opkg
@ -107,34 +88,13 @@ define Package/opkg/Default/install
$(VERSION_SED) $(1)/etc/opkg/distfeeds.conf $(VERSION_SED) $(1)/etc/opkg/distfeeds.conf
$(INSTALL_BIN) ./files/20_migrate-feeds $(1)/etc/uci-defaults/ $(INSTALL_BIN) ./files/20_migrate-feeds $(1)/etc/uci-defaults/
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/opkg-cl $(1)/bin/opkg $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/opkg-cl $(1)/bin/opkg
endef
define Package/opkg/install
$(call Package/opkg/Default/install,$(1),)
ifneq ($(CONFIG_SIGNED_PACKAGES),) ifneq ($(CONFIG_SIGNED_PACKAGES),)
echo "option check_signature 1" >> $(1)/etc/opkg.conf echo "option check_signature 1" >> $(1)/etc/opkg.conf
endif endif
mkdir $(1)/usr/sbin $(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) ./files/opkg-key $(1)/usr/sbin/ $(INSTALL_BIN) ./files/opkg-key $(1)/usr/sbin/
endef endef
define Build/InstallDev
mkdir -p $(1)/usr/include
$(CP) $(PKG_INSTALL_DIR)/usr/include/libopkg $(1)/usr/include/
endef
HOST_CONFIGURE_ARGS+= \
--disable-curl \
--disable-gpg \
--enable-sha256 \
--with-opkgetcdir=/etc \
--with-opkglockfile=/tmp/opkg.lock
define Host/Compile
+$(MAKE) $(HOST_JOBS) -C $(HOST_BUILD_DIR) CC="$(HOSTCC)" all
endef
define Host/Install define Host/Install
$(INSTALL_BIN) $(HOST_BUILD_DIR)/src/opkg-cl $(STAGING_DIR_HOST)/bin/opkg $(INSTALL_BIN) $(HOST_BUILD_DIR)/src/opkg-cl $(STAGING_DIR_HOST)/bin/opkg
endef endef

View File

@ -1,168 +0,0 @@
--- /dev/null
+++ b/m4/pkg.m4
@@ -0,0 +1,157 @@
+# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
+#
+# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# PKG_PROG_PKG_CONFIG([MIN-VERSION])
+# ----------------------------------
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+ AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+ _pkg_min_version=m4_default([$1], [0.9.0])
+ AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ PKG_CONFIG=""
+ fi
+
+fi[]dnl
+])# PKG_PROG_PKG_CONFIG
+
+# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# Check to see whether a particular set of modules exists. Similar
+# to PKG_CHECK_MODULES(), but does not set variables or print errors.
+#
+#
+# Similar to PKG_CHECK_MODULES, make sure that the first instance of
+# this or PKG_CHECK_MODULES is called, or make sure to call
+# PKG_CHECK_EXISTS manually
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+ m4_ifval([$2], [$2], [:])
+m4_ifvaln([$3], [else
+ $3])dnl
+fi])
+
+
+# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+# ---------------------------------------------
+m4_define([_PKG_CONFIG],
+[if test -n "$PKG_CONFIG"; then
+ if test -n "$$1"; then
+ pkg_cv_[]$1="$$1"
+ else
+ PKG_CHECK_EXISTS([$3],
+ [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
+ [pkg_failed=yes])
+ fi
+else
+ pkg_failed=untried
+fi[]dnl
+])# _PKG_CONFIG
+
+# _PKG_SHORT_ERRORS_SUPPORTED
+# -----------------------------
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi[]dnl
+])# _PKG_SHORT_ERRORS_SUPPORTED
+
+
+# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+# [ACTION-IF-NOT-FOUND])
+#
+#
+# Note that if there is a possibility the first call to
+# PKG_CHECK_MODULES might not happen, you should be sure to include an
+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+#
+#
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+ _PKG_SHORT_ERRORS_SUPPORTED
+ if test $_pkg_short_errors_supported = yes; then
+ $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"`
+ else
+ $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+ ifelse([$4], , [AC_MSG_ERROR(dnl
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT
+])],
+ [AC_MSG_RESULT([no])
+ $4])
+elif test $pkg_failed = untried; then
+ ifelse([$4], , [AC_MSG_FAILURE(dnl
+[The pkg-config script could not be found or is too old. Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])],
+ [$4])
+else
+ $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+ $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+ AC_MSG_RESULT([yes])
+ ifelse([$3], , :, [$3])
+fi[]dnl
+])# PKG_CHECK_MODULES
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,4 +1,4 @@
-ACLOCAL_AMFLAGS = -I shave
+ACLOCAL_AMFLAGS = -I shave -I m4
SUBDIRS = libbb libopkg src tests utils man

View File

@ -1,37 +0,0 @@
--- a/configure.ac
+++ b/configure.ac
@@ -4,7 +4,6 @@ AC_CONFIG_SRCDIR([libopkg/pkg.c])
AC_CONFIG_AUX_DIR([conf])
AC_CONFIG_MACRO_DIR([m4])
-AC_CONFIG_MACRO_DIR([shave])
AM_INIT_AUTOMAKE
AM_CONFIG_HEADER(libopkg/config.h)
@@ -277,9 +276,6 @@ AC_SUBST(opkgetcdir)
AC_SUBST(opkglockfile)
AC_SUBST([CLEAN_DATE])
-# Setup output beautifier.
-SHAVE_INIT([shave], [enable])
-
AC_OUTPUT(
Makefile
libopkg/Makefile
@@ -289,8 +285,6 @@ AC_OUTPUT(
utils/Makefile
utils/update-alternatives
libopkg.pc
- shave/shave
- shave/shave-libtool
man/Makefile
man/opkg-cl.1
man/opkg-key.1
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,4 +1,4 @@
-ACLOCAL_AMFLAGS = -I shave -I m4
+ACLOCAL_AMFLAGS = -I m4
SUBDIRS = libbb libopkg src tests utils man

View File

@ -1,20 +0,0 @@
--- a/libbb/Makefile.am
+++ b/libbb/Makefile.am
@@ -1,6 +1,6 @@
HOST_CPU=@host_cpu@
BUILD_CPU=@build_cpu@
-ALL_CFLAGS=-g -O -Wall -DHOST_CPU_STR=\"@host_cpu@\" -DBUILD_CPU=@build_cpu@
+ALL_CFLAGS=-g -O -Wall -DHOST_CPU_STR=\"$(HOST_CPU)\" -DBUILD_CPU=@build_cpu@
noinst_LTLIBRARIES = libbb.la
--- a/libopkg/Makefile.am
+++ b/libopkg/Makefile.am
@@ -1,5 +1,5 @@
-
-AM_CFLAGS=-Wall -DHOST_CPU_STR=\"@host_cpu@\" -DBUILD_CPU=@build_cpu@ -DLIBDIR=\"@libdir@\" -DOPKGLIBDIR=\"@opkglibdir@\" -DOPKGETCDIR=\"@opkgetcdir@\" -DOPKGLOCKFILE=\"@opkglockfile@\" -DDATADIR=\"@datadir@\" -I$(top_srcdir) $(BIGENDIAN_CFLAGS) $(CURL_CFLAGS) $(GPGME_CFLAGS) $(PATHFINDER_CFLAGS)
+HOST_CPU=@host_cpu@
+AM_CFLAGS=-Wall -DHOST_CPU_STR=\"$(HOST_CPU)\" -DBUILD_CPU=@build_cpu@ -DLIBDIR=\"@libdir@\" -DOPKGLIBDIR=\"@opkglibdir@\" -DOPKGETCDIR=\"@opkgetcdir@\" -DOPKGLOCKFILE=\"@opkglockfile@\" -DDATADIR=\"@datadir@\" -I$(top_srcdir) $(BIGENDIAN_CFLAGS) $(CURL_CFLAGS) $(GPGME_CFLAGS) $(PATHFINDER_CFLAGS)
libopkg_includedir=$(includedir)/libopkg
libopkg_include_HEADERS= *.h

View File

@ -1,71 +0,0 @@
--- a/libopkg/Makefile.am
+++ b/libopkg/Makefile.am
@@ -38,16 +38,10 @@ if HAVE_SHA256
opkg_util_sources += sha256.c sha256.h
endif
-lib_LTLIBRARIES = libopkg.la
-libopkg_la_SOURCES = \
+noinst_LIBRARIES = libopkg.a
+libopkg_a_SOURCES = \
$(opkg_libcore_sources) \
$(opkg_cmd_sources) $(opkg_db_sources) \
$(opkg_util_sources) $(opkg_list_sources)
-libopkg_la_LIBADD = $(top_builddir)/libbb/libbb.la $(CURL_LIBS) $(GPGME_LIBS) $(OPENSSL_LIBS) $(PATHFINDER_LIBS)
-
-# make sure we only export symbols that are for public use
-#libopkg_la_LDFLAGS = -export-symbols-regex "^opkg_.*"
-
-
-
+libopkg_a_LIBADD = $(top_builddir)/libbb/libbb.a
--- a/libbb/Makefile.am
+++ b/libbb/Makefile.am
@@ -2,9 +2,9 @@ HOST_CPU=@host_cpu@
BUILD_CPU=@build_cpu@
ALL_CFLAGS=-g -O -Wall -DHOST_CPU_STR=\"$(HOST_CPU)\" -DBUILD_CPU=@build_cpu@
-noinst_LTLIBRARIES = libbb.la
+noinst_LIBRARIES = libbb.a
-libbb_la_SOURCES = gz_open.c \
+libbb_a_SOURCES = gz_open.c \
libbb.h \
unzip.c \
wfopen.c \
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -4,11 +4,11 @@ AM_CFLAGS = $(ALL_CFLAGS) -Wall -g -O3 -
#noinst_PROGRAMS = libopkg_test opkg_active_list_test
noinst_PROGRAMS = libopkg_test
-#opkg_hash_test_LDADD = $(top_builddir)/libbb/libbb.la $(top_builddir)/libopkg/libopkg.la
+#opkg_hash_test_LDADD = $(top_builddir)/libbb/libbb.a $(top_builddir)/libopkg/libopkg.a
#opkg_hash_test_SOURCES = opkg_hash_test.c
#opkg_hash_test_CFLAGS = $(ALL_CFLAGS) -I$(top_srcdir)
-#opkg_extract_test_LDADD = $(top_builddir)/libbb/libbb.la $(top_builddir)/libopkg/libopkg.la
+#opkg_extract_test_LDADD = $(top_builddir)/libbb/libbb.a $(top_builddir)/libopkg/libopkg.a
#opkg_extract_test_SOURCES = opkg_extract_test.c
#opkg_extract_test_CFLAGS = $(ALL_CFLAGS) -I$(top_srcdir)
@@ -16,7 +16,7 @@ noinst_PROGRAMS = libopkg_test
#opkg_active_list_test_SOURCES = opkg_active_list_test.c
#opkg_active_list_test_CFLAGS = $(ALL_CFLAGS) -I$(top_srcdir)
-libopkg_test_LDADD = $(top_builddir)/libopkg/libopkg.la
+libopkg_test_LDADD = $(top_builddir)/libopkg/libopkg.a $(top_builddir)/libbb/libbb.a $(CURL_LIBS) $(GPGME_LIBS) $(OPENSSL_LIBS) $(PATHFINDER_LIBS)
libopkg_test_SOURCE = libopkg_test.c
libopkg_test_LDFLAGS = -static
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -2,5 +2,5 @@ AM_CFLAGS = -I${top_srcdir}/libopkg ${AL
bin_PROGRAMS = opkg-cl
opkg_cl_SOURCES = opkg-cl.c
-opkg_cl_LDADD = $(top_builddir)/libopkg/libopkg.la \
- $(top_builddir)/libbb/libbb.la
+opkg_cl_LDADD = $(top_builddir)/libopkg/libopkg.a \
+ $(top_builddir)/libbb/libbb.a $(CURL_LIBS) $(GPGME_LIBS) $(OPENSSL_LIBS) $(PATHFINDER_LIBS)

View File

@ -1,41 +0,0 @@
--- a/libopkg/opkg_cmd.c
+++ b/libopkg/opkg_cmd.c
@@ -551,18 +551,6 @@ opkg_upgrade_cmd(int argc, char **argv)
err = -1;
}
}
- } else {
- pkg_vec_t *installed = pkg_vec_alloc();
-
- pkg_info_preinstall_check();
-
- pkg_hash_fetch_all_installed(installed);
- for (i = 0; i < installed->len; i++) {
- pkg = installed->pkgs[i];
- if (opkg_upgrade_pkg(pkg))
- err = -1;
- }
- pkg_vec_free(installed);
}
if (opkg_configure_packages(NULL))
@@ -1258,7 +1246,7 @@ opkg_print_architecture_cmd(int argc, ch
array for easier maintenance */
static opkg_cmd_t cmds[] = {
{"update", 0, (opkg_cmd_fun_t)opkg_update_cmd, PFM_DESCRIPTION|PFM_SOURCE},
- {"upgrade", 0, (opkg_cmd_fun_t)opkg_upgrade_cmd, PFM_DESCRIPTION|PFM_SOURCE},
+ {"upgrade", 1, (opkg_cmd_fun_t)opkg_upgrade_cmd, PFM_DESCRIPTION|PFM_SOURCE},
{"list", 0, (opkg_cmd_fun_t)opkg_list_cmd, PFM_SOURCE},
{"list_installed", 0, (opkg_cmd_fun_t)opkg_list_installed_cmd, PFM_SOURCE},
{"list-installed", 0, (opkg_cmd_fun_t)opkg_list_installed_cmd, PFM_SOURCE},
--- a/src/opkg-cl.c
+++ b/src/opkg-cl.c
@@ -221,7 +221,7 @@ usage()
printf("\nPackage Manipulation:\n");
printf("\tupdate Update list of available packages\n");
- printf("\tupgrade Upgrade installed packages\n");
+ printf("\tupgrade <pkgs> Upgrade packages\n");
printf("\tinstall <pkgs> Install package(s)\n");
printf("\tconfigure <pkgs> Configure unpacked package(s)\n");
printf("\tremove <pkgs|regexp> Remove package(s)\n");

View File

@ -1,12 +0,0 @@
--- a/src/opkg-cl.c
+++ b/src/opkg-cl.c
@@ -207,6 +207,9 @@ args_parse(int argc, char *argv[])
}
}
+ if(!conf->conf_file && !conf->offline_root)
+ conf->conf_file = xstrdup("/etc/opkg.conf");
+
if (parse_err)
return parse_err;
else

View File

@ -1,23 +0,0 @@
--- a/libopkg/opkg_install.c
+++ b/libopkg/opkg_install.c
@@ -274,6 +274,7 @@ unpack_pkg_control_files(pkg_t *pkg)
while (1) {
char *cf_name;
char *cf_name_in_dest;
+ int i;
cf_name = file_read_line_alloc(conffiles_file);
if (cf_name == NULL) {
@@ -282,6 +283,12 @@ unpack_pkg_control_files(pkg_t *pkg)
if (cf_name[0] == '\0') {
continue;
}
+ for (i = strlen(cf_name) - 1;
+ (i >= 0) && (cf_name[i] == ' ' || cf_name[i] == '\t');
+ i--
+ ) {
+ cf_name[i] = '\0';
+ }
/* Prepend dest->root_dir to conffile name.
Take pains to avoid multiple slashes. */

View File

@ -1,15 +0,0 @@
--- a/libopkg/opkg_message.c
+++ b/libopkg/opkg_message.c
@@ -64,10 +64,10 @@ print_error_list(void)
struct errlist *err = error_list_head;
if (err) {
- printf("Collected errors:\n");
+ fprintf(stderr, "Collected errors:\n");
/* Here we print the errors collected and free the list */
while (err != NULL) {
- printf(" * %s", err->errmsg);
+ fprintf(stderr, " * %s", err->errmsg);
err = err->next;
}
}

View File

@ -1,317 +0,0 @@
--- a/libopkg/parse_util.c
+++ b/libopkg/parse_util.c
@@ -22,6 +22,7 @@
#include "libbb/libbb.h"
#include "parse_util.h"
+#include "pkg_parse.h"
int
is_field(const char *type, const char *line)
@@ -86,3 +87,84 @@ parse_list(const char *raw, unsigned int
*count = line_count;
return depends;
}
+
+int
+parse_from_stream_nomalloc(parse_line_t parse_line, void *item, FILE *fp, uint mask,
+ char **buf0, size_t buf0len)
+{
+ int ret, lineno;
+ char *buf, *nl;
+ size_t buflen;
+
+ lineno = 1;
+ ret = 0;
+
+ buflen = buf0len;
+ buf = *buf0;
+ buf[0] = '\0';
+
+ while (1) {
+ if (fgets(buf, (int)buflen, fp) == NULL) {
+ if (ferror(fp)) {
+ opkg_perror(ERROR, "fgets");
+ ret = -1;
+ } else if (strlen(*buf0) == buf0len-1) {
+ opkg_msg(ERROR, "Missing new line character"
+ " at end of file!\n");
+ parse_line(item, *buf0, mask);
+ }
+ break;
+ }
+
+ nl = strchr(buf, '\n');
+ if (nl == NULL) {
+ if (strlen(buf) < buflen-1) {
+ /*
+ * Line could be exactly buflen-1 long and
+ * missing a newline, but we won't know until
+ * fgets fails to read more data.
+ */
+ opkg_msg(ERROR, "Missing new line character"
+ " at end of file!\n");
+ parse_line(item, *buf0, mask);
+ break;
+ }
+ if (buf0len >= EXCESSIVE_LINE_LEN) {
+ opkg_msg(ERROR, "Excessively long line at "
+ "%d. Corrupt file?\n",
+ lineno);
+ ret = -1;
+ break;
+ }
+
+ /*
+ * Realloc and point buf past the data already read,
+ * at the NULL terminator inserted by fgets.
+ * |<--------------- buf0len ----------------->|
+ * | |<------- buflen ---->|
+ * |---------------------|---------------------|
+ * buf0 buf
+ */
+ buflen = buf0len +1;
+ buf0len *= 2;
+ *buf0 = xrealloc(*buf0, buf0len);
+ buf = *buf0 + buflen -2;
+
+ continue;
+ }
+
+ *nl = '\0';
+
+ lineno++;
+
+ if (parse_line(item, *buf0, mask))
+ break;
+
+ buf = *buf0;
+ buflen = buf0len;
+ buf[0] = '\0';
+ }
+
+ return ret;
+}
+
--- a/libopkg/parse_util.h
+++ b/libopkg/parse_util.h
@@ -22,4 +22,8 @@ int is_field(const char *type, const cha
char *parse_simple(const char *type, const char *line);
char **parse_list(const char *raw, unsigned int *count, const char sep, int skip_field);
+typedef int (*parse_line_t)(void *, const char *, uint);
+int parse_from_stream_nomalloc(parse_line_t parse_line, void *item, FILE *fp, uint mask,
+ char **buf0, size_t buf0len);
+
#endif
--- a/libopkg/pkg_hash.c
+++ b/libopkg/pkg_hash.c
@@ -23,6 +23,7 @@
#include "opkg_message.h"
#include "pkg_vec.h"
#include "pkg_hash.h"
+#include "parse_util.h"
#include "pkg_parse.h"
#include "opkg_utils.h"
#include "sprintf_alloc.h"
@@ -119,8 +120,14 @@ pkg_hash_add_from_file(const char *file_
pkg->src = src;
pkg->dest = dest;
- ret = pkg_parse_from_stream_nomalloc(pkg, fp, 0,
+ ret = parse_from_stream_nomalloc(pkg_parse_line, pkg, fp, 0,
&buf, len);
+
+ if (pkg->name == NULL) {
+ /* probably just a blank line */
+ ret = 1;
+ }
+
if (ret) {
pkg_deinit (pkg);
free(pkg);
--- a/libopkg/pkg_parse.c
+++ b/libopkg/pkg_parse.c
@@ -104,9 +104,11 @@ get_arch_priority(const char *arch)
return 0;
}
-static int
-pkg_parse_line(pkg_t *pkg, const char *line, uint mask)
+int
+pkg_parse_line(void *ptr, const char *line, uint mask)
{
+ pkg_t *pkg = (pkg_t *) ptr;
+
/* these flags are a bit hackish... */
static int reading_conffiles = 0, reading_description = 0;
int ret = 0;
@@ -266,91 +268,6 @@ dont_reset_flags:
}
int
-pkg_parse_from_stream_nomalloc(pkg_t *pkg, FILE *fp, uint mask,
- char **buf0, size_t buf0len)
-{
- int ret, lineno;
- char *buf, *nl;
- size_t buflen;
-
- lineno = 1;
- ret = 0;
-
- buflen = buf0len;
- buf = *buf0;
- buf[0] = '\0';
-
- while (1) {
- if (fgets(buf, (int)buflen, fp) == NULL) {
- if (ferror(fp)) {
- opkg_perror(ERROR, "fgets");
- ret = -1;
- } else if (strlen(*buf0) == buf0len-1) {
- opkg_msg(ERROR, "Missing new line character"
- " at end of file!\n");
- pkg_parse_line(pkg, *buf0, mask);
- }
- break;
- }
-
- nl = strchr(buf, '\n');
- if (nl == NULL) {
- if (strlen(buf) < buflen-1) {
- /*
- * Line could be exactly buflen-1 long and
- * missing a newline, but we won't know until
- * fgets fails to read more data.
- */
- opkg_msg(ERROR, "Missing new line character"
- " at end of file!\n");
- pkg_parse_line(pkg, *buf0, mask);
- break;
- }
- if (buf0len >= EXCESSIVE_LINE_LEN) {
- opkg_msg(ERROR, "Excessively long line at "
- "%d. Corrupt file?\n",
- lineno);
- ret = -1;
- break;
- }
-
- /*
- * Realloc and point buf past the data already read,
- * at the NULL terminator inserted by fgets.
- * |<--------------- buf0len ----------------->|
- * | |<------- buflen ---->|
- * |---------------------|---------------------|
- * buf0 buf
- */
- buflen = buf0len +1;
- buf0len *= 2;
- *buf0 = xrealloc(*buf0, buf0len);
- buf = *buf0 + buflen -2;
-
- continue;
- }
-
- *nl = '\0';
-
- lineno++;
-
- if (pkg_parse_line(pkg, *buf0, mask))
- break;
-
- buf = *buf0;
- buflen = buf0len;
- buf[0] = '\0';
- }
-
- if (pkg->name == NULL) {
- /* probably just a blank line */
- ret = 1;
- }
-
- return ret;
-}
-
-int
pkg_parse_from_stream(pkg_t *pkg, FILE *fp, uint mask)
{
int ret;
@@ -358,8 +275,13 @@ pkg_parse_from_stream(pkg_t *pkg, FILE *
const size_t len = 4096;
buf = xmalloc(len);
- ret = pkg_parse_from_stream_nomalloc(pkg, fp, mask, &buf, len);
+ ret = parse_from_stream_nomalloc(pkg_parse_line, pkg, fp, mask, &buf, len);
free(buf);
+ if (pkg->name == NULL) {
+ /* probably just a blank line */
+ ret = 1;
+ }
+
return ret;
}
--- a/libopkg/pkg_parse.h
+++ b/libopkg/pkg_parse.h
@@ -18,10 +18,11 @@
#ifndef PKG_PARSE_H
#define PKG_PARSE_H
+#include "pkg.h"
+
int parse_version(pkg_t *pkg, const char *raw);
int pkg_parse_from_stream(pkg_t *pkg, FILE *fp, uint mask);
-int pkg_parse_from_stream_nomalloc(pkg_t *pkg, FILE *fp, uint mask,
- char **buf0, size_t buf0len);
+int pkg_parse_line(void *ptr, const char *line, uint mask);
#define EXCESSIVE_LINE_LEN (4096 << 8)
--- a/libopkg/release_parse.c
+++ b/libopkg/release_parse.c
@@ -23,8 +23,10 @@
#include "parse_util.h"
static int
-release_parse_line(release_t *release, const char *line)
+release_parse_line(void *ptr, const char *line, uint mask)
{
+ release_t *release = (release_t *) ptr;
+
int ret = 0;
unsigned int count = 0;
char **list = 0;
@@ -111,25 +113,14 @@ dont_reset_flags:
int
release_parse_from_stream(release_t *release, FILE *fp)
{
- int ret = 0;
- char *buf = NULL;
- size_t buflen, nread;
-
- nread = getline(&buf, &buflen, fp);
- while ( nread != -1 ) {
- if (buf[nread-1] == '\n') buf[nread-1] = '\0';
- if (release_parse_line(release, buf))
- opkg_msg(DEBUG, "Failed to parse release line for %s:\n\t%s\n",
- release->name, buf);
- nread = getline(&buf, &buflen, fp);
- }
-
- if (!feof(fp)) {
- opkg_perror(ERROR, "Problems reading Release file for %sd\n", release->name);
- ret = -1;
- }
+ int ret;
+ char *buf;
+ const size_t len = 4096;
+ buf = xmalloc(len);
+ ret = parse_from_stream_nomalloc(release_parse_line, release, fp, 0, &buf, len);
free(buf);
+
return ret;
}

View File

@ -1,10 +0,0 @@
--- a/libopkg/opkg_remove.c
+++ b/libopkg/opkg_remove.c
@@ -138,7 +138,6 @@ opkg_remove_dependent_pkgs(pkg_t *pkg, a
for (i = 0; i < dependent_pkgs->len; i++) {
err = opkg_remove_pkg(dependent_pkgs->pkgs[i],0);
if (err) {
- pkg_vec_free(dependent_pkgs);
break;
}
}

View File

@ -1,31 +0,0 @@
--- a/libopkg/pkg_parse.c
+++ b/libopkg/pkg_parse.c
@@ -20,6 +20,7 @@
#include <stdio.h>
#include <ctype.h>
+#include <unistd.h>
#include "pkg.h"
#include "opkg_utils.h"
@@ -239,10 +240,16 @@ pkg_parse_line(void *ptr, const char *li
case ' ':
if ((mask & PFM_DESCRIPTION) && reading_description) {
- pkg->description = xrealloc(pkg->description,
- strlen(pkg->description)
- + 1 + strlen(line) + 1);
- strcat(pkg->description, "\n");
+ if (isatty(1)) {
+ pkg->description = xrealloc(pkg->description,
+ strlen(pkg->description)
+ + 1 + strlen(line) + 1);
+ strcat(pkg->description, "\n");
+ } else {
+ pkg->description = xrealloc(pkg->description,
+ strlen(pkg->description)
+ + 1 + strlen(line));
+ }
strcat(pkg->description, (line));
goto dont_reset_flags;
} else if ((mask & PFM_CONFFILES) && reading_conffiles) {

View File

@ -1,169 +0,0 @@
--- a/libopkg/opkg_cmd.c
+++ b/libopkg/opkg_cmd.c
@@ -436,7 +436,7 @@ opkg_configure_packages(char *pkg_name)
for(i = 0; i < ordered->len; i++) {
pkg = ordered->pkgs[i];
- if (pkg_name && fnmatch(pkg_name, pkg->name, 0))
+ if (pkg_name && fnmatch(pkg_name, pkg->name, conf->nocase))
continue;
if (pkg->state_status == SS_UNPACKED) {
@@ -610,7 +610,7 @@ opkg_list_cmd(int argc, char **argv)
for (i=0; i < available->len; i++) {
pkg = available->pkgs[i];
/* if we have package name or pattern and pkg does not match, then skip it */
- if (pkg_name && fnmatch(pkg_name, pkg->name, 0))
+ if (pkg_name && fnmatch(pkg_name, pkg->name, conf->nocase))
continue;
print_pkg(pkg);
}
@@ -637,7 +637,7 @@ opkg_list_installed_cmd(int argc, char *
for (i=0; i < available->len; i++) {
pkg = available->pkgs[i];
/* if we have package name or pattern and pkg does not match, then skip it */
- if (pkg_name && fnmatch(pkg_name, pkg->name, 0))
+ if (pkg_name && fnmatch(pkg_name, pkg->name, conf->nocase))
continue;
print_pkg(pkg);
}
@@ -666,7 +666,7 @@ opkg_list_changed_conffiles_cmd(int argc
for (i=0; i < available->len; i++) {
pkg = available->pkgs[i];
/* if we have package name or pattern and pkg does not match, then skip it */
- if (pkg_name && fnmatch(pkg_name, pkg->name, 0))
+ if (pkg_name && fnmatch(pkg_name, pkg->name, conf->nocase))
continue;
if (nv_pair_list_empty(&pkg->conffiles))
continue;
@@ -722,7 +722,7 @@ opkg_info_status_cmd(int argc, char **ar
for (i=0; i < available->len; i++) {
pkg = available->pkgs[i];
- if (pkg_name && fnmatch(pkg_name, pkg->name, 0)) {
+ if (pkg_name && fnmatch(pkg_name, pkg->name, conf->nocase)) {
continue;
}
@@ -792,7 +792,7 @@ opkg_remove_cmd(int argc, char **argv)
for (i=0; i<argc; i++) {
for (a=0; a<available->len; a++) {
pkg = available->pkgs[a];
- if (fnmatch(argv[i], pkg->name, 0)) {
+ if (fnmatch(argv[i], pkg->name, conf->nocase)) {
continue;
}
if (conf->restrict_to_default_dest) {
@@ -926,7 +926,7 @@ opkg_depends_cmd(int argc, char **argv)
for (j=0; j<available_pkgs->len; j++) {
pkg = available_pkgs->pkgs[j];
- if (fnmatch(argv[i], pkg->name, 0) != 0)
+ if (fnmatch(argv[i], pkg->name, conf->nocase) != 0)
continue;
depends_count = pkg->depends_count +
@@ -1147,9 +1147,9 @@ opkg_what_provides_replaces_cmd(enum wha
((what_field_type == WHATPROVIDES)
? pkg->provides[k]
: pkg->replaces[k]);
- if (fnmatch(target, apkg->name, 0) == 0) {
+ if (fnmatch(target, apkg->name, conf->nocase) == 0) {
opkg_msg(NOTICE, " %s", pkg->name);
- if (strcmp(target, apkg->name) != 0)
+ if ((conf->nocase ? strcasecmp(target, apkg->name) : strcmp(target, apkg->name)) != 0)
opkg_msg(NOTICE, "\t%s %s\n",
rel_str, apkg->name);
opkg_message(NOTICE, "\n");
@@ -1200,7 +1200,7 @@ opkg_search_cmd(int argc, char **argv)
for (iter = str_list_first(installed_files); iter; iter = str_list_next(installed_files, iter)) {
installed_file = (char *)iter->data;
- if (fnmatch(argv[0], installed_file, 0)==0)
+ if (fnmatch(argv[0], installed_file, conf->nocase)==0)
print_pkg(pkg);
}
--- a/libopkg/opkg_conf.c
+++ b/libopkg/opkg_conf.c
@@ -62,6 +62,7 @@ opkg_option_t options[] = {
{ "noaction", OPKG_OPT_TYPE_BOOL, &_conf.noaction },
{ "download_only", OPKG_OPT_TYPE_BOOL, &_conf.download_only },
{ "nodeps", OPKG_OPT_TYPE_BOOL, &_conf.nodeps },
+ { "nocase", OPKG_OPT_TYPE_BOOL, &_conf.nocase },
{ "offline_root", OPKG_OPT_TYPE_STRING, &_conf.offline_root },
{ "overlay_root", OPKG_OPT_TYPE_STRING, &_conf.overlay_root },
{ "proxy_passwd", OPKG_OPT_TYPE_STRING, &_conf.proxy_passwd },
--- a/libopkg/opkg_conf.h
+++ b/libopkg/opkg_conf.h
@@ -24,6 +24,7 @@ extern opkg_conf_t *conf;
#include "config.h"
#include <stdarg.h>
+#include <fnmatch.h> /* FNM_CASEFOLD */
#include "hash_table.h"
#include "pkg_src_list.h"
@@ -79,6 +80,7 @@ struct opkg_conf
int force_remove;
int check_signature;
int nodeps; /* do not follow dependencies */
+ int nocase; /* perform case insensitive matching */
char *offline_root;
char *overlay_root;
int query_all;
--- a/src/opkg-cl.c
+++ b/src/opkg-cl.c
@@ -47,6 +47,7 @@ enum {
ARGS_OPT_NOACTION,
ARGS_OPT_DOWNLOAD_ONLY,
ARGS_OPT_NODEPS,
+ ARGS_OPT_NOCASE,
ARGS_OPT_AUTOREMOVE,
ARGS_OPT_CACHE,
};
@@ -86,6 +87,7 @@ static struct option long_options[] = {
{"noaction", 0, 0, ARGS_OPT_NOACTION},
{"download-only", 0, 0, ARGS_OPT_DOWNLOAD_ONLY},
{"nodeps", 0, 0, ARGS_OPT_NODEPS},
+ {"nocase", 0, 0, ARGS_OPT_NOCASE},
{"offline", 1, 0, 'o'},
{"offline-root", 1, 0, 'o'},
{"add-arch", 1, 0, ARGS_OPT_ADD_ARCH},
@@ -107,7 +109,7 @@ args_parse(int argc, char *argv[])
char *tuple, *targ;
while (1) {
- c = getopt_long_only(argc, argv, "Ad:f:no:p:t:vV::",
+ c = getopt_long_only(argc, argv, "Ad:f:ino:p:t:vV::",
long_options, &option_index);
if (c == -1)
break;
@@ -122,6 +124,9 @@ args_parse(int argc, char *argv[])
case 'f':
conf->conf_file = xstrdup(optarg);
break;
+ case 'i':
+ conf->nocase = FNM_CASEFOLD;
+ break;
case 'o':
conf->offline_root = xstrdup(optarg);
break;
@@ -176,6 +181,9 @@ args_parse(int argc, char *argv[])
case ARGS_OPT_NODEPS:
conf->nodeps = 1;
break;
+ case ARGS_OPT_NOCASE:
+ conf->nocase = FNM_CASEFOLD;
+ break;
case ARGS_OPT_ADD_ARCH:
case ARGS_OPT_ADD_DEST:
tuple = xstrdup(optarg);
@@ -287,6 +295,7 @@ usage()
printf("\t--noaction No action -- test only\n");
printf("\t--download-only No action -- download only\n");
printf("\t--nodeps Do not follow dependencies\n");
+ printf("\t--nocase Perform case insensitive pattern matching\n");
printf("\t--force-removal-of-dependent-packages\n");
printf("\t Remove package and all dependencies\n");
printf("\t--autoremove Remove packages that were installed\n");

View File

@ -1,58 +0,0 @@
--- a/libopkg/opkg_cmd.c
+++ b/libopkg/opkg_cmd.c
@@ -594,7 +594,7 @@ opkg_download_cmd(int argc, char **argv)
static int
-opkg_list_cmd(int argc, char **argv)
+opkg_list_find_cmd(int argc, char **argv, int use_desc)
{
int i;
pkg_vec_t *available;
@@ -610,7 +610,8 @@ opkg_list_cmd(int argc, char **argv)
for (i=0; i < available->len; i++) {
pkg = available->pkgs[i];
/* if we have package name or pattern and pkg does not match, then skip it */
- if (pkg_name && fnmatch(pkg_name, pkg->name, conf->nocase))
+ if (pkg_name && fnmatch(pkg_name, pkg->name, conf->nocase) &&
+ (!use_desc || !pkg->description || fnmatch(pkg_name, pkg->description, conf->nocase)))
continue;
print_pkg(pkg);
}
@@ -619,6 +620,18 @@ opkg_list_cmd(int argc, char **argv)
return 0;
}
+static int
+opkg_list_cmd(int argc, char **argv)
+{
+ return opkg_list_find_cmd(argc, argv, 0);
+}
+
+static int
+opkg_find_cmd(int argc, char **argv)
+{
+ return opkg_list_find_cmd(argc, argv, 1);
+}
+
static int
opkg_list_installed_cmd(int argc, char **argv)
@@ -1262,6 +1275,7 @@ static opkg_cmd_t cmds[] = {
{"configure", 0, (opkg_cmd_fun_t)opkg_configure_cmd, PFM_DESCRIPTION|PFM_SOURCE},
{"files", 1, (opkg_cmd_fun_t)opkg_files_cmd, PFM_DESCRIPTION|PFM_SOURCE},
{"search", 1, (opkg_cmd_fun_t)opkg_search_cmd, PFM_DESCRIPTION|PFM_SOURCE},
+ {"find", 1, (opkg_cmd_fun_t)opkg_find_cmd, PFM_SOURCE},
{"download", 1, (opkg_cmd_fun_t)opkg_download_cmd, PFM_DESCRIPTION|PFM_SOURCE},
{"compare_versions", 1, (opkg_cmd_fun_t)opkg_compare_versions_cmd, PFM_DESCRIPTION|PFM_SOURCE},
{"compare-versions", 1, (opkg_cmd_fun_t)opkg_compare_versions_cmd, PFM_DESCRIPTION|PFM_SOURCE},
--- a/src/opkg-cl.c
+++ b/src/opkg-cl.c
@@ -246,6 +246,7 @@ usage()
printf("\tlist-changed-conffiles List user modified configuration files\n");
printf("\tfiles <pkg> List files belonging to <pkg>\n");
printf("\tsearch <file|regexp> List package providing <file>\n");
+ printf("\tfind <regexp> List packages whose name or description matches <regexp>\n");
printf("\tinfo [pkg|regexp] Display all info for <pkg>\n");
printf("\tstatus [pkg|regexp] Display all status for <pkg>\n");
printf("\tdownload <pkg> Download <pkg> to current directory\n");

View File

@ -1,719 +0,0 @@
--- a/libbb/unarchive.c
+++ b/libbb/unarchive.c
@@ -28,6 +28,7 @@
#include <libgen.h>
#include "libbb.h"
+#include "gzip.h"
#define CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY 1
#define CONFIG_FEATURE_TAR_GNU_EXTENSIONS
@@ -39,38 +40,15 @@ static char *linkname = NULL;
off_t archive_offset;
-#define SEEK_BUF 4096
static ssize_t
-seek_by_read(FILE* fd, size_t len)
-{
- ssize_t cc, total = 0;
- char buf[SEEK_BUF];
-
- while (len) {
- cc = fread(buf, sizeof(buf[0]),
- len > SEEK_BUF ? SEEK_BUF : len,
- fd);
-
- total += cc;
- len -= cc;
-
- if(feof(fd) || ferror(fd))
- break;
- }
- return total;
-}
-
-static void
-seek_sub_file(FILE *fd, const int count)
+seek_forward(struct gzip_handle *zh, ssize_t len)
{
- archive_offset += count;
+ ssize_t slen = gzip_seek(zh, len);
- /* Do not use fseek() on a pipe. It may fail with ESPIPE, leaving the
- * stream at an undefined location.
- */
- seek_by_read(fd, count);
+ if (slen == len)
+ archive_offset += len;
- return;
+ return slen;
}
@@ -87,7 +65,7 @@ seek_sub_file(FILE *fd, const int count)
* trailing '/' or else the last dir will be assumed to be the file prefix
*/
static char *
-extract_archive(FILE *src_stream, FILE *out_stream,
+extract_archive(struct gzip_handle *src_stream, FILE *out_stream,
const file_header_t *file_entry, const int function,
const char *prefix,
int *err)
@@ -129,14 +107,14 @@ extract_archive(FILE *src_stream, FILE *
if (function & extract_to_stream) {
if (S_ISREG(file_entry->mode)) {
- *err = copy_file_chunk(src_stream, out_stream, file_entry->size);
+ *err = gzip_copy(src_stream, out_stream, file_entry->size);
archive_offset += file_entry->size;
}
}
else if (function & extract_one_to_buffer) {
if (S_ISREG(file_entry->mode)) {
buffer = (char *) xmalloc(file_entry->size + 1);
- fread(buffer, 1, file_entry->size, src_stream);
+ gzip_read(src_stream, buffer, file_entry->size);
buffer[file_entry->size] = '\0';
archive_offset += file_entry->size;
goto cleanup;
@@ -156,7 +134,7 @@ extract_archive(FILE *src_stream, FILE *
*err = -1;
error_msg("%s not created: newer or same age file exists", file_entry->name);
}
- seek_sub_file(src_stream, file_entry->size);
+ seek_forward(src_stream, file_entry->size);
goto cleanup;
}
}
@@ -185,11 +163,11 @@ extract_archive(FILE *src_stream, FILE *
} else {
if ((dst_stream = wfopen(full_name, "w")) == NULL) {
*err = -1;
- seek_sub_file(src_stream, file_entry->size);
+ seek_forward(src_stream, file_entry->size);
goto cleanup;
}
archive_offset += file_entry->size;
- *err = copy_file_chunk(src_stream, dst_stream, file_entry->size);
+ *err = gzip_copy(src_stream, dst_stream, file_entry->size);
fclose(dst_stream);
}
break;
@@ -250,7 +228,7 @@ extract_archive(FILE *src_stream, FILE *
/* If we arent extracting data we have to skip it,
* if data size is 0 then then just do it anyway
* (saves testing for it) */
- seek_sub_file(src_stream, file_entry->size);
+ seek_forward(src_stream, file_entry->size);
}
/* extract_list and extract_verbose_list can be used in conjunction
@@ -274,8 +252,8 @@ cleanup:
}
static char *
-unarchive(FILE *src_stream, FILE *out_stream,
- file_header_t *(*get_headers)(FILE *),
+unarchive(struct gzip_handle *src_stream, FILE *out_stream,
+ file_header_t *(*get_headers)(struct gzip_handle *),
void (*free_headers)(file_header_t *),
const int extract_function,
const char *prefix,
@@ -329,7 +307,7 @@ unarchive(FILE *src_stream, FILE *out_st
}
} else {
/* seek past the data entry */
- seek_sub_file(src_stream, file_entry->size);
+ seek_forward(src_stream, file_entry->size);
}
free_headers(file_entry);
}
@@ -337,108 +315,9 @@ unarchive(FILE *src_stream, FILE *out_st
return buffer;
}
-static file_header_t *
-get_header_ar(FILE *src_stream)
-{
- file_header_t *typed;
- union {
- char raw[60];
- struct {
- char name[16];
- char date[12];
- char uid[6];
- char gid[6];
- char mode[8];
- char size[10];
- char magic[2];
- } formated;
- } ar;
- static char *ar_long_names;
-
- if (fread(ar.raw, 1, 60, src_stream) != 60) {
- return(NULL);
- }
- archive_offset += 60;
- /* align the headers based on the header magic */
- if ((ar.formated.magic[0] != '`') || (ar.formated.magic[1] != '\n')) {
- /* some version of ar, have an extra '\n' after each data entry,
- * this puts the next header out by 1 */
- if (ar.formated.magic[1] != '`') {
- error_msg("Invalid magic");
- return(NULL);
- }
- /* read the next char out of what would be the data section,
- * if its a '\n' then it is a valid header offset by 1*/
- archive_offset++;
- if (fgetc(src_stream) != '\n') {
- error_msg("Invalid magic");
- return(NULL);
- }
- /* fix up the header, we started reading 1 byte too early */
- /* raw_header[60] wont be '\n' as it should, but it doesnt matter */
- memmove(ar.raw, &ar.raw[1], 59);
- }
-
- typed = (file_header_t *) xcalloc(1, sizeof(file_header_t));
-
- typed->size = (size_t) atoi(ar.formated.size);
- /* long filenames have '/' as the first character */
- if (ar.formated.name[0] == '/') {
- if (ar.formated.name[1] == '/') {
- /* If the second char is a '/' then this entries data section
- * stores long filename for multiple entries, they are stored
- * in static variable long_names for use in future entries */
- ar_long_names = (char *) xrealloc(ar_long_names, typed->size);
- fread(ar_long_names, 1, typed->size, src_stream);
- archive_offset += typed->size;
- /* This ar entries data section only contained filenames for other records
- * they are stored in the static ar_long_names for future reference */
- return (get_header_ar(src_stream)); /* Return next header */
- } else if (ar.formated.name[1] == ' ') {
- /* This is the index of symbols in the file for compilers */
- seek_sub_file(src_stream, typed->size);
- return (get_header_ar(src_stream)); /* Return next header */
- } else {
- /* The number after the '/' indicates the offset in the ar data section
- (saved in variable long_name) that conatains the real filename */
- if (!ar_long_names) {
- error_msg("Cannot resolve long file name");
- return (NULL);
- }
- typed->name = xstrdup(ar_long_names + atoi(&ar.formated.name[1]));
- }
- } else {
- /* short filenames */
- typed->name = xcalloc(1, 16);
- strncpy(typed->name, ar.formated.name, 16);
- }
- typed->name[strcspn(typed->name, " /")]='\0';
-
- /* convert the rest of the now valid char header to its typed struct */
- parse_mode(ar.formated.mode, &typed->mode);
- typed->mtime = atoi(ar.formated.date);
- typed->uid = atoi(ar.formated.uid);
- typed->gid = atoi(ar.formated.gid);
-
- return(typed);
-}
-
-static void
-free_header_ar(file_header_t *ar_entry)
-{
- if (ar_entry == NULL)
- return;
-
- free(ar_entry->name);
- if (ar_entry->link_name)
- free(ar_entry->link_name);
-
- free(ar_entry);
-}
-
static file_header_t *
-get_header_tar(FILE *tar_stream)
+get_header_tar(struct gzip_handle *tar_stream)
{
union {
unsigned char raw[512];
@@ -467,10 +346,10 @@ get_header_tar(FILE *tar_stream)
long sum = 0;
if (archive_offset % 512 != 0) {
- seek_sub_file(tar_stream, 512 - (archive_offset % 512));
+ seek_forward(tar_stream, 512 - (archive_offset % 512));
}
- if (fread(tar.raw, 1, 512, tar_stream) != 512) {
+ if (gzip_read(tar_stream, tar.raw, 512) != 512) {
/* Unfortunately its common for tar files to have all sorts of
* trailing garbage, fail silently */
// error_msg("Couldnt read header");
@@ -557,7 +436,7 @@ get_header_tar(FILE *tar_stream)
# ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS
case 'L': {
longname = xmalloc(tar_entry->size + 1);
- if(fread(longname, tar_entry->size, 1, tar_stream) != 1)
+ if(gzip_read(tar_stream, longname, tar_entry->size) != tar_entry->size)
return NULL;
longname[tar_entry->size] = '\0';
archive_offset += tar_entry->size;
@@ -566,7 +445,7 @@ get_header_tar(FILE *tar_stream)
}
case 'K': {
linkname = xmalloc(tar_entry->size + 1);
- if(fread(linkname, tar_entry->size, 1, tar_stream) != 1)
+ if(gzip_read(tar_stream, linkname, tar_entry->size) != tar_entry->size)
return NULL;
linkname[tar_entry->size] = '\0';
archive_offset += tar_entry->size;
@@ -642,6 +521,9 @@ deb_extract(const char *package_filename
char *ared_file = NULL;
char ar_magic[8];
int gz_err;
+ struct gzip_handle tar_outer, tar_inner;
+ file_header_t *tar_header;
+ ssize_t len;
*err = 0;
@@ -672,111 +554,44 @@ deb_extract(const char *package_filename
/* set the buffer size */
setvbuf(deb_stream, NULL, _IOFBF, 0x8000);
- /* check ar magic */
- fread(ar_magic, 1, 8, deb_stream);
-
- if (strncmp(ar_magic,"!<arch>",7) == 0) {
- archive_offset = 8;
+ memset(&tar_outer, 0, sizeof(tar_outer));
+ tar_outer.file = deb_stream;
+ gzip_exec(&tar_outer, NULL);
- while ((ar_header = get_header_ar(deb_stream)) != NULL) {
- if (strcmp(ared_file, ar_header->name) == 0) {
- int gunzip_pid = 0;
- FILE *uncompressed_stream;
- /* open a stream of decompressed data */
- uncompressed_stream = gz_open(deb_stream, &gunzip_pid);
- if (uncompressed_stream == NULL) {
- *err = -1;
- goto cleanup;
- }
+ /* walk through outer tar file to find ared_file */
+ while ((tar_header = get_header_tar(&tar_outer)) != NULL) {
+ int name_offset = 0;
+ if (strncmp(tar_header->name, "./", 2) == 0)
+ name_offset = 2;
- archive_offset = 0;
- output_buffer = unarchive(uncompressed_stream,
- out_stream, get_header_tar,
- free_header_tar,
- extract_function, prefix,
- file_list, err);
- fclose(uncompressed_stream);
- gz_err = gz_close(gunzip_pid);
- if (gz_err)
- *err = -1;
- free_header_ar(ar_header);
- break;
- }
- if (fseek(deb_stream, ar_header->size, SEEK_CUR) == -1) {
- opkg_perror(ERROR, "Couldn't fseek into %s", package_filename);
- *err = -1;
- free_header_ar(ar_header);
- goto cleanup;
- }
- free_header_ar(ar_header);
- }
- goto cleanup;
- } else if (strncmp(ar_magic, "\037\213", 2) == 0) {
- /* it's a gz file, let's assume it's an opkg */
- int unzipped_opkg_pid;
- FILE *unzipped_opkg_stream;
- file_header_t *tar_header;
- archive_offset = 0;
- if (fseek(deb_stream, 0, SEEK_SET) == -1) {
- opkg_perror(ERROR, "Couldn't fseek into %s", package_filename);
- *err = -1;
- goto cleanup;
- }
- unzipped_opkg_stream = gz_open(deb_stream, &unzipped_opkg_pid);
- if (unzipped_opkg_stream == NULL) {
- *err = -1;
- goto cleanup;
- }
+ if (strcmp(ared_file, tar_header->name+name_offset) == 0) {
+ memset(&tar_inner, 0, sizeof(tar_inner));
+ tar_inner.gzip = &tar_outer;
+ gzip_exec(&tar_inner, NULL);
- /* walk through outer tar file to find ared_file */
- while ((tar_header = get_header_tar(unzipped_opkg_stream)) != NULL) {
- int name_offset = 0;
- if (strncmp(tar_header->name, "./", 2) == 0)
- name_offset = 2;
- if (strcmp(ared_file, tar_header->name+name_offset) == 0) {
- int gunzip_pid = 0;
- FILE *uncompressed_stream;
- /* open a stream of decompressed data */
- uncompressed_stream = gz_open(unzipped_opkg_stream, &gunzip_pid);
- if (uncompressed_stream == NULL) {
- *err = -1;
- goto cleanup;
- }
- archive_offset = 0;
+ archive_offset = 0;
- output_buffer = unarchive(uncompressed_stream,
- out_stream,
- get_header_tar,
- free_header_tar,
- extract_function,
- prefix,
- file_list,
- err);
+ output_buffer = unarchive(&tar_inner,
+ out_stream,
+ get_header_tar,
+ free_header_tar,
+ extract_function,
+ prefix,
+ file_list,
+ err);
- free_header_tar(tar_header);
- fclose(uncompressed_stream);
- gz_err = gz_close(gunzip_pid);
- if (gz_err)
- *err = -1;
- break;
- }
- seek_sub_file(unzipped_opkg_stream, tar_header->size);
free_header_tar(tar_header);
+ gzip_close(&tar_inner);
+ break;
}
- fclose(unzipped_opkg_stream);
- gz_err = gz_close(unzipped_opkg_pid);
- if (gz_err)
- *err = -1;
- goto cleanup;
- } else {
- *err = -1;
- error_msg("%s: invalid magic", package_filename);
+ seek_forward(&tar_outer, tar_header->size);
+ free_header_tar(tar_header);
}
cleanup:
- if (deb_stream)
- fclose(deb_stream);
+ gzip_close(&tar_outer);
+
if (file_list)
free(file_list);
--- /dev/null
+++ b/libbb/gzip.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2016 Jo-Philipp Wich <jo@mein.io>
+ *
+ * Zlib decrompression utility routines.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <stdio.h>
+#include <signal.h>
+#include <pthread.h>
+
+struct gzip_handle {
+ FILE *file;
+ struct gzip_handle *gzip;
+
+ pid_t pid;
+ int rfd, wfd;
+ struct sigaction pipe_sa;
+ pthread_t thread;
+};
+
+int gzip_exec(struct gzip_handle *zh, const char *filename);
+ssize_t gzip_read(struct gzip_handle *zh, char *buf, ssize_t len);
+ssize_t gzip_copy(struct gzip_handle *zh, FILE *out, ssize_t len);
+int gzip_close(struct gzip_handle *zh);
+FILE *gzip_fdopen(struct gzip_handle *zh, const char *filename);
+
+#define gzip_seek(zh, len) gzip_copy(zh, NULL, len)
--- a/libbb/Makefile.am
+++ b/libbb/Makefile.am
@@ -4,9 +4,8 @@ ALL_CFLAGS=-g -O -Wall -DHOST_CPU_STR=\"
noinst_LIBRARIES = libbb.a
-libbb_a_SOURCES = gz_open.c \
+libbb_a_SOURCES = \
libbb.h \
- unzip.c \
wfopen.c \
unarchive.c \
copy_file.c \
@@ -20,7 +19,8 @@ libbb_a_SOURCES = gz_open.c \
parse_mode.c \
time_string.c \
all_read.c \
- mode_string.c
+ mode_string.c \
+ gzip.c
libbb_la_CFLAGS = $(ALL_CFLAGS)
#libbb_la_LDFLAGS = -static
--- /dev/null
+++ b/libbb/gzip.c
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2016 Jo-Philipp Wich <jo@mein.io>
+ * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
+ *
+ * Zlib decrompression utility routines.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <poll.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+
+#include "gzip.h"
+
+static void
+to_devnull(int fd)
+{
+ int devnull = open("/dev/null", fd ? O_WRONLY : O_RDONLY);
+
+ if (devnull >= 0)
+ dup2(devnull, fd);
+
+ if (devnull > STDERR_FILENO)
+ close(devnull);
+}
+
+void *
+gzip_thread(void *ptr)
+{
+ struct gzip_handle *zh = ptr;
+ char buf[4096];
+ int len, ret;
+
+ while (1) {
+ if (zh->file)
+ len = fread(buf, 1, sizeof(buf), zh->file);
+ else if (zh->gzip)
+ len = gzip_read(zh->gzip, buf, sizeof(buf));
+
+ if (len <= 0)
+ break;
+
+ do {
+ ret = write(zh->wfd, buf, len);
+ } while (ret == -1 && errno == EINTR);
+ }
+
+ close(zh->wfd);
+ zh->wfd = -1;
+}
+
+int
+gzip_exec(struct gzip_handle *zh, const char *filename)
+{
+ int rpipe[2] = { -1, -1 }, wpipe[2] = { -1, -1 };
+ struct sigaction pipe_sa = { .sa_handler = SIG_IGN };
+
+ zh->rfd = -1;
+ zh->wfd = -1;
+
+ if (sigaction(SIGPIPE, &pipe_sa, &zh->pipe_sa) < 0)
+ return -1;
+
+ if (pipe(rpipe) < 0)
+ return -1;
+
+ if (!filename && pipe(wpipe) < 0) {
+ close(rpipe[0]);
+ close(rpipe[1]);
+ return -1;
+ }
+
+ zh->pid = vfork();
+
+ switch (zh->pid) {
+ case -1:
+ return -1;
+
+ case 0:
+ to_devnull(STDERR_FILENO);
+
+ if (filename) {
+ to_devnull(STDIN_FILENO);
+ }
+ else {
+ dup2(wpipe[0], STDIN_FILENO);
+ close(wpipe[0]);
+ close(wpipe[1]);
+ }
+
+ dup2(rpipe[1], STDOUT_FILENO);
+ close(rpipe[0]);
+ close(rpipe[1]);
+
+ execlp("gzip", "gzip", "-d", "-c", filename, NULL);
+ exit(-1);
+
+ default:
+ zh->rfd = rpipe[0];
+ zh->wfd = wpipe[1];
+
+ fcntl(zh->rfd, F_SETFD, fcntl(zh->rfd, F_GETFD) | FD_CLOEXEC);
+ close(rpipe[1]);
+
+ if (zh->wfd >= 0) {
+ fcntl(zh->wfd, F_SETFD, fcntl(zh->wfd, F_GETFD) | FD_CLOEXEC);
+ close(wpipe[0]);
+ pthread_create(&zh->thread, NULL, gzip_thread, zh);
+ }
+ }
+
+ return 0;
+}
+
+ssize_t
+gzip_read(struct gzip_handle *zh, char *buf, ssize_t len)
+{
+ ssize_t ret;
+
+ do {
+ ret = read(zh->rfd, buf, len);
+ } while (ret == -1 && errno != EINTR);
+
+ return ret;
+}
+
+ssize_t
+gzip_copy(struct gzip_handle *zh, FILE *out, ssize_t len)
+{
+ char buf[4096];
+ ssize_t rlen, total = 0;
+
+ while (len > 0) {
+ rlen = gzip_read(zh, buf,
+ (len > sizeof(buf)) ? sizeof(buf) : len);
+
+ if (rlen <= 0)
+ break;
+
+ if (out != NULL) {
+ if (fwrite(buf, 1, rlen, out) != rlen)
+ break;
+ }
+
+ len -= rlen;
+ total += rlen;
+ }
+
+ return total;
+}
+
+FILE *
+gzip_fdopen(struct gzip_handle *zh, const char *filename)
+{
+ memset(zh, 0, sizeof(*zh));
+
+ if (!filename || gzip_exec(zh, filename) < 0)
+ return NULL;
+
+ fcntl(zh->rfd, F_SETFL, fcntl(zh->rfd, F_GETFL) & ~O_NONBLOCK);
+
+ return fdopen(zh->rfd, "r");
+}
+
+int
+gzip_close(struct gzip_handle *zh)
+{
+ int code = -1;
+
+ if (zh->rfd >= 0)
+ close(zh->rfd);
+
+ if (zh->wfd >= 0)
+ close(zh->wfd);
+
+ if (zh->pid > 0) {
+ kill(zh->pid, SIGKILL);
+ waitpid(zh->pid, &code, 0);
+ }
+
+ if (zh->file)
+ fclose(zh->file);
+
+ if (zh->thread)
+ pthread_join(zh->thread, NULL);
+
+ sigaction(SIGPIPE, &zh->pipe_sa, NULL);
+
+ return WIFEXITED(code) ? WEXITSTATUS(code) : -1;
+}
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -3,4 +3,4 @@ bin_PROGRAMS = opkg-cl
opkg_cl_SOURCES = opkg-cl.c
opkg_cl_LDADD = $(top_builddir)/libopkg/libopkg.a \
- $(top_builddir)/libbb/libbb.a $(CURL_LIBS) $(GPGME_LIBS) $(OPENSSL_LIBS) $(PATHFINDER_LIBS)
+ $(top_builddir)/libbb/libbb.a $(CURL_LIBS) $(GPGME_LIBS) $(OPENSSL_LIBS) $(PATHFINDER_LIBS) -lpthread
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -16,7 +16,7 @@ noinst_PROGRAMS = libopkg_test
#opkg_active_list_test_SOURCES = opkg_active_list_test.c
#opkg_active_list_test_CFLAGS = $(ALL_CFLAGS) -I$(top_srcdir)
-libopkg_test_LDADD = $(top_builddir)/libopkg/libopkg.a $(top_builddir)/libbb/libbb.a $(CURL_LIBS) $(GPGME_LIBS) $(OPENSSL_LIBS) $(PATHFINDER_LIBS)
+libopkg_test_LDADD = $(top_builddir)/libopkg/libopkg.a $(top_builddir)/libbb/libbb.a $(CURL_LIBS) $(GPGME_LIBS) $(OPENSSL_LIBS) $(PATHFINDER_LIBS) -lpthread
libopkg_test_SOURCE = libopkg_test.c
libopkg_test_LDFLAGS = -static

View File

@ -1,124 +0,0 @@
--- a/libopkg/opkg.c
+++ b/libopkg/opkg.c
@@ -592,49 +592,8 @@ opkg_update_package_lists(opkg_progress_
src->gzip ? "Packages.gz" : "Packages");
sprintf_alloc(&list_file_name, "%s/%s", lists_dir, src->name);
- if (src->gzip) {
- FILE *in, *out;
- struct _curl_cb_data cb_data;
- char *tmp_file_name = NULL;
-
- sprintf_alloc(&tmp_file_name, "%s/%s.gz", tmp,
- src->name);
-
- opkg_msg(INFO, "Downloading %s to %s...\n", url,
- tmp_file_name);
-
- cb_data.cb = progress_callback;
- cb_data.progress_data = &pdata;
- cb_data.user_data = user_data;
- cb_data.start_range =
- 100 * sources_done / sources_list_count;
- cb_data.finish_range =
- 100 * (sources_done + 1) / sources_list_count;
-
- err = opkg_download(url, tmp_file_name,
- (curl_progress_func) curl_progress_cb,
- &cb_data, 0);
- if (err == 0) {
- opkg_msg(INFO, "Inflating %s...\n",
- tmp_file_name);
- in = fopen(tmp_file_name, "r");
- out = fopen(list_file_name, "w");
- if (in && out)
- unzip(in, out);
- else
- err = 1;
- if (in)
- fclose(in);
- if (out)
- fclose(out);
- unlink(tmp_file_name);
- }
- free(tmp_file_name);
- } else
- err = opkg_download(url, list_file_name, NULL, NULL, 0);
-
- if (err) {
+ if (opkg_download(url, list_file_name, NULL, NULL, 0)) {
opkg_msg(ERROR, "Couldn't retrieve %s\n", url);
result = -1;
}
--- a/libopkg/opkg_cmd.c
+++ b/libopkg/opkg_cmd.c
@@ -162,30 +162,7 @@ opkg_update_cmd(int argc, char **argv)
sprintf_alloc(&url, "%s/%s", src->value, src->gzip ? "Packages.gz" : "Packages");
sprintf_alloc(&list_file_name, "%s/%s", lists_dir, src->name);
- if (src->gzip) {
- char *tmp_file_name;
- FILE *in, *out;
-
- sprintf_alloc (&tmp_file_name, "%s/%s.gz", tmp, src->name);
- err = opkg_download(url, tmp_file_name, NULL, NULL, 0);
- if (err == 0) {
- opkg_msg(NOTICE, "Inflating %s.\n", url);
- in = fopen (tmp_file_name, "r");
- out = fopen (list_file_name, "w");
- if (in && out)
- unzip (in, out);
- else
- err = 1;
- if (in)
- fclose (in);
- if (out)
- fclose (out);
- unlink (tmp_file_name);
- }
- free(tmp_file_name);
- } else
- err = opkg_download(url, list_file_name, NULL, NULL, 0);
- if (err) {
+ if (opkg_download(url, list_file_name, NULL, NULL, 0)) {
failures++;
} else {
opkg_msg(NOTICE, "Updated list of available packages in %s.\n",
--- a/libopkg/pkg_hash.c
+++ b/libopkg/pkg_hash.c
@@ -29,6 +29,7 @@
#include "sprintf_alloc.h"
#include "file_util.h"
#include "libbb/libbb.h"
+#include "libbb/gzip.h"
void
pkg_hash_init(void)
@@ -106,8 +107,15 @@ pkg_hash_add_from_file(const char *file_
char *buf;
const size_t len = 4096;
int ret = 0;
+ struct gzip_handle zh;
+
+ if (src && src->gzip) {
+ fp = gzip_fdopen(&zh, file_name);
+ }
+ else {
+ fp = fopen(file_name, "r");
+ }
- fp = fopen(file_name, "r");
if (fp == NULL) {
opkg_perror(ERROR, "Failed to open %s", file_name);
return -1;
@@ -155,6 +163,9 @@ pkg_hash_add_from_file(const char *file_
free(buf);
fclose(fp);
+ if (src && src->gzip)
+ gzip_close(&zh);
+
return ret;
}

View File

@ -1,16 +0,0 @@
--- a/libopkg/parse_util.c
+++ b/libopkg/parse_util.c
@@ -35,7 +35,12 @@ is_field(const char *type, const char *l
char *
parse_simple(const char *type, const char *line)
{
- return trim_xstrdup(line + strlen(type) + 1);
+ char *field = trim_xstrdup(line + strlen(type) + 1);
+ if (strlen(field) == 0) {
+ free(field);
+ return NULL;
+ }
+ return field;
}
/*

View File

@ -1,11 +0,0 @@
--- a/libopkg/pkg.c
+++ b/libopkg/pkg.c
@@ -731,7 +731,7 @@ pkg_formatted_field(FILE *fp, pkg_t *pkg
} else if (strcasecmp(field, "Priority") == 0) {
fprintf(fp, "Priority: %s\n", pkg->priority);
} else if (strcasecmp(field, "Provides") == 0) {
- if (pkg->provides_count) {
+ if (pkg->provides_count > 1) {
fprintf(fp, "Provides:");
for(i = 1; i < pkg->provides_count; i++) {
fprintf(fp, "%s %s", i == 1 ? "" : ",",

View File

@ -1,85 +0,0 @@
--- a/libopkg/opkg_conf.c
+++ b/libopkg/opkg_conf.c
@@ -54,6 +54,7 @@ opkg_option_t options[] = {
{ "force_reinstall", OPKG_OPT_TYPE_BOOL, &_conf.force_reinstall },
{ "force_space", OPKG_OPT_TYPE_BOOL, &_conf.force_space },
{ "force_postinstall", OPKG_OPT_TYPE_BOOL, &_conf.force_postinstall },
+ { "force_checksum", OPKG_OPT_TYPE_BOOL, &_conf.force_checksum },
{ "check_signature", OPKG_OPT_TYPE_BOOL, &_conf.check_signature },
{ "ftp_proxy", OPKG_OPT_TYPE_STRING, &_conf.ftp_proxy },
{ "http_proxy", OPKG_OPT_TYPE_STRING, &_conf.http_proxy },
--- a/libopkg/opkg_conf.h
+++ b/libopkg/opkg_conf.h
@@ -78,6 +78,7 @@ struct opkg_conf
int force_removal_of_essential_packages;
int force_postinstall;
int force_remove;
+ int force_checksum;
int check_signature;
int nodeps; /* do not follow dependencies */
int nocase; /* perform case insensitive matching */
--- a/libopkg/opkg_install.c
+++ b/libopkg/opkg_install.c
@@ -1327,12 +1327,19 @@ opkg_install_pkg(pkg_t *pkg, int from_up
file_md5 = file_md5sum_alloc(pkg->local_filename);
if (file_md5 && strcmp(file_md5, pkg->md5sum))
{
- opkg_msg(ERROR, "Package %s md5sum mismatch. "
- "Either the opkg or the package index are corrupt. "
- "Try 'opkg update'.\n",
- pkg->name);
- free(file_md5);
- return -1;
+ if (!conf->force_checksum)
+ {
+ opkg_msg(ERROR, "Package %s md5sum mismatch. "
+ "Either the opkg or the package index are corrupt. "
+ "Try 'opkg update'.\n",
+ pkg->name);
+ free(file_md5);
+ return -1;
+ }
+ else
+ {
+ opkg_msg(NOTICE, "Ignored %s md5sum mismatch.\n", pkg->name);
+ }
}
if (file_md5)
free(file_md5);
--- a/src/opkg-cl.c
+++ b/src/opkg-cl.c
@@ -42,6 +42,7 @@ enum {
ARGS_OPT_FORCE_SPACE,
ARGS_OPT_FORCE_POSTINSTALL,
ARGS_OPT_FORCE_REMOVE,
+ ARGS_OPT_FORCE_CHECKSUM,
ARGS_OPT_ADD_ARCH,
ARGS_OPT_ADD_DEST,
ARGS_OPT_NOACTION,
@@ -84,6 +85,8 @@ static struct option long_options[] = {
{"force_postinstall", 0, 0, ARGS_OPT_FORCE_POSTINSTALL},
{"force-remove", 0, 0, ARGS_OPT_FORCE_REMOVE},
{"force_remove", 0, 0, ARGS_OPT_FORCE_REMOVE},
+ {"force-checksum", 0, 0, ARGS_OPT_FORCE_CHECKSUM},
+ {"force_checksum", 0, 0, ARGS_OPT_FORCE_CHECKSUM},
{"noaction", 0, 0, ARGS_OPT_NOACTION},
{"download-only", 0, 0, ARGS_OPT_DOWNLOAD_ONLY},
{"nodeps", 0, 0, ARGS_OPT_NODEPS},
@@ -178,6 +181,9 @@ args_parse(int argc, char *argv[])
case ARGS_OPT_FORCE_REMOVE:
conf->force_remove = 1;
break;
+ case ARGS_OPT_FORCE_CHECKSUM:
+ conf->force_checksum = 1;
+ break;
case ARGS_OPT_NODEPS:
conf->nodeps = 1;
break;
@@ -293,6 +299,7 @@ usage()
printf("\t--force-space Disable free space checks\n");
printf("\t--force-postinstall Run postinstall scripts even in offline mode\n");
printf("\t--force-remove Remove package even if prerm script fails\n");
+ printf("\t--force-checksum Don't fail on checksum mismatches\n");
printf("\t--noaction No action -- test only\n");
printf("\t--download-only No action -- download only\n");
printf("\t--nodeps Do not follow dependencies\n");

View File

@ -1,50 +0,0 @@
--- a/libopkg/opkg_install.c
+++ b/libopkg/opkg_install.c
@@ -1405,9 +1405,11 @@ opkg_install_pkg(pkg_t *pkg, int from_up
opkg_state_changed++;
pkg->state_flag |= SF_FILELIST_CHANGED;
- if (old_pkg)
+ if (old_pkg) {
pkg_remove_orphan_dependent(pkg, old_pkg);
-
+ old_pkg->is_upgrade = 1;
+ pkg->is_upgrade = 1;
+ }
/* XXX: BUG: we really should treat replacement more like an upgrade
* Instead, we're going to remove the replacees
*/
@@ -1466,7 +1468,7 @@ opkg_install_pkg(pkg_t *pkg, int from_up
}
- opkg_msg(INFO, "Installing maintainer scripts.\n");
+ opkg_msg(INFO, "%s maintainer scripts.\n", (pkg->is_upgrade) ? ("Upgrading") : ("Installing"));
if (install_maintainer_scripts(pkg, old_pkg)) {
opkg_msg(ERROR, "Failed to extract maintainer scripts for %s."
" Package debris may remain!\n",
--- a/libopkg/pkg.c
+++ b/libopkg/pkg.c
@@ -1285,6 +1285,12 @@ pkg_run_script(pkg_t *pkg, const char *s
setenv("PKG_ROOT",
pkg->dest ? pkg->dest->root_dir : conf->default_dest->root_dir, 1);
+ if (pkg->is_upgrade)
+ setenv("PKG_UPGRADE", "1", 1);
+ else
+ setenv("PKG_UPGRADE", "0", 1);
+
+
if (! file_exists(path)) {
free(path);
return 0;
--- a/libopkg/pkg.h
+++ b/libopkg/pkg.h
@@ -184,6 +184,7 @@ struct pkg
/* this flag specifies whether the package was installed to satisfy another
* package's dependancies */
int auto_installed;
+ int is_upgrade;
};
pkg_t *pkg_new(void);

View File

@ -1,91 +0,0 @@
--- a/configure.ac
+++ b/configure.ac
@@ -169,6 +169,15 @@ if test "x$want_gpgme" = "xyes"; then
fi
fi
+AC_ARG_ENABLE(usign,
+ AC_HELP_STRING([--enable-usign], [Enable signature checking with usign
+ [[default=yes]] ]),
+ [want_usign="$enableval"], [want_usign="yes"])
+
+if test "x$want_usign" = "xyes"; then
+ AC_DEFINE(HAVE_USIGN, 1, [Define if you want usign support])
+fi
+
AC_SUBST(GPGME_CFLAGS)
AC_SUBST(GPGME_LIBS)
--- a/libopkg/opkg.c
+++ b/libopkg/opkg.c
@@ -599,7 +599,7 @@ opkg_update_package_lists(opkg_progress_
}
free(url);
-#if defined(HAVE_GPGME) || defined(HAVE_OPENSSL)
+#if defined(HAVE_GPGME) || defined(HAVE_OPENSSL) || defined(HAVE_USIGN)
if (conf->check_signature) {
char *sig_file_name;
/* download detached signitures to verify the package lists */
--- a/libopkg/opkg_cmd.c
+++ b/libopkg/opkg_cmd.c
@@ -169,7 +169,7 @@ opkg_update_cmd(int argc, char **argv)
list_file_name);
}
free(url);
-#if defined(HAVE_GPGME) || defined(HAVE_OPENSSL)
+#if defined(HAVE_GPGME) || defined(HAVE_OPENSSL) || defined(HAVE_USIGN)
if (conf->check_signature) {
/* download detached signitures to verify the package lists */
/* get the url for the sig file */
--- a/libopkg/opkg_install.c
+++ b/libopkg/opkg_install.c
@@ -1288,7 +1288,7 @@ opkg_install_pkg(pkg_t *pkg, int from_up
}
/* check that the repository is valid */
- #if defined(HAVE_GPGME) || defined(HAVE_OPENSSL)
+ #if defined(HAVE_GPGME) || defined(HAVE_OPENSSL) || defined(HAVE_USIGN)
char *list_file_name, *sig_file_name, *lists_dir;
/* check to ensure the package has come from a repository */
--- a/libopkg/opkg_download.c
+++ b/libopkg/opkg_download.c
@@ -19,6 +19,7 @@
#include "config.h"
+#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <libgen.h>
@@ -342,7 +343,28 @@ opkg_prepare_url_for_install(const char
int
opkg_verify_file (char *text_file, char *sig_file)
{
-#if defined HAVE_GPGME
+#if defined HAVE_USIGN
+ int status = -1;
+ int pid;
+
+ if (conf->check_signature == 0 )
+ return 0;
+
+ pid = fork();
+ if (pid < 0)
+ return -1;
+
+ if (!pid) {
+ execl("/usr/sbin/opkg-key", "opkg-key", "verify", sig_file, text_file, NULL);
+ exit(255);
+ }
+
+ waitpid(pid, &status, 0);
+ if (!WIFEXITED(status) || WEXITSTATUS(status))
+ return -1;
+
+ return 0;
+#elif defined HAVE_GPGME
if (conf->check_signature == 0 )
return 0;
int status = -1;

View File

@ -1,70 +0,0 @@
--- a/libopkg/opkg_conf.h
+++ b/libopkg/opkg_conf.h
@@ -80,6 +80,7 @@ struct opkg_conf
int force_remove;
int force_checksum;
int check_signature;
+ int force_signature;
int nodeps; /* do not follow dependencies */
int nocase; /* perform case insensitive matching */
char *offline_root;
--- a/src/opkg-cl.c
+++ b/src/opkg-cl.c
@@ -51,6 +51,7 @@ enum {
ARGS_OPT_NOCASE,
ARGS_OPT_AUTOREMOVE,
ARGS_OPT_CACHE,
+ ARGS_OPT_FORCE_SIGNATURE,
};
static struct option long_options[] = {
@@ -87,6 +88,8 @@ static struct option long_options[] = {
{"force_remove", 0, 0, ARGS_OPT_FORCE_REMOVE},
{"force-checksum", 0, 0, ARGS_OPT_FORCE_CHECKSUM},
{"force_checksum", 0, 0, ARGS_OPT_FORCE_CHECKSUM},
+ {"force-signature", 0, 0, ARGS_OPT_FORCE_SIGNATURE},
+ {"force_signature", 0, 0, ARGS_OPT_FORCE_SIGNATURE},
{"noaction", 0, 0, ARGS_OPT_NOACTION},
{"download-only", 0, 0, ARGS_OPT_DOWNLOAD_ONLY},
{"nodeps", 0, 0, ARGS_OPT_NODEPS},
@@ -210,6 +213,9 @@ args_parse(int argc, char *argv[])
case ARGS_OPT_DOWNLOAD_ONLY:
conf->download_only = 1;
break;
+ case ARGS_OPT_FORCE_SIGNATURE:
+ conf->force_signature = 1;
+ break;
case ':':
parse_err = -1;
break;
--- a/libopkg/opkg_install.c
+++ b/libopkg/opkg_install.c
@@ -1306,13 +1306,15 @@ opkg_install_pkg(pkg_t *pkg, int from_up
if (opkg_verify_file (list_file_name, sig_file_name)){
opkg_msg(ERROR, "Failed to verify the signature of %s.\n",
list_file_name);
- return -1;
+ if (!conf->force_signature)
+ return -1;
}
}else{
opkg_msg(ERROR, "Signature file is missing for %s. "
"Perhaps you need to run 'opkg update'?\n",
pkg->name);
- return -1;
+ if (!conf->force_signature)
+ return -1;
}
free (lists_dir);
--- a/libopkg/opkg_cmd.c
+++ b/libopkg/opkg_cmd.c
@@ -196,7 +196,7 @@ opkg_update_cmd(int argc, char **argv)
else
opkg_msg(NOTICE, "Signature check failed.\n");
}
- if (err) {
+ if (err && !conf->force_signature) {
/* The signature was wrong so delete it */
opkg_msg(NOTICE, "Remove wrong Signature file.\n");
unlink (tmp_file_name);

View File

@ -1,812 +0,0 @@
--- a/libopkg/Makefile.am
+++ b/libopkg/Makefile.am
@@ -15,7 +15,6 @@ opkg_cmd_sources = opkg_cmd.c opkg_cmd.h
opkg_upgrade.c opkg_upgrade.h \
opkg_remove.c opkg_remove.h
opkg_db_sources = opkg_conf.c opkg_conf.h \
- release.c release.h release_parse.c release_parse.h \
opkg_utils.c opkg_utils.h pkg.c pkg.h hash_table.h \
pkg_depends.c pkg_depends.h pkg_extract.c pkg_extract.h \
hash_table.c pkg_hash.c pkg_hash.h pkg_parse.c pkg_parse.h \
@@ -28,7 +27,6 @@ opkg_list_sources = conffile.c conffile.
active_list.c active_list.h list.h
opkg_util_sources = file_util.c file_util.h opkg_message.h opkg_message.c md5.c md5.h \
parse_util.c parse_util.h \
- cksum_list.c cksum_list.h \
sprintf_alloc.c sprintf_alloc.h \
xregex.c xregex.h xsystem.c xsystem.h
if HAVE_PATHFINDER
--- a/libopkg/cksum_list.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/* cksum_lis.c - the opkg package management system
-
- Copyright (C) 2010,2011 Javier Palacios
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2, or (at
- your option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-*/
-
-#include "config.h"
-
-#include <stdio.h>
-
-#include "cksum_list.h"
-#include "libbb/libbb.h"
-
-
-int cksum_init(cksum_t *cksum, char **itemlist)
-{
- cksum->value = xstrdup(*itemlist++);
- cksum->size = atoi(*itemlist++);
- cksum->name = xstrdup(*itemlist++);
-
- return 0;
-}
-
-void cksum_deinit(cksum_t *cksum)
-{
- free (cksum->name);
- cksum->name = NULL;
-
- free (cksum->value);
- cksum->value = NULL;
-}
-
-void cksum_list_init(cksum_list_t *list)
-{
- void_list_init((void_list_t *) list);
-}
-
-void cksum_list_deinit(cksum_list_t *list)
-{
- cksum_list_elt_t *iter, *n;
- cksum_t *cksum;
-
- list_for_each_entry_safe(iter, n, &list->head, node) {
- cksum = (cksum_t *)iter->data;
- cksum_deinit(cksum);
-
- /* malloced in cksum_list_append */
- free(cksum);
- iter->data = NULL;
- }
- void_list_deinit((void_list_t *) list);
-}
-
-cksum_t *cksum_list_append(cksum_list_t *list, char **itemlist)
-{
- /* freed in cksum_list_deinit */
- cksum_t *cksum = xcalloc(1, sizeof(cksum_t));
- cksum_init(cksum, itemlist);
-
- void_list_append((void_list_t *) list, cksum);
-
- return cksum;
-}
-
-const cksum_t *cksum_list_find(cksum_list_t *list, const char *name)
-{
- cksum_list_elt_t *iter;
- cksum_t *cksum;
-
- list_for_each_entry(iter, &list->head, node) {
- cksum = (cksum_t *)iter->data;
- if (strcmp(cksum->name, name) == 0) {
- return cksum;
- }
- }
- return NULL;
-}
-
--- a/libopkg/cksum_list.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* cksum_list.h - the opkg package management system
-
- Copyright (C) 2010,2011 Javier Palacios
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2, or (at
- your option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-*/
-
-#ifndef CKSUM_LIST_H
-#define CKSUM_LIST_H
-
-typedef struct
-{
- char *name;
- char *value;
- int size;
-} cksum_t;
-
-int cksum_init(cksum_t *cksum, char **itemlist);
-void cksum_deinit(cksum_t *cksum);
-
-#include "void_list.h"
-
-typedef struct void_list_elt cksum_list_elt_t;
-
-typedef struct void_list cksum_list_t;
-
-static inline int cksum_list_empty(cksum_list_t *list)
-{
- return void_list_empty ((void_list_t *)list);
-}
-
-void cksum_list_init(cksum_list_t *list);
-void cksum_list_deinit(cksum_list_t *list);
-
-cksum_t *cksum_list_append(cksum_list_t *list, char **itemlist);
-const cksum_t *cksum_list_find(cksum_list_t *list, const char *name);
-
-#endif
--- a/libopkg/release.c
+++ /dev/null
@@ -1,342 +0,0 @@
-/* release.c - the opkg package management system
-
- Copyright (C) 2010,2011 Javier Palacios
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2, or (at
- your option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-*/
-
-#include <unistd.h>
-#include <ctype.h>
-
-#include "release.h"
-#include "opkg_utils.h"
-#include "libbb/libbb.h"
-
-#include "opkg_download.h"
-#include "sprintf_alloc.h"
-
-#include "release_parse.h"
-
-#include "parse_util.h"
-#include "file_util.h"
-
-static void
-release_init(release_t *release)
-{
- release->name = NULL;
- release->datestring = NULL;
- release->architectures = NULL;
- release->architectures_count = 0;
- release->components = NULL;
- release->components_count = 0;
- release->complist = NULL;
- release->complist_count = 0;
-}
-
-release_t *
-release_new(void)
-{
- release_t *release;
-
- release = xcalloc(1, sizeof(release_t));
- release_init(release);
-
- return release;
-}
-
-void
-release_deinit(release_t *release)
-{
- int i;
-
- free(release->name);
- free(release->datestring);
-
- for(i = 0; i < release->architectures_count; i++){
- free(release->architectures[i]);
- }
- free(release->architectures);
-
- for(i = 0; i < release->components_count; i++){
- free(release->components[i]);
- }
- free(release->components);
-
- for(i = 0; i < release->complist_count; i++){
- free(release->complist[i]);
- }
- free(release->complist);
-
-}
-
-int
-release_init_from_file(release_t *release, const char *filename)
-{
- int err = 0;
- FILE *release_file;
-
- release_file = fopen(filename, "r");
- if (release_file == NULL) {
- opkg_perror(ERROR, "Failed to open %s", filename);
- return -1;
- }
-
- err=release_parse_from_stream(release, release_file);
- if (!err) {
- if (!release_arch_supported(release)) {
- opkg_msg(ERROR, "No valid architecture found on Release file.\n");
- err = -1;
- }
- }
-
- return err;
-}
-
-const char *
-item_in_list(const char *comp, char **complist, const unsigned int count)
-{
- int i;
-
- if (!complist)
- return comp;
-
- for(i = 0; i < count; i++){
- if (strcmp(comp, complist[i]) == 0)
- return complist[i];
- }
-
- return NULL;
-}
-
-int
-release_arch_supported(release_t *release)
-{
- nv_pair_list_elt_t *l;
-
- list_for_each_entry(l , &conf->arch_list.head, node) {
- nv_pair_t *nv = (nv_pair_t *)l->data;
- if (item_in_list(nv->name, release->architectures, release->architectures_count)) {
- opkg_msg(DEBUG, "Arch %s (priority %s) supported for dist %s.\n",
- nv->name, nv->value, release->name);
- return 1;
- }
- }
-
- return 0;
-}
-
-int
-release_comps_supported(release_t *release, const char *complist)
-{
- int ret = 1;
- int i;
-
- if (complist) {
- release->complist = parse_list(complist, &release->complist_count, ' ', 1);
- for(i = 0; i < release->complist_count; i++){
- if (!item_in_list(release->complist[i], release->components, release->components_count)) {
- opkg_msg(ERROR, "Component %s not supported for dist %s.\n",
- release->complist[i], release->name);
- ret = 0;
- }
- }
- }
-
- return ret;
-}
-
-const char **
-release_comps(release_t *release, unsigned int *count)
-{
- char **comps = release->complist;
-
- if (!comps) {
- comps = release->components;
- *count = release->components_count;
- } else {
- *count = release->complist_count;
- }
-
- return (const char **)comps;
-}
-
-int
-release_download(release_t *release, pkg_src_t *dist, char *lists_dir, char *tmpdir)
-{
- int ret = 0;
- unsigned int ncomp;
- const char **comps = release_comps(release, &ncomp);
- nv_pair_list_elt_t *l;
- int i;
-
- for(i = 0; i < ncomp; i++){
- int err = 0;
- char *prefix;
-
- sprintf_alloc(&prefix, "%s/dists/%s/%s/binary", dist->value, dist->name,
- comps[i]);
-
- list_for_each_entry(l , &conf->arch_list.head, node) {
- char *url;
- char *tmp_file_name, *list_file_name;
- char *subpath = NULL;
-
- nv_pair_t *nv = (nv_pair_t *)l->data;
-
- sprintf_alloc(&list_file_name, "%s/%s-%s-%s", lists_dir, dist->name, comps[i], nv->name);
-
- sprintf_alloc(&tmp_file_name, "%s/%s-%s-%s%s", tmpdir, dist->name, comps[i], nv->name, ".gz");
-
- sprintf_alloc(&subpath, "%s/binary-%s/%s", comps[i], nv->name, dist->gzip ? "Packages.gz" : "Packages");
-
- if (dist->gzip) {
- sprintf_alloc(&url, "%s-%s/Packages.gz", prefix, nv->name);
- err = opkg_download(url, tmp_file_name, NULL, NULL, 1);
- if (!err) {
- err = release_verify_file(release, tmp_file_name, subpath);
- if (err) {
- unlink (tmp_file_name);
- unlink (list_file_name);
- }
- }
- if (!err) {
- FILE *in, *out;
- opkg_msg(NOTICE, "Inflating %s.\n", url);
- in = fopen (tmp_file_name, "r");
- out = fopen (list_file_name, "w");
- if (in && out) {
- err = unzip (in, out);
- if (err)
- opkg_msg(INFO, "Corrumpt file at %s.\n", url);
- } else
- err = 1;
- if (in)
- fclose (in);
- if (out)
- fclose (out);
- unlink (tmp_file_name);
- }
- free(url);
- }
-
- if (err) {
- sprintf_alloc(&url, "%s-%s/Packages", prefix, nv->name);
- err = opkg_download(url, list_file_name, NULL, NULL, 1);
- if (!err) {
- err = release_verify_file(release, tmp_file_name, subpath);
- if (err)
- unlink (list_file_name);
- }
- free(url);
- }
-
- free(tmp_file_name);
- free(list_file_name);
- }
-
- if(err)
- ret = 1;
-
- free(prefix);
- }
-
- return ret;
-}
-
-int
-release_get_size(release_t *release, const char *pathname)
-{
- const cksum_t *cksum;
-
- if (release->md5sums) {
- cksum = cksum_list_find(release->md5sums, pathname);
- return cksum->size;
- }
-
-#ifdef HAVE_SHA256
- if (release->sha256sums) {
- cksum = cksum_list_find(release->sha256sums, pathname);
- return cksum->size;
- }
-#endif
-
- return -1;
-}
-
-const char *
-release_get_md5(release_t *release, const char *pathname)
-{
- const cksum_t *cksum;
-
- if (release->md5sums) {
- cksum = cksum_list_find(release->md5sums, pathname);
- return cksum->value;
- }
-
- return '\0';
-}
-
-#ifdef HAVE_SHA256
-const char *
-release_get_sha256(release_t *release, const char *pathname)
-{
- const cksum_t *cksum;
-
- if (release->sha256sums) {
- cksum = cksum_list_find(release->sha256sums, pathname);
- return cksum->value;
- }
-
- return '\0';
-}
-#endif
-
-int
-release_verify_file(release_t *release, const char* file_name, const char *pathname)
-{
- struct stat f_info;
- char *f_md5 = NULL;
- const char *md5 = release_get_md5(release, pathname);
-#ifdef HAVE_SHA256
- char *f_sha256 = NULL;
- const char *sha256 = release_get_sha256(release, pathname);
-#endif
- int ret = 0;
-
- if (stat(file_name, &f_info) || (f_info.st_size!=release_get_size(release, pathname))) {
- opkg_msg(ERROR, "Size verification failed for %s - %s.\n", release->name, pathname);
- ret = 1;
- } else {
-
- f_md5 = file_md5sum_alloc(file_name);
-#ifdef HAVE_SHA256
- f_sha256 = file_sha256sum_alloc(file_name);
-#endif
-
- if (md5 && strcmp(md5, f_md5)) {
- opkg_msg(ERROR, "MD5 verification failed for %s - %s.\n", release->name, pathname);
- ret = 1;
-#ifdef HAVE_SHA256
- } else if (sha256 && strcmp(sha256, f_sha256)) {
- opkg_msg(ERROR, "SHA256 verification failed for %s - %s.\n", release->name, pathname);
- ret = 1;
-#endif
- }
-
- }
-
- free(f_md5);
-#ifdef HAVE_SHA256
- free(f_sha256);
-#endif
-
- return ret;
-}
--- a/libopkg/release.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* release.h - the opkg package management system
-
- Copyright (C) 2010,2011 Javier Palacios
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2, or (at
- your option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-*/
-
-#ifndef RELEASE_H
-#define RELEASE_H
-
-#include <stdio.h>
-#include "pkg.h"
-#include "cksum_list.h"
-
-struct release
-{
- char *name;
- char *datestring;
- char **architectures;
- unsigned int architectures_count;
- char **components;
- unsigned int components_count;
- cksum_list_t *md5sums;
-#ifdef HAVE_SHA256
- cksum_list_t *sha256sums;
-#endif
- char **complist;
- unsigned int complist_count;
-};
-
-typedef struct release release_t;
-
-release_t *release_new(void);
-void release_deinit(release_t *release);
-int release_init_from_file(release_t *release, const char *filename);
-
-int release_arch_supported(release_t *release);
-int release_comps_supported(release_t *release, const char *complist);
-int release_download(release_t *release, pkg_src_t *dist, char *lists_dir, char *tmpdir);
-
-const char **release_comps(release_t *release, unsigned int *count);
-
-int release_verify_file(release_t *release, const char *filename, const char *pathname);
-
-#endif
--- a/libopkg/release_parse.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/* release_parse.c - the opkg package management system
-
- Copyright (C) 2010,2011 Javier Palacios
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2, or (at
- your option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-*/
-
-#include "config.h"
-
-#include <stdio.h>
-
-#include "release.h"
-#include "release_parse.h"
-#include "libbb/libbb.h"
-#include "parse_util.h"
-
-static int
-release_parse_line(void *ptr, const char *line, uint mask)
-{
- release_t *release = (release_t *) ptr;
-
- int ret = 0;
- unsigned int count = 0;
- char **list = 0;
- static int reading_md5sums = 0;
-#ifdef HAVE_SHA256
- static int reading_sha256sums = 0;
-#endif
-
- switch (*line) {
- case 'A':
- if (is_field("Architectures", line)) {
- release->architectures = parse_list(line, &release->architectures_count, ' ', 0);
- }
- break;
-
- case 'C':
- if (is_field("Codename", line)) {
- release->name = parse_simple("Codename", line);
- }
- else if (is_field("Components", line)) {
- release->components = parse_list(line, &release->components_count, ' ', 0);
- }
- break;
-
- case 'D':
- if (is_field("Date", line)) {
- release->datestring = parse_simple("Date", line);
- }
- break;
-
- case 'M':
- if (is_field("MD5sum", line)) {
- reading_md5sums = 1;
- if (release->md5sums == NULL) {
- release->md5sums = xcalloc(1, sizeof(cksum_list_t));
- cksum_list_init(release->md5sums);
- }
- goto dont_reset_flags;
- }
- break;
-
-#ifdef HAVE_SHA256
- case 'S':
- if (is_field("SHA256", line)) {
- reading_sha256sums = 1;
- if (release->sha256sums == NULL) {
- release->sha256sums = xcalloc(1, sizeof(cksum_list_t));
- cksum_list_init(release->sha256sums);
- }
- goto dont_reset_flags;
- }
- break;
-#endif
-
- case ' ':
- if (reading_md5sums) {
- list = parse_list(line, &count, ' ', 1);
- cksum_list_append(release->md5sums, list);
- goto dont_reset_flags;
- }
-#ifdef HAVE_SHA256
- else if (reading_sha256sums) {
- list = parse_list(line, &count, ' ', 1);
- cksum_list_append(release->sha256sums, list);
- goto dont_reset_flags;
- }
-#endif
- break;
-
- default:
- ret = 1;
- }
-
- reading_md5sums = 0;
-#ifdef HAVE_SHA256
- reading_sha256sums = 0;
-#endif
-
-dont_reset_flags:
-
- return ret;
-}
-
-int
-release_parse_from_stream(release_t *release, FILE *fp)
-{
- int ret;
- char *buf;
- const size_t len = 4096;
-
- buf = xmalloc(len);
- ret = parse_from_stream_nomalloc(release_parse_line, release, fp, 0, &buf, len);
- free(buf);
-
- return ret;
-}
-
--- a/libopkg/release_parse.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* release_parse.h - the opkg package management system
-
- Copyright (C) 2010,2011 Javier Palacios
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2, or (at
- your option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-*/
-
-#ifndef RELEASE_PARSE_H
-#define RELEASE_PARSE_H
-
-int release_parse_from_stream(release_t *release, FILE *fp);
-
-#endif
--- a/libopkg/opkg_cmd.c
+++ b/libopkg/opkg_cmd.c
@@ -27,7 +27,6 @@
#include "opkg_conf.h"
#include "opkg_cmd.h"
#include "opkg_message.h"
-#include "release.h"
#include "pkg.h"
#include "pkg_dest.h"
#include "pkg_parse.h"
@@ -114,39 +113,6 @@ opkg_update_cmd(int argc, char **argv)
}
- for (iter = void_list_first(&conf->dist_src_list); iter; iter = void_list_next(&conf->dist_src_list, iter)) {
- char *url, *list_file_name;
-
- src = (pkg_src_t *)iter->data;
-
- sprintf_alloc(&url, "%s/dists/%s/Release", src->value, src->name);
-
- sprintf_alloc(&list_file_name, "%s/%s", lists_dir, src->name);
- err = opkg_download(url, list_file_name, NULL, NULL, 0);
- if (!err) {
- opkg_msg(NOTICE, "Downloaded release files for dist %s.\n",
- src->name);
- release_t *release = release_new();
- err = release_init_from_file(release, list_file_name);
- if (!err) {
- if (!release_comps_supported(release, src->extra_data))
- err = -1;
- }
- if (!err) {
- err = release_download(release, src, lists_dir, tmp);
- }
- release_deinit(release);
- if (err)
- unlink(list_file_name);
- }
-
- if (err)
- failures++;
-
- free(list_file_name);
- free(url);
- }
-
for (iter = void_list_first(&conf->pkg_src_list); iter; iter = void_list_next(&conf->pkg_src_list, iter)) {
char *url, *list_file_name;
--- a/libopkg/pkg_hash.c
+++ b/libopkg/pkg_hash.c
@@ -18,7 +18,6 @@
#include <stdio.h>
#include "hash_table.h"
-#include "release.h"
#include "pkg.h"
#include "opkg_message.h"
#include "pkg_vec.h"
@@ -184,40 +183,6 @@ pkg_hash_load_feeds(void)
lists_dir = conf->restrict_to_default_dest ?
conf->default_dest->lists_dir : conf->lists_dir;
- for (iter = void_list_first(&conf->dist_src_list); iter;
- iter = void_list_next(&conf->dist_src_list, iter)) {
-
- src = (pkg_src_t *)iter->data;
-
- sprintf_alloc(&list_file, "%s/%s", lists_dir, src->name);
-
- if (file_exists(list_file)) {
- int i;
- release_t *release = release_new();
- if(release_init_from_file(release, list_file)) {
- free(list_file);
- return -1;
- }
-
- unsigned int ncomp;
- const char **comps = release_comps(release, &ncomp);
- subdist = (pkg_src_t *) xmalloc(sizeof(pkg_src_t));
- memcpy(subdist, src, sizeof(pkg_src_t));
-
- for(i = 0; i < ncomp; i++){
- subdist->name = NULL;
- sprintf_alloc(&subdist->name, "%s-%s", src->name, comps[i]);
- if (dist_hash_add_from_file(lists_dir, subdist)) {
- free(subdist->name); free(subdist);
- free(list_file);
- return -1;
- }
- }
- free(subdist->name); free(subdist);
- }
- free(list_file);
- }
-
for (iter = void_list_first(&conf->pkg_src_list); iter;
iter = void_list_next(&conf->pkg_src_list, iter)) {

View File

@ -1,192 +0,0 @@
--- a/libopkg/conffile.c
+++ b/libopkg/conffile.c
@@ -36,7 +36,7 @@ void conffile_deinit(conffile_t *conffil
int conffile_has_been_modified(conffile_t *conffile)
{
- char *md5sum;
+ char *chksum;
char *filename = conffile->name;
char *root_filename;
int ret = 1;
@@ -48,16 +48,23 @@ int conffile_has_been_modified(conffile_
root_filename = root_filename_alloc(filename);
- md5sum = file_md5sum_alloc(root_filename);
-
- if (md5sum && (ret = strcmp(md5sum, conffile->value))) {
- opkg_msg(INFO, "Conffile %s:\n\told md5=%s\n\tnew md5=%s\n",
- conffile->name, md5sum, conffile->value);
+#ifdef HAVE_MD5
+ if(conffile->value && strlen(conffile->value) > 33) {
+ chksum = file_sha256sum_alloc(root_filename);
+ } else {
+ chksum = file_md5sum_alloc(root_filename);
+ }
+#else
+ chksum = file_sha256sum_alloc(root_filename);
+#endif
+ if (chksum && (ret = strcmp(chksum, conffile->value))) {
+ opkg_msg(INFO, "Conffile %s:\n\told chk=%s\n\tnew chk=%s\n",
+ conffile->name, chksum, conffile->value);
}
free(root_filename);
- if (md5sum)
- free(md5sum);
+ if (chksum)
+ free(chksum);
return ret;
}
--- a/libopkg/file_util.c
+++ b/libopkg/file_util.c
@@ -26,7 +26,9 @@
#include "sprintf_alloc.h"
#include "file_util.h"
+#ifdef HAVE_MD5
#include "md5.h"
+#endif
#include "libbb/libbb.h"
#if defined HAVE_SHA256
@@ -135,6 +137,7 @@ file_mkdir_hier(const char *path, long m
return make_directory(path, mode, FILEUTILS_RECUR);
}
+#ifdef HAVE_MD5
char *file_md5sum_alloc(const char *file_name)
{
static const int md5sum_bin_len = 16;
@@ -180,6 +183,7 @@ char *file_md5sum_alloc(const char *file
return md5sum_hex;
}
+#endif
#ifdef HAVE_SHA256
char *file_sha256sum_alloc(const char *file_name)
--- a/libopkg/opkg_install.c
+++ b/libopkg/opkg_install.c
@@ -1082,7 +1082,7 @@ resolve_conffiles(pkg_t *pkg)
conffile_list_elt_t *iter;
conffile_t *cf;
char *cf_backup;
- char *md5sum;
+ char *chksum;
if (conf->noaction) return 0;
@@ -1093,7 +1093,7 @@ resolve_conffiles(pkg_t *pkg)
/* Might need to initialize the md5sum for each conffile */
if (cf->value == NULL) {
- cf->value = file_md5sum_alloc(root_filename);
+ cf->value = file_sha256sum_alloc(root_filename);
}
if (!file_exists(root_filename)) {
@@ -1105,8 +1105,16 @@ resolve_conffiles(pkg_t *pkg)
if (file_exists(cf_backup)) {
/* Let's compute md5 to test if files are changed */
- md5sum = file_md5sum_alloc(cf_backup);
- if (md5sum && cf->value && strcmp(cf->value,md5sum) != 0 ) {
+#ifdef HAVE_MD5
+ if(cf->value && strlen(cf->value) > 33) {
+ chksum = file_sha256sum_alloc(cf_backup);
+ } else {
+ chksum = file_md5sum_alloc(cf_backup);
+ }
+#else
+ chksum = file_sha256sum_alloc(cf_backup);
+#endif
+ if (chksum && cf->value && strcmp(cf->value,chksum) != 0 ) {
if (conf->force_maintainer) {
opkg_msg(NOTICE, "Conffile %s using maintainer's setting.\n",
cf_backup);
@@ -1123,8 +1131,8 @@ resolve_conffiles(pkg_t *pkg)
}
}
unlink(cf_backup);
- if (md5sum)
- free(md5sum);
+ if (chksum)
+ free(chksum);
}
free(cf_backup);
@@ -1323,6 +1331,7 @@ opkg_install_pkg(pkg_t *pkg, int from_up
}
#endif
+#ifdef HAVE_MD5
/* Check for md5 values */
if (pkg->md5sum)
{
@@ -1346,6 +1355,7 @@ opkg_install_pkg(pkg_t *pkg, int from_up
if (file_md5)
free(file_md5);
}
+#endif
#ifdef HAVE_SHA256
/* Check for sha256 value */
--- a/libopkg/Makefile.am
+++ b/libopkg/Makefile.am
@@ -25,13 +25,16 @@ opkg_list_sources = conffile.c conffile.
pkg_src.c pkg_src.h pkg_src_list.c pkg_src_list.h \
str_list.c str_list.h void_list.c void_list.h \
active_list.c active_list.h list.h
-opkg_util_sources = file_util.c file_util.h opkg_message.h opkg_message.c md5.c md5.h \
+opkg_util_sources = file_util.c file_util.h opkg_message.h opkg_message.c \
parse_util.c parse_util.h \
sprintf_alloc.c sprintf_alloc.h \
xregex.c xregex.h xsystem.c xsystem.h
if HAVE_PATHFINDER
opkg_util_sources += opkg_pathfinder.c opkg_pathfinder.h
endif
+if HAVE_MD5
+opkg_util_sources += md5.c md5.h
+endif
if HAVE_SHA256
opkg_util_sources += sha256.c sha256.h
endif
--- a/configure.ac
+++ b/configure.ac
@@ -68,10 +68,19 @@ AC_ARG_ENABLE(sha256,
(sha256.{c,h} are GPLv3 licensed) [[default=no]] ]),
[want_sha256="$enableval"], [want_sha256="no"])
+AC_ARG_ENABLE(md5,
+ AC_HELP_STRING([--enable-md5], [Enable md5sum check
+ (md5.{c,h} are GPLv3 licensed) [[default=no]] ]),
+ [want_md5="$enableval"], [want_md5="yes"])
+
if test "x$want_sha256" = "xyes"; then
AC_DEFINE(HAVE_SHA256, 1, [Define if you want sha256 support])
fi
+if test "x$want_md5" = "xyes"; then
+ AC_DEFINE(HAVE_MD5, 1, [Define if you want md5 support])
+fi
AM_CONDITIONAL(HAVE_SHA256, test "x$want_sha256" = "xyes")
+AM_CONDITIONAL(HAVE_MD5, test "x$want_md5" = "xyes")
# check for openssl
AC_ARG_ENABLE(openssl,
--- a/libopkg/pkg_parse.c
+++ b/libopkg/pkg_parse.c
@@ -49,9 +49,9 @@ parse_status(pkg_t *pkg, const char *sst
static void
parse_conffiles(pkg_t *pkg, const char *cstr)
{
- char file_name[1024], md5sum[35];
+ char file_name[1024], md5sum[85];
- if (sscanf(cstr, "%1023s %34s", file_name, md5sum) != 2) {
+ if (sscanf(cstr, "%1023s %84s", file_name, md5sum) != 2) {
opkg_msg(ERROR, "Failed to parse Conffiles line for %s\n",
pkg->name);
return;

View File

@ -1,31 +0,0 @@
--- a/libopkg/opkg_install.c
+++ b/libopkg/opkg_install.c
@@ -1364,12 +1364,22 @@ opkg_install_pkg(pkg_t *pkg, int from_up
file_sha256 = file_sha256sum_alloc(pkg->local_filename);
if (file_sha256 && strcmp(file_sha256, pkg->sha256sum))
{
- opkg_msg(ERROR, "Package %s sha256sum mismatch. "
- "Either the opkg or the package index are corrupt. "
- "Try 'opkg update'.\n",
- pkg->name);
- free(file_sha256);
- return -1;
+ if (!conf->force_checksum)
+ {
+ opkg_msg(ERROR,
+ "Package %s sha256sum mismatch. "
+ "Either the opkg or the package index are corrupt. "
+ "Try 'opkg update'.\n",
+ pkg->name);
+ free(file_sha256);
+ return -1;
+ }
+ else
+ {
+ opkg_msg(NOTICE,
+ "Ignored %s sha256sum mismatch.\n",
+ pkg->name);
+ }
}
if (file_sha256)
free(file_sha256);

View File

@ -1,39 +0,0 @@
--- a/src/opkg-cl.c
+++ b/src/opkg-cl.c
@@ -101,6 +101,8 @@ static struct option long_options[] = {
{"test", 0, 0, ARGS_OPT_NOACTION},
{"tmp-dir", 1, 0, 't'},
{"tmp_dir", 1, 0, 't'},
+ {"lists-dir", 1, 0, 'l'},
+ {"lists_dir", 1, 0, 'l'},
{"verbosity", 2, 0, 'V'},
{"version", 0, 0, 'v'},
{0, 0, 0, 0}
@@ -115,7 +117,7 @@ args_parse(int argc, char *argv[])
char *tuple, *targ;
while (1) {
- c = getopt_long_only(argc, argv, "Ad:f:ino:p:t:vV::",
+ c = getopt_long_only(argc, argv, "Ad:f:ino:p:l:t:vV::",
long_options, &option_index);
if (c == -1)
break;
@@ -139,6 +141,9 @@ args_parse(int argc, char *argv[])
case 't':
conf->tmp_dir = xstrdup(optarg);
break;
+ case 'l':
+ conf->lists_dir = xstrdup(optarg);
+ break;
case 'v':
printf("opkg version %s\n", VERSION);
exit(0);
@@ -316,6 +321,8 @@ usage()
printf("\t automatically to satisfy dependencies\n");
printf("\t-t Specify tmp-dir.\n");
printf("\t--tmp-dir Specify tmp-dir.\n");
+ printf("\t-l Specify lists-dir.\n");
+ printf("\t--lists-dir Specify lists-dir.\n");
printf("\n");

View File

@ -1,74 +0,0 @@
--- a/libopkg/opkg_conf.c
+++ b/libopkg/opkg_conf.c
@@ -69,6 +69,7 @@ opkg_option_t options[] = {
{ "proxy_passwd", OPKG_OPT_TYPE_STRING, &_conf.proxy_passwd },
{ "proxy_user", OPKG_OPT_TYPE_STRING, &_conf.proxy_user },
{ "query-all", OPKG_OPT_TYPE_BOOL, &_conf.query_all },
+ { "size", OPKG_OPT_TYPE_BOOL, &_conf.size },
{ "tmp_dir", OPKG_OPT_TYPE_STRING, &_conf.tmp_dir },
{ "verbosity", OPKG_OPT_TYPE_INT, &_conf.verbosity },
#if defined(HAVE_OPENSSL)
--- a/libopkg/opkg_conf.h
+++ b/libopkg/opkg_conf.h
@@ -88,6 +88,7 @@ struct opkg_conf
int query_all;
int verbosity;
int noaction;
+ int size;
int download_only;
char *cache;
--- a/src/opkg-cl.c
+++ b/src/opkg-cl.c
@@ -52,6 +52,7 @@ enum {
ARGS_OPT_AUTOREMOVE,
ARGS_OPT_CACHE,
ARGS_OPT_FORCE_SIGNATURE,
+ ARGS_OPT_SIZE,
};
static struct option long_options[] = {
@@ -98,6 +99,7 @@ static struct option long_options[] = {
{"offline-root", 1, 0, 'o'},
{"add-arch", 1, 0, ARGS_OPT_ADD_ARCH},
{"add-dest", 1, 0, ARGS_OPT_ADD_DEST},
+ {"size", 0, 0, ARGS_OPT_SIZE},
{"test", 0, 0, ARGS_OPT_NOACTION},
{"tmp-dir", 1, 0, 't'},
{"tmp_dir", 1, 0, 't'},
@@ -212,6 +214,9 @@ args_parse(int argc, char *argv[])
}
free(tuple);
break;
+ case ARGS_OPT_SIZE:
+ conf->size = 1;
+ break;
case ARGS_OPT_NOACTION:
conf->noaction = 1;
break;
@@ -315,6 +320,7 @@ usage()
printf("\t--download-only No action -- download only\n");
printf("\t--nodeps Do not follow dependencies\n");
printf("\t--nocase Perform case insensitive pattern matching\n");
+ printf("\t--size Print package size when listing available packages\n");
printf("\t--force-removal-of-dependent-packages\n");
printf("\t Remove package and all dependencies\n");
printf("\t--autoremove Remove packages that were installed\n");
--- a/libopkg/opkg_cmd.c
+++ b/libopkg/opkg_cmd.c
@@ -47,10 +47,12 @@ static void
print_pkg(pkg_t *pkg)
{
char *version = pkg_version_str_alloc(pkg);
+ printf("%s - %s", pkg->name, version);
+ if (conf->size)
+ printf(" - %lu", pkg->size);
if (pkg->description)
- printf("%s - %s - %s\n", pkg->name, version, pkg->description);
- else
- printf("%s - %s\n", pkg->name, version);
+ printf(" - %s", pkg->description);
+ printf("\n");
free(version);
}

View File

@ -1,11 +0,0 @@
--- a/libopkg/opkg_download.c
+++ b/libopkg/opkg_download.c
@@ -335,7 +335,7 @@ opkg_prepare_url_for_install(const char
hash_insert_pkg(pkg, 1);
if (namep) {
- *namep = pkg->name;
+ *namep = xstrdup(pkg->name);
}
return 0;
}

View File

@ -1,73 +0,0 @@
From a8555d352d2851ee1482b74b57ba9eacfb354c18 Mon Sep 17 00:00:00 2001
From: Peter Urbanec <peteru@urbanec.net>
Date: Thu, 23 Oct 2014 01:05:35 +1100
Subject: [PATCH] opkg_install: Call prerm and postrm scripts on package
upgrade
When upgrading a package from v1 to v2, run "v1-prerm upgrade v2" and
"v1-postrm upgrade v2", similarly to what dpkg does.
This patch fixes issue 104.
Signed-off-by: Peter Urbanec <openembedded-devel@urbanec.net>
Signed-off-by: Paul Barker <paul@paulbarker.me.uk>
---
libopkg/opkg_install.c | 40 ++++++++++++++++++++++++++++++++++++++--
1 file changed, 38 insertions(+), 2 deletions(-)
--- a/libopkg/opkg_install.c
+++ b/libopkg/opkg_install.c
@@ -528,7 +528,25 @@ prerm_upgrade_old_pkg(pkg_t *pkg, pkg_t
Error unwind, for both the above cases:
old-postinst abort-upgrade new-version
*/
- return 0;
+ int err;
+ char *script_args;
+ char *new_version;
+
+ if (!old_pkg || !pkg)
+ return 0;
+
+ new_version = pkg_version_str_alloc(pkg);
+
+ sprintf_alloc(&script_args, "upgrade %s", new_version);
+ free(new_version);
+ err = pkg_run_script(old_pkg, "prerm", script_args);
+ free(script_args);
+ if (err != 0) {
+ opkg_msg(ERROR, "prerm script for package \"%s\" failed\n",
+ old_pkg->name);
+ return -1;
+ }
+ return 0;
}
static int
@@ -925,7 +943,25 @@ postrm_upgrade_old_pkg(pkg_t *pkg, pkg_t
new-postrm failed-upgrade old-version
Error unwind, for both cases:
old-preinst abort-upgrade new-version */
- return 0;
+ int err;
+ char *script_args;
+ char *new_version;
+
+ if (!old_pkg || !pkg)
+ return 0;
+
+ new_version = pkg_version_str_alloc(pkg);
+
+ sprintf_alloc(&script_args, "upgrade %s", new_version);
+ free(new_version);
+ err = pkg_run_script(old_pkg, "postrm", script_args);
+ free(script_args);
+ if (err != 0) {
+ opkg_msg(ERROR, "postrm script for package \"%s\" failed\n",
+ old_pkg->name);
+ return -1;
+ }
+ return 0;
}
static int

View File

@ -1,61 +0,0 @@
--- a/libopkg/opkg_cmd.c
+++ b/libopkg/opkg_cmd.c
@@ -85,6 +85,7 @@ opkg_update_cmd(int argc, char **argv)
char *tmp;
int err;
int failures;
+ int pkglist_dl_error;
char *lists_dir;
pkg_src_list_elt_t *iter;
pkg_src_t *src;
@@ -130,15 +131,19 @@ opkg_update_cmd(int argc, char **argv)
sprintf_alloc(&url, "%s/%s", src->value, src->gzip ? "Packages.gz" : "Packages");
sprintf_alloc(&list_file_name, "%s/%s", lists_dir, src->name);
+ pkglist_dl_error = 0;
if (opkg_download(url, list_file_name, NULL, NULL, 0)) {
failures++;
+ pkglist_dl_error = 1;
+ opkg_msg(NOTICE, "*** Failed to download the package list from %s\n\n",
+ url);
} else {
- opkg_msg(NOTICE, "Updated list of available packages in %s.\n",
+ opkg_msg(NOTICE, "Updated list of available packages in %s\n",
list_file_name);
}
free(url);
#if defined(HAVE_GPGME) || defined(HAVE_OPENSSL) || defined(HAVE_USIGN)
- if (conf->check_signature) {
+ if (pkglist_dl_error == 0 && conf->check_signature) {
/* download detached signitures to verify the package lists */
/* get the url for the sig file */
if (src->extra_data) /* debian style? */
@@ -156,7 +161,7 @@ opkg_update_cmd(int argc, char **argv)
err = opkg_download(url, tmp_file_name, NULL, NULL, 0);
if (err) {
failures++;
- opkg_msg(NOTICE, "Signature check failed.\n");
+ opkg_msg(NOTICE, "Signature file download failed.\n");
} else {
err = opkg_verify_file (list_file_name, tmp_file_name);
if (err == 0)
--- a/libopkg/opkg_download.c
+++ b/libopkg/opkg_download.c
@@ -91,7 +91,7 @@ opkg_download(const char *src, const cha
char *src_base = basename(src_basec);
char *tmp_file_location;
- opkg_msg(NOTICE,"Downloading %s.\n", src);
+ opkg_msg(NOTICE,"Downloading %s\n", src);
if (str_starts_with(src, "file:")) {
const char *file_src = src + 5;
@@ -175,6 +175,8 @@ opkg_download(const char *src, const cha
if (res) {
opkg_msg(ERROR, "Failed to download %s, wget returned %d.\n", src, res);
+ if (res == 4)
+ opkg_msg(ERROR, "Check your network settings and connectivity.\n\n");
free(tmp_file_location);
return -1;
}