instead of a variable number of args.
/*
- * Copyright (c) 2011 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2011-2012 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
}
void
-sudo_debug_printf2(const char *func, const char *file, int lineno, int level,
- const char *fmt, ...)
+sudo_debug_vprintf2(const char *func, const char *file, int lineno, int level,
+ const char *fmt, va_list ap)
{
int buflen, pri, subsys, saved_errno = errno;
- va_list ap;
char *buf;
if (!sudo_debug_mode)
/* Make sure we want debug info at this level. */
if (subsys < NUM_SUBSYSTEMS && sudo_debug_settings[subsys] >= pri) {
- va_start(ap, fmt);
buflen = vasprintf(&buf, fmt, ap);
va_end(ap);
if (buflen != -1) {
errno = saved_errno;
}
+void
+sudo_debug_printf2(const char *func, const char *file, int lineno, int level,
+ const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ sudo_debug_vprintf2(func, file, lineno, level, fmt, ap);
+ va_end(ap);
+}
+
void
sudo_debug_execve2(int level, const char *path, char *const argv[], char *const envp[])
{
/*
- * Copyright (c) 2004, 2010 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2004, 2010-2012 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
# define warning(...) warning2(__VA_ARGS__)
# define warningx(...) warningx2(__VA_ARGS__)
# endif /* __GNUC__ == 2 */
+# define verror(rval, fmt, ap) error2((rval), (fmt), (ap))
+# define verrorx(rval, fmt, ap) errorx2((rval), (fmt), (ap))
+# define vwarning(fmt, ap) warning2((fmt), (ap))
+# define vwarningx(fmt, ap) warningx2((fmt), (ap))
#else /* SUDO_ERROR_WRAP */
# if defined(__GNUC__) && __GNUC__ == 2
# define error(rval, fmt...) do { \
warningx2(__VA_ARGS__); \
} while (0)
# endif /* __GNUC__ == 2 */
+# define verror(rval, fmt, ap) do { \
+ sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \
+ SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \
+ (fmt), (ap)); \
+ verror2((rval), (fmt), (ap)); \
+} while (0)
+# define verrorx(rval, fmt, ap) do { \
+ sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \
+ SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, (fmt), (ap)); \
+ verrorx2((rval), (fmt), (ap)); \
+} while (0)
+# define vwarning(fmt, ap) do { \
+ sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \
+ SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \
+ (fmt), (ap)); \
+ vwarning2((fmt), (ap)); \
+} while (0)
+# define vwarningx(fmt, ap) do { \
+ sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \
+ SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|sudo_debug_subsys, (fmt), (ap)); \
+ vwarningx2((fmt), (ap)); \
+} while (0)
#endif /* SUDO_ERROR_WRAP */
-void error2(int, const char *, ...) __printflike(2, 3) __attribute__((__noreturn__));
-void errorx2(int, const char *, ...) __printflike(2, 3) __attribute__((__noreturn__));
+void error2(int, const char *, ...) __printflike(2, 3) __attribute__((__noreturn__));
+void errorx2(int, const char *, ...) __printflike(2, 3) __attribute__((__noreturn__));
+void verror2(int, const char *, va_list ap) __attribute__((__noreturn__));
+void verrorx2(int, const char *, va_list ap) __attribute__((__noreturn__));
void warning2(const char *, ...) __printflike(1, 2);
void warningx2(const char *, ...) __printflike(1, 2);
+void vwarning2(const char *, va_list ap);
+void vwarningx2(const char *, va_list ap);
#endif /* _SUDO_ERROR_H_ */
/*
- * Copyright (c) 2011 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2011-2012 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
void sudo_debug_exit_ptr(const char *func, const char *file, int line, int subsys, const void *rval);
int sudo_debug_fd_set(int fd);
int sudo_debug_init(const char *debugfile, const char *settings);
-void sudo_debug_printf2(const char *func, const char *file, int line, int level, const char *format, ...) __printflike(5, 6);
+void sudo_debug_printf2(const char *func, const char *file, int line, int level, const char *fmt, ...) __printflike(5, 6);
+void sudo_debug_vprintf2(const char *func, const char *file, int line, int level, const char *fmt, va_list ap);
void sudo_debug_write(const char *str, int len, int errno_val);
void sudo_debug_write2(const char *func, const char *file, int line, const char *str, int len, int errno_val);
pid_t sudo_debug_fork(void);
/*
- * Copyright (c) 2004-2005, 2010 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2004-2005, 2010-2012 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
siglongjmp(error_jmp, eval);
}
+void
+verror2(int eval, const char *fmt, va_list ap)
+{
+ _warning(1, fmt, ap);
+ sudoers_plugin_cleanup(0);
+ siglongjmp(error_jmp, eval);
+}
+
+void
+verrorx2(int eval, const char *fmt, va_list ap)
+{
+ _warning(0, fmt, ap);
+ sudoers_plugin_cleanup(0);
+ siglongjmp(error_jmp, eval);
+}
+
void
warning2(const char *fmt, ...)
{
va_end(ap);
}
+void
+vwarning2(const char *fmt, va_list ap)
+{
+ _warning(1, fmt, ap);
+}
+
+void
+vwarningx2(const char *fmt, va_list ap)
+{
+ _warning(0, fmt, ap);
+}
+
static void
_warning(int use_errno, const char *fmt, va_list ap)
{
/*
- * Copyright (c) 2004-2005, 2010 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2004-2005, 2010-2012 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
void
error2(int eval, const char *fmt, ...)
{
- va_list ap;
- va_start(ap, fmt);
- _warning(1, fmt, ap);
- va_end(ap);
- cleanup(0);
- exit(eval);
+ va_list ap;
+ va_start(ap, fmt);
+ _warning(1, fmt, ap);
+ va_end(ap);
+ cleanup(0);
+ exit(eval);
}
void
errorx2(int eval, const char *fmt, ...)
{
- va_list ap;
- va_start(ap, fmt);
- _warning(0, fmt, ap);
- va_end(ap);
- cleanup(0);
- exit(eval);
+ va_list ap;
+ va_start(ap, fmt);
+ _warning(0, fmt, ap);
+ va_end(ap);
+ cleanup(0);
+ exit(eval);
+}
+
+void
+verror2(int eval, const char *fmt, va_list ap)
+{
+ _warning(1, fmt, ap);
+ cleanup(0);
+ exit(eval);
+}
+
+void
+verrorx2(int eval, const char *fmt, va_list ap)
+{
+ _warning(0, fmt, ap);
+ cleanup(0);
+ exit(eval);
}
void
warning2(const char *fmt, ...)
{
- va_list ap;
- va_start(ap, fmt);
- _warning(1, fmt, ap);
- va_end(ap);
+ va_list ap;
+ va_start(ap, fmt);
+ _warning(1, fmt, ap);
+ va_end(ap);
}
void
warningx2(const char *fmt, ...)
{
- va_list ap;
- va_start(ap, fmt);
- _warning(0, fmt, ap);
- va_end(ap);
+ va_list ap;
+ va_start(ap, fmt);
+ _warning(0, fmt, ap);
+ va_end(ap);
+}
+
+void
+vwarning2(const char *fmt, va_list ap)
+{
+ _warning(1, fmt, ap);
+}
+
+void
+vwarningx2(const char *fmt, va_list ap)
+{
+ _warning(0, fmt, ap);
}
static void
_warning(int use_errno, const char *fmt, va_list ap)
{
- int serrno = errno;
-
- fputs(getprogname(), stderr);
- if (fmt != NULL) {
- fputs(_(": "), stderr);
- vfprintf(stderr, fmt, ap);
- }
- if (use_errno) {
- fputs(_(": "), stderr);
- fputs(strerror(serrno), stderr);
- }
- putc('\n', stderr);
+ int serrno = errno;
+
+ fputs(getprogname(), stderr);
+ if (fmt != NULL) {
+ fputs(_(": "), stderr);
+ vfprintf(stderr, fmt, ap);
+ }
+ if (use_errno) {
+ fputs(_(": "), stderr);
+ fputs(strerror(serrno), stderr);
+ }
+ putc('\n', stderr);
}