]>
Commit | Line | Data |
---|---|---|
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 | p = (void *)mmap((caddr_t)0, (size_t)nbytes, PROT_READ, | |
48 | MAP_FILE|MAP_PRIVATE, fd, (off_t)0); | |
49 | if (p == (void *)-1) { | |
50 | perror(name); | |
51 | close(fd); | |
52 | return 0; | |
53 | } | |
54 | processor(p, nbytes, name, arg); | |
55 | munmap((caddr_t)p, nbytes); | |
56 | close(fd); | |
57 | return 1; | |
58 | } |