46 Commits

Author SHA1 Message Date
Ariadne Conill
be0687f637 libpkgconf: use pkgconf_client_getenv wrapper for mocking
Signed-off-by: Ariadne Conill <ariadne@ariadne.space>
2025-12-24 15:47:53 -08:00
Ariadne Conill
c863ef3f82 libpkgconf: clean up _WIN32 include mess quite a bit
Ref: https://github.com/pkgconf/pkgconf/issues/406
Signed-off-by: Ariadne Conill <ariadne@ariadne.space>
2025-12-20 15:25:17 -08:00
Ariadne Conill
aa5813ac5e libpkgconf: path: refactor windows registry PKG_CONFIG_PATH support
Now we add to the search list rather than falling back to the registry
after the search list fails to find a package.

Signed-off-by: Ariadne Conill <ariadne@ariadne.space>
2025-05-31 00:17:11 -07:00
Ariadne Conill
2983d31188 libpkgconf: path: gracefully handle memory alloc failures
Found-by: GCC -fanalyzer
Signed-off-by: Ariadne Conill <ariadne@ariadne.space>
2025-05-28 23:21:24 -07:00
Ariadne Conill
7b8865d1ba libpkgconf: path: add pkgconf_path_prepend_list
Previously when processing --with-path entries we were adding to the tail
of the search list.  In reality, we expect --with-path entries to be treated
in an equivalent way to PKG_CONFIG_PATH.

Accordingly, add a variant of pkgconf_path_copy_list which prepends instead.

Related: https://github.com/pkgconf/pkgconf/issues/400
Signed-off-by: Ariadne Conill <ariadne@ariadne.space>
2025-05-08 13:07:30 -07:00
Ariadne Conill
792e2c6225
libpkgconf: path: get rid of unused win32-specific variable
Windows builder was warning about this.

