oweals/opkg-lede.git
6 years agoadd opkg option http_timeout
Alexander Couzens [Mon, 4 Dec 2017 14:41:20 +0000 (15:41 +0100)]
add opkg option http_timeout

http_timeout will append `--timeout xy` to the resulting wget
call. This is useful when using opkg update in a automatic
way and prevent long timeouts

Signed-off-by: Alexander Couzens <lynxis@fe80.eu>
6 years agoopkg: encode archive filenames while constructing download URLs
Jo-Philipp Wich [Thu, 7 Dec 2017 10:43:02 +0000 (11:43 +0100)]
opkg: encode archive filenames while constructing download URLs

Various web servers, namely Amazon S3 ones, have problems handling requests
to URLs with a literal "+" in the path component.

According to the RFC 3986 "+" is a reserved char and its purpose is
delimiting. When used in a file name it should be encoded.

Use the new urlencode_path() helper to encode the path component before
constructing the final download URL.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Tested-by: Rafał Miłecki <rafal@milecki.pl>
6 years agofile_util: implement urlencode_path() helper
Jo-Philipp Wich [Thu, 7 Dec 2017 10:40:21 +0000 (11:40 +0100)]
file_util: implement urlencode_path() helper

Introduce a helper function urlencode_path() which can be used to encode
problematic characters in package file names.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Tested-by: Rafał Miłecki <rafal@milecki.pl>
6 years agolibopkg: fix SHA256 calculation for big endian system
Jonas Gorski [Sat, 18 Nov 2017 11:30:11 +0000 (12:30 +0100)]
libopkg: fix SHA256 calculation for big endian system

The SHA256 implementation relied on WORDS_BIGENDIAN being defined for
big endian systems, but this was broken since the switch to cmake,
causing wrong checksums on big endian systems like ar71xx.

Fix this by adding a cmake check for endianess similar to the one done
by the original autotools.

Fixes: e6e6c5a21634 ("build: add cmake build system")
Acked-by: Jo-Philipp Wich <jo@mein.io>
Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
6 years agopkg_parse: fix segfault when parsing descriptions with leading newlines
Jo-Philipp Wich [Fri, 28 Jul 2017 11:02:08 +0000 (13:02 +0200)]
pkg_parse: fix segfault when parsing descriptions with leading newlines

During parsing of multi-line descriptions that begin with a newline
character, the description pointer will be NULL when the first
continuation line is encountered, causing the strlen() invocation
on the description pointer to segfault.

This is caused by the fact that the parse_simple() helper used for
parsing the initial description line returns NULL instead of an
empty string when encountering only whitespace after the field name.

Rework the continuation line parsing code to not assume an initialized
pointer by checking before calling strlen() and avoiding realloc()
on a NULL pointer.

Fixes FS#933.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
6 years agopkg_alternatives: pass if the desired symlink already exists
Yousong Zhou [Tue, 11 Jul 2017 03:07:23 +0000 (11:07 +0800)]
pkg_alternatives: pass if the desired symlink already exists

This can happen when opkg installs, then configures multiple
alternatives in a batch.  Symlink to the highest prio alternative will
be created in the initial configuring stage causing later symlink call
fail with EEXIST

    Configuring busybox.
    ...
    symlink("/sbin/ip-full", "/home/yousong/j/t/lede-imagebuilder-mvebu.Linux-x86_64/build_dir/target-arm_cortex-a9+vfpv3_musl_eabi/root-mvebu/sbin/ip") = 0
    ...
    Configuring ip-full.
    ...
    symlink("/sbin/ip-full", "/home/yousong/j/t/lede-imagebuilder-mvebu.Linux-x86_64/build_dir/target-arm_cortex-a9+vfpv3_musl_eabi/root-mvebu/sbin/ip") = -1 EEXIST (File exists)
    ...

While at it, "mkdir -p" dirname(path_in_dest) before symlink in case the
following symlink call may fail with ENOENT

Ref: https://github.com/openwrt/packages/issues/4567
Reported-by: Aner Andros <aa@anerandros.info>
Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
6 years agoopkg: add --no-check-certificate argument
Alexandru Ardelean [Thu, 11 May 2017 19:42:02 +0000 (22:42 +0300)]
opkg: add --no-check-certificate argument

For cases when artifacts are stored on https:// accessible
locations and you don't want to install ca-certificates
(for various reasons).

