build: basic autoconfization

This commit is contained in:
Lennart Poettering 2010-02-03 14:21:48 +01:00
parent a7334b0952
commit 47be870bd8
19 changed files with 677 additions and 134 deletions

17
.gitignore vendored
View File

@ -8,3 +8,20 @@ systemctl.c
systemd-interfaces.c
systemadm
systemadm.c
.deps/
Makefile.in
aclocal.m4
*.cache
compile
config.guess
config.h
config.h.in
config.log
config.status
config.sub
configure
depcomp
install-sh
missing
stamp-*
*.stamp

View File

@ -1,53 +0,0 @@
CFLAGS=-Wall -Wextra -O0 -g -pipe -D_GNU_SOURCE -fdiagnostics-show-option -Wno-unused-parameter -DUNIT_PATH=\"/tmp/does/not/exist\" `pkg-config --cflags libudev dbus-1`
LIBS=-lrt -lcap `pkg-config --libs libudev dbus-1`
COMMON= \
unit.o \
util.o \
set.o \
hashmap.o \
strv.o \
job.o \
manager.o \
conf-parser.o \
load-fragment.o \
socket-util.o \
log.o \
service.o \
automount.o \
mount.o \
device.o \
target.o \
snapshot.o \
socket.o \
timer.o \
load-dropin.o \
execute.o \
ratelimit.o \
dbus.o \
dbus-manager.o \
dbus-unit.o \
dbus-job.o
all: systemd test-engine test-job-type systemd-logger systemctl systemadm
systemd: main.o $(COMMON)
$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
systemd-logger: logger.o $(COMMON)
$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
test-engine: test-engine.o $(COMMON)
$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
test-job-type: test-job-type.o $(COMMON)
$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
systemctl: systemctl.vala
valac -g --save-temps systemctl.vala systemd-interfaces.vala --pkg=dbus-glib-1 --pkg=posix
systemadm: systemadm.vala
valac -g --save-temps systemadm.vala systemd-interfaces.vala --pkg=dbus-glib-1 --pkg=posix --pkg gee-1.0 --pkg gtk+-2.0
clean:
rm -f *.o systemd test-engine systemctl systemadm

112
Makefile.am Normal file
View File

@ -0,0 +1,112 @@
# This file is part of systemd.
#
# Copyright 2010 Lennart Poettering
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# systemd is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
ACLOCAL_AMFLAGS = -I m4
AM_CPPFLAGS = \
-include $(top_builddir)/config.h \
-DUNIT_PATH=\"/tmp/does/not/exist\"
sbin_PROGRAMS = \
systemd
bin_PROGRAMS = \
systemctl \
systemadm \
systemd-logger
noinst_PROGRAMS = \
test-engine \
test-job-type
BASIC_SOURCES= \
util.c \
hashmap.c \
set.c \
strv.c \
conf-parser.c \
socket-util.c \
log.c \
ratelimit.c
COMMON_SOURCES= \
$(BASIC_SOURCES) \
unit.c \
job.c \
manager.c \
load-fragment.c \
service.c \
automount.c \
mount.c \
device.c \
target.c \
snapshot.c \
socket.c \
timer.c \
load-dropin.c \
execute.c \
dbus.c \
dbus-manager.c \
dbus-unit.c \
dbus-job.c
systemd_SOURCES = \
$(COMMON_SOURCES) \
main.c
systemd_CPPFLAGS = \
$(AM_CPPFLAGS) \
$(DBUS_CFLAGS) \
$(UDEV_CFLAGS)
systemd_LDADD = \
$(DBUS_LIBS) \
$(UDEV_LIBS)
test_engine_SOURCES = \
$(COMMON_SOURCES) \
test-engine.c
test_engine_CPPFLAGS = $(systemd_CPPFLAGS)
test_engine_LDADD = $(systemd_LDADD)
test_job_type_SOURCES = \
$(COMMON_SOURCES) \
test-engine.c
test_job_type_CPPFLAGS = $(systemd_CPPFLAGS)
test_job_type_LDADD = $(systemd_LDADD)
systemd_logger_SOURCES = \
$(BASIC_SOURCES) \
logger.c
VALAFLAGS = -g --save-temps --pkg=dbus-glib-1 --pkg=posix --pkg gee-1.0 --pkg gtk+-2.0
systemctl_SOURCES = \
systemctl.vala \
systemd-interfaces.vala
systemctl_CPPFLAGS = $(AM_CPPFLAGS) $(DBUSGLIB_CFLAGS)
systemctl_LDADD = $(DBUSGLIB_LIBS)
systemadm_SOURCES = \
systemadm.vala \
systemd-interfaces.vala
systemadm_CPPFLAGS = $(AM_CPPFLAGS) $(DBUSGLIB_CFLAGS) $(GTK_CFLAGS)
systemadm_LDADD = $(DBUSGLIB_LIBS) $(GTK_LIBS)