Signed-off-by: Ariadne Conill <ariadne@ariadne.space>
2025-02-04 17:00:30 -08:00
Sam James
d454f62c73 libpkgconf: fix -Walloc-size
GCC 14 introduces a new -Walloc-size included in -Wextra which gives:
```
libpkgconf/personality.c:260:11: warning: allocation of insufficient size '1' for type 'pkgconf_cross_personality_t' {aka 'struct pkgconf_cross_personality_'} with size '48' [-Walloc-size]
libpkgconf/queue.c:46:33: warning: allocation of insufficient size '1' for type 'pkgconf_queue_t' {aka'struct pkgconf_queue_'} with size '16' [-Walloc-size]
libpkgconf/client.c:164:33: warning: allocation of insufficient size '1' for type 'pkgconf_client_t' {aka 'struct pkgconf_client_'} with size '120' [-Walloc-size]
libpkgconf/path.c:105:14: warning: allocation of insufficient size '1' for type 'pkgconf_path_t' {aka 'struct pkgconf_path_'} with size '24' [-Walloc-size]
libpkgconf/path.c:237:22: warning: allocation of insufficient size '1' for type 'pkgconf_path_t' {aka 'struct pkgconf_path_'} with size '24' [-Walloc-size]
libpkgconf/tuple.c:239:34: warning: allocation of insufficient size '1' for type 'pkgconf_tuple_t' {aka 'struct pkgconf_tuple_'} with size '24' [-Walloc-size]
libpkgconf/dependency.c:133:13: warning: allocation of insufficient size '1' for type 'pkgconf_dependency_t' {aka 'struct pkgconf_dependency_'} with size '44' [-Walloc-size]
libpkgconf/dependency.c:472:17: warning: allocation of insufficient size '1' for type 'pkgconf_dependency_t' {aka 'struct pkgconf_dependency_'} with size '44' [-Walloc-size]
libpkgconf/fragment.c:146:22: warning: allocation of insufficient size '1' for type 'pkgconf_fragment_t' {aka 'struct pkgconf_fragment_'} with size '24' [-Walloc-size]
libpkgconf/fragment.c:195:22: warning: allocation of insufficient size '1' for type 'pkgconf_fragment_t' {aka 'struct pkgconf_fragment_'} with size '24' [-Walloc-size]
libpkgconf/fragment.c:356:14: warning: allocation of insufficient size '1' for type 'pkgconf_fragment_t' {aka 'struct pkgconf_fragment_'} with size '24' [-Walloc-size]
libpkgconf/pkg.c:422:13: warning: allocation of insufficient size '1' for type 'pkgconf_pkg_t' {aka 'struct pkgconf_pkg_'} with size '188' [-Walloc-size]
libpkgconf/client.c:164:33: warning: allocation of insufficient size '1' for type 'pkgconf_client_t' {aka 'struct pkgconf_client_'} with size '224' [-Walloc-size]
libpkgconf/personality.c:260:11: warning: allocation of insufficient size '1' for type 'pkgconf_cross_personality_t' {aka 'struct pkgconf_cross_personality_'} with size '96' [-Walloc-size]
libpkgconf/dependency.c:133:13: warning: allocation of insufficient size '1' for type 'pkgconf_dependency_t' {aka 'struct pkgconf_dependency_'} with size '80' [-Walloc-size]
libpkgconf/dependency.c:472:17: warning: allocation of insufficient size '1' for type 'pkgconf_dependency_t' {aka 'struct pkgconf_dependency_'} with size '80' [-Walloc-size]
libpkgconf/path.c:105:14: warning: allocation of insufficient size '1' for type 'pkgconf_path_t' {aka 'struct pkgconf_path_'} with size '48' [-Walloc-size]
libpkgconf/path.c:237:22: warning: allocation of insufficient size '1' for type 'pkgconf_path_t' {aka 'struct pkgconf_path_'} with size '48' [-Walloc-size]
libpkgconf/queue.c:46:33: warning: allocation of insufficient size '1' for type 'pkgconf_queue_t' {aka 'struct pkgconf_queue_'} with size '32' [-Walloc-size]
libpkgconf/tuple.c:239:34: warning: allocation of insufficient size '1' for type 'pkgconf_tuple_t' {aka 'struct pkgconf_tuple_'} with size '48' [-Walloc-size]
libpkgconf/fragment.c:146:22: warning: allocation of insufficient size '1' for type 'pkgconf_fragment_t' {aka 'struct pkgconf_fragment_'} with size '48' [-Walloc-size]
libpkgconf/fragment.c:195:22: warning: allocation of insufficient size '1' for type 'pkgconf_fragment_t' {aka 'struct pkgconf_fragment_'} with size '48' [-Walloc-size]
libpkgconf/fragment.c:356:14: warning: allocation of insufficient size '1' for type 'pkgconf_fragment_t' {aka 'struct pkgconf_fragment_'} with size '48' [-Walloc-size]
libpkgconf/pkg.c:422:13: warning: allocation of insufficient size '1' for type 'pkgconf_pkg_t' {aka 'struct pkgconf_pkg_'} with size '360' [-Walloc-size]
```

The calloc prototype is:
```
void *calloc(size_t nmemb, size_t size);
    ```

So, just swap the number of members and size arguments to match the prototype, as
we're initialising 1 struct of size `sizeof(struct ...)`. GCC then sees we're not
doing anything wrong.

The only exception there is for argv which I fixed while at it.

Signed-off-by: Sam James <sam@gentoo.org>
2023-11-22 10:06:14 -08:00
Ariadne Conill
652aff9790 path: add pkgconf_path_prepend API for --with-path
Otherwise, PKG_CONFIG_PATH and PKG_CONFIG_LIBDIR elements would be processed backwards.

Fixes: 384ade5 (path: prepend paths rather than append paths when processing --with-path arguments)
Closes: #250
Signed-off-by: Ariadne Conill <ariadne@dereferenced.org>
2023-10-08 22:27:56 +00:00
Ariadne Conill
384ade5f31 path: prepend paths rather than append paths when processing --with-path arguments 2023-08-04 08:24:32 +00:00
Dylan Baker
c0fa7879b2 libpkgconf: zero path lists after freeing
This is required to make the pointer safely re-usable after being freed,
otherwise the list still says that it has nodes, but they point nowhere.
This is particularly important for libpkgconf, if a caller needs to
re-enter the library after freeing a path in a static path (such as the
default personality)
2022-06-26 03:12:34 +00:00
Christoph Reiter
4f73f6a1d6 Rework path handling on native Windows
The current approach was to parse the .pc and, detect the prefix, throw
everything together and at the end replace all \ with / to not produce invalid
escape sequences.