I'll admit, using SSL like this is not recommended,
but since wget (even uclient-fetch) allows the
--no-check-certificate option, it would be nice
for opkg to support setting it if needed/configured.

Signed-off-by: Alexandru Ardelean <ardeleanalex@gmail.com>
6 years agopkg_alternatives: use ERROR level for symlink failure
Yousong Zhou [Wed, 3 May 2017 09:08:10 +0000 (17:08 +0800)]
pkg_alternatives: use ERROR level for symlink failure

Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
6 years agopkg: alternatives support
Yousong Zhou [Sat, 18 Mar 2017 08:45:53 +0000 (16:45 +0800)]
pkg: alternatives support

It's a list of specs of the following form seprated by commas to describe
alternatives provided by the package

    <prio>:<path>:<altpath>

where <path> will be a symbolic link to <altpath> of the highest <prio>

Size comparison on x86_64 after the change

    function                                             old     new   delta
    pkg_alternatives_update                                -     587    +587
    pkg_parse_line                                      2101    2609    +522
    .rodata                                            24594   24738    +144
    pkg_formatted_field                                 2385    2528    +143
    pkg_deinit                                           427     486     +59
    pkg_print_status                                     264     280     +16
    opkg_configure                                        59      69     +10
    xreadlink                                            120     128      +8
    opkg_remove_pkg                                     1079    1087      +8
    ------------------------------------------------------------------------------
    (add/remove: 2/0 grow/shrink: 8/0 up/down: 1483/0)           Total: 1497 bytes

Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
6 years agolibbb: xreadlink: fix memory leak on failure case
Yousong Zhou [Mon, 20 Mar 2017 02:46:15 +0000 (10:46 +0800)]
libbb: xreadlink: fix memory leak on failure case

Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
7 years agopkg_run_script: use pkg->dest in half installed case
Alejandro del Castillo [Mon, 27 Mar 2017 21:58:17 +0000 (16:58 -0500)]
pkg_run_script: use pkg->dest in half installed case

Fixes running scripts for packages in half-installed state which would
otherwise fail with:

 * pkg_run_script: Internal error: ... has a NULL tmp_unpack_dir.
 * opkg_remove_pkg: not removing package "...", prerm script failed

Upstream bug: https://bugzilla.yoctoproject.org/show_bug.cgi?id=11245

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
[Jo-Philipp Wich: rebased onto opkg-lede, updated commit message]
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agocheck_data_file_clashes_change: remove duplicated offline root in paths
Alejandro del Castillo [Wed, 23 Mar 2016 23:14:50 +0000 (18:14 -0500)]
check_data_file_clashes_change: remove duplicated offline root in paths

The function check_data_file_clashes_change update the ownership of
files that belong to a package being replaced. It calls
pkg_get_installed_files then adds an offline root if
opkg_conf->offline_root to each path. However, pkg_get_installed_files
already returns paths with the offline root (if present).

This fixes issue 156.

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
7 years agobuildReplaces: do not add duplicated replacees
Alejandro del Castillo [Mon, 21 Mar 2016 22:33:59 +0000 (17:33 -0500)]
buildReplaces: do not add duplicated replacees

If package A both replaces and conflicts package B, it is added
unconditionally to the replaced_by vector of package B. Add check to
only add it if it's not there to avoid inaccurate warnings of the type:

Multiple replacers for X, using first one

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
7 years agoopkg: compare-versions doesn't need any state
Ross Burton [Tue, 1 Mar 2016 16:54:26 +0000 (16:54 +0000)]
opkg: compare-versions doesn't need any state

compare-versions doesn't need lock files created and databases opened, so don't.

Signed-off-by: Ross Burton <ross.burton@intel.com>
7 years agoopkg_cmd: fix segmentation fault in opkg_compare_versions_cmd()
Jo-Philipp Wich [Wed, 15 Mar 2017 02:08:18 +0000 (03:08 +0100)]
opkg_cmd: fix segmentation fault in opkg_compare_versions_cmd()

Due to the fact that we're using blob buffers internally now we cannot simpyl
call parse_version() on an uninitialized struct.

Properly create the temporary packages using pkg_new() and deallocated them
using pkg_deinit() and free().

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agoopkg_cmd: fix return of opkg compare-versions
Ross Burton [Tue, 1 Mar 2016 18:03:29 +0000 (18:03 +0000)]
opkg_cmd: fix return of opkg compare-versions

