| /* | |
| #progos: linux | |
| */ | |
| #define _GNU_SOURCE | |
| #include <string.h> | |
| #include <stdlib.h> | |
| #include <stdio.h> | |
| #include <sys/types.h> | |
| #include <sys/stat.h> | |
| #include <fcntl.h> | |
| #include <unistd.h> | |
| #include <sys/mman.h> | |
| int main (int argc, char *argv[]) | |
| { | |
| int fd = open (argv[0], O_RDONLY); | |
| struct stat sb; | |
| int size; | |
| void *a; | |
| const char *str = "a string you'll only find in the program"; | |
| if (fd == -1) | |
| { | |
| perror ("open"); | |
| abort (); | |
| } | |
| if (fstat (fd, &sb) < 0) | |
| { | |
| perror ("fstat"); | |
| abort (); | |
| } | |
| size = sb.st_size; | |
| /* We want to test mmapping a size that isn't exactly a page. */ | |
| if ((size & 8191) == 0) | |
| size--; | |
| #ifndef MMAP_FLAGS | |
| #define MMAP_FLAGS MAP_PRIVATE | |
| #endif | |
| a = mmap (NULL, size, PROT_READ, MMAP_FLAGS, fd, 0); | |
| if (memmem (a, size, str, strlen (str) + 1) == NULL) | |
| abort (); | |
| printf ("pass\n"); | |
| exit (0); | |
| } |