#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
int mapFile(unsigned char *fileName, char **pFileBuf, int *pFileSize)
{
struct stat sb;
off_t len;
char *p;
int fd;
fd = open (fileName, O_RDONLY);
if (fd == -1)
{
perror ("open");
return 1;
}
if (fstat (fd, &sb) == -1)
{
perror ("fstat");
return 1;
}
if (!S_ISREG (sb.st_mode))
{
fprintf (stderr, "%s is not a file\n", fileName);
return 1;
}
p = mmap (0, sb.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (p == MAP_FAILED)
{
perror ("mmap");
return 1;
}
if (close (fd) == -1)
{
perror ("close");
return 1;
}
*pFileBuf = p;
*pFileSize = sb.st_size;
return 0;
}
int unmapFile(char *pFileBuf, int pFileSize)
{
if (munmap (pFileBuf, pFileSize) == -1)
{
perror ("munmap");
return 1;
}
return 0;
}
int main (int argc, char *argv[])
{
off_t len;
int size;
char *p;
int status = 0;
if (argc < 2)
{
fprintf (stderr, "usage: %s <file>\n", argv[0]);
return 1;
}
status = mapFile(argv[1], &p ,&size);
if (status != 0)
{
return 1;
}
for (len = 0; len < size; len++)
putchar (p[len]);
status = unmapFile(p, size);
if (status != 0)
{
return 1;
}
return 0;
}