PAKFIRE_PTY_READY_TO_READ = (1 << 0),
PAKFIRE_PTY_READY_TO_WRITE = (1 << 1),
PAKFIRE_PTY_HANGUP = (1 << 2),
- PAKFIRE_PTY_MAP_CRNL = (1 << 3),
} io;
// Event Source
return 0;
}
-/*
- Maps any CRNL in the buffer to just NL
-*/
-static void pakfire_pty_map_crnl(struct pakfire_pty_stdio* stdio) {
- char* cr = NULL;
-
- // Walk through the entire buffer...
- for (char* p = stdio->buffer; p <= stdio->buffer + stdio->buffered; p++) {
- switch (*p) {
- // Remember the position of the last CR
- case '\r':
- cr = p;
- continue;
-
- // Check if have have found a NL
- case '\n':
- // CR is only set if the previous character was CR
- if (cr)
- memmove(cr, p, stdio->buffered-- - (cr - stdio->buffer));
- break;
- }
-
- // Reset
- cr = NULL;
- }
-}
-
/*
Reads as much data as possible into the buffer
*/
static int pakfire_pty_drain_buffer(struct pakfire_pty* pty, int fd, struct pakfire_pty_stdio* stdio) {
ssize_t bytes_written = 0;
- // Map any CRNL to just NL
- if (stdio->io & PAKFIRE_PTY_MAP_CRNL)
- pakfire_pty_map_crnl(stdio);
-
// Write to the file descriptor
bytes_written = write(fd, stdio->buffer, stdio->buffered);