project/opkg-lede.git
4 years agolibopkg: implement lightweight package listing logic
Jo-Philipp Wich [Thu, 7 May 2020 20:19:39 +0000 (22:19 +0200)]
libopkg: implement lightweight package listing logic

Instead of building a complete package dependency tree internally, use a
lightweight list data structure to gather and sort package names, version and
descriptions.

This reduced the "opkg list" memory footprint on x86/64 from ~8MB to ~1.5MB.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
4 years agolibopkg: support passing callbacks to feed parsing functions
Jo-Philipp Wich [Sun, 3 May 2020 19:39:56 +0000 (21:39 +0200)]
libopkg: support passing callbacks to feed parsing functions

Extend pkg_hash_add_from_file(), pkg_hash_load_feeds() and
pkg_hash_load_status_files() to accept a per-package callback
function andan associated userdata pointer.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
4 years agoopkg-cl: don't read feeds on opkg update
Jo-Philipp Wich [Sun, 3 May 2020 16:24:34 +0000 (18:24 +0200)]
opkg-cl: don't read feeds on opkg update

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
4 years agolibopkg: use xsystem() to spawn opkg-key
Jo-Philipp Wich [Sun, 3 May 2020 16:01:57 +0000 (18:01 +0200)]
libopkg: use xsystem() to spawn opkg-key

Instead of the custom fork()/exec() implementation, use the existing
xsystem() helper function which provides a number of benefits:

 - It readily provides error reporting in case the execution fails
 - It has a simpler api
 - It uses vfork() internally which avoids the need to copy pages

This likely fixes https://bugs.openwrt.org/index.php?do=details&task_id=2734.

Fixes: 71f02a3 ("libopkg: add support for signature checking through usign")
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
4 years agofile_util.c: refactor and fix checksum_hex2bin()
Jo-Philipp Wich [Wed, 1 Apr 2020 11:41:37 +0000 (13:41 +0200)]
file_util.c: refactor and fix checksum_hex2bin()

 - Simplify function body by reducing the amount of intermediate vars
 - Derive length checks from the size of the buf
 - Replace complex for(;;) by a simple while() advancing the src string
 - Handle edge case of a zero length input not returning NULL

Fixes: c09fe20 ("libopkg: fix skipping of leading whitespace when parsing checksums")
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
4 years agofile_util.c: fix possible bad memory access in file_read_line_alloc()
Jo-Philipp Wich [Wed, 1 Apr 2020 10:41:37 +0000 (12:41 +0200)]
file_util.c: fix possible bad memory access in file_read_line_alloc()

In the case of a zero length string being returned by fgets(), the condition
checking for a trailing new line would perform a bad memory access outside
of `buf`. This might happen when line with a leading null byte is read.

Avoid this case by checking that the string has a length of at least one
byte. Also change the unsigned int types to size_t to store length values
while we're at it.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
4 years agolibopkg: fix skipping of leading whitespace when parsing checksums
Jo-Philipp Wich [Sat, 25 Jan 2020 12:57:01 +0000 (13:57 +0100)]
libopkg: fix skipping of leading whitespace when parsing checksums

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
4 years agoopkg: Fix -Wformat-overflow warning
Rosen Penev [Fri, 29 Nov 2019 21:08:32 +0000 (13:08 -0800)]
opkg: Fix -Wformat-overflow warning

A null pointer is being passed to printf. This can lead to problems.

Fixes warning:

