mirror of
https://gitlab.freedesktop.org/libbsd/libbsd.git
synced 2025-10-19 12:42:33 +02:00
Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
1bf0a55579 | ||
![]() |
ad613d9d09 | ||
![]() |
e084ce3fa7 | ||
![]() |
50e4c55afd | ||
![]() |
6faea4d2a0 | ||
![]() |
367e036537 | ||
![]() |
dc8b09783f | ||
![]() |
4663364783 | ||
![]() |
df5aebd7e1 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -5,6 +5,8 @@ ChangeLog
|
||||
*.o
|
||||
*.so*
|
||||
*.a
|
||||
*.log
|
||||
*.trs
|
||||
.deps/
|
||||
.libs/
|
||||
Makefile
|
||||
|
2
COPYING
2
COPYING
@@ -66,7 +66,7 @@ for man/arc4random.3, man/tree.3 and man/getprogname.3.
|
||||
The rest of the licenses apply to code and/or man pages.
|
||||
|
||||
|
||||
Copyright © 2004-2006, 2008-2012 Guillem Jover <guillem@hadrons.org>
|
||||
Copyright © 2004-2006, 2008-2013 Guillem Jover <guillem@hadrons.org>
|
||||
Copyright © 2005 Hector Garcia Alvarez
|
||||
Copyright © 2005 Aurelien Jarno
|
||||
Copyright © 2006 Robert Millan
|
||||
|
45
configure.ac
45
configure.ac
@@ -53,6 +53,51 @@ AC_CHECK_DECL([F_CLOSEM],
|
||||
[#include <limits.h>
|
||||
#include <fcntl.h>])
|
||||
|
||||
AC_CACHE_CHECK(
|
||||
[for GNU .init_array section support],
|
||||
[libbsd_cv_gnu_init_array_support],
|
||||
[AC_RUN_IFELSE(
|
||||
[AC_LANG_SOURCE(
|
||||
[[
|
||||
static int rc = 1;
|
||||
static void init(int argc) { if (argc == 1) rc = 0; }
|
||||
void (*init_func)(int argc) __attribute__((section(".init_array"))) = init;
|
||||
int main() { return rc; }
|
||||
]]
|
||||
)],
|
||||
[libbsd_cv_gnu_init_array_support=yes],
|
||||
[libbsd_cv_gnu_init_array_support=no],
|
||||
[AC_PREPROC_IFELSE(
|
||||
[AC_LANG_SOURCE(
|
||||
[[
|
||||
/* Look for a known libc that supports .init_array with the GNU extension
|
||||
* to pass main() arguments to the init functions. */
|
||||
#include <stdlib.h>
|
||||
#if defined __GLIBC_PREREQ
|
||||
# if __GLIBC_PREREQ(2, 4)
|
||||
/* glibc supports GNU .init_array since 2.4. */
|
||||
# else
|
||||
# error glibc does not support GNU .init_array
|
||||
# endif
|
||||
#else
|
||||
/*
|
||||
* Basic SysV ABI .init_array support, init functions do not get arguments:
|
||||
* - Bionic since its inception.
|
||||
* - uClibc since 0.9.29.
|
||||
*/
|
||||
# error unknown whether libc supports GNU .init_array
|
||||
#endif
|
||||
]]
|
||||
)],
|
||||
[libbsd_cv_gnu_init_array_support=yes],
|
||||
[libbsd_cv_gnu_init_array_support=no])
|
||||
]
|
||||
)]
|
||||
)
|
||||
if test "$libbsd_cv_gnu_init_array_support" = no; then
|
||||
AC_MSG_ERROR([missing required GNU .init_array section support])
|
||||
fi
|
||||
|
||||
# Checks for library functions.
|
||||
AC_MSG_CHECKING([for program_invocation_short_name])
|
||||
AC_LINK_IFELSE(
|
||||
|
@@ -34,7 +34,7 @@ libbsd_la_DEPENDENCIES = \
|
||||
libbsd.map
|
||||
libbsd_la_LDFLAGS = \
|
||||
-Wl,--version-script=$(srcdir)/libbsd.map \
|
||||
-version-number 0:5:0
|
||||
-version-number 0:5:2
|
||||
libbsd_la_SOURCES = \
|
||||
arc4random.c \
|
||||
bsd_getopt.c \
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright © 2010 William Ahern
|
||||
* Copyright © 2012 Guillem Jover <guillem@hadrons.org>
|
||||
* Copyright © 2012-2013 Guillem Jover <guillem@hadrons.org>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
@@ -76,36 +76,60 @@ spt_clearenv(void)
|
||||
}
|
||||
|
||||
static int
|
||||
spt_copyenv(char *oldenv[])
|
||||
spt_copyenv(int envc, char *envp[])
|
||||
{
|
||||
char **envcopy;
|
||||
char *eq;
|
||||
int envsize;
|
||||
int i, error;
|
||||
|
||||
if (environ != oldenv)
|
||||
if (environ != envp)
|
||||
return 0;
|
||||
|
||||
/* Make a copy of the old environ array of pointers, in case
|
||||
* clearenv() or setenv() is implemented to free the internal
|
||||
* environ array, because we will need to access the old environ
|
||||
* contents to make the new copy. */
|
||||
envsize = (envc + 1) * sizeof(char *);
|
||||
envcopy = malloc(envsize);
|
||||
if (envcopy == NULL)
|
||||
return errno;
|
||||
memcpy(envcopy, envp, envsize);
|
||||
|
||||
error = spt_clearenv();
|
||||
if (error) {
|
||||
environ = oldenv;
|
||||
environ = envp;
|
||||
free(envcopy);
|
||||
return error;
|
||||
}
|
||||
|
||||
for (i = 0; oldenv[i]; i++) {
|
||||
eq = strchr(oldenv[i], '=');
|
||||
for (i = 0; envcopy[i]; i++) {
|
||||
eq = strchr(envcopy[i], '=');
|
||||
if (eq == NULL)
|
||||
continue;
|
||||
|
||||
*eq = '\0';
|
||||
if (setenv(oldenv[i], eq + 1, 1) < 0)
|
||||
if (setenv(envcopy[i], eq + 1, 1) < 0)
|
||||
error = errno;
|
||||
*eq = '=';
|
||||
|
||||
if (error) {
|
||||
environ = oldenv;
|
||||
#ifdef HAVE_CLEARENV
|
||||
/* Because the old environ might not be available
|
||||
* anymore we will make do with the shallow copy. */
|
||||
environ = envcopy;
|
||||
#else
|
||||
environ = envp;
|
||||
free(envcopy);
|
||||
#endif
|
||||
return error;
|
||||
}
|
||||
}
|
||||
|
||||
/* Dispose of the shallow copy, now that we've finished transfering
|
||||
* the old environment. */
|
||||
free(envcopy);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -129,11 +153,15 @@ spt_copyargs(int argc, char *argv[])
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __attribute__((constructor))
|
||||
static void
|
||||
spt_init(int argc, char *argv[], char *envp[])
|
||||
{
|
||||
char *base, *end, *nul, *tmp;
|
||||
int i, error;
|
||||
int i, envc, error;
|
||||
|
||||
/* Try to make sure we got called with main() arguments. */
|
||||
if (argc < 0)
|
||||
return;
|
||||
|
||||
base = argv[0];
|
||||
if (base == NULL)
|
||||
@@ -155,6 +183,7 @@ spt_init(int argc, char *argv[], char *envp[])
|
||||
|
||||
end = envp[i] + strlen(envp[i]) + 1;
|
||||
}
|
||||
envc = i;
|
||||
|
||||
SPT.arg0 = strdup(argv[0]);
|
||||
if (SPT.arg0 == NULL) {
|
||||
@@ -169,7 +198,7 @@ spt_init(int argc, char *argv[], char *envp[])
|
||||
}
|
||||
setprogname(tmp);
|
||||
|
||||
error = spt_copyenv(envp);
|
||||
error = spt_copyenv(envc, envp);
|
||||
if (error) {
|
||||
SPT.error = error;
|
||||
return;
|
||||
@@ -186,6 +215,14 @@ spt_init(int argc, char *argv[], char *envp[])
|
||||
SPT.end = end;
|
||||
}
|
||||
|
||||
/*
|
||||
* Force spt_init() function into the .init_array section instead of expecting
|
||||
* either the compiler to place constructors there or the linker to move them
|
||||
* from .ctors to .init_array.
|
||||
*/
|
||||
void (*spt_init_func)(int argc, char *argv[], char *envp[])
|
||||
__attribute__((section(".init_array"))) = spt_init;
|
||||
|
||||
#ifndef SPT_MAXTITLE
|
||||
#define SPT_MAXTITLE 255
|
||||
#endif
|
||||
@@ -245,11 +282,14 @@ setproctitle_impl(const char *fmt, ...)
|
||||
}
|
||||
__asm__(".symver setproctitle_impl,setproctitle@@LIBBSD_0.5");
|
||||
|
||||
#ifdef HAVE_TYPEOF
|
||||
/* The original function introduced in 0.2 was a stub, it only got implemented
|
||||
* in 0.5, make the implementation available in the old version as an alias
|
||||
* for code linking against that version, and change the default to use the
|
||||
* new version, so that new code depends on the implemented version. */
|
||||
#ifdef HAVE_TYPEOF
|
||||
extern typeof(setproctitle_impl) setproctitle_stub __attribute__((alias("setproctitle_impl")));
|
||||
__asm__(".symver setproctitle_stub,setproctitle@LIBBSD_0.2");
|
||||
#else
|
||||
void setproctitle_stub(const char *fmt, ...)
|
||||
__attribute__((alias("setproctitle_impl")));
|
||||
#endif
|
||||
__asm__(".symver setproctitle_stub,setproctitle@LIBBSD_0.2");
|
||||
|
@@ -58,7 +58,7 @@ main(int argc, char **argv)
|
||||
assert(val == 20971520);
|
||||
|
||||
assert(dehumanize_number("-3G", &val) == 0);
|
||||
assert(val == -3221225472);
|
||||
assert(val == -3221225472LL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright © 2012 Guillem Jover <guillem@hadrons.org>
|
||||
* Copyright © 2012-2013 Guillem Jover <guillem@hadrons.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@@ -35,6 +35,7 @@ main(int argc, char **argv)
|
||||
{
|
||||
const char newtitle_base[] = "test arg1 arg2";
|
||||
char *newtitle_full;
|
||||
char *envvar;
|
||||
|
||||
setproctitle("-test %s arg2", "arg1");
|
||||
assert(strcmp(argv[0], newtitle_base) == 0);
|
||||
@@ -44,5 +45,10 @@ main(int argc, char **argv)
|
||||
assert(strcmp(argv[0], newtitle_full) == 0);
|
||||
free(newtitle_full);
|
||||
|
||||
assert(setenv("LIBBSD_TEST", "test value", 1) == 0);
|
||||
envvar = getenv("LIBBSD_TEST");
|
||||
assert(envvar != NULL);
|
||||
assert(strcmp(envvar, "test value") == 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user