The implementation of opkg compare-version was simply returning the return value
of pkg_version_satisfied(), which returns a boolean.  This results in inverted
logic in that:

$ opkg compare-version 1.0 == 1.0 || echo different
different

That's clearly not right.  As nobody had noticed this before presumably nobody
was actually using this (likely either opkg-compare-version or
opkg-compare-versions.sh) just change the return value so it's correct.

Signed-off-by: Ross Burton <ross.burton@intel.com>
7 years agopkg_src_list_push: remove unused function
Alejandro del Castillo [Wed, 10 Feb 2016 22:27:37 +0000 (16:27 -0600)]
pkg_src_list_push: remove unused function

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
7 years agopkg_src_list_pop: remove unused function
Alejandro del Castillo [Wed, 10 Feb 2016 22:27:36 +0000 (16:27 -0600)]
pkg_src_list_pop: remove unused function

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
7 years agostr_list_push: remove unused function
Alejandro del Castillo [Wed, 10 Feb 2016 22:27:35 +0000 (16:27 -0600)]
str_list_push: remove unused function

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
7 years agostr_list_prev: remove unused function
Alejandro del Castillo [Wed, 10 Feb 2016 22:27:34 +0000 (16:27 -0600)]
str_list_prev: remove unused function

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
7 years agostr_list_last: remove unused function
Alejandro del Castillo [Wed, 10 Feb 2016 22:27:33 +0000 (16:27 -0600)]
str_list_last: remove unused function

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
7 years agoconffile_list_pop: remove unused function
Alejandro del Castillo [Wed, 10 Feb 2016 22:27:28 +0000 (16:27 -0600)]
conffile_list_pop: remove unused function

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
7 years agopkg_dest_list_push: remove unused functions
Alejandro del Castillo [Wed, 10 Feb 2016 22:27:31 +0000 (16:27 -0600)]
pkg_dest_list_push: remove unused functions

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
7 years agonv_pair_list_prev: remove unused function
Alejandro del Castillo [Wed, 10 Feb 2016 22:27:30 +0000 (16:27 -0600)]
nv_pair_list_prev: remove unused function

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
7 years agonv_pair_list_last: remove unused function
Alejandro del Castillo [Wed, 10 Feb 2016 22:27:29 +0000 (16:27 -0600)]
nv_pair_list_last: remove unused function

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
7 years agoconffile_list_pop: remove unused function
Alejandro del Castillo [Wed, 10 Feb 2016 22:27:28 +0000 (16:27 -0600)]
conffile_list_pop: remove unused function

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
7 years agoconffile_list_push: remove unused function
Alejandro del Castillo [Wed, 10 Feb 2016 22:27:27 +0000 (16:27 -0600)]
conffile_list_push: remove unused function

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
7 years agoactive_list_sort: remove unused function
Alejandro del Castillo [Wed, 10 Feb 2016 22:27:26 +0000 (16:27 -0600)]
active_list_sort: remove unused function

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
[Jo-Philipp Wich: remove call from opkg_active_list_test]
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agoactive_list_add_depend: remove unused function
Alejandro del Castillo [Wed, 10 Feb 2016 22:27:25 +0000 (16:27 -0600)]
active_list_add_depend: remove unused function

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
[Jo-Philipp Wich: remove call from opkg_active_list_test]
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agopkg_dependence_satisfied: remove unused function
Alejandro del Castillo [Mon, 23 Nov 2015 19:48:42 +0000 (13:48 -0600)]
pkg_dependence_satisfied: remove unused function

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
7 years agoFix typo in pkg_hash_fetch_best_installation_candidate.
Michael Hansen [Wed, 14 Sep 2016 20:42:26 +0000 (13:42 -0700)]
Fix typo in pkg_hash_fetch_best_installation_candidate.

A (presumed) typo in pkg_hash_fetch_best_installation_candidate caused the
matching_pkgs vec to be sorted twice, instead of sorting matching_apkgs.
This fixes both the call and the API to match what appears to be intended.

Signed-off-by: Michael Hansen <michael.j.hansen@hp.com>
Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
7 years agoset_flags_from_control: remove function
Alejandro del Castillo [Wed, 22 Feb 2017 23:32:08 +0000 (17:32 -0600)]
set_flags_from_control: remove function

