summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile13
-rw-r--r--membuf-check.c184
2 files changed, 197 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..ce7ed40
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,13 @@
+CC := gcc
+
+SRCS := membuf-check.c
+OBJS := $(SRCS:.c=.o)
+
+membuf-check: $(OBJS)
+ $(CC) -o $@ $^ $(LDFLAGS)
+
+install: membuf-check
+ install -D -m 755 $< $(DESTDIR)$(prefix)/bin/$<
+
+clean:
+ rm -f membuf-check $(OBJS)
diff --git a/membuf-check.c b/membuf-check.c
new file mode 100644
index 0000000..497edbf
--- /dev/null
+++ b/membuf-check.c
@@ -0,0 +1,184 @@
+#include <fcntl.h>
+#include <stdio.h>
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/wait.h>
+#include <sys/ioctl.h>
+#include <stdlib.h>
+#include <semaphore.h>
+
+static char msg[] = "HELLO WORLD";
+
+#define MEMBUF_IOC_MEMSIZE _IOR('M', 0x02 , unsigned int)
+
+int main(void)
+{
+ char *buffer;
+ unsigned bsize;
+ int fd, ret, i, pid, j;
+
+ /* is /dev/membuf avaible ? */
+ fd = open("/dev/membuf", O_RDWR);
+ if (fd < 0) {
+ perror("[ERROR] Unable to open /dev/membuf");
+ return -1;
+ }
+
+ printf("[OK] open /dev/membuf\n");
+
+ /* ioctl */
+ ret = ioctl(fd, MEMBUF_IOC_MEMSIZE, &bsize);
+ if (ret) {
+ perror("[WARN] ioctl: unable to perform MEMBUF_IOC_MEMSIZE ioctl");
+ bsize = 1024;
+ } else if (!bsize) {
+ /* can not do anything useful with 0-byte buffer */
+ printf("[WARN] ioctl: reported memsize is 0, please increase\n");
+ return -1;
+ } else {
+ printf("[OK] ioctl: buffer size = %u\n", bsize);
+ }
+
+ buffer = malloc(bsize + 1);
+
+ /* can we read one byte ? */
+ ret = pread(fd, buffer, 1, 0);
+ if (ret < 0) {
+ perror("[ERROR] read-one: Unable to read one byte");
+ return -1;
+ } else if (ret != 1) {
+ fprintf(stderr, "[ERROR] read-one: expected 1 byte, got %d bytes\n", ret);
+ return -1;
+ }
+
+ printf("[OK] Read one byte\n");
+
+ /* can we read the whole buffer ? */
+ ret = pread(fd, buffer, bsize, 0);
+ if (ret < 0) {
+ perror("[ERROR] read-whole: Unable to read the buffer");
+ return -1;
+ } else if (ret != bsize) {
+ fprintf(stderr, "[ERROR] read-whole: Unable to read %d bytes, got %d bytes\n", bsize, ret);
+ return -1;
+ }
+
+ printf("[OK] Read buffer\n");
+
+ /* Read more than bsize */
+ ret = pread(fd, buffer, bsize + 1, 0);
+ if (ret < 0) {
+ perror("[ERROR] over-read: Unable to read the buffer");
+ return -1;
+ } else if (ret != bsize) {
+ fprintf(stderr, "[ERROR] over-read: exp %d bytes, got %d bytes\n", bsize, ret);
+ return -1;
+ }
+ printf("[OK] Over read\n");
+
+ /* write 0x42 pattern */
+ memset(buffer, 0x42, bsize);
+ ret = pwrite(fd, buffer, bsize, 0);
+ if (ret < 0) {
+ perror("[ERROR] Unable to write the buffer");
+ return -1;
+ } else if (ret != bsize) {
+ fprintf(stderr, "[ERROR] read: Unable to write %d bytes, %d written\n", bsize, ret);
+ return -1;
+ }
+
+ printf("[OK] Write buffer\n");
+
+ /* Read 0x42 pattern */
+ memset(buffer, 0, bsize);
+ ret = pread(fd, buffer, bsize, 0);
+ if (ret < 0) {
+ perror("[ERROR] Unable to read back buffer");
+ return -1;
+ } else if (ret != bsize) {
+ fprintf(stderr, "[ERROR] read-back: Unable to read %d bytes, got %d bytes\n", bsize, ret);
+ return -1;
+ }
+ for (i = 0; i < bsize; i++) {
+ if (buffer[i] != 0x42) {
+ fprintf(stderr, "[ERROR] read-back: pattern mismatch\n");
+ return -1;
+ }
+ }
+
+ printf("[OK] Read back buffer\n");
+
+ /* Write more than bsize */
+ ret = pwrite(fd, buffer, bsize + 1, 0);
+ if (ret < 0) {
+ perror("[ERROR] over-write: Unable to read the buffer");
+ return -1;
+ } else if (ret != bsize) {
+ fprintf(stderr, "[ERROR] over-write: exp %d bytes, got %d bytes\n", bsize, ret);
+ return -1;
+ }
+ printf("[OK] Over write\n");
+
+ memset(buffer, 0x00, bsize);
+
+ /* test shared buffer */
+ ret = 0;
+ if ((pid = fork()) == 0) {
+ /* child */
+
+ /* Write shared data */
+ pwrite(fd, msg, sizeof(msg), 0);
+
+ /*for (i = 0; i < 1000000; i++) {
+ memset(buffer, 0xFF, bsize);
+ pwrite(fd, buffer, bsize, 0);
+ pread(fd, buffer, bsize, 0);
+ for (j = 0; j < bsize; j++) {
+ if (buffer[j] != buffer[0]) {
+ fprintf(stderr, "[ERROR]\n");
+ ret = -1;
+ }
+ }
+ }*/
+ return 0;
+ } else {
+ int status;
+
+ /* parent */
+ i = 10000;
+ do {
+ /* insane ! */
+ pread(fd, buffer, bsize, 0);
+ if (!memcmp(buffer, msg, sizeof(msg)))
+ break;
+ } while (i--);
+
+ if (!i) {
+ fprintf(stderr, "[ERROR] shared-buffer: Unable to share data between processes\n");
+ waitpid(pid, &status, 0);
+ return -1;
+ }
+
+ printf("[OK] shared-buffer\n");
+
+ /*for (i = 0; i < 1000000; i++) {
+ memset(buffer, 0x00, bsize);
+ printf("Parent!\n");
+ pwrite(fd, buffer, bsize, 0);
+ pread(fd, buffer, bsize, 0);
+ for (j = 0; j < bsize; j++) {
+ if (buffer[j] != 0x00) {
+ fprintf(stderr, "[ERROR]\n");
+ ret = -1;
+ }
+ }
+ }*/
+
+ /* done */
+ waitpid(pid, &status, 0);
+ if (status) ret = status;
+ }
+
+ printf("Test complete - Congrats!\n");
+}