chiark / gitweb /
machined: add support for reporting image size via btrfs quota
[elogind.git] / src / shared / pty.c
index 11d76f825fd890d2569ba52924cf035047816424..6863be654eaa676a4f82cc12af45b6f2ebb2cecd 100644 (file)
@@ -45,7 +45,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <limits.h>
-#include <pty.h>
+#include <linux/ioctl.h>
 #include <signal.h>
 #include <stdbool.h>
 #include <stdint.h>
@@ -67,7 +67,7 @@
 #include "ring.h"
 #include "util.h"
 
-#define PTY_BUFSIZE 16384
+#define PTY_BUFSIZE 4096
 
 enum {
         PTY_ROLE_UNKNOWN,
@@ -105,6 +105,7 @@ int pty_new(Pty **out) {
 
         pty->ref = 1;
         pty->fd = -1;
+        pty->barrier = (Barrier) BARRIER_NULL;
 
         pty->fd = posix_openpt(O_RDWR | O_NOCTTY | O_CLOEXEC | O_NONBLOCK);
         if (pty->fd < 0)
@@ -127,7 +128,7 @@ int pty_new(Pty **out) {
         if (r < 0)
                 return -errno;
 
-        r = barrier_init(&pty->barrier);
+        r = barrier_create(&pty->barrier);
         if (r < 0)
                 return r;
 
@@ -193,13 +194,13 @@ int pty_get_fd(Pty *pty) {
 }
 
 int pty_make_child(Pty *pty) {
-        char slave_name[1024];
+        _cleanup_free_ char *slave_name = NULL;
         int r, fd;
 
         assert_return(pty, -EINVAL);
         assert_return(pty_is_unknown(pty), -EALREADY);
 
-        r = ptsname_r(pty->fd, slave_name, sizeof(slave_name));
+        r = ptsname_malloc(pty->fd, &slave_name);
         if (r < 0)
                 return -errno;
 
@@ -304,11 +305,11 @@ static int pty_dispatch_read(Pty *pty) {
         /*
          * We're edge-triggered, means we need to read the whole queue. This,
          * however, might cause us to stall if the writer is faster than we
-         * are. Therefore, we read twice and if the second read still returned
-         * data, we reschedule.
+         * are. Therefore, try reading as much as 8 times (32KiB) and only
+         * bail out then.
          */
 
-        for (i = 0; i < 2; ++i) {
+        for (i = 0; i < 8; ++i) {
                 len = read(pty->fd, pty->in_buf, sizeof(pty->in_buf) - 1);
                 if (len < 0) {
                         if (errno == EINTR)