aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Hubbs <w.d.hubbs@gmail.com>2013-10-16 12:55:37 -0500
committerWilliam Hubbs <w.d.hubbs@gmail.com>2013-10-21 13:49:41 -0500
commit48981be8a872c7a0191d2519793205276fdc423a (patch)
tree52176c1b31b3c9429c57fdc279c06b93c1d72ca2
parentd2988dc7ddd832ffc94f6b76c54898217812b7cc (diff)
Revert "Make einfo routines private"
This reverts commit de88aff0a839844526ae262f8961ec4372fed238. I was advised that splashutils links to libeinfo, so we do have a consumer for this library.
-rw-r--r--man/Makefile2
-rw-r--r--man/einfo.3210
-rw-r--r--pkgconfig/Makefile4
-rw-r--r--pkgconfig/einfo.pc.in9
-rw-r--r--src/Makefile2
-rw-r--r--src/libeinfo/.gitignore1
-rw-r--r--src/libeinfo/Makefile12
-rw-r--r--src/libeinfo/einfo.h (renamed from src/rc/einfo.h)68
-rw-r--r--src/libeinfo/einfo.map35
-rw-r--r--src/libeinfo/libeinfo.c (renamed from src/rc/einfo.c)110
-rw-r--r--src/rc/Makefile27
-rw-r--r--src/test/einfo.data.list1
-rw-r--r--src/test/einfo.funcs.list52
-rwxr-xr-xsrc/test/runtests.sh18
14 files changed, 472 insertions, 79 deletions
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 <roy@marples.name>
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 <roy@marples.name>
# 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
index 57645695..31a891f8 100644
--- a/src/rc/einfo.h
+++ b/src/libeinfo/einfo.h
@@ -37,6 +37,19 @@
#include <sys/types.h>
#include <stdbool.h>
+/* 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 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 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_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
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 \