static void
pass_warn(void)
{
- struct sudo_conv_message msg[2];
- struct sudo_conv_reply repl[2];
+ const char *warning = def_badpass_message;
- /* Call conversation function */
- memset(msg, 0, sizeof(msg));
- msg[0].msg_type = SUDO_CONV_ERROR_MSG;
#ifdef INSULT
if (def_insults)
- msg[0].msg = INSULT;
- else
+ warning = INSULT;
#endif
- msg[0].msg = def_badpass_message;
- msg[1].msg_type = SUDO_CONV_ERROR_MSG;
- msg[1].msg = "\n";
- memset(&repl, 0, sizeof(repl));
- sudo_conv(2, msg, repl);
+ sudo_printf(SUDO_CONV_ERROR_MSG, "%s\n", warning);
}
char *
return repl.reply;
}
-#ifdef notyet
void
dump_auth_methods(void)
{
sudo_auth *auth;
- /* XXX - conversation function */
- (void) fputs("Authentication methods:", stdout);
+ sudo_printf(SUDO_CONV_INFO_MSG, "Authentication methods:");
for (auth = auth_switch; auth->name; auth++)
- (void) printf(" '%s'", auth->name);
- (void) putchar('\n');
+ sudo_printf(SUDO_CONV_INFO_MSG, " '%s'", auth->name);
+ sudo_printf(SUDO_CONV_INFO_MSG, "\n");
}
-#endif
switch (cur->type & T_MASK) {
case T_FLAG:
if (cur->sd_un.flag)
- puts(cur->desc);
+ sudo_printf(SUDO_CONV_INFO_MSG, "%s\n", cur->desc);
break;
case T_STR:
if (cur->sd_un.str) {
- (void) printf(cur->desc, cur->sd_un.str);
- putchar('\n');
+ sudo_printf(SUDO_CONV_INFO_MSG,
+ cur->desc, cur->sd_un.str);
+ sudo_printf(SUDO_CONV_INFO_MSG, "\n");
}
break;
case T_LOGFAC:
if (cur->sd_un.ival) {
- (void) printf(cur->desc, logfac2str(cur->sd_un.ival));
- putchar('\n');
+ sudo_printf(SUDO_CONV_INFO_MSG,
+ cur->desc, logfac2str(cur->sd_un.ival));
+ sudo_printf(SUDO_CONV_INFO_MSG, "\n");
}
break;
case T_LOGPRI:
if (cur->sd_un.ival) {
- (void) printf(cur->desc, logpri2str(cur->sd_un.ival));
- putchar('\n');
+ sudo_printf(SUDO_CONV_INFO_MSG,
+ cur->desc, logpri2str(cur->sd_un.ival));
+ sudo_printf(SUDO_CONV_INFO_MSG, "\n");
}
break;
case T_UINT:
case T_INT:
- (void) printf(cur->desc, cur->sd_un.ival);
- putchar('\n');
+ sudo_printf(SUDO_CONV_INFO_MSG, cur->desc, cur->sd_un.ival);
+ sudo_printf(SUDO_CONV_INFO_MSG, "\n");
break;
case T_FLOAT:
- (void) printf(cur->desc, cur->sd_un.fval);
- putchar('\n');
+ sudo_printf(SUDO_CONV_INFO_MSG, cur->desc, cur->sd_un.fval);
+ sudo_printf(SUDO_CONV_INFO_MSG, "\n");
break;
case T_MODE:
- (void) printf(cur->desc, cur->sd_un.mode);
- putchar('\n');
+ sudo_printf(SUDO_CONV_INFO_MSG, cur->desc, cur->sd_un.mode);
+ sudo_printf(SUDO_CONV_INFO_MSG, "\n");
break;
case T_LIST:
if (cur->sd_un.list) {
- puts(cur->desc);
- for (item = cur->sd_un.list; item; item = item->next)
- printf("\t%s\n", item->value);
+ sudo_printf(SUDO_CONV_INFO_MSG, "%s\n", cur->desc);
+ for (item = cur->sd_un.list; item; item = item->next) {
+ sudo_printf(SUDO_CONV_INFO_MSG,
+ "\t%s\n", item->value);
+ }
}
break;
case T_TUPLE:
for (def = cur->values; def->sval; def++) {
if (cur->sd_un.ival == def->ival) {
- (void) printf(cur->desc, def->sval);
+ sudo_printf(SUDO_CONV_INFO_MSG,
+ cur->desc, def->sval);
break;
}
}
- putchar('\n');
+ sudo_printf(SUDO_CONV_INFO_MSG, "\n");
break;
}
}
struct sudo_defs_types *cur;
char *p;
- (void) puts("Available options in a sudoers ``Defaults'' line:\n");
+ sudo_printf(SUDO_CONV_INFO_MSG,
+ "Available options in a sudoers ``Defaults'' line:\n\n");
for (cur = sudo_defs_table; cur->name; cur++) {
if (cur->name && cur->desc) {
switch (cur->type & T_MASK) {
case T_FLAG:
- (void) printf("%s: %s\n", cur->name, cur->desc);
+ sudo_printf(SUDO_CONV_INFO_MSG,
+ "%s: %s\n", cur->name, cur->desc);
break;
default:
p = strrchr(cur->desc, ':');
- if (p)
- (void) printf("%s: %.*s\n", cur->name,
- (int) (p - cur->desc), cur->desc);
- else
- (void) printf("%s: %s\n", cur->name, cur->desc);
+ if (p) {
+ sudo_printf(SUDO_CONV_INFO_MSG, "%s: %.*s\n",
+ cur->name, (int) (p - cur->desc), cur->desc);
+ } else {
+ sudo_printf(SUDO_CONV_INFO_MSG,
+ "%s: %s\n", cur->name, cur->desc);
+ }
break;
}
}
char addrbuf[INET6_ADDRSTRLEN], maskbuf[INET6_ADDRSTRLEN];
#endif
- puts("Local IP address and netmask pairs:");
+ sudo_printf(SUDO_CONV_INFO_MSG, "Local IP address and netmask pairs:\n");
for (i = 0; i < num_interfaces; i++) {
switch(interfaces[i].family) {
case AF_INET:
- printf("\t%s / ", inet_ntoa(interfaces[i].addr.ip4));
- puts(inet_ntoa(interfaces[i].netmask.ip4));
+ sudo_printf(SUDO_CONV_INFO_MSG,
+ "\t%s / ", inet_ntoa(interfaces[i].addr.ip4));
+ sudo_printf(SUDO_CONV_INFO_MSG, "%s\n",
+ inet_ntoa(interfaces[i].netmask.ip4));
break;
#ifdef HAVE_IN6_ADDR
case AF_INET6:
addrbuf, sizeof(addrbuf));
inet_ntop(AF_INET6, &interfaces[i].netmask.ip6,
maskbuf, sizeof(maskbuf));
- printf("\t%s / %s\n", addrbuf, maskbuf);
+ sudo_printf(SUDO_CONV_INFO_MSG,
+ "\t%s / %s\n", addrbuf, maskbuf);
break;
#endif /* HAVE_IN6_ADDR */
}
if (!sudo_printf)
sudo_printf = plugin_printf;
+ /* If we have no command (because -V was specified) just return. */
+ if (argc == 0)
+ return TRUE;
+
if (!def_transcript)
return FALSE;
default:
return(-1);
}
- /* printf("Per-%s Defaults entries:\n", dname); */
+ /* sudo_printf(SUDO_CONV_INFO_MSG, "Per-%s Defaults entries:\n", dname); */
tq_foreach_fwd(&defaults, d) {
if (d->type != dtype)
continue;
}
matched:
if (match != NULL && !match->negated) {
- printf("%s%s%s\n", safe_cmnd, user_args ? " " : "",
- user_args ? user_args : "");
+ sudo_printf(SUDO_CONV_INFO_MSG, "%s%s%s\n",
+ safe_cmnd, user_args ? " " : "", user_args ? user_args : "");
rval = 0;
}
return(rval);
{
struct sudo_conv_message msg;
struct sudo_conv_reply repl;
- char *str;
- easprintf(&str, "Sudoers plugin version %s\n", PACKAGE_VERSION);
+ sudo_printf(SUDO_CONV_INFO_MSG, "Sudoers plugin version %s\n",
+ PACKAGE_VERSION);
- /* Call conversation function */
- memset(&msg, 0, sizeof(msg));
- msg.msg_type = SUDO_CONV_INFO_MSG;
- msg.msg = str;
- memset(&repl, 0, sizeof(repl));
- sudo_conv(1, &msg, &repl);
- free(str);
-
-#ifdef notyet
if (verbose) {
- putchar('\n');
- (void) printf("Sudoers path: %s\n", _PATH_SUDOERS);
+ sudo_printf(SUDO_CONV_INFO_MSG, "\nSudoers path: %s\n", _PATH_SUDOERS);
#ifdef HAVE_LDAP
# ifdef _PATH_NSSWITCH_CONF
- (void) printf("nsswitch path: %s\n", _PATH_NSSWITCH_CONF);
+ sudo_printf(SUDO_CONV_INFO_MSG, "nsswitch path: %s\n", _PATH_NSSWITCH_CONF);
# endif
- (void) printf("ldap.conf path: %s\n", _PATH_LDAP_CONF);
- (void) printf("ldap.secret path: %s\n", _PATH_LDAP_SECRET);
+ sudo_printf(SUDO_CONV_INFO_MSG, "ldap.conf path: %s\n", _PATH_LDAP_CONF);
+ sudo_printf(SUDO_CONV_INFO_MSG, "ldap.secret path: %s\n", _PATH_LDAP_SECRET);
#endif
dump_auth_methods();
dump_defaults();
+ sudo_printf(SUDO_CONV_INFO_MSG, "\n");
dump_interfaces();
+ sudo_printf(SUDO_CONV_INFO_MSG, "\n");
}
-#endif
return TRUE;
}
# include <netgroup.h>
#endif /* HAVE_NETGROUP_H */
#include <ctype.h>
+#include <errno.h>
#include <pwd.h>
#include <grp.h>
#include <netinet/in.h>
#endif /* HAVE_FNMATCH */
/*
- * Globals
+ * Function Prototypes
*/
-int Argc, NewArgc;
-char **Argv, **NewArgv;
-int num_interfaces;
-struct interface *interfaces;
-struct sudo_user sudo_user;
-struct passwd *list_pw;
-extern int parse_error;
-
-/* For getopt(3) */
-extern char *optarg;
-extern int optind;
-
-#if defined(SUDO_DEVEL) && defined(__OpenBSD__)
-extern char *malloc_options;
-#endif
-#ifdef YYDEBUG
-extern int yydebug;
-#endif
-
int print_alias(void *, void *);
void dump_sudoers(void);
void print_defaults(void);
void usage(void) __attribute__((__noreturn__));
void set_runasgr(char *);
void set_runaspw(char *);
+static int testsudoers_printf(int msg_type, const char *fmt, ...);
extern void setgrfile(const char *);
extern void setgrent(void);
extern struct passwd *getpwnam(const char *);
extern struct passwd *getpwuid(uid_t);
+/*
+ * Globals
+ */
+int Argc, NewArgc;
+char **Argv, **NewArgv;
+int num_interfaces;
+struct interface *interfaces;
+struct sudo_user sudo_user;
+struct passwd *list_pw;
+extern int parse_error;
+sudo_printf_t sudo_printf = testsudoers_printf;
+
+/* For getopt(3) */
+extern char *optarg;
+extern int optind;
+
+#if defined(SUDO_DEVEL) && defined(__OpenBSD__)
+extern char *malloc_options;
+#endif
+#ifdef YYDEBUG
+extern int yydebug;
+#endif
+
int
main(int argc, char *argv[])
{
}
}
+static int
+testsudoers_printf(int msg_type, const char *fmt, ...)
+{
+ va_list ap;
+ FILE *fp;
+
+ switch (msg_type) {
+ case SUDO_CONV_INFO_MSG:
+ fp = stdout;
+ break;
+ case SUDO_CONV_ERROR_MSG:
+ fp = stderr;
+ break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+
+ va_start(ap, fmt);
+ vfprintf(fp, fmt, ap);
+ va_end(ap);
+
+ return 0;
+}
+
void
dump_sudoers(void)
{
static int print_unused(void *, void *);
static int reparse_sudoers(char *, char *, int, int);
static int run_command(char *, char **);
+static int visudo_printf(int msg_type, const char *fmt, ...);
static void print_selfref(char *name, int, int, int);
static void print_undefined(char *name, int, int, int);
static void setup_signals(void);
struct interface *interfaces;
struct sudo_user sudo_user;
struct passwd *list_pw;
+sudo_printf_t sudo_printf = visudo_printf;
static struct sudoerslist {
struct sudoersfile *first, *last;
} sudoerslist;
getprogname());
exit(1);
}
+
+static int
+visudo_printf(int msg_type, const char *fmt, ...)
+{
+ va_list ap;
+ FILE *fp;
+
+ switch (msg_type) {
+ case SUDO_CONV_INFO_MSG:
+ fp = stdout;
+ break;
+ case SUDO_CONV_ERROR_MSG:
+ fp = stderr;
+ break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+
+ va_start(ap, fmt);
+ vfprintf(fp, fmt, ap);
+ va_end(ap);
+
+ return 0;
+}