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
15int 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