]> granicus.if.org Git - sudo/commitdiff
Add tty size to user info
authorTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 17 Mar 2010 14:36:02 +0000 (10:36 -0400)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 17 Mar 2010 14:36:02 +0000 (10:36 -0400)
src/Makefile.in
src/sudo.c
src/sudo.h
src/ttysize.c [new file with mode: 0644]

index 5f735b918fa19ba9682696b185332ac63837664e..57d15267635be8f8b1d8af06bf8cef354cce2970 100644 (file)
@@ -73,7 +73,7 @@ PROGS = sudo
 #      sudo_edit.o
 OBJS = sudo.o parse_args.o lbuf.o alloc.o error.o zero_bytes.o \
        load_plugins.o conversation.o list.o fmt_string.o tgetpass.o \
-       fileops.o term.o atobool.o script.o pty.o @SUDO_OBJS@ $(LIBOBJS)
+       fileops.o term.o ttysize.o atobool.o script.o pty.o @SUDO_OBJS@ $(LIBOBJS)
 
 LIBOBJDIR = $(top_srcdir)/@ac_config_libobj_dir@/
 
@@ -149,6 +149,8 @@ term.o: $(srcdir)/term.c $(SUDODEP)
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(OPTIONS) $(srcdir)/term.c
 tgetpass.o: $(srcdir)/tgetpass.c $(SUDODEP)
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(OPTIONS) $(srcdir)/tgetpass.c
+ttysize.o: $(srcdir)/ttysize.c $(incdir)/compat.h $(top_builddir)/config.h
+       $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(OPTIONS) $(srcdir)/ttysize.c
 zero_bytes.o: $(srcdir)/zero_bytes.c $(incdir)/compat.h $(top_builddir)/config.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(OPTIONS) $(srcdir)/zero_bytes.c
 
index 0951cdde907ba6cb123be9b9d5298e133fd8f2b6..43501978b96b54c18febb1becbad88eb7431ab0a 100644 (file)
@@ -364,6 +364,10 @@ get_user_info(struct user_details *ud)
        errorx(1, "unable to allocate memory");
     ud->host = user_info[i] + sizeof("host=") - 1;
 
+    get_ttysize(&ud->ts_lines, &ud->ts_cols);
+    easprintf(&user_info[++i], "lines=%d", ud->ts_lines);
+    easprintf(&user_info[++i], "cols=%d", ud->ts_cols);
+
     user_info[++i] = NULL;
 
     return user_info;
index 1dde636b413ad0acfd3c0f394130495a24864e6f..5dcc4871da7ec6154b9bbba954ec76406f992912 100644 (file)
@@ -119,6 +119,8 @@ struct user_details {
     const char *host;
     GETGROUPS_T *groups;
     int ngroups;
+    int ts_cols;
+    int ts_lines;
 };
 
 #define CD_SET_UID             0x0001
@@ -200,6 +202,9 @@ int parse_args(int argc, char **argv, int *nargc, char ***nargv,
 /* pty.c */
 int get_pty(int *master, int *slave, char *name, size_t namesz, uid_t uid);
 
+/* ttysize.c */
+void get_ttysize(int *linep, int *colp);
+
 /* sudo.c */
 int exec_setup(struct command_details *details);
 extern int debug_level;
diff --git a/src/ttysize.c b/src/ttysize.c
new file mode 100644 (file)
index 0000000..3054e65
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2010 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.
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <stdio.h>
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif /* STDC_HEADERS */
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#ifdef HAVE_TERMIOS_H
+# include <termios.h>
+#else
+# include <termio.h>
+#endif
+
+#include "compat.h"
+
+#if !defined(TIOCGSIZE) && defined(TIOCGWINSZ)
+# define TIOCGSIZE     TIOCGWINSZ
+# define ttysize       winsize
+# define ts_cols       ws_col
+# define ts_lines      ws_row
+#endif
+
+void
+get_ttysize(int *linep, int *colp)
+{
+    char *p;
+#ifdef TIOCGSIZE
+    struct ttysize win;
+
+    if (ioctl(STDERR_FILENO, TIOCGSIZE, &win) == 0 &&
+       win.ts_lines != 0 && win.ts_cols  != 0) {
+       *linep = win.ts_lines;
+       *colp = win.ts_cols;
+       return;
+    }
+#endif
+
+    /* Fall back on $LINES and $COLUMNS. */
+    if ((p = getenv("LINES")) == NULL || (*linep = atoi(p)) <= 0)
+       *linep = 24;
+    if ((p = getenv("COLUMNS")) == NULL || (*colp = atoi(p)) <= 0)
+       *colp = 80;
+}