1b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd 2b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project See the file COPYING for copying permission. 3b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/ 4b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 5b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <sys/types.h> 6b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <sys/stat.h> 7b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <fcntl.h> 8b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <stdlib.h> 9b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <stdio.h> 10b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 11d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#ifdef __WATCOMC__ 12d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#ifndef __LINUX__ 13d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#include <io.h> 14d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#else 15d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#include <unistd.h> 16d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#endif 17d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#endif 18d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes 19b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef __BEOS__ 20b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <unistd.h> 21b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif 22b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 23b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifndef S_ISREG 24b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifndef S_IFREG 25b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define S_IFREG _S_IFREG 26b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif 27b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifndef S_IFMT 28b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define S_IFMT _S_IFMT 29b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif 30b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) 31b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* not S_ISREG */ 32b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 33b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifndef O_BINARY 34b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef _O_BINARY 35b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define O_BINARY _O_BINARY 36b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else 37b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define O_BINARY 0 38b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif 39b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif 40b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 41b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "filemap.h" 42b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 43b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectint 44b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectfilemap(const char *name, 45b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project void (*processor)(const void *, size_t, const char *, void *arg), 46b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project void *arg) 47b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{ 48b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project size_t nbytes; 49b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project int fd; 50b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project int n; 51b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project struct stat sb; 52b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project void *p; 53b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 54b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project fd = open(name, O_RDONLY|O_BINARY); 55b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project if (fd < 0) { 56b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project perror(name); 57b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project return 0; 58b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project } 59b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project if (fstat(fd, &sb) < 0) { 60b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project perror(name); 6135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes close(fd); 62b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project return 0; 63b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project } 64b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project if (!S_ISREG(sb.st_mode)) { 65b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project fprintf(stderr, "%s: not a regular file\n", name); 6635e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes close(fd); 67b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project return 0; 68b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project } 69b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project nbytes = sb.st_size; 70d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes /* malloc will return NULL with nbytes == 0, handle files with size 0 */ 71d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes if (nbytes == 0) { 72d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes static const char c = '\0'; 73d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes processor(&c, 0, name, arg); 74d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes close(fd); 75d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes return 1; 76d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes } 77b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project p = malloc(nbytes); 78b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project if (!p) { 79b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project fprintf(stderr, "%s: out of memory\n", name); 80d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes close(fd); 81b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project return 0; 82b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project } 83b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project n = read(fd, p, nbytes); 84b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project if (n < 0) { 85b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project perror(name); 86b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project free(p); 87b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project close(fd); 88b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project return 0; 89b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project } 90b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project if (n != nbytes) { 91b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project fprintf(stderr, "%s: read unexpected number of bytes\n", name); 92b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project free(p); 93b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project close(fd); 94b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project return 0; 95b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project } 96b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project processor(p, nbytes, name, arg); 97b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project free(p); 98b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project close(fd); 99b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project return 1; 100b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} 101