diff options
author | Sven Eden <yamakuzure@gmx.net> | 2017-03-07 10:29:34 +0100 |
---|---|---|
committer | Sven Eden <yamakuzure@gmx.net> | 2017-03-14 10:23:22 +0100 |
commit | 6156b4779584b4bf1dc973ce988a34a1bcae1db3 (patch) | |
tree | 457e7f8cf76bf8f155369f6c73b9ddc4adbadb71 /src/basic/musl_missing.h | |
parent | c6999740c1a68767c5397306b8d7e14e08533111 (diff) |
Add support for building elogind against musl libc
* Check whether printf.h is available and define/undef HAVE_PRINTF_H
accordingly.
* Added src/shared/parse-printf-format.[hc] by Emil Renner Berthing
<systemd@esmil.dk> that provides parse_printf_format() if printf.h
is unavailable
* Added src/basic/musl_missing.h by Juergen Buchmueller
<pullmoll@t-online.de> that implements glibc functions missing in
musl libc as macros.
* Extended src/basic/musl_missing.h and added
src/basic/musl_missing.c providing
- program_invocation_name
- program_invocation_short_name and
- elogind_set_program_name() to set the two where appropriate.
* Added calls to elogind_set_program_name() to all main() functions
where needed.
* A few other fixes to work nicely with musl libc.
Diffstat (limited to 'src/basic/musl_missing.h')
-rw-r--r-- | src/basic/musl_missing.h | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/src/basic/musl_missing.h b/src/basic/musl_missing.h new file mode 100644 index 000000000..f54319d1b --- /dev/null +++ b/src/basic/musl_missing.h @@ -0,0 +1,94 @@ +#pragma once +#ifndef ELOGIND_BASIC_MUSL_MISSING_H_INCLUDED +#define ELOGIND_BASIC_MUSL_MISSING_H_INCLUDED + + +/**************************************************************** + * musl_missing.h - work around glibc extensions for musl libc. + * + * Implements glibc functions missing in musl libc as macros. + * Is to be included where these functions are used. + * Also defines some glibc only constants as either 0 or + * as found in the corresponding glibc header file. + * + * Juergen Buchmueller <pullmoll@t-online.de> for Void Linux + * Public Domain; no warranties whatsoever. Thank you Mr. P. + * + ****************************************************************/ + + +void elogind_set_program_name(const char* pcall); + +#if !defined(__GLIBC__) +#include "config.h" +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#define strerror_r(e, m, k) (strerror_r(e, m, k) < 0 ? strdup("strerror_r() failed") : m); + +#ifndef _ERRNO_H +extern char *program_invocation_name; +extern char *program_invocation_short_name; +#endif // errno.h included beforehand + +/* + * Possibly TODO according to http://man7.org/linux/man-pages/man3/getenv.3.html + * + test if the process's effective user ID does not match its real user ID or + * the process's effective group ID does not match its real group ID; + * typically this is the result of executing a set-user-ID or set- + * group-ID program. Is calling issetugid() sufficient here? + * + test if the effective capability bit was set on the executable file + * + test if the process has a nonempty permitted capability set + */ +#if !defined(HAVE_SECURE_GETENV) && !defined(HAVE___SECURE_GETENV) +# define secure_getenv(name) \ + (issetugid() ? NULL : getenv(name)) +# define HAVE_SECURE_GETENV 1 +#endif // HAVE_[__]SECURE_GETENV + +/* Poor man's basename */ +#define basename(path) \ + (strrchr(path, '/') ? strrchr(path, '/')+1 : path) + +/* strndupa may already be defined in another compatibility header */ +#if !defined(strndupa) +#define strndupa(src, n) \ + (__extension__ ({const char *in = (src); \ + size_t len = strnlen(in, (n)) + 1; \ + char *out = (char *) alloca(len); \ + out[len-1] = '\0'; \ + (char *) memcpy(out, in, len-1);}) \ + ) +#endif + +/* See http://man7.org/linux/man-pages/man3/canonicalize_file_name.3.html */ +#define canonicalize_file_name(path) \ + realpath(path, NULL) + +typedef int (*__compar_fn_t)(const void *, const void *); + +/* GLOB_BRACE is another glibc extension - ignore it for musl libc */ +#define GLOB_BRACE 0 + +/* getnameinfo(3) glibc extensions are undefined in musl libc */ +#define NI_IDN 0 +#define NI_IDN_USE_STD3_ASCII_RULES 0 + +/* Taken from glibc's net/if_arp.h */ +#if !defined(ARPHRD_IEEE802154_PHY) +#define ARPHRD_IEEE802154_PHY 805 /* IEEE 802.15.4 PHY header. */ +#endif + +/* Shorthand for type of comparison functions. */ +#ifndef __COMPAR_FN_T +# define __COMPAR_FN_T +typedef int (*__compar_fn_t) (const void *, const void *); +typedef __compar_fn_t comparison_fn_t; +#endif + + +#endif // !defined(__GLIBC__) + +#endif // ELOGIND_BASIC_MUSL_MISSING_H_INCLUDED + |