mirror of
https://gitlab.freedesktop.org/libbsd/libbsd.git
synced 2025-10-20 22:31:34 +02:00
Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
119417462e | ||
![]() |
948bcf1db8 | ||
![]() |
c5b9590287 | ||
![]() |
3077d2fffc |
@@ -11,6 +11,13 @@ AM_INIT_AUTOMAKE([1.8 foreign nostdinc no-dist-gzip dist-xz])
|
|||||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])],
|
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])],
|
||||||
[AC_SUBST([AM_DEFAULT_VERBOSITY], [1])])
|
[AC_SUBST([AM_DEFAULT_VERBOSITY], [1])])
|
||||||
|
|
||||||
|
LIBBSD_ABI_MAJOR=0
|
||||||
|
LIBBSD_ABI_MINOR=6
|
||||||
|
LIBBSD_ABI_PATCH=0
|
||||||
|
|
||||||
|
LIBBSD_ABI="$LIBBSD_ABI_MAJOR:$LIBBSD_ABI_MINOR:$LIBBSD_ABI_PATCH"
|
||||||
|
AC_SUBST([LIBBSD_ABI])
|
||||||
|
|
||||||
# Check and store if we got user supplied variables
|
# Check and store if we got user supplied variables
|
||||||
user_CFLAGS=${CFLAGS-unset}
|
user_CFLAGS=${CFLAGS-unset}
|
||||||
|
|
||||||
@@ -125,6 +132,7 @@ AC_CONFIG_FILES([
|
|||||||
man/Makefile
|
man/Makefile
|
||||||
src/Makefile
|
src/Makefile
|
||||||
src/libbsd.pc
|
src/libbsd.pc
|
||||||
|
src/libbsd-ctor.pc
|
||||||
src/libbsd-overlay.pc
|
src/libbsd-overlay.pc
|
||||||
test/Makefile
|
test/Makefile
|
||||||
])
|
])
|
||||||
|
@@ -56,6 +56,10 @@ void *setmode(const char *mode_str);
|
|||||||
|
|
||||||
void closefrom(int lowfd);
|
void closefrom(int lowfd);
|
||||||
|
|
||||||
|
/* Compatibility with sendmail implementations. */
|
||||||
|
#define initsetproctitle(c, a, e) setproctitle_init((c), (a), (e))
|
||||||
|
|
||||||
|
void setproctitle_init(int argc, char *argv[], char *envp[]);
|
||||||
void setproctitle(const char *fmt, ...);
|
void setproctitle(const char *fmt, ...);
|
||||||
|
|
||||||
int getpeereid(int s, uid_t *euid, gid_t *egid);
|
int getpeereid(int s, uid_t *euid, gid_t *egid);
|
||||||
|
@@ -33,6 +33,8 @@
|
|||||||
.In sys/types.h
|
.In sys/types.h
|
||||||
.In bsd/unistd.h
|
.In bsd/unistd.h
|
||||||
.Ft void
|
.Ft void
|
||||||
|
.Fn setproctitle_init "int argc" "char *argv[]" "char *envp[]"
|
||||||
|
.Ft void
|
||||||
.Fn setproctitle "const char *fmt" "..."
|
.Fn setproctitle "const char *fmt" "..."
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
The
|
The
|
||||||
@@ -41,6 +43,15 @@ library routine sets the process title that appears on the
|
|||||||
.Xr ps 1
|
.Xr ps 1
|
||||||
command.
|
command.
|
||||||
.Pp
|
.Pp
|
||||||
|
The
|
||||||
|
.Fn setproctitle_init
|
||||||
|
library routine only needs to be called (before any call to
|
||||||
|
.Fn setproctitle
|
||||||
|
and with
|
||||||
|
.Fn main
|
||||||
|
arguments), if the automatic constructor support has not
|
||||||
|
been linked in through the libbsd-ctor pkg-config file.
|
||||||
|
.Pp
|
||||||
The title is set from the executable's name, followed by the
|
The title is set from the executable's name, followed by the
|
||||||
result of a
|
result of a
|
||||||
.Xr printf 3
|
.Xr printf 3
|
||||||
@@ -101,6 +112,11 @@ first appeared in
|
|||||||
.Fx 2.2 .
|
.Fx 2.2 .
|
||||||
Other operating systems have
|
Other operating systems have
|
||||||
similar functions.
|
similar functions.
|
||||||
|
.Pp
|
||||||
|
The
|
||||||
|
.Fn setproctitle_init
|
||||||
|
function is a libbsd extension not present on the BSDs, avoid using it
|
||||||
|
in portable code.
|
||||||
.Sh AUTHORS
|
.Sh AUTHORS
|
||||||
.An -nosplit
|
.An -nosplit
|
||||||
.An Peter Wemm Aq peter@FreeBSD.org
|
.An Peter Wemm Aq peter@FreeBSD.org
|
||||||
|
@@ -10,6 +10,7 @@ AM_CPPFLAGS = \
|
|||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
libbsd.map \
|
libbsd.map \
|
||||||
libbsd.pc.in \
|
libbsd.pc.in \
|
||||||
|
libbsd-ctor.pc.in \
|
||||||
libbsd-overlay.pc.in \
|
libbsd-overlay.pc.in \
|
||||||
hash/helper.c \
|
hash/helper.c \
|
||||||
$(nil)
|
$(nil)
|
||||||
@@ -21,10 +22,12 @@ CLEANFILES = \
|
|||||||
pkgconfigdir = $(libdir)/pkgconfig
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
pkgconfig_DATA = \
|
pkgconfig_DATA = \
|
||||||
libbsd.pc \
|
libbsd.pc \
|
||||||
|
libbsd-ctor.pc \
|
||||||
libbsd-overlay.pc \
|
libbsd-overlay.pc \
|
||||||
$(nil)
|
$(nil)
|
||||||
|
|
||||||
lib_LTLIBRARIES = libbsd.la
|
lib_LTLIBRARIES = libbsd.la
|
||||||
|
lib_LIBRARIES = libbsd-ctor.a
|
||||||
|
|
||||||
hash/md5hl.c: $(srcdir)/hash/helper.c
|
hash/md5hl.c: $(srcdir)/hash/helper.c
|
||||||
$(AM_V_at) $(MKDIR_P) hash
|
$(AM_V_at) $(MKDIR_P) hash
|
||||||
@@ -34,7 +37,7 @@ libbsd_la_DEPENDENCIES = \
|
|||||||
libbsd.map
|
libbsd.map
|
||||||
libbsd_la_LDFLAGS = \
|
libbsd_la_LDFLAGS = \
|
||||||
-Wl,--version-script=$(srcdir)/libbsd.map \
|
-Wl,--version-script=$(srcdir)/libbsd.map \
|
||||||
-version-number 0:5:2
|
-version-number $(LIBBSD_ABI)
|
||||||
libbsd_la_SOURCES = \
|
libbsd_la_SOURCES = \
|
||||||
arc4random.c \
|
arc4random.c \
|
||||||
bsd_getopt.c \
|
bsd_getopt.c \
|
||||||
@@ -75,6 +78,10 @@ libbsd_la_SOURCES = \
|
|||||||
wcslcpy.c \
|
wcslcpy.c \
|
||||||
$(nil)
|
$(nil)
|
||||||
|
|
||||||
|
libbsd_ctor_a_SOURCES = \
|
||||||
|
setproctitle_ctor.c \
|
||||||
|
$(nil)
|
||||||
|
|
||||||
runtimelibdir = $(libdir)
|
runtimelibdir = $(libdir)
|
||||||
|
|
||||||
install-exec-hook:
|
install-exec-hook:
|
||||||
|
12
src/libbsd-ctor.pc.in
Normal file
12
src/libbsd-ctor.pc.in
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
prefix=@prefix@
|
||||||
|
exec_prefix=@exec_prefix@
|
||||||
|
libdir=@libdir@
|
||||||
|
includedir=@includedir@
|
||||||
|
|
||||||
|
Name: libbsd-ctor
|
||||||
|
Description: Automatic constructor functions for libbsd
|
||||||
|
Version: @VERSION@
|
||||||
|
URL: http://libbsd.freedesktop.org/
|
||||||
|
Cflags: -I${includedir}
|
||||||
|
Libs: -L${libdir} -Wl,-z,nodlopen -Wl,-u,libbsd_init_func -lbsd-ctor
|
||||||
|
Requires: libbsd
|
@@ -105,3 +105,8 @@ LIBBSD_0.5 {
|
|||||||
wcslcat;
|
wcslcat;
|
||||||
wcslcpy;
|
wcslcpy;
|
||||||
} LIBBSD_0.4;
|
} LIBBSD_0.4;
|
||||||
|
|
||||||
|
LIBBSD_0.6 {
|
||||||
|
/* Exported to cope with the constructor+dlopen+threads mess. */
|
||||||
|
setproctitle_init;
|
||||||
|
} LIBBSD_0.5;
|
||||||
|
@@ -28,6 +28,7 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <err.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@@ -41,6 +42,7 @@ static struct {
|
|||||||
/* Pointer to original nul character within base. */
|
/* Pointer to original nul character within base. */
|
||||||
char *nul;
|
char *nul;
|
||||||
|
|
||||||
|
bool warned;
|
||||||
bool reset;
|
bool reset;
|
||||||
int error;
|
int error;
|
||||||
} SPT;
|
} SPT;
|
||||||
@@ -153,8 +155,8 @@ spt_copyargs(int argc, char *argv[])
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
spt_init(int argc, char *argv[], char *envp[])
|
setproctitle_init(int argc, char *argv[], char *envp[])
|
||||||
{
|
{
|
||||||
char *base, *end, *nul, *tmp;
|
char *base, *end, *nul, *tmp;
|
||||||
int i, envc, error;
|
int i, envc, error;
|
||||||
@@ -215,14 +217,6 @@ spt_init(int argc, char *argv[], char *envp[])
|
|||||||
SPT.end = end;
|
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
|
#ifndef SPT_MAXTITLE
|
||||||
#define SPT_MAXTITLE 255
|
#define SPT_MAXTITLE 255
|
||||||
#endif
|
#endif
|
||||||
@@ -236,8 +230,14 @@ setproctitle_impl(const char *fmt, ...)
|
|||||||
char *nul;
|
char *nul;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if (SPT.base == NULL)
|
if (SPT.base == NULL) {
|
||||||
|
if (!SPT.warned) {
|
||||||
|
warnx("setproctitle not initialized, please either call "
|
||||||
|
"setproctitle_init() or link against libbsd-ctor.");
|
||||||
|
SPT.warned = true;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (fmt) {
|
if (fmt) {
|
||||||
if (fmt[0] == '-') {
|
if (fmt[0] == '-') {
|
||||||
|
52
src/setproctitle_ctor.c
Normal file
52
src/setproctitle_ctor.c
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 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
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The automatic initialization cannot be part of the main shared library,
|
||||||
|
* because there is no thread-safe way to change the environ global
|
||||||
|
* variable. This is not a problem if the initializaion happens just at
|
||||||
|
* program load time, but becomes one if the shared library is directly or
|
||||||
|
* indirectly dlopen()ed during the execution of the program, which could
|
||||||
|
* have either kept references to the old environ or could change it in
|
||||||
|
* some other thread. This has been observed for example on systems using
|
||||||
|
* Samba NSS modules.
|
||||||
|
*
|
||||||
|
* To avoid any other possible fallout, the constructor is split into a
|
||||||
|
* new static library that needs to be linked explicitly into programs
|
||||||
|
* using setproctitle(). As an additional safety measure the pkg-config
|
||||||
|
* linker flags will mark the program as not allowing to be dlopen()ed
|
||||||
|
* so that we make sure to avoid the problem described above.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Force setproctitle_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 (*libbsd_init_func)(int argc, char *argv[], char *envp[])
|
||||||
|
__attribute__((section(".init_array"))) = setproctitle_init;
|
@@ -18,6 +18,10 @@ check_PROGRAMS = \
|
|||||||
|
|
||||||
humanize_LDFLAGS = $(top_builddir)/src/libbsd.la
|
humanize_LDFLAGS = $(top_builddir)/src/libbsd.la
|
||||||
fgetln_LDFLAGS = $(top_builddir)/src/libbsd.la
|
fgetln_LDFLAGS = $(top_builddir)/src/libbsd.la
|
||||||
proctitle_LDFLAGS = $(top_builddir)/src/libbsd.la
|
proctitle_LDFLAGS = \
|
||||||
|
-Wl,-u,libbsd_init_func \
|
||||||
|
$(top_builddir)/src/libbsd-ctor.a \
|
||||||
|
$(top_builddir)/src/libbsd.la \
|
||||||
|
$(nil)
|
||||||
|
|
||||||
TESTS = $(check_PROGRAMS)
|
TESTS = $(check_PROGRAMS)
|
||||||
|
Reference in New Issue
Block a user