diff --git a/man/Makefile b/man/Makefile index 6a106e7c..4110c8f7 100644 --- a/man/Makefile +++ b/man/Makefile @@ -1,4 +1,4 @@ -MAN3= \ +MAN3= einfo.3 \ rc_config.3 rc_deptree.3 rc_find_pids.3 rc_plugin_hook.3 \ rc_runlevel.3 rc_service.3 rc_stringlist.3 MAN8= rc-service.8 rc-status.8 rc-update.8 rc.8 runscript.8 \ diff --git a/man/einfo.3 b/man/einfo.3 new file mode 100644 index 00000000..f7b1fd26 --- /dev/null +++ b/man/einfo.3 @@ -0,0 +1,210 @@ +.\" Copyright (c) 2007-2008 Roy Marples +.\" +.\" 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. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. +.\" +.Dd Mar 16, 2008 +.Dt EINFO 3 SMM +.Os OpenRC +.Sh NAME +.Nm einfo , ewarn , eerror , ebegin , +.Nm einfon , ewarnn , eerrorn , ebeginn , +.Nm einfov , ewarnv , ebeginv , +.Nm einfovn , ewarnvn , ebeginvn , +.Nm ewarnx , eerrorx , +.Nm eend , ewend , +.Nm eendv , ewendv , +.Nm ebracket , +.Nm eindent , eoutdent , +.Nm eindentv , eoutdentv , +.Nm eprefix +.Nd colorful informational output +.Sh LIBRARY +Enhanced Information output library (libeinfo, -leinfo) +.Sh SYNOPSIS +.In einfo.h +.Ft int Fn einfo "const char * restrict format" ... +.Ft int Fn ewarn "const char * restrict format" ... +.Ft int Fn eerror "const char * restrict format" ... +.Ft int Fn ebegin "const char * restrict format" ... +.Ft int Fn einfon "const char * restrict format" ... +.Ft int Fn ewarnn "const char * restrict format" ... +.Ft int Fn eerrorn "const char * restrict format" ... +.Ft int Fn ebeginn "const char * restrict format" ... +.Ft int Fn einfov "const char * restrict format" ... +.Ft int Fn ewarnv "const char * restrict format" ... +.Ft int Fn ebeginv "const char * restrict format" ... +.Ft int Fn einfovn "const char * restrict format" ... +.Ft int Fn ewarnvn "const char * restrict format" ... +.Ft int Fn ebeginvn "const char * restrict format" ... +.Ft int Fn ewarnx "const char * restrict format" ... +.Ft int Fn eerrorx "const char * restrict format" ... +.Ft int Fn eend "int retval" "const char * restrict format" ... +.Ft int Fn ewend "int retval" "const char * restrict format" ... +.Ft int Fn eendv "int retval" "const char * restrict format" ... +.Ft int Fn ewendv "int retval" "const char * restrict format" ... +.Ft void Fn ebracket "int col" "ECOLOR color" "const char * restrict msg" +.Ft void Fn eindent void +.Ft void Fn eoutdent void +.Ft void Fn eindentv void +.Ft void Fn eoutdentv void +.Ft void Fn eprefix "const char * prefix" +.Sh DESCRIPTION +The +.Fn einfo +family of functions provide a simple informational output that is colorised. +Basically +.Fn einfo , +.Fn ewarn +and +.Fn eerror +behave exactly like +.Fn printf +but prefix the output with a colored *. The function called denotes the color +used with +.Fn einfo +being green, +.Fn ewarn +being yellow and +.Fn eerror +being red. +einfo goes to stdout and the others go to stderr. +The number of real characters printed is returned. +.Fn ebegin +is identical to +.Fn einfo +except that 3 dots are appended to the output. +.Pp +.Fn einfov , +.Fn ewarnv +and +.Fn ebeginv +work the same way to +.Fn einfo , +.Fn ewarn , +and +.Fn ebegin +respectively, but only work when +.Va EINFO_VERBOSE +is true. You can also make the +.Fn einfo , +.Fn ewarn , +and +.Fn ebegin +functions silent by setting +.Va EINFO_QUIET +to true. +.Pp +These functions are designed to output a whole line, so they also +append a newline to the string. To stop this behaviour, you can use the +functions +.Fn einfon , +.Fn ewarnn , +.Fn eerrorn , +.Fn einfovn , +.Fn ewarnvn , +and +.Fn ebeginvn . +.Pp +.Fn eend , +.Fn ewend , +.Fn eendv +and +.Fn ewendv +are the counterparts to the above functions. If +.Fa retval +is zero then ok in green is printed in a bracket at the end of the prior +line. Otherwise we print the formatted string using +.Fn error +(or +.Fn ewarn +if +.Fn ewend +is called) !! in red (or yellow if +.Fn ewend +is called) is printed in a bracket at the end of the line. +The value of +.Fa retval +is returned. +.Pp +.Fn ebracket +does the same as +.Fn eend +but prints +.Fa msg +instead of ok or !! in the color +.Fa color +at the column +.Fa col . +.Pp +.Fn eindent +indents subsequent calls to the above functions by 3 characters. +.Fn eoutdent +removes an +.Fn eindent . +.Fn eindentv +and +.Fn eoutdentv +only work when +.Va EINFO_VERBOSE +is true. +.Pp +.Fn eprefix +prefixes the string +.Fa prefix +to the above functions. +.Sh IMPLEMENTATION NOTES +einfo can optionally be linked against the +.Lb libtermcap +so that we can correctly query the connected console for our color and +cursor escape codes. +If not, then we have a hard coded list of terminals we know about that support +the commonly used codes for color and cursor position. +.Sh ENVIRONMENT +.Va EINFO_QUIET +when set to true makes the +.Fn einfo +and +.Fn einfon +family of functions quiet, so nothing is printed. +.Va EERROR_QUIET +when set to true makes the +.Fn eerror +and +.Fn eerrorn +family of functions quiet, so nothing is printed. +.Pp +.Va EINFO_VERBOSE +when set to true makes the +.Fn einfov +and +.Fn einfovn +family of functions work, so they do print. +.Sh FILES +.Pa /etc/init.d/functions.sh +is provided by OpenRC, which allows shell scripts to use the above functions. +For historical reasons our verbose functions are prefixed with v instead of +suffixed. So einfov becomes veinfo, einfovn becomes veinfon. +Rinse and repeat for the other verbose functions. +.Sh SEE ALSO +.Xr printf 3 , +.Sh AUTHORS +.An Roy Marples diff --git a/pkgconfig/Makefile b/pkgconfig/Makefile index d1dc5507..4bf28cfb 100644 --- a/pkgconfig/Makefile +++ b/pkgconfig/Makefile @@ -1,6 +1,6 @@ DIR= ${LIBDIR}/pkgconfig -SRCS= openrc.pc.in -INC= openrc.pc +SRCS= einfo.pc.in openrc.pc.in +INC= einfo.pc openrc.pc .DEFAULT: ${SED} -n -e 's/^VERSION=[[:space:]]*\([^[:space:]]*\).*/#define VERSION "\1${GITVER}\"/p' ../../Makefile > version.h diff --git a/pkgconfig/einfo.pc.in b/pkgconfig/einfo.pc.in new file mode 100644 index 00000000..b5242a66 --- /dev/null +++ b/pkgconfig/einfo.pc.in @@ -0,0 +1,9 @@ +prefix=@PREFIX@ +exec_prefix=${prefix} +libdir=${prefix}/@LIB@ +includedir=/usr/include + +Name: einfo +Description: Pretty console informational display +Version: @VERSION@ +Libs: -L${libdir} -leinfo diff --git a/src/Makefile b/src/Makefile index f4cd512f..ffbf8d6e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,7 +1,7 @@ # Copyright (c) 2007-2008 Roy Marples # Released under the 2-clause BSD license. -SUBDIR= test librc rc +SUBDIR= test libeinfo librc rc ifeq (${MKTOOLS},yes) SUBDIR+= tools diff --git a/src/libeinfo/.gitignore b/src/libeinfo/.gitignore new file mode 100644 index 00000000..373284db --- /dev/null +++ b/src/libeinfo/.gitignore @@ -0,0 +1 @@ +libeinfo.so.1 diff --git a/src/libeinfo/Makefile b/src/libeinfo/Makefile new file mode 100644 index 00000000..ec756b47 --- /dev/null +++ b/src/libeinfo/Makefile @@ -0,0 +1,12 @@ +LIB= einfo +SHLIB_MAJOR= 1 +SRCS= libeinfo.c +INCS= einfo.h +VERSION_MAP= einfo.map + +CPPFLAGS+= -I../includes + +MK= ../../mk +include ${MK}/lib.mk +include ${MK}/cc.mk +include ${MK}/termcap.mk diff --git a/src/rc/einfo.h b/src/libeinfo/einfo.h similarity index 61% rename from src/rc/einfo.h rename to src/libeinfo/einfo.h index 57645695..31a891f8 100644 --- a/src/rc/einfo.h +++ b/src/libeinfo/einfo.h @@ -37,6 +37,19 @@ #include #include +/* Although OpenRC requires C99, linking to us should not. */ +#ifdef restrict +# define EINFO_RESTRICT restrict +#else +# ifdef __restrict +# define EINFO_RESTRICT __restrict +# else +# define EINFO_RESTRICT +# endif +#endif + +__BEGIN_DECLS + /*! @brief Color types to use */ typedef enum { @@ -52,14 +65,14 @@ typedef enum const char *ecolor(ECOLOR); /*! @brief Writes to syslog. */ -void elog(int, const char *, ...) EINFO_PRINTF(2, 3); +void elog(int, const char * EINFO_RESTRICT, ...) EINFO_PRINTF(2, 3); /*! * @brief Display informational messages. * * The einfo family of functions display messages in a consistent manner - * Basically they prefix the message with " * ". - * If the terminal can handle color then we color the * based on + * across applications. Basically they prefix the message with + * " * ". If the terminal can handle color then we color the * based on * the command used. Otherwise we are identical to the printf function. * * - einfo - green @@ -70,22 +83,22 @@ void elog(int, const char *, ...) EINFO_PRINTF(2, 3); * The v suffix means only print if EINFO_VERBOSE is yes. */ /*@{*/ -int einfon(const char *, ...) EINFO_PRINTF(1, 2); -int ewarnn(const char *, ...) EINFO_PRINTF(1, 2); -int eerrorn(const char *, ...) EINFO_PRINTF(1, 2); -int einfo(const char *, ...) EINFO_PRINTF(1, 2); -int ewarn(const char *, ...) EINFO_PRINTF(1, 2); -void ewarnx(const char *, ...) EINFO_XPRINTF(1, 2); -int eerror(const char *, ...) EINFO_PRINTF(1, 2); -void eerrorx(const char *, ...) EINFO_XPRINTF(1, 2); +int einfon(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); +int ewarnn(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); +int eerrorn(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); +int einfo(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); +int ewarn(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); +void ewarnx(const char * __EINFO_RESTRICT, ...) EINFO_XPRINTF(1, 2); +int eerror(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); +void eerrorx(const char * __EINFO_RESTRICT, ...) EINFO_XPRINTF(1, 2); -int einfovn(const char *, ...) EINFO_PRINTF(1, 2); -int ewarnvn(const char * , ...) EINFO_PRINTF(1, 2); -int ebeginvn(const char *, ...) EINFO_PRINTF(1, 2); -int eendvn(int, const char *, ...) EINFO_PRINTF(2, 3); -int ewendvn(int, const char *, ...) EINFO_PRINTF(2, 3); -int einfov(const char *, ...) EINFO_PRINTF(1, 2); -int ewarnv(const char *, ...) EINFO_PRINTF(1, 2); +int einfovn(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); +int ewarnvn(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); +int ebeginvn(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); +int eendvn(int, const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(2, 3); +int ewendvn(int, const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(2, 3); +int einfov(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); +int ewarnv(const char * __EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); /*@}*/ /*! @ingroup ebegin @@ -93,8 +106,8 @@ int ewarnv(const char *, ...) EINFO_PRINTF(1, 2); * * Similar to einfo, but we add ... to the end of the message */ /*@{*/ -int ebeginv(const char *, ...) EINFO_PRINTF(1, 2); -int ebegin(const char *, ...) EINFO_PRINTF(1, 2); +int ebeginv(const char * EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); +int ebegin(const char * EINFO_RESTRICT, ...) EINFO_PRINTF(1, 2); /*@}*/ /*! @ingroup eend @@ -106,12 +119,12 @@ int ebegin(const char *, ...) EINFO_PRINTF(1, 2); * * ebracket allows you to specifiy the position, color and message */ /*@{*/ -int eend(int, const char *, ...) EINFO_PRINTF(2, 3); -int ewend(int, const char *, ...) EINFO_PRINTF(2, 3); -void ebracket(int, ECOLOR, const char *); +int eend(int, const char * EINFO_RESTRICT, ...) EINFO_PRINTF(2, 3); +int ewend(int, const char * EINFO_RESTRICT, ...) EINFO_PRINTF(2, 3); +void ebracket(int, ECOLOR, const char * EINFO_RESTRICT); -int eendv(int, const char *, ...) EINFO_PRINTF(2, 3); -int ewendv(int, const char *, ...) EINFO_PRINTF(2, 3); +int eendv(int, const char * EINFO_RESTRICT, ...) EINFO_PRINTF(2, 3); +int ewendv(int, const char * EINFO_RESTRICT, ...) EINFO_PRINTF(2, 3); /*@}*/ /*! @ingroup eindent @@ -125,6 +138,7 @@ void eindentv(void); void eoutdentv(void); /*! @brief Prefix each einfo line with something */ -void eprefix(const char *); +void eprefix(const char * EINFO_RESTRICT); +__END_DECLS #endif diff --git a/src/libeinfo/einfo.map b/src/libeinfo/einfo.map new file mode 100644 index 00000000..428a8954 --- /dev/null +++ b/src/libeinfo/einfo.map @@ -0,0 +1,35 @@ +EINFO_1.0 { +global: + ecolor; + elog; + einfon; + ewarnn; + eerrorn; + einfo; + ewarn; + ewarnx; + eerror; + eerrorx; + einfovn; + ewarnvn; + ebeginvn; + eendvn; + ewendvn; + einfov; + ewarnv; + ebeginv; + ebegin; + eend; + ewend; + ebracket; + eendv; + ewendv; + eindent; + eoutdent; + eindentv; + eoutdentv; + eprefix; + +local: + *; +}; diff --git a/src/rc/einfo.c b/src/libeinfo/libeinfo.c similarity index 87% rename from src/rc/einfo.c rename to src/libeinfo/libeinfo.c index 306e7885..9791051f 100644 --- a/src/rc/einfo.c +++ b/src/libeinfo/libeinfo.c @@ -52,6 +52,34 @@ const char libeinfo_copyright[] = "Copyright (c) 2007-2008 Roy Marples"; #include "einfo.h" #include "helpers.h" +#include "hidden-visibility.h" + +hidden_proto(ecolor) +hidden_proto(ebegin) +hidden_proto(ebeginv) +hidden_proto(ebracket) +hidden_proto(eend) +hidden_proto(eendv) +hidden_proto(eerror) +hidden_proto(eerrorn) +hidden_proto(eerrorx) +hidden_proto(eindent) +hidden_proto(eindentv) +hidden_proto(einfo) +hidden_proto(einfon) +hidden_proto(einfov) +hidden_proto(einfovn) +hidden_proto(elog) +hidden_proto(eoutdent) +hidden_proto(eoutdentv) +hidden_proto(eprefix) +hidden_proto(ewarn) +hidden_proto(ewarnn) +hidden_proto(ewarnv) +hidden_proto(ewarnvn) +hidden_proto(ewarnx) +hidden_proto(ewend) +hidden_proto(ewendv) /* Incase we cannot work out how many columns from ioctl, supply a default */ #define DEFAULT_COLS 80 @@ -324,7 +352,7 @@ tgoto(const char *cap, int col, int line) #endif static bool -colour_terminal(FILE *f) +colour_terminal(FILE * EINFO_RESTRICT f) { static int in_colour = -1; char *e, *ee, *end, *d, *p; @@ -471,7 +499,7 @@ colour_terminal(FILE *f) } static int -get_term_columns(FILE *stream) +get_term_columns(FILE * EINFO_RESTRICT stream) { struct winsize ws; char *env = getenv("COLUMNS"); @@ -491,13 +519,14 @@ get_term_columns(FILE *stream) } void -eprefix(const char *prefix) +eprefix(const char *EINFO_RESTRICT prefix) { _eprefix = prefix; } +hidden_def(eprefix) static void EINFO_PRINTF(2, 0) -elogv(int level, const char *fmt, va_list ap) +elogv(int level, const char *EINFO_RESTRICT fmt, va_list ap) { char *e = getenv("EINFO_LOG"); va_list apc; @@ -513,7 +542,7 @@ elogv(int level, const char *fmt, va_list ap) } void -elog(int level, const char *fmt, ...) +elog(int level, const char *EINFO_RESTRICT fmt, ...) { va_list ap; @@ -521,9 +550,10 @@ elog(int level, const char *fmt, ...) elogv(level, fmt, ap); va_end(ap); } +hidden_def(elog) static int -_eindent(FILE *stream) +_eindent(FILE * EINFO_RESTRICT stream) { char *env = getenv("EINFO_INDENT"); int amount = 0; @@ -547,7 +577,7 @@ _eindent(FILE *stream) } static const char * -_ecolor(FILE *f, ECOLOR color) +_ecolor(FILE * EINFO_RESTRICT f, ECOLOR color) { unsigned int i; @@ -559,6 +589,7 @@ _ecolor(FILE *f, ECOLOR color) return ecolors_str[i]; return ""; } +hidden_def(ecolor) const char * ecolor(ECOLOR color) @@ -584,7 +615,7 @@ ecolor(ECOLOR color) } static int EINFO_PRINTF(3, 0) - _einfo(FILE *f, ECOLOR color, const char *fmt, va_list va) + _einfo(FILE *f, ECOLOR color, const char *EINFO_RESTRICT fmt, va_list va) { int retval = 0; char *last = getenv("EINFO_LASTCMD"); @@ -612,7 +643,7 @@ static int EINFO_PRINTF(3, 0) #define _eerrorvn(fmt, ap) _einfo(stderr, ECOLOR_BAD, fmt, ap) int -einfon(const char *fmt, ...) +einfon(const char *EINFO_RESTRICT fmt, ...) { int retval; va_list ap; @@ -625,9 +656,10 @@ einfon(const char *fmt, ...) LASTCMD("einfon"); return retval; } +hidden_def(einfon) int -ewarnn(const char *fmt, ...) +ewarnn(const char *EINFO_RESTRICT fmt, ...) { int retval; va_list ap; @@ -640,9 +672,10 @@ ewarnn(const char *fmt, ...) LASTCMD("ewarnn"); return retval; } +hidden_def(ewarnn) int -eerrorn(const char *fmt, ...) +eerrorn(const char *EINFO_RESTRICT fmt, ...) { int retval; va_list ap; @@ -655,9 +688,10 @@ eerrorn(const char *fmt, ...) LASTCMD("errorn"); return retval; } +hidden_def(eerrorn) int -einfo(const char *fmt, ...) +einfo(const char *EINFO_RESTRICT fmt, ...) { int retval; va_list ap; @@ -671,9 +705,10 @@ einfo(const char *fmt, ...) LASTCMD("einfo"); return retval; } +hidden_def(einfo) int -ewarn(const char *fmt, ...) +ewarn(const char *EINFO_RESTRICT fmt, ...) { int retval; va_list ap; @@ -688,9 +723,10 @@ ewarn(const char *fmt, ...) LASTCMD("ewarn"); return retval; } +hidden_def(ewarn) void -ewarnx(const char *fmt, ...) +ewarnx(const char *EINFO_RESTRICT fmt, ...) { int retval; va_list ap; @@ -704,9 +740,10 @@ ewarnx(const char *fmt, ...) } exit(EXIT_FAILURE); } +hidden_def(ewarnx) int -eerror(const char *fmt, ...) +eerror(const char *EINFO_RESTRICT fmt, ...) { int retval; va_list ap; @@ -721,9 +758,10 @@ eerror(const char *fmt, ...) LASTCMD("eerror"); return retval; } +hidden_def(eerror) void -eerrorx(const char *fmt, ...) +eerrorx(const char *EINFO_RESTRICT fmt, ...) { va_list ap; @@ -736,9 +774,10 @@ eerrorx(const char *fmt, ...) } exit(EXIT_FAILURE); } +hidden_def(eerrorx) int -ebegin(const char *fmt, ...) +ebegin(const char *EINFO_RESTRICT fmt, ...) { int retval; va_list ap; @@ -754,9 +793,10 @@ ebegin(const char *fmt, ...) LASTCMD("ebegin"); return retval; } +hidden_def(ebegin) static void -_eend(FILE *fp, int col, ECOLOR color, const char *msg) +_eend(FILE * EINFO_RESTRICT fp, int col, ECOLOR color, const char *msg) { int i; int cols; @@ -792,7 +832,7 @@ _eend(FILE *fp, int col, ECOLOR color, const char *msg) static int EINFO_PRINTF(3, 0) _do_eend(const char *cmd, int retval, - const char *fmt, va_list ap) + const char *EINFO_RESTRICT fmt, va_list ap) { int col = 0; FILE *fp = stdout; @@ -815,7 +855,7 @@ _do_eend(const char *cmd, int retval, } int -eend(int retval, const char *fmt, ...) +eend(int retval, const char *EINFO_RESTRICT fmt, ...) { va_list ap; @@ -827,9 +867,10 @@ eend(int retval, const char *fmt, ...) LASTCMD("eend"); return retval; } +hidden_def(eend) int -ewend(int retval, const char *fmt, ...) +ewend(int retval, const char *EINFO_RESTRICT fmt, ...) { va_list ap; @@ -841,12 +882,14 @@ ewend(int retval, const char *fmt, ...) LASTCMD("ewend"); return retval; } +hidden_def(ewend) void ebracket(int col, ECOLOR color, const char *msg) { _eend(stdout, col, color, msg); } +hidden_def(ebracket) void eindent(void) @@ -867,6 +910,7 @@ eindent(void) snprintf(num, 10, "%08d", amount); setenv("EINFO_INDENT", num, 1); } +hidden_def(eindent) void eoutdent(void) { @@ -891,9 +935,10 @@ void eoutdent(void) } errno = serrno; } +hidden_def(eoutdent) int -einfovn(const char *fmt, ...) +einfovn(const char *EINFO_RESTRICT fmt, ...) { int retval; va_list ap; @@ -906,9 +951,10 @@ einfovn(const char *fmt, ...) LASTCMD("einfovn"); return retval; } +hidden_def(einfovn) int -ewarnvn(const char *fmt, ...) +ewarnvn(const char *EINFO_RESTRICT fmt, ...) { int retval; va_list ap; @@ -921,9 +967,10 @@ ewarnvn(const char *fmt, ...) LASTCMD("ewarnvn"); return retval; } +hidden_def(ewarnvn) int -einfov(const char *fmt, ...) +einfov(const char *EINFO_RESTRICT fmt, ...) { int retval; va_list ap; @@ -937,9 +984,10 @@ einfov(const char *fmt, ...) LASTCMD("einfov"); return retval; } +hidden_def(einfov) int -ewarnv(const char *fmt, ...) +ewarnv(const char *EINFO_RESTRICT fmt, ...) { int retval; va_list ap; @@ -953,9 +1001,10 @@ ewarnv(const char *fmt, ...) LASTCMD("ewarnv"); return retval; } +hidden_def(ewarnv) int -ebeginv(const char *fmt, ...) +ebeginv(const char *EINFO_RESTRICT fmt, ...) { int retval; va_list ap; @@ -972,9 +1021,10 @@ ebeginv(const char *fmt, ...) LASTCMD("ebeginv"); return retval; } +hidden_def(ebeginv) int -eendv(int retval, const char *fmt, ...) +eendv(int retval, const char *EINFO_RESTRICT fmt, ...) { va_list ap; @@ -986,9 +1036,10 @@ eendv(int retval, const char *fmt, ...) LASTCMD("eendv"); return retval; } +hidden_def(eendv) int -ewendv(int retval, const char *fmt, ...) +ewendv(int retval, const char *EINFO_RESTRICT fmt, ...) { va_list ap; @@ -1000,6 +1051,7 @@ ewendv(int retval, const char *fmt, ...) LASTCMD("ewendv"); return retval; } +hidden_def(ewendv) void eindentv(void) @@ -1007,6 +1059,7 @@ eindentv(void) if (is_verbose()) eindent(); } +hidden_def(eindentv) void eoutdentv(void) @@ -1014,3 +1067,4 @@ eoutdentv(void) if (is_verbose()) eoutdent(); } +hidden_def(eoutdentv) diff --git a/src/rc/Makefile b/src/rc/Makefile index 6490826e..a2e638e8 100644 --- a/src/rc/Makefile +++ b/src/rc/Makefile @@ -1,21 +1,8 @@ PROG= rc -SRCS= \ - checkpath.c \ - einfo.c \ - fstabinfo.c \ - mountinfo.c \ - rc-applets.c \ - rc-depend.c \ - rc-logger.c \ - rc-misc.c \ - rc-plugin.c \ - rc-service.c \ - rc-status.c \ - rc-update.c \ - rc.c \ - runscript.c \ - start-stop-daemon.c \ - swclock.c +SRCS= checkpath.c fstabinfo.c mountinfo.c start-stop-daemon.c \ + rc-applets.c rc-depend.c rc-logger.c \ + rc-misc.c rc-plugin.c rc-service.c rc-status.c rc-update.c \ + runscript.c rc.c swclock.c CLEANFILES= version.h @@ -43,9 +30,9 @@ RC_SBINLINKS= mark_service_starting mark_service_started \ ALL_LINKS= ${BINLINKS} ${SBINLINKS} ${RC_BINLINKS} ${RC_SBINLINKS} CLEANFILES+= ${ALL_LINKS} -CPPFLAGS+= -I../includes -I../librc -LDFLAGS+= -L../librc -LDADD+= -lutil -lrc +CPPFLAGS+= -I../includes -I../librc -I../libeinfo +LDFLAGS+= -L../librc -L../libeinfo +LDADD+= -lutil -lrc -leinfo include ../../Makefile.inc MK= ../../mk diff --git a/src/test/einfo.data.list b/src/test/einfo.data.list new file mode 100644 index 00000000..c638b2f1 --- /dev/null +++ b/src/test/einfo.data.list @@ -0,0 +1 @@ +EINFO_1.0 diff --git a/src/test/einfo.funcs.list b/src/test/einfo.funcs.list new file mode 100644 index 00000000..5dbbd96f --- /dev/null +++ b/src/test/einfo.funcs.list @@ -0,0 +1,52 @@ +ebegin +ebegin@@EINFO_1.0 +ebeginv +ebeginv@@EINFO_1.0 +ebracket +ebracket@@EINFO_1.0 +ecolor +ecolor@@EINFO_1.0 +eend +eend@@EINFO_1.0 +eendv +eendv@@EINFO_1.0 +eerror +eerror@@EINFO_1.0 +eerrorn +eerrorn@@EINFO_1.0 +eerrorx +eerrorx@@EINFO_1.0 +eindent +eindent@@EINFO_1.0 +eindentv +eindentv@@EINFO_1.0 +einfo +einfo@@EINFO_1.0 +einfon +einfon@@EINFO_1.0 +einfov +einfov@@EINFO_1.0 +einfovn +einfovn@@EINFO_1.0 +elog +elog@@EINFO_1.0 +eoutdent +eoutdent@@EINFO_1.0 +eoutdentv +eoutdentv@@EINFO_1.0 +eprefix +eprefix@@EINFO_1.0 +ewarn +ewarn@@EINFO_1.0 +ewarnn +ewarnn@@EINFO_1.0 +ewarnv +ewarnv@@EINFO_1.0 +ewarnvn +ewarnvn@@EINFO_1.0 +ewarnx +ewarnx@@EINFO_1.0 +ewend +ewend@@EINFO_1.0 +ewendv +ewendv@@EINFO_1.0 diff --git a/src/test/runtests.sh b/src/test/runtests.sh index b5b053fa..5a87c847 100755 --- a/src/test/runtests.sh +++ b/src/test/runtests.sh @@ -3,6 +3,8 @@ top_srcdir=${top_srcdir:-../..} . ${top_srcdir}/test/setup_env.sh +libeinfo_srcdir="${srcdir}/../libeinfo" +libeinfo_builddir="${builddir}/../libeinfo" librc_srcdir="${srcdir}/../librc" librc_builddir="${builddir}/../librc" rc_srcdir="${srcdir}/../rc" @@ -18,6 +20,22 @@ checkit() { ret=0 +ebegin "Checking exported symbols in libeinfo.so (data)" +checkit einfo.data $( +readelf -Ws ${libeinfo_builddir}/libeinfo.so \ + | awk '$4 == "OBJECT" && $5 == "GLOBAL" && $7 != "UND" {print $NF}' \ + | LC_ALL=C sort -u +) + +ebegin "Checking exported symbols in libeinfo.so (functions)" +checkit einfo.funcs $( +readelf -Ws ${libeinfo_builddir}/libeinfo.so \ + | awk '$4 == "FUNC" && $5 == "GLOBAL" && $7 != "UND" {print $NF}' \ + | LC_ALL=C sort -u \ + | egrep -v \ + -e '^_(init|fini)$' +) + ebegin "Checking exported symbols in librc.so (data)" checkit rc.data $( readelf -Ws ${librc_builddir}/librc.so \