This has the problem that escaping in .pc files is ignored and no longer
possible. Also in case the prefix path has a space in it the result would be
invalid because of missing escaping.

This changes the following things:

* We no longer normalize values at the end. Instead we assume .pc files use "/"
  as a directory separator or "\\", same format as under Unix. "\" alone no
  longer works. This shouldn't be a problem since most build tools produce .pc
  files with "/" like meson, cmake, autotools.

* When injecting the prefix at runtime we convert the prefix to use "/" and
  escape spaces so that in combination with the .pc content the result is a
  valid escaped path value again.

This patch has been used in MSYS2 for some months now.

See #212
2021-03-20 06:59:38 -08:00
Christoph Reiter
4be39c59fb Remove usage of cygwin_conv_path() under cygwin/msys
This converted Unix paths to Windows paths, but all cygwin tools
work with Unix paths so this shouldn't be needed.

There is one use case if you use a cygwin pkgconf with a non-cygwin toolchain,
but pkgconf works reasonable well natively now so this shouldn't be needed
anymore and more likely leads to problems and confusion.

Both cygwin and msys have patched this out already:
* https://cygwin.com/git-cygwin-packages/?p=git/cygwin-packages/pkgconf.git;a=blob;f=pkgconf.cygport;h=e5d003f3f3dfc9e374b916974018022ad8d68852;hb=HEAD#l55
* a4bce0c294/pkgconf/PKGBUILD (L26)
2021-03-20 06:58:53 -08:00
Ariadne Conill
dbb6a232e5 path: don't use PATH_MAX, use PKGCONF_ITEM_SIZE * 4 for realpath buffer 2021-03-18 06:56:55 -06:00
Fabian Groffen
13a5d9a5f0 libpkgconf: path: supply buffer to realpath
To avoid a crash on some platforms (like Darwin 9) provide a buffer to
realpath(3).

Darwin 9 (last PPC target) documents realpath needs to be given a buffer
to the resolved_path argument large enough to hold PATH_MAX bytes.
With NULL argument it crashes.  Solaris makes no mention of
resolved_path to be allowed NULL, yet recent versions accept it and
malloc(3) accordingly.

Because the documentation explicitly mentions PATH_MAX being the limit
to what realpath(3) would write in resolved_path, switching to a static
buffer here doesn't limit resolution compared to dynamically allocating
a buffer by realpath(3).

While this change requires a bit more space on the stack, it avoids a
malloc/free sequence, and allows successful operation on (older)
platforms that lack support for dynamically allocating a return buffer
in realpath(3).

