Instead of trying to make weak functions work on all platforms,
just use a registration function for a plugin-specific setlocale function. The sudoers version just wraps sudoers_setlocale().
This commit is contained in:
@@ -101,21 +101,21 @@ LTOBJS = alloc.lo event.lo fatal.lo key_val.lo gethostname.lo gettime.lo \
|
||||
setgroups.lo strtobool.lo strtoid.lo strtomode.lo sudo_conf.lo \
|
||||
sudo_debug.lo sudo_dso.lo term.lo ttysize.lo @COMMON_OBJS@ @LTLIBOBJS@
|
||||
|
||||
ATOFOO_TEST_OBJS = atofoo_test.lo locale_stub.lo
|
||||
ATOFOO_TEST_OBJS = atofoo_test.lo
|
||||
|
||||
MKTEMP_TEST_OBJS = mktemp_test.lo locale_stub.lo
|
||||
MKTEMP_TEST_OBJS = mktemp_test.lo
|
||||
|
||||
PARSELN_TEST_OBJS = parseln_test.lo locale_stub.lo
|
||||
PARSELN_TEST_OBJS = parseln_test.lo
|
||||
|
||||
PROGNAME_TEST_OBJS = progname_test.lo progname.lo
|
||||
|
||||
CONF_TEST_OBJS = conf_test.lo locale_stub.lo
|
||||
CONF_TEST_OBJS = conf_test.lo
|
||||
|
||||
HLTQ_TEST_OBJS = hltq_test.lo locale_stub.lo
|
||||
HLTQ_TEST_OBJS = hltq_test.lo
|
||||
|
||||
FNM_TEST_OBJS = fnm_test.lo locale_stub.lo
|
||||
FNM_TEST_OBJS = fnm_test.lo
|
||||
|
||||
GLOBTEST_OBJS = globtest.lo locale_stub.lo
|
||||
GLOBTEST_OBJS = globtest.lo
|
||||
|
||||
all: libsudo_util.la
|
||||
|
||||
@@ -309,9 +309,9 @@ aix.lo: $(srcdir)/aix.c $(incdir)/compat/stdbool.h $(incdir)/sudo_alloc.h \
|
||||
$(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
|
||||
$(top_builddir)/config.h
|
||||
$(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/aix.c
|
||||
alloc.lo: $(srcdir)/alloc.c $(incdir)/sudo_alloc.h $(incdir)/sudo_compat.h \
|
||||
$(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
|
||||
$(top_builddir)/config.h
|
||||
alloc.lo: $(srcdir)/alloc.c $(incdir)/compat/stdbool.h $(incdir)/sudo_alloc.h \
|
||||
$(incdir)/sudo_compat.h $(incdir)/sudo_fatal.h \
|
||||
$(incdir)/sudo_gettext.h $(top_builddir)/config.h
|
||||
$(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/alloc.c
|
||||
atofoo_test.lo: $(srcdir)/regress/atofoo/atofoo_test.c \
|
||||
$(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
|
||||
@@ -372,8 +372,8 @@ gethostname.lo: $(srcdir)/gethostname.c $(incdir)/compat/stdbool.h \
|
||||
getline.lo: $(srcdir)/getline.c $(incdir)/sudo_compat.h $(top_builddir)/config.h
|
||||
$(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/getline.c
|
||||
getopt_long.lo: $(srcdir)/getopt_long.c $(incdir)/compat/getopt.h \
|
||||
$(incdir)/sudo_compat.h $(incdir)/sudo_fatal.h \
|
||||
$(top_builddir)/config.h
|
||||
$(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
|
||||
$(incdir)/sudo_fatal.h $(top_builddir)/config.h
|
||||
$(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/getopt_long.c
|
||||
gettime.lo: $(srcdir)/gettime.c $(incdir)/compat/stdbool.h \
|
||||
$(incdir)/compat/timespec.h $(incdir)/sudo_compat.h \
|
||||
@@ -407,18 +407,10 @@ key_val.lo: $(srcdir)/key_val.c $(incdir)/compat/stdbool.h \
|
||||
$(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
|
||||
$(top_builddir)/config.h
|
||||
$(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/key_val.c
|
||||
lbuf.lo: $(srcdir)/lbuf.c $(incdir)/sudo_alloc.h $(incdir)/sudo_compat.h \
|
||||
$(incdir)/sudo_debug.h $(incdir)/sudo_lbuf.h $(incdir)/sudo_queue.h \
|
||||
$(top_builddir)/config.h
|
||||
lbuf.lo: $(srcdir)/lbuf.c $(incdir)/compat/stdbool.h $(incdir)/sudo_alloc.h \
|
||||
$(incdir)/sudo_compat.h $(incdir)/sudo_debug.h $(incdir)/sudo_lbuf.h \
|
||||
$(incdir)/sudo_queue.h $(top_builddir)/config.h
|
||||
$(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/lbuf.c
|
||||
locale_stub.lo: $(top_srcdir)/src/locale_stub.c $(incdir)/sudo_compat.h \
|
||||
$(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
|
||||
$(top_builddir)/config.h
|
||||
$(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(top_srcdir)/src/locale_stub.c
|
||||
locale_weak.lo: $(srcdir)/locale_weak.c $(incdir)/sudo_compat.h \
|
||||
$(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
|
||||
$(top_builddir)/config.h
|
||||
$(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/locale_weak.c
|
||||
locking.lo: $(srcdir)/locking.c $(incdir)/compat/stdbool.h \
|
||||
$(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
|
||||
$(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
|
||||
|
@@ -46,6 +46,8 @@ SLIST_HEAD(sudo_fatal_callback_list, sudo_fatal_callback);
|
||||
|
||||
static struct sudo_fatal_callback_list callbacks = SLIST_HEAD_INITIALIZER(&callbacks);
|
||||
static sudo_conv_t sudo_warn_conversation;
|
||||
static bool (*sudo_warn_setlocale)(bool, int *);
|
||||
static bool (*sudo_warn_setlocale_prev)(bool, int *);
|
||||
|
||||
static void _warning(int errnum, const char *fmt, va_list ap);
|
||||
|
||||
@@ -136,6 +138,12 @@ sudo_vwarnx_nodebug_v1(const char *fmt, va_list ap)
|
||||
static void
|
||||
_warning(int errnum, const char *fmt, va_list ap)
|
||||
{
|
||||
int cookie;
|
||||
|
||||
/* Set user locale if setter was specified. */
|
||||
if (sudo_warn_setlocale != NULL)
|
||||
sudo_warn_setlocale(false, &cookie);
|
||||
|
||||
if (sudo_warn_conversation != NULL) {
|
||||
struct sudo_conv_message msgs[6];
|
||||
int nmsgs = 0;
|
||||
@@ -155,7 +163,7 @@ _warning(int errnum, const char *fmt, va_list ap)
|
||||
msgs[nmsgs].msg_type = SUDO_CONV_ERROR_MSG;
|
||||
msgs[nmsgs++].msg = ": ";
|
||||
msgs[nmsgs].msg_type = SUDO_CONV_ERROR_MSG;
|
||||
msgs[nmsgs++].msg = sudo_warn_strerror(errnum);
|
||||
msgs[nmsgs++].msg = strerror(errnum);
|
||||
}
|
||||
msgs[nmsgs].msg_type = SUDO_CONV_ERROR_MSG;
|
||||
msgs[nmsgs++].msg = "\n";
|
||||
@@ -170,10 +178,14 @@ _warning(int errnum, const char *fmt, va_list ap)
|
||||
}
|
||||
if (errnum) {
|
||||
fputs(": ", stderr);
|
||||
fputs(sudo_warn_strerror(errnum), stderr);
|
||||
fputs(strerror(errnum), stderr);
|
||||
}
|
||||
putc('\n', stderr);
|
||||
}
|
||||
|
||||
/* Restore old locale as needed. */
|
||||
if (sudo_warn_setlocale != NULL)
|
||||
sudo_warn_setlocale(true, &cookie);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -232,3 +244,35 @@ sudo_warn_set_conversation_v1(sudo_conv_t conv)
|
||||
{
|
||||
sudo_warn_conversation = conv;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the locale function so the plugin can use a non-default
|
||||
* locale for user warnings.
|
||||
*/
|
||||
void
|
||||
sudo_warn_set_locale_func_v1(bool (*func)(bool, int *))
|
||||
{
|
||||
sudo_warn_setlocale_prev = sudo_warn_setlocale;
|
||||
sudo_warn_setlocale = func;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBINTL_H
|
||||
char *
|
||||
sudo_warn_gettext_v1(const char *msgid)
|
||||
{
|
||||
int cookie;
|
||||
char *msg;
|
||||
|
||||
/* Set user locale if setter was specified. */
|
||||
if (sudo_warn_setlocale != NULL)
|
||||
sudo_warn_setlocale(false, &cookie);
|
||||
|
||||
msg = gettext(msgid);
|
||||
|
||||
/* Restore old locale as needed. */
|
||||
if (sudo_warn_setlocale != NULL)
|
||||
sudo_warn_setlocale(true, &cookie);
|
||||
|
||||
return msg;
|
||||
}
|
||||
#endif /* HAVE_LIBINTL_H */
|
||||
|
@@ -1,80 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2015 Todd C. Miller <Todd.Miller@courtesan.com>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef HAVE_SYS_WEAK_ALIAS
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#ifdef HAVE_STRING_H
|
||||
# include <string.h>
|
||||
#endif /* HAVE_STRING_H */
|
||||
#ifdef HAVE_STRINGS_H
|
||||
# include <strings.h>
|
||||
#endif /* HAVE_STRINGS_H */
|
||||
|
||||
#define DEFAULT_TEXT_DOMAIN "sudo"
|
||||
#include "sudo_gettext.h" /* must be included before sudo_compat.h */
|
||||
|
||||
#include "sudo_compat.h"
|
||||
#include "sudo_fatal.h"
|
||||
|
||||
/*
|
||||
* Weak symbols for sudo_warn_gettext_v1() and sudo_warn_strerror_v1().
|
||||
* These stubs are provided to make libsudo_util link with no undefined
|
||||
* symbols.
|
||||
*/
|
||||
|
||||
# ifdef HAVE_LIBINTL_H
|
||||
/* We only need to swap locales in the plugin. */
|
||||
char *
|
||||
sudo_warn_gettext_weak(const char *msgid)
|
||||
{
|
||||
return gettext(msgid);
|
||||
}
|
||||
# if defined(HAVE_SYS_WEAK_ALIAS_ATTRIBUTE)
|
||||
char *sudo_warn_gettext_v1(const char *msgid)
|
||||
__attribute__((weak, alias("sudo_warn_gettext_weak")));
|
||||
# elif defined(HAVE_SYS_WEAK_ALIAS_PRAGMA)
|
||||
# pragma weak sudo_warn_gettext_v1 = sudo_warn_gettext_weak
|
||||
# elif defined(HAVE_SYS_WEAK_ALIAS_HPSECONDARY)
|
||||
# pragma _HP_SECONDARY_DEF sudo_warn_gettext_weak sudo_warn_gettext_v1
|
||||
# elif defined(HAVE_SYS_WEAK_ALIAS_CRIDUPLICATE)
|
||||
# pragma _CRI duplicate sudo_warn_gettext_v1 as sudo_warn_gettext_weak
|
||||
# endif
|
||||
# endif /* HAVE_LIBINTL_H */
|
||||
|
||||
/* We only need to swap locales in the plugin. */
|
||||
char *
|
||||
sudo_warn_strerror_weak(int errnum)
|
||||
{
|
||||
return strerror(errnum);
|
||||
}
|
||||
# if defined(HAVE_SYS_WEAK_ALIAS_ATTRIBUTE)
|
||||
char *sudo_warn_strerror_v1(int errnum)
|
||||
__attribute__((weak, alias("sudo_warn_strerror_weak")));
|
||||
# elif defined(HAVE_SYS_WEAK_ALIAS_PRAGMA)
|
||||
# pragma weak sudo_warn_strerror_v1 = sudo_warn_strerror_weak
|
||||
# elif defined(HAVE_SYS_WEAK_ALIAS_HPSECONDARY)
|
||||
# pragma _HP_SECONDARY_DEF sudo_warn_strerror_weak sudo_warn_strerror_v1
|
||||
# elif defined(HAVE_SYS_WEAK_ALIAS_CRIDUPLICATE)
|
||||
# pragma _CRI duplicate sudo_warn_strerror_v1 as sudo_warn_strerror_weak
|
||||
# endif
|
||||
|
||||
#endif /* HAVE_SYS_WEAK_ALIAS */
|
@@ -96,4 +96,5 @@ sudo_vwarn_nodebug_v1
|
||||
sudo_vwarnx_nodebug_v1
|
||||
sudo_warn_nodebug_v1
|
||||
sudo_warn_set_conversation_v1
|
||||
sudo_warn_set_locale_func_v1
|
||||
sudo_warnx_nodebug_v1
|
||||
|
Reference in New Issue
Block a user