From 042776e04c24c8ce7a681a175d91595fbeb82103 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rainer=20M=C3=BCller?= Date: Wed, 20 Feb 2013 18:31:48 +0100 Subject: [PATCH 1/4] configure: check for program_invocation_name For portabiliy, check for program_invocation_name during configure and define HAVE_PROGRAM_INVOCATION_NAME accordingly. Use of this symbol is now enclosed with the appropriate #ifdef block. The symbol program_invocation_name is only used for error message handling using error(), so it's safe to omit this if it is not available. --- configure.ac | 8 ++++++++ free.c | 4 +++- pgrep.c | 2 ++ pmap.c | 2 ++ pwdx.c | 4 +++- skill.c | 4 +++- slabtop.c | 2 ++ sysctl.c | 2 ++ tload.c | 2 ++ uptime.c | 2 ++ vmstat.c | 2 ++ w.c | 2 ++ watch.c | 2 ++ 13 files changed, 35 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 711be2ab..afb24cee 100644 --- a/configure.ac +++ b/configure.ac @@ -137,6 +137,14 @@ dnl else dnl ALL_LINGUAS="af am ar as be bg bn_IN bn ca cs cy da de el en_GB es et eu_ES fa fi fr gl gu he hi hr hu hy id is it ja ka kn ko ku lo lt lv mk ml mr ms my nb nl nn no nso or pa pl pt_BR pt ro ru si sk sl sq sr@Latn sr sv ta te th tr uk ur vi zh_CN zh_TW zu" dnl fi +AC_MSG_CHECKING(whether program_invocation_name is defined) +AC_TRY_COMPILE([#include ], + [program_invocation_name = "test";], + AC_DEFINE(HAVE_PROGRAM_INVOCATION_NAME, 1, + [Define if program_invocation_name is defined]) + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no)) + AC_MSG_CHECKING(whether program_invocation_short_name is defined) AC_TRY_COMPILE([#include ], [program_invocation_short_name = "test";], diff --git a/free.c b/free.c index ecaeccdd..ffc4b86f 100644 --- a/free.c +++ b/free.c @@ -223,7 +223,9 @@ int main(int argc, char **argv) args.repeat_interval = 1000000; args.repeat_counter = 0; - program_invocation_name = program_invocation_short_name; +#ifdef HAVE_PROGRAM_INVOCATION_NAME + program_invocation_name = program_invocation_short_name; +#endif setlocale (LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); diff --git a/pgrep.c b/pgrep.c index 349221a6..7c54d964 100644 --- a/pgrep.c +++ b/pgrep.c @@ -832,7 +832,9 @@ int main (int argc, char **argv) struct el *procs; int num; +#ifdef HAVE_PROGRAM_INVOCATION_NAME program_invocation_name = program_invocation_short_name; +#endif setlocale (LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); diff --git a/pmap.c b/pmap.c index 8d19294b..7b88fec2 100644 --- a/pmap.c +++ b/pmap.c @@ -1013,7 +1013,9 @@ int main(int argc, char **argv) {NULL, 0, NULL, 0} }; +#ifdef HAVE_PROGRAM_INVOCATION_NAME program_invocation_name = program_invocation_short_name; +#endif nls_initialize(); atexit(close_stdout); diff --git a/pwdx.c b/pwdx.c index 4aee389b..214275a9 100644 --- a/pwdx.c +++ b/pwdx.c @@ -74,7 +74,9 @@ int main(int argc, char *argv[]) {NULL, 0, 0, 0} }; - program_invocation_name = program_invocation_short_name; +#ifdef HAVE_PROGRAM_INVOCATION_NAME + program_invocation_name = program_invocation_short_name; +#endif setlocale (LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); diff --git a/skill.c b/skill.c index 03df229c..fb57305a 100644 --- a/skill.c +++ b/skill.c @@ -629,7 +629,9 @@ static void skillsnice_parse(int argc, /* main body */ int main(int argc, char ** argv) { - program_invocation_name = program_invocation_short_name; +#ifdef HAVE_PROGRAM_INVOCATION_NAME + program_invocation_name = program_invocation_short_name; +#endif struct run_time_conf_t run_time; memset(&run_time, 0, sizeof(struct run_time_conf_t)); my_pid = getpid(); diff --git a/slabtop.c b/slabtop.c index 9e535d4f..ebdae8d4 100644 --- a/slabtop.c +++ b/slabtop.c @@ -300,7 +300,9 @@ int main(int argc, char *argv[]) { NULL, 0, NULL, 0 } }; +#ifdef HAVE_PROGRAM_INVOCATION_NAME program_invocation_name = program_invocation_short_name; +#endif setlocale (LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); diff --git a/sysctl.c b/sysctl.c index 07568788..2eeacd91 100644 --- a/sysctl.c +++ b/sysctl.c @@ -675,7 +675,9 @@ int main(int argc, char *argv[]) {NULL, 0, NULL, 0} }; +#ifdef HAVE_PROGRAM_INVOCATION_NAME program_invocation_name = program_invocation_short_name; +#endif setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); diff --git a/tload.c b/tload.c index 765ed177..a5fe14a0 100644 --- a/tload.c +++ b/tload.c @@ -114,7 +114,9 @@ int main(int argc, char **argv) {NULL, 0, NULL, 0} }; +#ifdef HAVE_PROGRAM_INVOCATION_NAME program_invocation_name = program_invocation_short_name; +#endif setlocale (LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); diff --git a/uptime.c b/uptime.c index ac4579cd..27421895 100644 --- a/uptime.c +++ b/uptime.c @@ -77,7 +77,9 @@ int main(int argc, char **argv) {NULL, 0, NULL, 0} }; +#ifdef HAVE_PROGRAM_INVOCATION_NAME program_invocation_name = program_invocation_short_name; +#endif setlocale (LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); diff --git a/vmstat.c b/vmstat.c index a2627b8d..6f95f095 100644 --- a/vmstat.c +++ b/vmstat.c @@ -724,7 +724,9 @@ int main(int argc, char *argv[]) {NULL, 0, NULL, 0} }; +#ifdef HAVE_PROGRAM_INVOCATION_NAME program_invocation_name = program_invocation_short_name; +#endif setlocale (LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); diff --git a/w.c b/w.c index 27c7d222..a73f3282 100644 --- a/w.c +++ b/w.c @@ -483,7 +483,9 @@ int main(int argc, char **argv) {NULL, 0, NULL, 0} }; +#ifdef HAVE_PROGRAM_INVOCATION_NAME program_invocation_name = program_invocation_short_name; +#endif setlocale (LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); diff --git a/watch.c b/watch.c index 0fe0a8fb..5a229528 100644 --- a/watch.c +++ b/watch.c @@ -590,7 +590,9 @@ int main(int argc, char *argv[]) {0, 0, 0, 0} }; +#ifdef HAVE_PROGRAM_INVOCATION_NAME program_invocation_name = program_invocation_short_name; +#endif setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); From 538bd978a41263792e14e4df56091cecbece2f24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rainer=20M=C3=BCller?= Date: Wed, 20 Feb 2013 19:09:54 +0100 Subject: [PATCH 2/4] watch: Remove unused header No declaration from proc/procps.h is actually used for watch. --- watch.c | 1 - 1 file changed, 1 deletion(-) diff --git a/watch.c b/watch.c index 5a229528..07134487 100644 --- a/watch.c +++ b/watch.c @@ -31,7 +31,6 @@ #include "config.h" #include "fileutils.h" #include "nls.h" -#include "proc/procps.h" #include "strutils.h" #include "xalloc.h" #include From 6df4fc403dd3994c714e9154c7ad533125ee1e8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rainer=20M=C3=BCller?= Date: Wed, 20 Feb 2013 20:10:40 +0100 Subject: [PATCH 3/4] configure: Check for stdio_ext.h For portability, check for stdio_ext.h during configure and define HAVE_STDIO_EXT_H accordingly. If the current system does not provide this header, use a fallback for __fpending(). This definition will not work on all systems as it relies on internal data structures of libc. A more portable solution should be preferred, for example by using gnulib. --- configure.ac | 2 ++ lib/fileutils.c | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index afb24cee..08f59e3d 100644 --- a/configure.ac +++ b/configure.ac @@ -137,6 +137,8 @@ dnl else dnl ALL_LINGUAS="af am ar as be bg bn_IN bn ca cs cy da de el en_GB es et eu_ES fa fi fr gl gu he hi hr hu hy id is it ja ka kn ko ku lo lt lv mk ml mr ms my nb nl nn no nso or pa pl pt_BR pt ro ru si sk sl sq sr@Latn sr sv ta te th tr uk ur vi zh_CN zh_TW zu" dnl fi +AC_CHECK_HEADERS(stdio_ext.h, [], [], AC_INCLUDES_DEFAULT) + AC_MSG_CHECKING(whether program_invocation_name is defined) AC_TRY_COMPILE([#include ], [program_invocation_name = "test";], diff --git a/lib/fileutils.c b/lib/fileutils.c index fe56cb81..c50d6aa9 100644 --- a/lib/fileutils.c +++ b/lib/fileutils.c @@ -1,6 +1,12 @@ #include #include -#include +#ifdef HAVE_STDIO_EXT_H +# include +#else +/* FIXME: use a more portable definition of __fpending() (from gnulib?) */ +# include +# define __fpending(fp) ((fp)->_p - (fp)->_bf._base) +#endif #include #include From 838e5d89413df78058feaf7b0af973b01180ac23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rainer=20M=C3=BCller?= Date: Wed, 20 Feb 2013 20:14:29 +0100 Subject: [PATCH 4/4] configure: Check for error.h For portability, check for error.h during configure and define HAVE_ERROR_H accordingly. If this header is not available, emulate the functionality of error() from glibc with an inline wrapper in include/c.h. --- configure.ac | 2 ++ include/c.h | 21 +++++++++++++++++++++ lib/fileutils.c | 7 ++++++- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 08f59e3d..6e0883b6 100644 --- a/configure.ac +++ b/configure.ac @@ -137,6 +137,8 @@ dnl else dnl ALL_LINGUAS="af am ar as be bg bn_IN bn ca cs cy da de el en_GB es et eu_ES fa fi fr gl gu he hi hr hu hy id is it ja ka kn ko ku lo lt lv mk ml mr ms my nb nl nn no nso or pa pl pt_BR pt ro ru si sk sl sq sr@Latn sr sv ta te th tr uk ur vi zh_CN zh_TW zu" dnl fi +AC_CHECK_HEADERS(error.h, [], [], AC_INCLUDES_DEFAULT) + AC_CHECK_HEADERS(stdio_ext.h, [], [], AC_INCLUDES_DEFAULT) AC_MSG_CHECKING(whether program_invocation_name is defined) diff --git a/include/c.h b/include/c.h index 737630bb..6bcdf5f5 100644 --- a/include/c.h +++ b/include/c.h @@ -16,7 +16,11 @@ #include #include #include +#ifdef HAVE_ERROR_H #include +#else +#include +#endif /* * Compiler specific stuff @@ -103,6 +107,23 @@ static inline char *prog_inv_sh_nm_from_file(char *f, char stripext) /* * Error printing. */ +#ifndef HAVE_ERROR_H +/* Emulate the error() function from glibc */ +__attribute__((__format__(__printf__, 3, 4))) +static void error(int status, int errnum, const char *format, ...) +{ + va_list argp; + fprintf(stderr, "%s: ", program_invocation_short_name); + va_start(argp, format); + vfprintf(stderr, format, argp); + va_end(argp); + if (errnum != 0) + fprintf(stderr, ": error code %d", errnum); + fprintf(stderr, "\n"); + if (status != 0) + exit(status); +} +#endif #define xwarn(...) error(0, errno, __VA_ARGS__) #define xwarnx(...) error(0, 0, __VA_ARGS__) #define xerr(STATUS, ...) error(STATUS, errno, __VA_ARGS__) diff --git a/lib/fileutils.c b/lib/fileutils.c index c50d6aa9..a9ef2ff5 100644 --- a/lib/fileutils.c +++ b/lib/fileutils.c @@ -1,5 +1,7 @@ #include -#include +#ifdef HAVE_ERROR_H +# include +#endif #ifdef HAVE_STDIO_EXT_H # include #else @@ -12,6 +14,9 @@ #include "nls.h" #include "fileutils.h" +#ifndef HAVE_ERROR_H +# include "c.h" /* for error() emulation */ +#endif int close_stream(FILE * stream) {