Signed-off-by: Fabian Groffen <grobian@gentoo.org>
2021-01-08 18:44:40 -05:00
Ariadne Conill
2a8bebf289 libpkgconf: path: rewrite DOS paths in non-cygwin case too 2020-06-11 18:00:56 -06:00
Ariadne Conill
7e0b0fadab libpkgconf: path: fix memory leak when deduping paths (closes #39) 2019-07-11 03:43:18 -05:00
Alexander Tsoy
db9c1e96a1
fix the order of header includes
config.h should be included before stdinc.h, otherwise large file
support is not enabled.

Downstream bug: https://bugs.gentoo.org/687548
2019-06-08 04:55:52 +03:00
William Pitcock
3afd14c49e libpkgconf: path: use realpath(3) to deduplicate the search path
closes #24
2019-03-23 22:27:05 -05:00
William Pitcock
43e8c7b44d libpkgconf: path: add path list copying function 2018-05-09 16:35:21 -05:00
William Pitcock
4589274c43 libpkgconf: start to remove PKGCONF_BUFSIZE allocations from the stack. (closes #149)
Patch by Karen Arutyunov.
2017-10-16 12:56:19 -05:00
William Pitcock
36551cca83 libpkgconf: path: relocate the path before doing dedup checks (closes #151) 2017-10-16 11:30:22 -05:00
William Pitcock
3bc2e21dd1 libpkgconf: path: ensure entire buffer is zeroed before calling realpath() on it (closes #150) 2017-10-16 11:26:27 -05:00
William Pitcock
e9fd43caa7 libpkgconf: clean up header includes (closes #137) 2017-09-17 23:38:25 -05:00
William Pitcock
a6d6b88d14 libpkgconf: path: fix logic error in path relocation case when matching against a list (closes #129) 2017-09-08 18:27:04 -05:00
Dan Kegel
4d7b4d7c8e Minimal tweaks to compile with Visual C 2015 2017-06-04 19:19:55 -07:00
John Hein
9b255d465c If PKG_CONFIG_PATH element is a sym link, use the link destination instead of the link for inode caching checks.
See issue 112 & issue 110 (https://github.com/pkgconf/pkgconf/issues)
2017-02-24 23:26:41 -06:00
John Hein
76b8e0a26b Normalize the path to remove duplicate / separators rather than possibly altering the path with realpath(3). Leave sym links as is in path components. This is also cheaper than realpath(3), and works on platforms that don't have realpath(3).
Note: if this is accepted, the check for realpath in configure.ac
can be removed, and some docs that mention realpath will be adjusted.
2017-02-24 23:26:10 -06:00
William Pitcock
b06bbe75a4 libpkgconf: path: only enable cygwin path relocation backend for msys (ref #72) 2017-01-23 23:17:26 -06:00
William Pitcock
1ee3c12f53 libpkgconf: path: use pkgconf_path_relocate() when matching paths 2017-01-19 10:43:23 -06:00
William Pitcock
fa927fd379 libpkgconf: path: pkgconf_path_relocate(): implement realpath backend 2017-01-19 10:36:07 -06:00
William Pitcock
0315832285 doc: document pkgconf_path_relocate() 2017-01-19 10:31:40 -06:00
William Pitcock
147fd80750 path: relocate system libdir/includedir if appropriate 2017-01-13 20:12:38 -06:00
William Pitcock
87a5a1f0cc path: when stubbing pkgconf_path_relocate(), suppress unused variables warnings 2017-01-13 20:08:22 -06:00
William Pitcock
1369f558c6 path: add new pkgconf_path_relocate() API which is a stub when path
relocation is not needed
2017-01-13 20:05:21 -06:00
Baptiste Daroussin
3b3f1dc76e Fix gcc warnings 2017-01-07 17:57:37 +01:00
Baptiste Daroussin
2e855972dc inode cache: ensure we never use an unitilized struct stat 2017-01-07 17:52:44 +01:00
Graham Ollis
9c426b6f2c do not filter non-existent directories if filter is off 2016-12-31 14:10:59 -06:00
William Pitcock
92f566ff38 libpkgconf: path: check both device node and inode for dedup. pointed out by @plicease 2016-12-30 11:39:45 -06:00
William Pitcock
2305031573 libpkgconf: path: make the duplicate filtering opt-in. some path lists should not be deduped (compiler path lists, for example) 2016-12-30 11:13:04 -06:00
William Pitcock
bad0da0c03 libpkgconf: path: filter out duplicate path entries by inode if possible (closes #102) 2016-12-30 11:01:15 -06:00
William Pitcock
aa041b415e libpkgconf: path: add naive path list filtering function 2016-12-30 10:44:01 -06:00
William Pitcock
f6b074f267 libpkgconf: path: make pkgconf_path_match_list() take a const list argument 2016-12-21 19:50:05 -06:00
William Pitcock
4cc0d017da libpkgconf: document path module 2016-12-10 20:14:42 -06:00
William Pitcock
e7f4846508 libpkgconf: path: add cleanup functions 2016-12-02 00:04:43 -06:00
William Pitcock
4bb46e20e3 libpkgconf: add path matching and environment building functions 2016-11-30 22:36:35 -06:00
William Pitcock
f4da1082cb libpkgconf: refactor some path operations 2016-11-30 22:15:13 -06:00