blob: b5dc4ac09b0fab55113d9a1d93ada0c67fa465f0 [file] [log] [blame]
bungeman@google.com6cab1a42013-05-29 13:43:31 +00001/*
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
bungeman@google.comf5cc5b12013-07-12 18:22:49 +000010#include "SkTFitsIn.h"
bungeman@google.com11c9a552013-06-03 17:10:35 +000011
bungeman@google.com6cab1a42013-05-29 13:43:31 +000012#include <stdio.h>
13#include <sys/mman.h>
14#include <sys/stat.h>
15#include <sys/types.h>
bungemanbf0b9ce2014-07-10 15:18:23 -070016#include <unistd.h>
17
18bool 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}
bungeman@google.com6cab1a42013-05-29 13:43:31 +000028
29typedef struct {
30 dev_t dev;
31 ino_t ino;
32} SkFILEID;
33
34static 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
48bool 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
55void sk_fmunmap(const void* addr, size_t length) {
56 munmap(const_cast<void*>(addr), length);
57}
58
bungeman@google.com11c9a552013-06-03 17:10:35 +000059void* sk_fdmmap(int fd, size_t* size) {
60 struct stat status;
61 if (0 != fstat(fd, &status)) {
bungeman@google.com6cab1a42013-05-29 13:43:31 +000062 return NULL;
63 }
bungeman@google.com11c9a552013-06-03 17:10:35 +000064 if (!S_ISREG(status.st_mode)) {
bungeman@google.com6cab1a42013-05-29 13:43:31 +000065 return NULL;
66 }
bungeman@google.com11c9a552013-06-03 17:10:35 +000067 if (!SkTFitsIn<size_t>(status.st_size)) {
68 return NULL;
69 }
70 size_t fileSize = static_cast<size_t>(status.st_size);
bungeman@google.com6cab1a42013-05-29 13:43:31 +000071
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}
bungeman@google.com11c9a552013-06-03 17:10:35 +000080
81int sk_fileno(SkFILE* f) {
82 return fileno((FILE*)f);
83}
84
85void* sk_fmmap(SkFILE* f, size_t* size) {
86 int fd = sk_fileno(f);
87 if (fd < 0) {
88 return NULL;
89 }
skia.committer@gmail.com11f2b442013-06-04 07:00:53 +000090
bungeman@google.com11c9a552013-06-03 17:10:35 +000091 return sk_fdmmap(fd, size);
92}