Revisions for untitled paste

View the changes made to this paste.

unlisted ⁨1⁩ ⁨file⁩ 2021-04-29 18:31:01 UTC

mmap.c

@@ -0,0 +1,75 @@

+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <error.h>
+#include <errno.h>
+#include <getopt.h>
+#include <string.h>
+#include <sys/mman.h>
+
+int
+main (int argc, char **argv)
+{
+  int c;
+  int fd;
+  void *addr;
+  int read_write = 0, write_only = 0, private = 0;
+  int prot, flags;
+
+  const struct option options[] = {
+    { "read-write", no_argument, &read_write, 1 },
+    { "write-only", no_argument, &write_only, 1 },
+    { "private", no_argument, &private, 1 },
+    { NULL, 0, NULL, 0 }
+  };
+
+  while (1)
+    {
+      c = getopt_long (argc, argv, "", options, NULL);
+      if (c == '?')
+        return EXIT_FAILURE;
+      if (c == -1)
+        break;
+    }
+
+  if (optind != argc - 1)
+    error (EXIT_FAILURE, 0, "please specify one file name");
+
+  if (read_write)
+    flags = O_RDWR;
+  else if (write_only)
+    flags = O_WRONLY;
+  else
+    flags = O_RDONLY;
+
+  fd = open (argv[optind], flags | O_NOCTTY);
+  if (fd == -1)
+    error (EXIT_FAILURE, errno, "failed to open");
+
+  if (read_write)
+    prot = PROT_READ|PROT_WRITE;
+  else if (write_only)
+    prot = PROT_WRITE;
+  else
+    prot = PROT_READ;
+
+  flags = MAP_FILE;
+  if (private)
+    flags |= MAP_PRIVATE;
+  else
+    flags |= MAP_SHARED;
+
+  addr = mmap (NULL, 4096, prot, flags, fd, 0);
+  if (addr == MAP_FAILED)
+    error (EXIT_FAILURE, errno, "failed to mmap");
+
+  fprintf (stderr, "mmaped at %p\n", addr);
+  fflush (stderr);
+
+  if (!write_only)
+    printf ("%s\n", addr);
+  if (read_write || write_only)
+    strcpy(addr, "well hello friends! :^)\n");
+
+  return 0;
+}
\ No newline at end of file