error: '%s' directive argument is null [-Werror=format-overflow=]
   41 |    opkg_message(l, "%s: "fmt, __FUNCTION__, ##args); \
      |    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
note: in expansion of macro 'opkg_msg'
   45 |  opkg_msg(l, fmt": %s.\n", ##args, strerror(errno))
      |  ^~~~~~~~
note: in expansion of macro 'opkg_perror'
  247 |   opkg_perror(ERROR, "Failed to create temporary directory '%s'",

Signed-off-by: Rosen Penev <rosenp@gmail.com>
5 years agoalternatives: remove duplicate 'const' specifier
Yousong Zhou [Fri, 14 Jun 2019 01:28:54 +0000 (01:28 +0000)]
alternatives: remove duplicate 'const' specifier

To quash warnings from GCC 7.

/home/yunion/git-repo/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-malta_be/opkg-2019-06-14-21b7bd73/libopkg/pkg_alternatives.c:35:42: warning: duplicate 'const' declaration specifier [-Wduplicate-decl-specifier]
 static const struct alternative_provider const providers[] = {
  ^~~~~

Signed-off-by: Yousong Zhou <zhouyousong@yunionyun.com>
5 years agoalternatives: special-case busybox as alternatives provider
Yousong Zhou [Wed, 12 Jun 2019 04:19:02 +0000 (04:19 +0000)]
alternatives: special-case busybox as alternatives provider

Almost all busybox applets are alternatives to some other existing
"full" utilities.  To lift the maintenance burden of enumerating CONFIG
symbols, symlink path of each applet, we special case busybox here as a
known alternatives provider.

All file pathes provided by busybox will serve as fallback alternatives
with -inf priority.  Packages intending to switch to using alternatives
mechanism will also not need to depend on the same kind of change be
applied on busybox in base system

v3 <- v2 continue to next when fetching provider pkg failed
v2 <- v1 Move busybox-specific part into data section

Signed-off-by: Yousong Zhou <zhouyousong@yunionyun.com>
Acked-by: Jo-Philipp Wich <jo@mein.io>
5 years agolibopkg: only perform size check when information is available
Jo-Philipp Wich [Thu, 31 Jan 2019 09:13:10 +0000 (10:13 +0100)]
libopkg: only perform size check when information is available

Fixes: cb66403 ("libopkg: check for file size mismatches")
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
5 years agolibopkg: check for file size mismatches
Jo-Philipp Wich [Thu, 31 Jan 2019 07:29:22 +0000 (08:29 +0100)]
libopkg: check for file size mismatches

Reject package files whose file size deviates from the size specified
in the package index in order to complicate producing hash collisions.

Ref: https://groups.google.com/d/msg/opkg-devel/o4kiGQMvkiw/hu0TVv59DgAJ
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
5 years agoRevert "libopkg: accept alternative notation for "Replaces" control field"
Jo-Philipp Wich [Fri, 18 Jan 2019 17:41:16 +0000 (18:41 +0100)]
Revert "libopkg: accept alternative notation for "Replaces" control field"

This reverts commit 1504d35f123980bf322df99fb434f6fda6e3ecd2.

We won't use Replaces: for the repo ABI_VERSION tracking after all, so
drop this hack before it becomes another liability.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
5 years agoRevert "libopkg: check installed reverse dependencies upon install/upgrade"
Jo-Philipp Wich [Fri, 18 Jan 2019 15:07:53 +0000 (16:07 +0100)]
Revert "libopkg: check installed reverse dependencies upon install/upgrade"

This reverts commit 89fe77cb119a24f728088320d66d51250a1f02ab.

After spending further thoughts on this I think this makes no sense at all
and such situations should be avoided on the repo level instead by don't
providing incompatible packages having an identical name.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
5 years agolibopkg: accept alternative notation for "Replaces" control field
Jo-Philipp Wich [Fri, 18 Jan 2019 08:01:10 +0000 (09:01 +0100)]
libopkg: accept alternative notation for "Replaces" control field

The presence of a "Replaces:" tag in any package feed list will cause
opkg prior to "d217daf libopkg: fix replacelist parsing and writing"
to segfault while parsing such a list.

Add a hack which lets opkg recognize a "Replace2" field and handle
it identically to "Replaces".

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
5 years agolibopkg: fix replacelist parsing and writing
Jo-Philipp Wich [Thu, 17 Jan 2019 21:02:37 +0000 (22:02 +0100)]
libopkg: fix replacelist parsing and writing

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
5 years agolibopkg: fix segmentation fault when traversing conflicts
Jo-Philipp Wich [Thu, 17 Jan 2019 20:37:09 +0000 (21:37 +0100)]
libopkg: fix segmentation fault when traversing conflicts

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
5 years agolibopkg: check installed reverse dependencies upon install/upgrade
Jo-Philipp Wich [Tue, 15 Jan 2019 08:19:32 +0000 (09:19 +0100)]
libopkg: check installed reverse dependencies upon install/upgrade

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
5 years agolibopkg: consider provided packages in pkg_vec_mark_if_matches()
Jo-Philipp Wich [Tue, 15 Jan 2019 07:46:15 +0000 (08:46 +0100)]
libopkg: consider provided packages in pkg_vec_mark_if_matches()

Also consider the list of provided abstract packages when testing the
package vector for name matches. This fixes the "opkg whatdepends"
command with abstract provided package arguments.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
5 years agoopkg_download: print error when fork() fails
Jo-Philipp Wich [Fri, 14 Dec 2018 07:13:38 +0000 (08:13 +0100)]
opkg_download: print error when fork() fails

Instead of silently failing and claiming that the signature verification
failed, print out the error status when the initial fork() call fails.

Ref: https://bugs.openwrt.org/index.php?do=details&task_id=1999
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
6 years agolibopkg: don't print unresolved dependencies twice
Jo-Philipp Wich [Tue, 30 Oct 2018 09:25:11 +0000 (10:25 +0100)]
libopkg: don't print unresolved dependencies twice

Sometimes opkg ends up reporting unresolved dependencies multiple
times while also missing a newline between consecutive error lines,
making the error message output looking garbled and confusing.

Add some logic to skip repeated unresolved dependencies and ensure
that message lines are properly terminated by newlines.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
6 years agoopkg_download: decode file:/ URLs
Jo-Philipp Wich [Thu, 7 Dec 2017 13:23:45 +0000 (14:23 +0100)]
opkg_download: decode file:/ URLs

Opkg might receive percent-encoded file:/ URLs from various sources,
e.g. local package lists, user-supplied command line arguments etc.

In order to support such URLs, decode the path component before
trying to invoke file operations on it.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
6 years agofile_util: implement urldecode_path()
Jo-Philipp Wich [Thu, 7 Dec 2017 13:23:00 +0000 (14:23 +0100)]
file_util: implement urldecode_path()

Introduce a new urldecode_path() helper to resolve percent-encoded URL
portions back into the original binary form.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
6 years agofile_util: consolidate hex/unhex routines
Jo-Philipp Wich [Thu, 7 Dec 2017 16:44:46 +0000 (17:44 +0100)]
file_util: consolidate hex/unhex routines

Consolidate the various copies of the bin2hex table into one global variant
and replace the broken hex() define with a static helper function to prevent
accidential multiple expression evaluation.

This also fixes bug when converting hexadecimal checksums into binary forms
where the letters a..f/A..F where incorrectly converted into 0..5 instead
of 10..15 .

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
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>
7 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>
7 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>
7 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>
7 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>
7 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>
7 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>