Home | History | Annotate | Line # | Download | only in c
      1 /*
      2 #progos: linux
      3 */
      4 
      5 #define _GNU_SOURCE
      6 #include <string.h>
      7 #include <stdlib.h>
      8 #include <stdio.h>
      9 #include <sys/types.h>
     10 #include <sys/stat.h>
     11 #include <fcntl.h>
     12 #include <unistd.h>
     13 #include <sys/mman.h>
     14 
     15 int main (int argc, char *argv[])
     16 {
     17   int fd = open (argv[0], O_RDONLY);
     18   struct stat sb;
     19   int size;
     20   void *a;
     21   const char *str = "a string you'll only find in the program";
     22 
     23   if (fd == -1)
     24     {
     25       perror ("open");
     26       abort ();
     27     }
     28 
     29   if (fstat (fd, &sb) < 0)
     30     {
     31       perror ("fstat");
     32       abort ();
     33     }
     34 
     35   size = sb.st_size;
     36 
     37   /* We want to test mmapping a size that isn't exactly a page.  */
     38   if ((size & 8191) == 0)
     39     size--;
     40 
     41 #ifndef MMAP_FLAGS
     42 #define MMAP_FLAGS MAP_PRIVATE
     43 #endif
     44 
     45   a = mmap (NULL, size, PROT_READ, MMAP_FLAGS, fd, 0);
     46 
     47   if (memmem (a, size, str, strlen (str) + 1) == NULL)
     48     abort ();
     49 
     50   printf ("pass\n");
     51   exit (0);
     52 }
     53