From 47be870bd83fb3719dffc3ee9348a409ab762a14 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 3 Feb 2010 14:21:48 +0100 Subject: [PATCH] build: basic autoconfization --- .gitignore | 17 +++ Makefile | 53 -------- Makefile.am | 112 +++++++++++++++++ bootstrap.sh | 80 ++++++++++++ configure.ac | 75 ++++++++++++ dbus-job.c | 2 +- dbus-manager.c | 44 +++---- execute.c | 2 +- job.h | 2 + load-fragment.c | 26 ++-- logger.c | 8 +- m4/attributes.m4 | 311 +++++++++++++++++++++++++++++++++++++++++++++++ ratelimit.h | 30 ++--- service.c | 22 ++-- service.h | 2 +- socket-util.c | 1 - timer.h | 2 +- unit.c | 10 +- util.c | 12 +- 19 files changed, 677 insertions(+), 134 deletions(-) delete mode 100644 Makefile create mode 100644 Makefile.am create mode 100755 bootstrap.sh create mode 100644 configure.ac create mode 100644 m4/attributes.m4 diff --git a/.gitignore b/.gitignore index 9c5193d27..a1956d5d7 100644 --- a/.gitignore +++ b/.gitignore @@ -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 diff --git a/Makefile b/Makefile deleted file mode 100644 index 41df4e29e..000000000 --- a/Makefile +++ /dev/null @@ -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 diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 000000000..8ac2c2da4 --- /dev/null +++ b/Makefile.am @@ -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 . + +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) diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100755 index 000000000..73243ed44 --- /dev/null +++ b/bootstrap.sh @@ -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 . + +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 diff --git a/configure.ac b/configure.ac new file mode 100644 index 000000000..95a9ef5ca --- /dev/null +++ b/configure.ac @@ -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 . + +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]) diff --git a/dbus-job.c b/dbus-job.c index 70dbfd88e..544868fc7 100644 --- a/dbus-job.c +++ b/dbus-job.c @@ -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; diff --git a/dbus-manager.c b/dbus-manager.c index 03a39300d..bdc82df07 100644 --- a/dbus-manager.c +++ b/dbus-manager.c @@ -54,7 +54,7 @@ #define INTROSPECTION_END \ "" -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; diff --git a/execute.c b/execute.c index 94866ebfa..7bdf1b13b 100644 --- a/execute.c +++ b/execute.c @@ -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); diff --git a/job.h b/job.h index 28ed07dbe..554f9fc98 100644 --- a/job.h +++ b/job.h @@ -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); diff --git a/load-fragment.c b/load-fragment.c index 3f1e578f3..10972e43c 100644 --- a/load-fragment.c +++ b/load-fragment.c @@ -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, diff --git a/logger.c b/logger.c index 311458bd2..af3293bd7 100644 --- a/logger.c +++ b/logger.c @@ -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) diff --git a/m4/attributes.m4 b/m4/attributes.m4 new file mode 100644 index 000000000..3bf96a304 --- /dev/null +++ b/m4/attributes.m4 @@ -0,0 +1,311 @@ +dnl Macros to check the presence of generic (non-typed) symbols. +dnl Copyright (c) 2006-2008 Diego Pettenò +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 +]) diff --git a/ratelimit.h b/ratelimit.h index 963b3675b..f61a10a91 100644 --- a/ratelimit.h +++ b/ratelimit.h @@ -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); diff --git a/service.c b/service.c index 2427f2097..67950d4e6 100644 --- a/service.c +++ b/service.c @@ -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) diff --git a/service.h b/service.h index c8e41ba26..fef100bad 100644 --- a/service.h +++ b/service.h @@ -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); diff --git a/socket-util.c b/socket-util.c index c8e8e5975..0f5140ec5 100644 --- a/socket-util.c +++ b/socket-util.c @@ -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; diff --git a/timer.h b/timer.h index 518202012..0ec3e0d9b 100644 --- a/timer.h +++ b/timer.h @@ -44,6 +44,6 @@ struct Timer { Service *service; }; -const UnitVTable timer_vtable; +extern const UnitVTable timer_vtable; #endif diff --git a/unit.c b/unit.c index bdbcb45c5..a14e18ef5 100644 --- a/unit.c +++ b/unit.c @@ -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 */ diff --git a/util.c b/util.c index 33b143d3b..bf7469585 100644 --- a/util.c +++ b/util.c @@ -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; -- 2.30.2