During installs, install_data_files calls set_flags_from_control to
capture the case where fields, such as "Essential", are present in the
package control file but are missing on the Packages file. This
operation is expensive (re-parses the control file) and is catering to a
case that should not be supported on the first place.

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
[Jo-Philipp Wich: remove function prototype as well]
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agoopkg_active_list_test: mark functions static, swap strcmp() with memcmp()
Jo-Philipp Wich [Wed, 15 Mar 2017 00:32:52 +0000 (01:32 +0100)]
opkg_active_list_test: mark functions static, swap strcmp() with memcmp()

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg_test: mark functions static, remove unused opkg_test()
Jo-Philipp Wich [Wed, 15 Mar 2017 00:29:35 +0000 (01:29 +0100)]
libopkg_test: mark functions static, remove unused opkg_test()

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agopkg_parse: fix bad message level for opkg_msg() call
Jo-Philipp Wich [Wed, 15 Mar 2017 00:26:16 +0000 (01:26 +0100)]
pkg_parse: fix bad message level for opkg_msg() call

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agopkg_parse: remove unused variable in pkg_parse_line()
Jo-Philipp Wich [Wed, 15 Mar 2017 00:23:31 +0000 (01:23 +0100)]
pkg_parse: remove unused variable in pkg_parse_line()

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agopkg_parse: remove const requirement from pkg_parse_line()
Jo-Philipp Wich [Wed, 15 Mar 2017 00:21:03 +0000 (01:21 +0100)]
pkg_parse: remove const requirement from pkg_parse_line()

To simplify parsing we'd like to be able to modify the passed line buffer
inplace, so remove the const requirement from the pkg_parse_line() argument.

Convert pkg_parse_line's sole user accordingly.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agopkg_hash: remove unused variable in pkg_hash_load_feeds()
Jo-Philipp Wich [Wed, 15 Mar 2017 00:16:23 +0000 (01:16 +0100)]
pkg_hash: remove unused variable in pkg_hash_load_feeds()

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agopkg_depends: add missing parse_replacelist() prototype
Jo-Philipp Wich [Wed, 15 Mar 2017 00:13:26 +0000 (01:13 +0100)]
pkg_depends: add missing parse_replacelist() prototype

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agoopkg_utils: add missing header
Jo-Philipp Wich [Wed, 15 Mar 2017 00:11:14 +0000 (01:11 +0100)]
opkg_utils: add missing header

Include "opkg_utils.h" header file to declare function prototypes.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: remove unused progress parameters from opkg_download()
Jo-Philipp Wich [Wed, 15 Mar 2017 00:04:49 +0000 (01:04 +0100)]
libopkg: remove unused progress parameters from opkg_download()

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: remove unused progress callback
Jo-Philipp Wich [Tue, 14 Mar 2017 23:59:45 +0000 (00:59 +0100)]
libopkg: remove unused progress callback

The current opkg_download() implementation completely ignores the passed
progress callback function, so drop this unused code.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: remove unused variable from opkg_install_package()
Jo-Philipp Wich [Wed, 15 Mar 2017 00:06:32 +0000 (01:06 +0100)]
libopkg: remove unused variable from opkg_install_package()

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibbb: remove unused variables
Jo-Philipp Wich [Tue, 14 Mar 2017 23:52:47 +0000 (00:52 +0100)]
libbb: remove unused variables

Remove unused variables from deb_extract() to avoid compiler warnings.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibbb: change gzip_read() buffer argument to void *
Jo-Philipp Wich [Tue, 14 Mar 2017 23:50:46 +0000 (00:50 +0100)]
libbb: change gzip_read() buffer argument to void *

Make gzip_read() expect a void * buffer argument to avoid signed vs unsigned
char mismatch warnings.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibbb: fix gzip_thread() warnings
Jo-Philipp Wich [Tue, 14 Mar 2017 23:47:23 +0000 (00:47 +0100)]
libbb: fix gzip_thread() warnings

 - mark function static
 - add missing return statement
 - avoid uninitialized use of "len"

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg/opkg_cmd.c: more robust PATH handling
Glenn Strauss [Thu, 2 Mar 2017 22:53:42 +0000 (17:53 -0500)]
libopkg/opkg_cmd.c: more robust PATH handling

preserve semantics of PATH when PATH is not set in environment

error and undefined behavior reported in
  https://github.com/openwrt/packages/issues/1922
