]> granicus.if.org Git - sudo/commitdiff
Use sudo_printf to display verbose version information.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 28 May 2010 16:01:06 +0000 (12:01 -0400)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 28 May 2010 16:01:06 +0000 (12:01 -0400)
plugins/sudoers/auth/sudo_auth.c
plugins/sudoers/defaults.c
plugins/sudoers/interfaces.c
plugins/sudoers/iolog.c
plugins/sudoers/parse.c
plugins/sudoers/sudoers.c
plugins/sudoers/testsudoers.c
plugins/sudoers/visudo.c

index 427145358541ad78235384a52e15ae80a2660ffc..77f3b29f1df4294d2fa175fbcd37db7e2c971099 100644 (file)
@@ -293,22 +293,13 @@ int auth_end_session(void)
 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 *
@@ -328,16 +319,13 @@ auth_getpass(const char *prompt, int timeout, int type)
     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
index d0e1a8173f25aeafdd9f706cfa7bc1757b52a186..b2f5fac3a252c30d4d97b8b37c4e8c34dc27ffe3 100644 (file)
@@ -125,54 +125,60 @@ dump_defaults(void)
            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;
            }
        }
@@ -188,20 +194,24 @@ list_options(void)
     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;
            }
        }
index 715600c599699a15ad1e7bf6eea275924c870ec4..ebfbfb936022c0f9296d3bffbb9106bd84060825 100644 (file)
@@ -333,12 +333,14 @@ dump_interfaces(void)
     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:
@@ -346,7 +348,8 @@ dump_interfaces(void)
                    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 */
        }
index ebd24d7e13b92ccf2303b84f52aa1fbf8b4259f7..ae994e6a813925c855fe159566ddea90af9ce62c 100644 (file)
@@ -190,6 +190,10 @@ sudoers_io_open(unsigned int version, sudo_conv_t conversation,
     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;
 
index fe12f63169c4c472f6a8310230e6a8261b1da6e6..b2905c7caabe36c808c73c604582ee88bb2095b6 100644 (file)
@@ -523,7 +523,7 @@ display_bound_defaults(int dtype, struct lbuf *lbuf)
        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;
@@ -590,8 +590,8 @@ sudo_file_display_cmnd(struct sudo_nss *nss, struct passwd *pw)
     }
     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);
index 77cf08c55f931286b0162cfca09b148a3f077eed..1c5fd9eee20ccd8c9b5fe4e78a4d3477fc27ea56 100644 (file)
@@ -1156,34 +1156,25 @@ sudoers_policy_version(int verbose)
 {
     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;
 }
 
index e6226dfa68894f2c490f9b1e3a208fd3b172e6a4..331655ac8d31e2c55a707c9460c1ef54be1146c6 100644 (file)
@@ -55,6 +55,7 @@
 # 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);
@@ -100,6 +82,7 @@ void print_userspecs(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);
@@ -114,6 +97,29 @@ extern struct passwd *getpwent(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[])
 {
@@ -527,6 +533,31 @@ print_userspecs(void)
     }
 }
 
+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)
 {
index 39bce815119dc84a16165503f6fe94e434d3dd83..1d049f8bd323a3192eb2ca9146ae726b968e940f 100644 (file)
@@ -108,6 +108,7 @@ static int install_sudoers(struct sudoersfile *, int);
 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);
@@ -136,6 +137,7 @@ int num_interfaces;
 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;
@@ -1158,3 +1160,28 @@ usage(void)
        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;
+}