summaryrefslogtreecommitdiffstats
path: root/misc-progs/mapcmp.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/mapcmp.c
downloadldd3-ab121f379a3cff458c90e6f480ba4bb68c8733dd.tar.gz
Linux Device Drivers 3 examples
Diffstat (limited to 'misc-progs/mapcmp.c')
-rw-r--r--misc-progs/mapcmp.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/misc-progs/mapcmp.c b/misc-progs/mapcmp.c
new file mode 100644
index 0000000..8ef8831
--- /dev/null
+++ b/misc-progs/mapcmp.c
@@ -0,0 +1,87 @@
+/*
+ * Simple program to compare two mmap'd areas.
+ *
+ * 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.
+ *
+ * $Id: mapcmp.c,v 1.2 2004/03/05 17:35:41 corbet Exp $
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <sys/errno.h>
+#include <fcntl.h>
+
+static char *mapdev (const char *, unsigned long, unsigned long);
+#define PAGE_SIZE 4096
+
+/*
+ * memcmp dev1 dev2 offset pages
+ */
+int main (int argc, char **argv)
+{
+ unsigned long offset, size, i;
+ char *addr1, *addr2;
+/*
+ * Sanity check.
+ */
+ if (argc != 5)
+ {
+ fprintf (stderr, "Usage: mapcmp dev1 dev2 offset pages\n");
+ exit (1);
+ }
+/*
+ * Map the two devices.
+ */
+ offset = strtoul (argv[3], NULL, 16);
+ size = atoi (argv[4])*PAGE_SIZE;
+ printf ("Offset is 0x%lx\n", offset);
+ addr1 = mapdev (argv[1], offset, size);
+ addr2 = mapdev (argv[2], offset, size);
+/*
+ * Do the comparison.
+ */
+ printf ("Comparing...");
+ fflush (stdout);
+ for (i = 0; i < size; i++)
+ if (*addr1++ != *addr2++)
+ {
+ printf ("areas differ at byte %ld\n", i);
+ exit (0);
+ }
+ printf ("areas are identical.\n");
+ exit (0);
+}
+
+
+
+static char *mapdev (const char *dev, unsigned long offset,
+ unsigned long size)
+{
+ char *addr;
+ int fd = open (dev, O_RDONLY);
+
+ if (fd < 0)
+ {
+ perror (dev);
+ exit (1);
+ }
+ addr = mmap (0, size, PROT_READ, MAP_PRIVATE, fd, offset);
+ if (addr == MAP_FAILED)
+ {
+ perror (dev);
+ exit (1);
+ }
+ printf ("Mapped %s (%lu @ %lx) at %p\n", dev, size, offset, addr);
+ return (addr);
+}