From d28030c9fd4a03ec407685fe0c2ae8c7be6e3ef1 Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Sat, 18 Aug 2007 12:22:16 +0000 Subject: [PATCH] Fix line wrapping in usage() and use the actual tty width instead of assuming 80. --- parse.c | 3 +-- sudo.c | 28 +++++++++++++++++++--------- sudo.h | 1 + 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/parse.c b/parse.c index 98a38a1c8..6db0d15bd 100644 --- a/parse.c +++ b/parse.c @@ -64,7 +64,6 @@ extern struct defaults *defaults; static void print_member __P((char *, int, int, int)); static void display_defaults __P((struct passwd *)); static void display_bound_defaults __P((int)); -static int get_ttycols __P((void)); static void print_wrap __P((int, int, int, ...)); #define print_def(a) print_wrap(4, 0, 1, a); @@ -491,7 +490,7 @@ print_member(name, type, negated, alias_type) # define ts_cols ws_col #endif -static int +int get_ttycols() { char *p; diff --git a/sudo.c b/sudo.c index de730ea4f..2b0c626f3 100644 --- a/sudo.c +++ b/sudo.c @@ -1318,13 +1318,21 @@ usage(exit_val) int exit_val; { char **p, **uvec[5]; - int i, linelen, linemax, ulen; + int i, linelen, linemax, ulen, plen; static char *uvec1[] = { - " -h | -K | -k | -L | -V | -v", + " -h |", + " -K |", + " -k |", + " -L |", + " -V |", + " -v", NULL }; static char *uvec2[] = { - " -l [-U username] [-u username|#uid] [command]", + " -l", + " [-U username]", + " [-u username|#uid]", + " [command]", NULL }; static char *uvec3[] = { @@ -1373,20 +1381,22 @@ usage(exit_val) } /* - * Print usage and wrap lines as needed. - * Assumes an 80-character wide terminal, which is kind of bogus... + * Print usage and wrap lines as needed, depending on the + * tty width. */ ulen = (int)strlen(getprogname()) + 7; - linemax = 80; + linemax = get_ttycols(); for (i = 0; uvec[i] != NULL; i++) { - linelen = linemax - ulen; printf("usage: %s", getprogname()); + linelen = linemax - ulen; for (p = uvec[i]; *p != NULL; p++) { - if (linelen == linemax || (linelen -= strlen(*p)) >= 0) { + plen = (int)strlen(*p); + if (linelen >= plen || linelen == linemax - ulen) { fputs(*p, stdout); + linelen -= plen; } else { p--; - linelen = linemax; + linelen = linemax - ulen; printf("\n%*s", ulen, ""); } } diff --git a/sudo.h b/sudo.h index 31791f6dc..659da3a74 100644 --- a/sudo.h +++ b/sudo.h @@ -264,6 +264,7 @@ int gettime __P((struct timespec *)); FILE *open_sudoers __P((const char *, int *)); void display_privs __P((VOID *, struct passwd *)); int display_cmnd __P((VOID *, struct passwd *)); +int get_ttycols __P((void)); void sudo_setenv __P((const char *, const char *, int)); void sudo_unsetenv __P((const char *)); void sudo_setgrent __P((void)); -- 2.40.0