80
bootstrap.sh Executable file
View File

@ -0,0 +1,80 @@
#!/bin/bash
# This file is part of systemd.
#
# Copyright 2010 Lennart Poettering
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# systemd is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
AM_VERSION=1.11
AC_VERSION=2.63
run_versioned() {
local P
local V
V=$(echo "$2" | sed -e 's,\.,,g')
if [ -e "`which $1$V 2> /dev/null`" ] ; then
P="$1$V"
else
if [ -e "`which $1-$2 2> /dev/null`" ] ; then
P="$1-$2"
else
P="$1"
fi
fi
shift 2
"$P" "$@"
}
set -ex
if [ -f .git/hooks/pre-commit.sample -a ! -f .git/hooks/pre-commit ] ; then
cp -p .git/hooks/pre-commit.sample .git/hooks/pre-commit && \
chmod +x .git/hooks/pre-commit && \
echo "Activated pre-commit hook."
fi
# We check for this here, because if pkg-config is not found in the
# system, it's likely that the pkg.m4 macro file is also not present,
# which will make PKG_PROG_PKG_CONFIG be undefined and the generated
# configure file faulty.
if ! pkg-config --version &>/dev/null; then
echo "pkg-config is required to bootstrap this program" &>/dev/null
exit 1
fi
if type -p colorgcc > /dev/null ; then
export CC=colorgcc
fi
if [ "x$1" = "xam" ] ; then
run_versioned automake "$VERSION" -a -c --foreign
./config.status
else
rm -rf autom4te.cache
rm -f config.cache
run_versioned aclocal "$AM_VERSION" -I m4
run_versioned autoconf "$AC_VERSION" -Wall
run_versioned autoheader "$AC_VERSION"
run_versioned automake "$AM_VERSION" --copy --foreign --add-missing
if [ "x$1" != "xac" ]; then
CFLAGS="$CFLAGS -g -O0" ./configure --sysconfdir=/etc --localstatedir=/var "$@"
make clean
fi
fi

75
configure.ac Normal file
View File

