PAKFIRE_PTY_READY_TO_WRITE = (1 << 1),
PAKFIRE_PTY_HANGUP = (1 << 2),
PAKFIRE_PTY_EOF = (1 << 3),
+ PAKFIRE_PTY_MAP_CRNL = (1 << 4),
} 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
*/
ssize_t bytes_written = 0;
char* eol = NULL;
+ // Map any CRNL to just NL
+ if (stdio->io & PAKFIRE_PTY_MAP_CRNL)
+ pakfire_pty_map_crnl(stdio);
+
// Call the callback if possible
if (stdio->callbacks.stdout_callback) {
// Try finding the end of a line
return -errno;
}
+ // Map any CRNL to NL
+ pty->stdout.io |= PAKFIRE_PTY_MAP_CRNL;
+
// Close the buffer in the end
pty->stdout.close_fd = 1;
ASSERT_SUCCESS(pakfire_jail_exec(jail, cmd_hello_world, 0, &output));
// We should have some output
- ASSERT_STRING_EQUALS(output, "Hello World!\r\n");
+ ASSERT_STRING_EQUALS(output, "Hello World!\n");
// Destroy it
ASSERT_NULL(pakfire_jail_unref(jail));
// Check if the nice level has been set
ASSERT_SUCCESS(pakfire_jail_exec(jail, argv, 0, &output));
- ASSERT_STRING_EQUALS(output, "5\r\n");
+ ASSERT_STRING_EQUALS(output, "5\n");
// Success
r = EXIT_SUCCESS;