summaryrefslogtreecommitdiffstats
path: root/misc-progs/nbtest.c
diff options
context:
space:
mode:
authorJavier Martinez Canillas <martinez.javier@gmail.com>2010-11-27 07:49:17 +0100
committerJavier Martinez Canillas <martinez.javier@gmail.com>2010-11-27 07:49:17 +0100
commitab121f379a3cff458c90e6f480ba4bb68c8733dd (patch)
treea9851af109ee83646d108bc247d03b131461b764 /misc-progs/nbtest.c
downloadldd3-ab121f379a3cff458c90e6f480ba4bb68c8733dd.tar.gz
Linux Device Drivers 3 examples
Diffstat (limited to 'misc-progs/nbtest.c')
-rw-r--r--misc-progs/nbtest.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/misc-progs/nbtest.c b/misc-progs/nbtest.c
new file mode 100644
index 0000000..6a0bd54
--- /dev/null
+++ b/misc-progs/nbtest.c
@@ -0,0 +1,44 @@
+/*
+ * nbtest.c: read and write in non-blocking mode
+ * This should run with any Unix
+ *
+ * Copyright (C) 2001 Alessandro Rubini and Jonathan Corbet
+ * Copyright (C) 2001 O'Reilly & Associates
+ *
+ * The source code in this file can be freely used, adapted,
+ * and redistributed in source or binary form, so long as an
+ * acknowledgment appears in derived source files. The citation
+ * should list that the code comes from the book "Linux Device
+ * Drivers" by Alessandro Rubini and Jonathan Corbet, published
+ * by O'Reilly & Associates. No warranty is attached;
+ * we cannot take responsibility for errors or fitness for use.
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <errno.h>
+
+char buffer[4096];
+
+int main(int argc, char **argv)
+{
+ int delay = 1, n, m = 0;
+
+ if (argc > 1)
+ delay=atoi(argv[1]);
+ fcntl(0, F_SETFL, fcntl(0,F_GETFL) | O_NONBLOCK); /* stdin */
+ fcntl(1, F_SETFL, fcntl(1,F_GETFL) | O_NONBLOCK); /* stdout */
+
+ while (1) {
+ n = read(0, buffer, 4096);
+ if (n >= 0)
+ m = write(1, buffer, n);
+ if ((n < 0 || m < 0) && (errno != EAGAIN))
+ break;
+ sleep(delay);
+ }
+ perror(n < 0 ? "stdin" : "stdout");
+ exit(1);
+}