when PATH not set in environment
(lighttpd executes CGI with empty base env, plus standard CGI env vars)

Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
[Jo-Philipp Wich: avoid free() on NULL, use default from cmake cache string]
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: specify "/bin/sh" instead of "sh"
Glenn Strauss [Thu, 2 Mar 2017 22:53:09 +0000 (17:53 -0500)]
libopkg: specify "/bin/sh" instead of "sh"

avoid strange behavior with execvp() when PATH is not set in environment
(in which case confstr(_CS_PATH) should return something reasonable)

reproducable running openwrt 15.05 and 15.05.1 and attempting to install
a software package (e.g. libuuid) via LuCI (prior to openwrt/luci#1048).
(https://github.com/openwrt/luci/pull/1048) libuuid.postinst fails with
status 255 on 15.05 and opkg segfaults in 15.05.1.  This probably merits
further exploration.

Originally reported in https://github.com/openwrt/packages/issues/1922

Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
7 years agounarchive: fix possible segmentation fault in deb_extract()
Jo-Philipp Wich [Tue, 28 Feb 2017 23:46:39 +0000 (00:46 +0100)]
unarchive: fix possible segmentation fault in deb_extract()

When a not existing or unreachable file path is passed to deb_extract(),
the wfopen() call fails, causing a jump to the cleanup: label which leads
to a call to gzip_close() on the tar_outer structure.

The tar_outer structure however contains uninitialized memory at this point,
causing gzip_close() to operate on garbage data. Depending on the nature of
the unitialized memory, this might lead to all sorts of issues, e.g. freeing
of not allocated memory or invoking fclose() on garbage pointers.

Solve this problem by initializing the tar_outer and tar_inner structures
right at the declaration.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agopkg: forward "provided_by_hand" flag in pkg_merge()
Jo-Philipp Wich [Tue, 28 Feb 2017 23:08:40 +0000 (00:08 +0100)]
pkg: forward "provided_by_hand" flag in pkg_merge()

Due to the fact that we now load status files after preparing the abstract
structures describing the cli specified packages, we need to ensure that the
"provided_by_hand" flag is properly conveyed in pkg_merge(), otherwise the
cli provided package archive might get ignored in favor to a newer version
from feeds.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agopkg: mark bit fields in pkg_t unsigned
Jo-Philipp Wich [Tue, 28 Feb 2017 22:53:41 +0000 (23:53 +0100)]
pkg: mark bit fields in pkg_t unsigned

Qualify the bit field type as unsigned int to ensure that set flags are
interpreted as "1" and not "-1".

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agoopkg_cmd: avoid null pointer dereference in opkg_what_depends_conflicts_cmd()
Jo-Philipp Wich [Mon, 27 Feb 2017 22:23:59 +0000 (23:23 +0100)]
opkg_cmd: avoid null pointer dereference in opkg_what_depends_conflicts_cmd()

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agoopkg_cmd: fix endless loop in whatprovides/whatreplaces
Jo-Philipp Wich [Mon, 27 Feb 2017 19:19:21 +0000 (20:19 +0100)]
opkg_cmd: fix endless loop in whatprovides/whatreplaces

Fix the loop semantics in opkg_what_provides_replaces_cmd() to properly
advance the package vector pointer.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agopkg_depends: propagate virtual provided detail flag to providers
Jo-Philipp Wich [Mon, 27 Feb 2017 18:24:31 +0000 (19:24 +0100)]
pkg_depends: propagate virtual provided detail flag to providers

When the provided abstract package (e.g. "px5g" provided by "px5g-mbedtls") is
marked as requiring details, then mark the provider abstract package as well.

This ensures that package info for discrete provider packages is acquired and
retained if the virtual package they provide is being depended upon by another
package requiring details.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agopkg_depends: fix unsatisfied dependency installation order
Pieter Smith [Thu, 23 Feb 2017 12:54:14 +0000 (13:54 +0100)]
pkg_depends: fix unsatisfied dependency installation order

Unsatisfied dependencies are not being installed in the correct order. The
algorithm is not crawling down the dependency chain first when inserting
unsatisfied dependencies, resulting in a correct installation order only for
the first layer of dependencies.

This patch changes the unsatisfied dependency insertion order to first add leaf
dependencies, then move up the chain. The result is a list of unsatisfied
dependencies ordered most-dependent-first.

An example that resulted in the incorrect installation order was:
  A -> B
  A -> C
  B -> D

Without the fix, a most-dependent-first installation order was not guaranteed
more than one layer deep, resulting in an installation order where B is
incorrectly installed before D:
  B, D, C, A

After the fix, the installation order follows most-dependent first irrespective
of the number of layers:
  D, B, C, A

Signed-off-by: Pieter Smith <pieter.smith@philips.com>
[Jo-Philipp Wich: rebased onto opkg-lede.git]
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: fix some overly aggressive line wrapping in pkg_depends.c
Jo-Philipp Wich [Thu, 23 Feb 2017 15:37:35 +0000 (16:37 +0100)]
libopkg: fix some overly aggressive line wrapping in pkg_depends.c

Then deeply nested blocks in pkg_depends.c tripped up Lindent, causing it
to perform overly aggressive line wrapping.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: remove stray printf()
Jo-Philipp Wich [Thu, 23 Feb 2017 08:42:47 +0000 (09:42 +0100)]
libopkg: remove stray printf()

This lone printf() statement was accidentally left in the code during some
previous refactoring session.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: switch to GPL2 SHA256 implementation
Jo-Philipp Wich [Wed, 22 Feb 2017 15:13:49 +0000 (16:13 +0100)]
libopkg: switch to GPL2 SHA256 implementation

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: initialize conffile list during status parsing
Jo-Philipp Wich [Wed, 22 Feb 2017 12:27:20 +0000 (13:27 +0100)]
libopkg: initialize conffile list during status parsing

When parsing conffile information from status files, we need to initialize
the conffile list head upon encountering a "Conffiles:" line, otherwise
parse_conffiles() will ignore all subsequent entries due to a missing list
pointer.

Fixes missing conffile information in /usr/lib/opkg/status on a fresh
installation.

Reported-by: Hartmut Birr <e9hack@gmail.com>
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agobuild: enable usign support
Jo-Philipp Wich [Mon, 20 Feb 2017 13:43:30 +0000 (14:43 +0100)]
build: enable usign support

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agobuild: allow to pass version via CMake
Jo-Philipp Wich [Sat, 18 Feb 2017 14:45:53 +0000 (15:45 +0100)]
build: allow to pass version via CMake

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: remove OpenSSL support
Jo-Philipp Wich [Sat, 18 Feb 2017 14:06:38 +0000 (15:06 +0100)]
libopkg: remove OpenSSL support

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: remove Curl support
Jo-Philipp Wich [Sat, 18 Feb 2017 14:04:02 +0000 (15:04 +0100)]
libopkg: remove Curl support

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: remove GPG support
Jo-Philipp Wich [Sat, 18 Feb 2017 14:00:14 +0000 (15:00 +0100)]
libopkg: remove GPG support

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: remove x509 support
Jo-Philipp Wich [Sat, 18 Feb 2017 13:57:20 +0000 (14:57 +0100)]
libopkg: remove x509 support

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: drop custom md5 implementation, unconditionally enable sha256 support
Jo-Philipp Wich [Sat, 18 Feb 2017 13:53:16 +0000 (14:53 +0100)]
libopkg: drop custom md5 implementation, unconditionally enable sha256 support

Drop custom md5 implementation and switch to the one provided by libubox,
also remove support for enabling/disabling checksum support and always build
it unconditionally.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: fix pkg_set_int(), pkg_get_int()
Jo-Philipp Wich [Sat, 18 Feb 2017 13:35:53 +0000 (14:35 +0100)]
libopkg: fix pkg_set_int(), pkg_get_int()

Fix the return values of pkg_get_int() and pkg_set_int() to properly
convert the pointers from/to integer values.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: properly fix parse_version()
Jo-Philipp Wich [Sat, 18 Feb 2017 12:48:25 +0000 (13:48 +0100)]
libopkg: properly fix parse_version()

A previous attempt to fix the verison/revision split caused unterminated
strings to get stored in the blob buffer, properly fix this case now.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agobuild: fix handling of string options
Jo-Philipp Wich [Sat, 18 Feb 2017 12:32:45 +0000 (13:32 +0100)]
build: fix handling of string options

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: do not modify original version string in parse_version()
Jo-Philipp Wich [Fri, 17 Feb 2017 19:01:42 +0000 (20:01 +0100)]
libopkg: do not modify original version string in parse_version()

The parse_version() function might be parsing the version string of another
pkg_t instance so we must not modify it inplace to truncate the revision
part, otherwise we will clobber the original version, leading to failing
comparisations later on.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agobuild: add install target for opkg-cl
Jo-Philipp Wich [Fri, 17 Feb 2017 17:43:19 +0000 (18:43 +0100)]
build: add install target for opkg-cl

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agobuild: enable SHA256 support
Jo-Philipp Wich [Fri, 17 Feb 2017 17:28:19 +0000 (18:28 +0100)]
build: enable SHA256 support

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agoopkg-cl: remove config.h reference
Jo-Philipp Wich [Fri, 17 Feb 2017 17:26:40 +0000 (18:26 +0100)]
opkg-cl: remove config.h reference

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: remove config.h references
Jo-Philipp Wich [Fri, 17 Feb 2017 17:26:18 +0000 (18:26 +0100)]
libopkg: remove config.h references

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agobuild: infer VERSION from Git history
Jo-Philipp Wich [Fri, 17 Feb 2017 17:22:02 +0000 (18:22 +0100)]
build: infer VERSION from Git history

Pass short hash and commit date as VERSION string.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agobuild: do not unconditionally link libpthread
Jo-Philipp Wich [Fri, 17 Feb 2017 17:19:53 +0000 (18:19 +0100)]
build: do not unconditionally link libpthread

Some environments, e.g. musl libc based ones, do not have a dedicated
libpthread, so only link it if it exists.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agoopkg-cl: add missing include to import FNM_CASEFOLD
Jo-Philipp Wich [Fri, 17 Feb 2017 14:58:57 +0000 (15:58 +0100)]
opkg-cl: add missing include to import FNM_CASEFOLD

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agobuild: expose LOCK_FILE option
Jo-Philipp Wich [Fri, 17 Feb 2017 14:36:08 +0000 (15:36 +0100)]
build: expose LOCK_FILE option

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agobuild: remove outdated files
Jo-Philipp Wich [Fri, 17 Feb 2017 14:21:44 +0000 (15:21 +0100)]
build: remove outdated files

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agobuild: remove automake/autoconf build system
Jo-Philipp Wich [Fri, 17 Feb 2017 14:17:36 +0000 (15:17 +0100)]
build: remove automake/autoconf build system

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years ago.gitignore: ignore test executables
Jo-Philipp Wich [Fri, 17 Feb 2017 14:13:29 +0000 (15:13 +0100)]
.gitignore: ignore test executables

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years ago.gitignore: ignore CMake artifacts
Jo-Philipp Wich [Fri, 17 Feb 2017 14:10:07 +0000 (15:10 +0100)]
.gitignore: ignore CMake artifacts

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agotests: fix build of opkg_extract_test
Jo-Philipp Wich [Fri, 17 Feb 2017 14:08:44 +0000 (15:08 +0100)]
tests: fix build of opkg_extract_test

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agobuild: add cmake build system
Jo-Philipp Wich [Fri, 17 Feb 2017 14:08:03 +0000 (15:08 +0100)]
build: add cmake build system

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agoopkg-cl: stop preloading package feeds on install
Jo-Philipp Wich [Thu, 16 Feb 2017 15:44:07 +0000 (16:44 +0100)]
opkg-cl: stop preloading package feeds on install

Instead of unconditionally loading all package feed lists entirely into
memory, let opkg_install_cmd() selectively parse the lists using the new
pkg_hash_load_package_details() helper.

This will result in a slightly longer runtime but dramatically reduces the
memory requirements. On an x86_64 test system, the peak heap memory
consumption during an "opkg install luci" dropped from 3.7 MB to about
360 KB, a decrease of roughly 90%.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: selectively load package feeds in opkg_info_status_cmd()
Jo-Philipp Wich [Thu, 16 Feb 2017 15:36:58 +0000 (16:36 +0100)]
libopkg: selectively load package feeds in opkg_info_status_cmd()

Use the new pkg_hash_load_package_details() helper to selectively load the
dependency subgraphs of the to be installed packages.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: immediately free packages not marked for detail parsing
Jo-Philipp Wich [Thu, 16 Feb 2017 15:33:57 +0000 (16:33 +0100)]
libopkg: immediately free packages not marked for detail parsing

Stop recording packages into the dependency graph which are not flagged
with SF_NEED_DETAILS.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: avoid aggregating multiple identical providers
Jo-Philipp Wich [Thu, 16 Feb 2017 14:56:14 +0000 (15:56 +0100)]
libopkg: avoid aggregating multiple identical providers

Since we might do multiple parsing runs over the feed list files in the
future, ensure that we do not insert the abstract provider package multiple
times into the provided_by vector.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: implement pkg_hash_load_package_details() helper
Jo-Philipp Wich [Thu, 16 Feb 2017 11:19:02 +0000 (12:19 +0100)]
libopkg: implement pkg_hash_load_package_details() helper

The purpose of this new function is to keep parsing feed lists until
all package detail requests are satisified.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: support passing default state flags in pkg_hash_load_feeds()
Jo-Philipp Wich [Thu, 16 Feb 2017 11:16:29 +0000 (12:16 +0100)]
libopkg: support passing default state flags in pkg_hash_load_feeds()

Add a new argument to pkg_hash_load_feeds() which allows specifying default
state flags that should be applied to all loaded packages.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: flag package with SF_NEED_DETAIL in pkg_init_from_file()
Jo-Philipp Wich [Thu, 16 Feb 2017 11:12:04 +0000 (12:12 +0100)]
libopkg: flag package with SF_NEED_DETAIL in pkg_init_from_file()

Flag the package loaded from file as SF_NEED_DETAIL to properly fetch and
resolve dependencies.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: fix printing provides in pkg_formatted_field()
Jo-Philipp Wich [Thu, 16 Feb 2017 11:10:16 +0000 (12:10 +0100)]
libopkg: fix printing provides in pkg_formatted_field()

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: fix pkg_deinit() to properly free the resources in the blob buffer
Jo-Philipp Wich [Thu, 16 Feb 2017 10:57:55 +0000 (11:57 +0100)]
libopkg: fix pkg_deinit() to properly free the resources in the blob buffer

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: free old provides list in pkg_merge()
Jo-Philipp Wich [Thu, 16 Feb 2017 10:50:02 +0000 (11:50 +0100)]
libopkg: free old provides list in pkg_merge()

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: fix merging PKG_CONFFILES in pkg_merge()
Jo-Philipp Wich [Thu, 16 Feb 2017 10:47:48 +0000 (11:47 +0100)]
libopkg: fix merging PKG_CONFFILES in pkg_merge()

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: fix pkg_set_ptr() to properly set NULL pointers
Jo-Philipp Wich [Thu, 16 Feb 2017 10:46:31 +0000 (11:46 +0100)]
libopkg: fix pkg_set_ptr() to properly set NULL pointers

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: allow passing common package state flags to pkg_hash_add_from_file()
Jo-Philipp Wich [Wed, 15 Feb 2017 23:24:29 +0000 (00:24 +0100)]
libopkg: allow passing common package state flags to pkg_hash_add_from_file()

Add a new parameter to pkg_hash_add_from_file() for passing package state
flags that shall be applied to all pkg_t instances parsed from the given
file and use it to mark all packages loaded from local status files with
the SF_NEED_DETAIL flag.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: propagate SF_NEED_DETAIL from abstract to discrete package
Jo-Philipp Wich [Wed, 15 Feb 2017 23:21:05 +0000 (00:21 +0100)]
libopkg: propagate SF_NEED_DETAIL from abstract to discrete package

During parsing, propagate the state of the SF_NEED_DETAIL flag from the
related abstract package to the discrete pkg_t instance getting assembled.

This is required to ensure that subsequent parsing of pkg_t's dependency
lists considers the state of SF_NEED_DETAIL.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: do not clobber package flags during parsing
Jo-Philipp Wich [Wed, 15 Feb 2017 23:18:25 +0000 (00:18 +0100)]
libopkg: do not clobber package flags during parsing

When parsing "Status:" lines from package control or list files, do not
overwrite previously set flags in the package structure.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
7 years agolibopkg: propagate SF_NEED_DETAIL to related packages
Jo-Philipp Wich [Wed, 15 Feb 2017 23:15:05 +0000 (00:15 +0100)]
libopkg: propagate SF_NEED_DETAIL to related packages

When parsing Provides, Suggests, Conflicts, Replaces and Depends lists,
propagate the parent package SF_NEED_DETAIL flag to related abstract
packages in order to ensure that the entire related dependency graph
is processed.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>