# 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@/
$(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
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;
const char *host;
GETGROUPS_T *groups;
int ngroups;
+ int ts_cols;
+ int ts_lines;
};
#define CD_SET_UID 0x0001
/* 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;
--- /dev/null
+/*
+ * 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;
+}