Annotation of embedaddon/expat/xmlwf/unixfilemap.c, revision 1.1
1.1 ! misho 1: /* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
! 2: See the file COPYING for copying permission.
! 3: */
! 4:
! 5: #include <sys/types.h>
! 6: #include <sys/mman.h>
! 7: #include <sys/stat.h>
! 8: #include <fcntl.h>
! 9: #include <errno.h>
! 10: #include <string.h>
! 11: #include <stdio.h>
! 12: #include <unistd.h>
! 13:
! 14: #ifndef MAP_FILE
! 15: #define MAP_FILE 0
! 16: #endif
! 17:
! 18: #include "filemap.h"
! 19:
! 20: int
! 21: filemap(const char *name,
! 22: void (*processor)(const void *, size_t, const char *, void *arg),
! 23: void *arg)
! 24: {
! 25: int fd;
! 26: size_t nbytes;
! 27: struct stat sb;
! 28: void *p;
! 29:
! 30: fd = open(name, O_RDONLY);
! 31: if (fd < 0) {
! 32: perror(name);
! 33: return 0;
! 34: }
! 35: if (fstat(fd, &sb) < 0) {
! 36: perror(name);
! 37: close(fd);
! 38: return 0;
! 39: }
! 40: if (!S_ISREG(sb.st_mode)) {
! 41: close(fd);
! 42: fprintf(stderr, "%s: not a regular file\n", name);
! 43: return 0;
! 44: }
! 45:
! 46: nbytes = sb.st_size;
! 47: /* mmap fails for zero length files */
! 48: if (nbytes == 0) {
! 49: static const char c = '\0';
! 50: processor(&c, 0, name, arg);
! 51: close(fd);
! 52: return 1;
! 53: }
! 54: p = (void *)mmap((caddr_t)0, (size_t)nbytes, PROT_READ,
! 55: MAP_FILE|MAP_PRIVATE, fd, (off_t)0);
! 56: if (p == (void *)-1) {
! 57: perror(name);
! 58: close(fd);
! 59: return 0;
! 60: }
! 61: processor(p, nbytes, name, arg);
! 62: munmap((caddr_t)p, nbytes);
! 63: close(fd);
! 64: return 1;
! 65: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>