@ -0,0 +1,75 @@
# This file is part of systemd.
#
# Copyright 2010 Lennart Poettering
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# systemd is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
AC_PREREQ(2.63)
AC_INIT([systemd],[0],[mzflfgrzq (at) 0pointer (dot) net])
AC_CONFIG_SRCDIR([main.c])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([foreign 1.11 -Wall -Wno-portability silent-rules tar-pax])
AC_SUBST(PACKAGE_URL, [http://git.0pointer.de/?p=systemd.git])
AC_CANONICAL_HOST
AM_SILENT_RULES([yes])
AC_CHECK_PROG([STOW], [stow], [yes], [no])
AS_IF([test "x$STOW" = "xyes" && test -d /usr/local/stow], [
AC_MSG_NOTICE([*** Found /usr/local/stow: default install prefix set to /usr/local/stow/${PACKAGE_NAME}-${PACKAGE_VERSION} ***])
ac_default_prefix="/usr/local/stow/${PACKAGE_NAME}-${PACKAGE_VERSION}"
])
AC_PROG_CC
AC_PROG_CC_C99
AM_PROG_CC_C_O
AC_PROG_GCC_TRADITIONAL
AC_USE_SYSTEM_EXTENSIONS
CC_CHECK_CFLAGS_APPEND([-Wall -W -Wextra -pipe -Wno-long-long -Winline -Wvla -Wno-overlength-strings -Wunsafe-loop-optimizations -Wundef -Wformat=2 -Wlogical-op -Wsign-compare -Wformat-security -Wmissing-include-dirs -Wformat-nonliteral -Wold-style-definition -Wpointer-arith -Winit-self -Wdeclaration-after-statement -Wfloat-equal -Wmissing-prototypes -Wstrict-prototypes -Wredundant-decls -Wmissing-declarations -Wmissing-noreturn -Wshadow -Wendif-labels -Wcast-align -Wstrict-aliasing=2 -Wwrite-strings -Wno-unused-parameter -ffast-math -Wp,-D_FORTIFY_SOURCE=2 -fno-common -fdiagnostics-show-option -Wno-missing-field-initializers])
AC_SEARCH_LIBS([clock_gettime], [rt], [], [AC_MSG_ERROR([*** POSIX RT library not found])])
AC_SEARCH_LIBS([cap_init], [cap], [], [AC_MSG_ERROR([*** POSIX caps library not found])])
AC_CHECK_HEADERS([sys/capability.h], [], [AC_MSG_ERROR([*** POSIX caps headers not found])])
PKG_CHECK_MODULES(UDEV, [ libudev ])
AC_SUBST(UDEV_CFLAGS)
AC_SUBST(UDEV_LIBS)
PKG_CHECK_MODULES(DBUS, [ dbus-1 ])
AC_SUBST(DBUS_CFLAGS)
AC_SUBST(DBUS_LIBS)
PKG_CHECK_MODULES(DBUSGLIB, [ dbus-glib-1 ])
AC_SUBST(DBUSGLIB_CFLAGS)
AC_SUBST(DBUSGLIB_LIBS)
PKG_CHECK_MODULES(GEE, [ gee-1.0 ])
AC_SUBST(GEE_CFLAGS)
AC_SUBST(GEE_LIBS)
PKG_CHECK_MODULES(GTK, [ gtk+-2.0 ])
AC_SUBST(GTK_CFLAGS)
AC_SUBST(GTK_LIBS)
AM_PROG_VALAC()
AC_SUBST(VAPIDIR)
AC_OUTPUT([Makefile])

View File

@ -142,7 +142,7 @@ oom:
return DBUS_HANDLER_RESULT_NEED_MEMORY;
}
DBusHandlerResult bus_job_message_handler(DBusConnection *connection, DBusMessage *message, void *data) {
static DBusHandlerResult bus_job_message_handler(DBusConnection *connection, DBusMessage *message, void *data) {
Manager *m = data;
Job *j;
int r;

View File

@ -54,7 +54,7 @@
#define INTROSPECTION_END \
"</node>"
DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusMessage *message, void *data) {
static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusMessage *message, void *data) {
int r;
Manager *m = data;
DBusError error;
@ -172,7 +172,7 @@ DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusM
goto oom;
HASHMAP_FOREACH_KEY(u, k, m->units, i) {
char *unit_path, *job_path;
char *u_path, *j_path;
const char *id, *description, *load_state, *active_state, *job_type;
DBusMessageIter sub2;
uint32_t job_id;
@ -188,21 +188,21 @@ DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusM
load_state = unit_load_state_to_string(u->meta.load_state);
active_state = unit_active_state_to_string(unit_active_state(u));
if (!(unit_path = unit_dbus_path(u)))
if (!(u_path = unit_dbus_path(u)))
goto oom;
if (u->meta.job) {
job_id = (uint32_t) u->meta.job->id;
if (!(job_path = job_dbus_path(u->meta.job))) {
free(unit_path);
if (!(j_path = job_dbus_path(u->meta.job))) {
free(u_path);
goto oom;
}
job_type = job_type_to_string(u->meta.job->type);
} else {
job_id = 0;
job_path = unit_path;
j_path = u_path;
job_type = "";
}
@ -210,19 +210,19 @@ DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusM
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &description) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &load_state) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &active_state) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_OBJECT_PATH, &unit_path) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_OBJECT_PATH, &u_path) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_UINT32, &job_id) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &job_type) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_OBJECT_PATH, &job_path)) {
free(unit_path);
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_OBJECT_PATH, &j_path)) {
free(u_path);
if (u->meta.job)
free(job_path);
free(j_path);
goto oom;
}
free(unit_path);
free(u_path);
if (u->meta.job)
free(job_path);
free(j_path);
if (!dbus_message_iter_close_container(&sub, &sub2))
goto oom;
@ -245,7 +245,7 @@ DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusM
goto oom;
HASHMAP_FOREACH(j, m->jobs, i) {
char *unit_path, *job_path;
char *u_path, *j_path;
const char *unit, *state, *type;
uint32_t id;
DBusMessageIter sub2;
@ -258,11 +258,11 @@ DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusM
state = job_state_to_string(j->state);
type = job_type_to_string(j->type);
if (!(job_path = job_dbus_path(j)))
if (!(j_path = job_dbus_path(j)))
goto oom;
if (!(unit_path = unit_dbus_path(j->unit))) {
free(job_path);
if (!(u_path = unit_dbus_path(j->unit))) {
free(j_path);
goto oom;
}
@ -270,15 +270,15 @@ DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusM
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &unit) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &type) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &state) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_OBJECT_PATH, &job_path) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_OBJECT_PATH, &unit_path)) {
free(job_path);
free(unit_path);
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_OBJECT_PATH, &j_path) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_OBJECT_PATH, &u_path)) {
free(j_path);
free(u_path);
goto oom;
}
free(job_path);
free(unit_path);
free(j_path);
free(u_path);
if (!dbus_message_iter_close_container(&sub, &sub2))
goto oom;

