commit b11c164c60aedf10026bfc1a168ce79ba005fe43
Author: Jan Klemkow <[email protected]>
AuthorDate: Thu Apr 9 20:29:27 2020 +0200
Commit: Jan Klemkow <[email protected]>
CommitDate: Thu Apr 9 20:44:57 2020 +0200
set resource limit for scroll back buffer size
diff --git a/scroll.c b/scroll.c
index 51366f5..89bbd1d 100644
--- a/scroll.c
+++ b/scroll.c
@@ -21,6 +21,7 @@
#include <sys/ioctl.h>
#include <sys/wait.h>
#include <sys/queue.h>
+#include <sys/resource.h>
#include <assert.h>
#include <errno.h>
@@ -333,9 +334,37 @@ jumpdown(char *buf, size_t size)
scrolldown(buf, size, ws.ws_row);
}
+void
+usage(void) {
+ die("usage: scroll [-M] [-m mem] <program>");
+}
+
int
main(int argc, char *argv[])
{
+ int ch;
+ struct rlimit rlimit;
+
+ if (getrlimit(RLIMIT_DATA, &rlimit) == -1)
+ die("getrlimit");
+
+ while ((ch = getopt(argc, argv, "Mm:")) != -1) {
+ switch (ch) {
+ case 'M':
+ rlimit.rlim_cur = rlimit.rlim_max;
+ break;
+ case 'm':
+ rlimit.rlim_cur = strtoull(optarg, NULL, 0);
+ if (errno != 0)
+ die("strtoull: %s", optarg);
+ break;
+ default:
+ usage();
+ }
+ }
+ argc -= optind;
+ argv += optind;
+
TAILQ_INIT(&head);
if (isatty(STDIN_FILENO) == 0)
@@ -343,8 +372,8 @@ main(int argc, char *argv[])
if (isatty(STDOUT_FILENO) == 0)
die("stdout it not a tty");
- if (argc <= 1)
- die("usage: scroll <program>");
+ if (argc < 1)
+ usage();
/* save terminal settings for resetting after exit */
if (tcgetattr(STDIN_FILENO, &dfl) == -1)
@@ -360,11 +389,15 @@ main(int argc, char *argv[])
if (child == -1)
die("forkpty:");
if (child == 0) { /* child */
- execvp(argv[1], argv + 1);
+ execvp(argv[0], argv);
perror("execvp");
_exit(127);
}
+ /* set maximum memory size for scrollback buffer */
+ if (setrlimit(RLIMIT_DATA, &rlimit) == -1)
+ die("setrlimit:");
+
#ifdef __OpenBSD__
if (pledge("stdio tty proc", NULL) == -1)
die("pledge:");