1 /*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "SkOSFile.h"
9
10 #include "SkTFitsIn.h"
11
12 #include <stdio.h>
13 #include <sys/mman.h>
14 #include <sys/stat.h>
15 #include <sys/types.h>
16 #include <unistd.h>
17
sk_exists(const char * path,SkFILE_Flags flags)18 bool sk_exists(const char *path, SkFILE_Flags flags) {
19 int mode = F_OK;
20 if (flags & kRead_SkFILE_Flag) {
21 mode |= R_OK;
22 }
23 if (flags & kWrite_SkFILE_Flag) {
24 mode |= W_OK;
25 }
26 return (0 == access(path, mode));
27 }
28
29 typedef struct {
30 dev_t dev;
31 ino_t ino;
32 } SkFILEID;
33
sk_ino(SkFILE * a,SkFILEID * id)34 static bool sk_ino(SkFILE* a, SkFILEID* id) {
35 int fd = fileno((FILE*)a);
36 if (fd < 0) {
37 return 0;
38 }
39 struct stat status;
40 if (0 != fstat(fd, &status)) {
41 return 0;
42 }
43 id->dev = status.st_dev;
44 id->ino = status.st_ino;
45 return true;
46 }
47
sk_fidentical(SkFILE * a,SkFILE * b)48 bool sk_fidentical(SkFILE* a, SkFILE* b) {
49 SkFILEID aID, bID;
50 return sk_ino(a, &aID) && sk_ino(b, &bID)
51 && aID.ino == bID.ino
52 && aID.dev == bID.dev;
53 }
54
sk_fmunmap(const void * addr,size_t length)55 void sk_fmunmap(const void* addr, size_t length) {
56 munmap(const_cast<void*>(addr), length);
57 }
58
sk_fdmmap(int fd,size_t * size)59 void* sk_fdmmap(int fd, size_t* size) {
60 struct stat status;
61 if (0 != fstat(fd, &status)) {
62 return NULL;
63 }
64 if (!S_ISREG(status.st_mode)) {
65 return NULL;
66 }
67 if (!SkTFitsIn<size_t>(status.st_size)) {
68 return NULL;
69 }
70 size_t fileSize = static_cast<size_t>(status.st_size);
71
72 void* addr = mmap(NULL, fileSize, PROT_READ, MAP_PRIVATE, fd, 0);
73 if (MAP_FAILED == addr) {
74 return NULL;
75 }
76
77 *size = fileSize;
78 return addr;
79 }
80
sk_fileno(SkFILE * f)81 int sk_fileno(SkFILE* f) {
82 return fileno((FILE*)f);
83 }
84
sk_fmmap(SkFILE * f,size_t * size)85 void* sk_fmmap(SkFILE* f, size_t* size) {
86 int fd = sk_fileno(f);
87 if (fd < 0) {
88 return NULL;
89 }
90
91 return sk_fdmmap(fd, size);
92 }
93