View File

@ -269,7 +269,7 @@ static int setup_output(const ExecContext *context, const char *ident) {
}
}
int setup_input(const ExecContext *context) {
static int setup_input(const ExecContext *context) {
int r;
assert(context);

2
job.h
View File

@ -124,6 +124,8 @@ bool job_type_is_mergeable(JobType a, JobType b);
bool job_type_is_superset(JobType a, JobType b);
bool job_type_is_conflicting(JobType a, JobType b);
bool job_is_runnable(Job *j);
void job_schedule_run(Job *j);
int job_run_and_invalidate(Job *j);
int job_finish_and_invalidate(Job *j, bool success);

View File

@ -472,7 +472,7 @@ static int config_parse_service_restart(
return 0;
}
int config_parse_bindtodevice(
static int config_parse_bindtodevice(
const char *filename,
unsigned line,
const char *section,
@ -501,7 +501,7 @@ int config_parse_bindtodevice(
return 0;
}
int config_parse_output(
static int config_parse_output(
const char *filename,
unsigned line,
const char *section,
@ -527,7 +527,7 @@ int config_parse_output(
return 0;
}
int config_parse_input(
static int config_parse_input(
const char *filename,
unsigned line,
const char *section,
@ -553,7 +553,7 @@ int config_parse_input(
return 0;
}
int config_parse_facility(
static int config_parse_facility(
const char *filename,
unsigned line,
const char *section,
@ -583,7 +583,7 @@ int config_parse_facility(
return 0;
}
int config_parse_level(
static int config_parse_level(
const char *filename,
unsigned line,
const char *section,
@ -612,7 +612,7 @@ int config_parse_level(
return 0;
}
int config_parse_io_class(
static int config_parse_io_class(
const char *filename,
unsigned line,
const char *section,
@ -643,7 +643,7 @@ int config_parse_io_class(
return 0;
}
int config_parse_io_priority(
static int config_parse_io_priority(
const char *filename,
unsigned line,
const char *section,
@ -671,7 +671,7 @@ int config_parse_io_priority(
return 0;
}
int config_parse_cpu_sched_policy(
static int config_parse_cpu_sched_policy(
const char *filename,
unsigned line,
const char *section,
@ -703,7 +703,7 @@ int config_parse_cpu_sched_policy(
return 0;
}
int config_parse_cpu_sched_prio(
static int config_parse_cpu_sched_prio(
const char *filename,
unsigned line,
const char *section,
@ -732,7 +732,7 @@ int config_parse_cpu_sched_prio(
return 0;
}
int config_parse_cpu_affinity(
static int config_parse_cpu_affinity(
const char *filename,
unsigned line,
const char *section,
@ -775,7 +775,7 @@ int config_parse_cpu_affinity(
return 0;
}
int config_parse_capabilities(
static int config_parse_capabilities(
const char *filename,
unsigned line,
const char *section,
@ -807,7 +807,7 @@ int config_parse_capabilities(
return 0;
}
int config_parse_secure_bits(
static int config_parse_secure_bits(
const char *filename,
unsigned line,
const char *section,
@ -848,7 +848,7 @@ int config_parse_secure_bits(
return 0;
}
int config_parse_bounding_set(
static int config_parse_bounding_set(
const char *filename,
unsigned line,
const char *section,

View File

@ -155,7 +155,7 @@ static int stream_log(Stream *s, char *p, usec_t timestamp) {
IOVEC_SET_STRING(iovec[1], s->process);
IOVEC_SET_STRING(iovec[2], header_pid);
IOVEC_SET_STRING(iovec[3], p);
IOVEC_SET_STRING(iovec[4], "\n");
IOVEC_SET_STRING(iovec[4], (char*) "\n");
if (writev(s->server->kmsg_fd, iovec, ELEMENTSOF(iovec)) < 0)
return -errno;
@ -548,9 +548,9 @@ int main(int argc, char *argv[]) {
for (;;) {
struct epoll_event event;
int n;
int k;
if ((n = epoll_wait(server.epoll_fd,
if ((k = epoll_wait(server.epoll_fd,
&event, 1,
server.n_streams <= 0 ? TIMEOUT : -1)) < 0) {
@ -561,7 +561,7 @@ int main(int argc, char *argv[]) {
goto fail;
}
if (n <= 0)
if (k <= 0)
break;
if ((r = process_event(&server, &event)) < 0)

311
m4/attributes.m4 Normal file
View File

@ -0,0 +1,311 @@
dnl Macros to check the presence of generic (non-typed) symbols.
dnl Copyright (c) 2006-2008 Diego Pettenò <flameeyes@gmail.com>
dnl Copyright (c) 2006-2008 xine project
dnl
dnl This program is free software; you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by
dnl the Free Software Foundation; either version 2, or (at your option)
dnl any later version.
dnl
dnl This program is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
dnl GNU General Public License for more details.
dnl
dnl You should have received a copy of the GNU General Public License
dnl along with this program; if not, write to the Free Software
dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
dnl 02110-1301, USA.
dnl
dnl As a special exception, the copyright owners of the
dnl macro gives unlimited permission to copy, distribute and modify the
dnl configure scripts that are the output of Autoconf when processing the
dnl Macro. You need not follow the terms of the GNU General Public
dnl License when using or distributing such scripts, even though portions
dnl of the text of the Macro appear in them. The GNU General Public
dnl License (GPL) does govern all other use of the material that
dnl constitutes the Autoconf Macro.
dnl
dnl This special exception to the GPL applies to versions of the
dnl Autoconf Macro released by this project. When you make and
dnl distribute a modified version of the Autoconf Macro, you may extend
dnl this special exception to the GPL to apply to your modified version as
dnl well.
dnl Check if the flag is supported by compiler
dnl CC_CHECK_CFLAGS_SILENT([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND])
AC_DEFUN([CC_CHECK_CFLAGS_SILENT], [
AC_CACHE_VAL(AS_TR_SH([cc_cv_cflags_$1]),
[ac_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $1"
AC_COMPILE_IFELSE([int a;],
[eval "AS_TR_SH([cc_cv_cflags_$1])='yes'"],
[eval "AS_TR_SH([cc_cv_cflags_$1])='no'"])
CFLAGS="$ac_save_CFLAGS"
])
AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes],
[$2], [$3])
])
dnl Check if the flag is supported by compiler (cacheable)
dnl CC_CHECK_CFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND])
AC_DEFUN([CC_CHECK_CFLAGS], [
AC_CACHE_CHECK([if $CC supports $1 flag],
AS_TR_SH([cc_cv_cflags_$1]),
CC_CHECK_CFLAGS_SILENT([$1]) dnl Don't execute actions here!
)
AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes],
[$2], [$3])
])
dnl CC_CHECK_CFLAG_APPEND(FLAG, [action-if-found], [action-if-not-found])
dnl Check for CFLAG and appends them to CFLAGS if supported
AC_DEFUN([CC_CHECK_CFLAG_APPEND], [
AC_CACHE_CHECK([if $CC supports $1 flag],
AS_TR_SH([cc_cv_cflags_$1]),
CC_CHECK_CFLAGS_SILENT([$1]) dnl Don't execute actions here!
)
AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes],
[CFLAGS="$CFLAGS $1"; DEBUG_CFLAGS="$DEBUG_CFLAGS $1"; $2], [$3])
])
dnl CC_CHECK_CFLAGS_APPEND([FLAG1 FLAG2], [action-if-found], [action-if-not])
AC_DEFUN([CC_CHECK_CFLAGS_APPEND], [
for flag in $1; do
CC_CHECK_CFLAG_APPEND($flag, [$2], [$3])
done
])
dnl Check if the flag is supported by linker (cacheable)
dnl CC_CHECK_LDFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND])
AC_DEFUN([CC_CHECK_LDFLAGS], [
AC_CACHE_CHECK([if $CC supports $1 flag],
AS_TR_SH([cc_cv_ldflags_$1]),
[ac_save_LDFLAGS="$LDFLAGS"
LDFLAGS="$LDFLAGS $1"
AC_LINK_IFELSE([int main() { return 1; }],
[eval "AS_TR_SH([cc_cv_ldflags_$1])='yes'"],
[eval "AS_TR_SH([cc_cv_ldflags_$1])="])
LDFLAGS="$ac_save_LDFLAGS"
])
AS_IF([eval test x$]AS_TR_SH([cc_cv_ldflags_$1])[ = xyes],
[$2], [$3])
])
dnl define the LDFLAGS_NOUNDEFINED variable with the correct value for
dnl the current linker to avoid undefined references in a shared object.
AC_DEFUN([CC_NOUNDEFINED], [
dnl We check $host for which systems to enable this for.
AC_REQUIRE([AC_CANONICAL_HOST])
case $host in
dnl FreeBSD (et al.) does not complete linking for shared objects when pthreads
dnl are requested, as different implementations are present; to avoid problems
dnl use -Wl,-z,defs only for those platform not behaving this way.
*-freebsd* | *-openbsd*) ;;
*)
dnl First of all check for the --no-undefined variant of GNU ld. This allows
dnl for a much more readable commandline, so that people can understand what
dnl it does without going to look for what the heck -z defs does.
for possible_flags in "-Wl,--no-undefined" "-Wl,-z,defs"; do
CC_CHECK_LDFLAGS([$possible_flags], [LDFLAGS_NOUNDEFINED="$possible_flags"])
break
done
;;
esac
AC_SUBST([LDFLAGS_NOUNDEFINED])
])
dnl Check for a -Werror flag or equivalent. -Werror is the GCC
dnl and ICC flag that tells the compiler to treat all the warnings
dnl as fatal. We usually need this option to make sure that some
dnl constructs (like attributes) are not simply ignored.
dnl
dnl Other compilers don't support -Werror per se, but they support
dnl an equivalent flag:
dnl - Sun Studio compiler supports -errwarn=%all
AC_DEFUN([CC_CHECK_WERROR], [
AC_CACHE_CHECK(
[for $CC way to treat warnings as errors],
[cc_cv_werror],
[CC_CHECK_CFLAGS_SILENT([-Werror], [cc_cv_werror=-Werror],
[CC_CHECK_CFLAGS_SILENT([-errwarn=%all], [cc_cv_werror=-errwarn=%all])])
])
])
AC_DEFUN([CC_CHECK_ATTRIBUTE], [
AC_REQUIRE([CC_CHECK_WERROR])
AC_CACHE_CHECK([if $CC supports __attribute__(( ifelse([$2], , [$1], [$2]) ))],
AS_TR_SH([cc_cv_attribute_$1]),
[ac_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $cc_cv_werror"
AC_COMPILE_IFELSE([$3],
[eval "AS_TR_SH([cc_cv_attribute_$1])='yes'"],
[eval "AS_TR_SH([cc_cv_attribute_$1])='no'"])
CFLAGS="$ac_save_CFLAGS"
])
AS_IF([eval test x$]AS_TR_SH([cc_cv_attribute_$1])[ = xyes],
[AC_DEFINE(
AS_TR_CPP([SUPPORT_ATTRIBUTE_$1]), 1,
[Define this if the compiler supports __attribute__(( ifelse([$2], , [$1], [$2]) ))]
)
$4],
[$5])
])
AC_DEFUN([CC_ATTRIBUTE_CONSTRUCTOR], [
CC_CHECK_ATTRIBUTE(
[constructor],,
[void __attribute__((constructor)) ctor() { int a; }],
[$1], [$2])
])
AC_DEFUN([CC_ATTRIBUTE_FORMAT], [
CC_CHECK_ATTRIBUTE(
[format], [format(printf, n, n)],
[void __attribute__((format(printf, 1, 2))) printflike(const char *fmt, ...) { fmt = (void *)0; }],
[$1], [$2])
])
AC_DEFUN([CC_ATTRIBUTE_FORMAT_ARG], [
CC_CHECK_ATTRIBUTE(
[format_arg], [format_arg(printf)],
[char *__attribute__((format_arg(1))) gettextlike(const char *fmt) { fmt = (void *)0; }],
[$1], [$2])
])
AC_DEFUN([CC_ATTRIBUTE_VISIBILITY], [
CC_CHECK_ATTRIBUTE(
[visibility_$1], [visibility("$1")],
[void __attribute__((visibility("$1"))) $1_function() { }],
[$2], [$3])
])
AC_DEFUN([CC_ATTRIBUTE_NONNULL], [
CC_CHECK_ATTRIBUTE(
[nonnull], [nonnull()],
[void __attribute__((nonnull())) some_function(void *foo, void *bar) { foo = (void*)0; bar = (void*)0; }],
[$1], [$2])
])
AC_DEFUN([CC_ATTRIBUTE_UNUSED], [
CC_CHECK_ATTRIBUTE(
[unused], ,
[void some_function(void *foo, __attribute__((unused)) void *bar);],
[$1], [$2])
])
AC_DEFUN([CC_ATTRIBUTE_SENTINEL], [
CC_CHECK_ATTRIBUTE(
[sentinel], ,
[void some_function(void *foo, ...) __attribute__((sentinel));],
[$1], [$2])
])
AC_DEFUN([CC_ATTRIBUTE_DEPRECATED], [
CC_CHECK_ATTRIBUTE(
[deprecated], ,
[void some_function(void *foo, ...) __attribute__((deprecated));],
[$1], [$2])
])
AC_DEFUN([CC_ATTRIBUTE_ALIAS], [
CC_CHECK_ATTRIBUTE(
[alias], [weak, alias],
[void other_function(void *foo) { }
void some_function(void *foo) __attribute__((weak, alias("other_function")));],
[$1], [$2])
])
AC_DEFUN([CC_ATTRIBUTE_MALLOC], [
CC_CHECK_ATTRIBUTE(
[malloc], ,
[void * __attribute__((malloc)) my_alloc(int n);],
[$1], [$2])
])
AC_DEFUN([CC_ATTRIBUTE_PACKED], [
CC_CHECK_ATTRIBUTE(
[packed], ,
[struct astructure { char a; int b; long c; void *d; } __attribute__((packed));],
[$1], [$2])
])
AC_DEFUN([CC_ATTRIBUTE_CONST], [
CC_CHECK_ATTRIBUTE(
[const], ,
[int __attribute__((const)) twopow(int n) { return 1 << n; } ],
[$1], [$2])
])
AC_DEFUN([CC_FLAG_VISIBILITY], [
AC_REQUIRE([CC_CHECK_WERROR])
AC_CACHE_CHECK([if $CC supports -fvisibility=hidden],
[cc_cv_flag_visibility],
[cc_flag_visibility_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $cc_cv_werror"
CC_CHECK_CFLAGS_SILENT([-fvisibility=hidden],
cc_cv_flag_visibility='yes',
cc_cv_flag_visibility='no')
CFLAGS="$cc_flag_visibility_save_CFLAGS"])
AS_IF([test "x$cc_cv_flag_visibility" = "xyes"],
[AC_DEFINE([SUPPORT_FLAG_VISIBILITY], 1,
[Define this if the compiler supports the -fvisibility flag])
$1],
[$2])
])
AC_DEFUN([CC_FUNC_EXPECT], [
AC_REQUIRE([CC_CHECK_WERROR])
AC_CACHE_CHECK([if compiler has __builtin_expect function],
[cc_cv_func_expect],
[ac_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $cc_cv_werror"
AC_COMPILE_IFELSE(
[int some_function() {
int a = 3;
return (int)__builtin_expect(a, 3);
}],
[cc_cv_func_expect=yes],
[cc_cv_func_expect=no])
CFLAGS="$ac_save_CFLAGS"
])
AS_IF([test "x$cc_cv_func_expect" = "xyes"],
[AC_DEFINE([SUPPORT__BUILTIN_EXPECT], 1,
[Define this if the compiler supports __builtin_expect() function])
$1],
[$2])
])
AC_DEFUN([CC_ATTRIBUTE_ALIGNED], [
AC_REQUIRE([CC_CHECK_WERROR])
AC_CACHE_CHECK([highest __attribute__ ((aligned ())) supported],
[cc_cv_attribute_aligned],
[ac_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $cc_cv_werror"
for cc_attribute_align_try in 64 32 16 8 4 2; do
AC_COMPILE_IFELSE([
int main() {
static char c __attribute__ ((aligned($cc_attribute_align_try))) = 0;
return c;
}], [cc_cv_attribute_aligned=$cc_attribute_align_try; break])
done
CFLAGS="$ac_save_CFLAGS"
])
if test "x$cc_cv_attribute_aligned" != "x"; then
AC_DEFINE_UNQUOTED([ATTRIBUTE_ALIGNED_MAX], [$cc_cv_attribute_aligned],
[Define the highest alignment supported])
fi
])

View File

@ -31,23 +31,23 @@ typedef struct RateLimit {
usec_t begin;
} RateLimit;
#define RATELIMIT_DEFINE(_name, _interval, _burst) \
RateLimit _name = { \
.interval = (_interval), \
.burst = (_burst), \
.n_printed = 0, \
.n_missed = 0, \
.begin = 0 \
#define RATELIMIT_DEFINE(_name, _interval, _burst) \
RateLimit _name = { \
.interval = (_interval), \
.burst = (_burst), \
.n_printed = 0, \
.n_missed = 0, \
.begin = 0 \
}
#define RATELIMIT_INIT(v, _interval, _burst) \
do { \
RateLimit *r = &(v); \
r->interval = (_interval); \
r->burst = (_burst); \
r->n_printed = 0; \
r->n_missed = 0; \
r->begin = 0; \
#define RATELIMIT_INIT(v, _interval, _burst) \
do { \
RateLimit *_r = &(v); \
_r->interval = (_interval); \
_r->burst = (_burst); \
_r->n_printed = 0; \
_r->n_missed = 0; \
_r->begin = 0; \
} while (false);
bool ratelimit_test(RateLimit *r);

View File

@ -130,13 +130,13 @@ static void service_dump(Unit *u, FILE *f, const char *prefix) {
ServiceExecCommand c;
Service *s = SERVICE(u);
char *prefix2;
const char *prefix2;
char *p2;
assert(s);
prefix2 = strappend(prefix, "\t");
if (!prefix2)
prefix2 = "";
p2 = strappend(prefix, "\t");
prefix2 = p2 ? p2 : prefix;
fprintf(f,
"%sService State: %s\n",
@ -161,7 +161,7 @@ static void service_dump(Unit *u, FILE *f, const char *prefix) {
exec_command_dump_list(s->exec_command[c], f, prefix2);
}
free(prefix2);
free(p2);
}
static int service_load_pid_file(Service *s) {
@ -243,7 +243,7 @@ fail:
static int service_notify_sockets(Service *s) {
Iterator i;
Set *set;
Socket *socket;
Socket *sock;
int r;
assert(s);
@ -253,8 +253,8 @@ static int service_notify_sockets(Service *s) {
if ((r = service_get_sockets(s, &set)) < 0)
return r;
SET_FOREACH(socket, set, i)
socket_notify_service_dead(socket);
SET_FOREACH(sock, set, i)
socket_notify_service_dead(sock);
set_free(set);
@ -338,7 +338,7 @@ static int service_collect_fds(Service *s, int **fds, unsigned *n_fds) {
int *rfds = NULL;
unsigned rn_fds = 0;
Set *set;
Socket *socket;
Socket *sock;
assert(s);
assert(fds);
@ -347,11 +347,11 @@ static int service_collect_fds(Service *s, int **fds, unsigned *n_fds) {
if ((r = service_get_sockets(s, &set)) < 0)
return r;
SET_FOREACH(socket, set, i) {
SET_FOREACH(sock, set, i) {
int *cfds;
unsigned cn_fds;
if ((r = socket_collect_fds(socket, &cfds, &cn_fds)) < 0)
if ((r = socket_collect_fds(sock, &cfds, &cn_fds)) < 0)
goto fail;
if (!cfds)

View File

@ -102,7 +102,7 @@ struct Service {
RateLimit ratelimit;
};
const UnitVTable service_vtable;
extern const UnitVTable service_vtable;
const char* service_state_to_string(ServiceState i);
ServiceState service_state_from_string(const char *s);

View File

@ -103,7 +103,6 @@ int socket_address_parse(SocketAddress *a, const char *s) {
} else {
if ((e = strchr(s, ':'))) {
int r;
if ((r = safe_atou(e+1, &u)) < 0)
return r;

View File

@ -44,6 +44,6 @@ struct Timer {
Service *service;
};
const UnitVTable timer_vtable;
extern const UnitVTable timer_vtable;
#endif

10
unit.c
View File

@ -351,15 +351,15 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
char *t;
UnitDependency d;
Iterator i;
char *prefix2;
char *p2;
const char *prefix2;
assert(u);
if (!prefix)
prefix = "";
prefix2 = strappend(prefix, "\t");
if (!prefix2)
prefix2 = "";
p2 = strappend(prefix, "\t");
prefix2 = p2 ? p2 : prefix;
fprintf(f,
"%s→ Unit %s:\n"
@ -397,7 +397,7 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
if (u->meta.job)
job_dump(u->meta.job, f, prefix2);
free(prefix2);
free(p2);
}
/* Common implementation for multiple backends */

12
util.c
View File

@ -36,10 +36,10 @@
#include "ioprio.h"
#include "missing.h"
usec_t now(clockid_t clock) {
usec_t now(clockid_t clock_id) {
struct timespec ts;
assert_se(clock_gettime(clock, &ts) == 0);
assert_se(clock_gettime(clock_id, &ts) == 0);
return timespec_load(&ts);
}
@ -824,11 +824,11 @@ char *xescape(const char *s, const char *bad) {
}
char *bus_path_escape(const char *s) {
assert(s);
char *r, *t;
const char *f;
assert(s);
/* Escapes all chars that D-Bus' object path cannot deal
* with. Can be reverse with bus_path_unescape() */
@ -853,11 +853,11 @@ char *bus_path_escape(const char *s) {
}
char *bus_path_unescape(const char *s) {
assert(s);
char *r, *t;
const char *f;
assert(s);
if (!(r = new(char, strlen(s)+1)))
return NULL;