16cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com/* 26cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com * Copyright 2013 Google Inc. 36cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com * 46cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com * Use of this source code is governed by a BSD-style license that can be 56cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com * found in the LICENSE file. 66cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com */ 76cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com 86cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com#include "SkOSFile.h" 96cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com 10f5cc5b140c1c00c536e02b5cfbe158bb2d5c2c15bungeman@google.com#include "SkTFitsIn.h" 1111c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com 126cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com#include <stdio.h> 136cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com#include <sys/mman.h> 146cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com#include <sys/stat.h> 156cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com#include <sys/types.h> 16bf0b9ced0b93d9684b044e0880691768f9aa4394bungeman#include <unistd.h> 17bf0b9ced0b93d9684b044e0880691768f9aa4394bungeman 18bf0b9ced0b93d9684b044e0880691768f9aa4394bungemanbool sk_exists(const char *path, SkFILE_Flags flags) { 19bf0b9ced0b93d9684b044e0880691768f9aa4394bungeman int mode = F_OK; 20bf0b9ced0b93d9684b044e0880691768f9aa4394bungeman if (flags & kRead_SkFILE_Flag) { 21bf0b9ced0b93d9684b044e0880691768f9aa4394bungeman mode |= R_OK; 22bf0b9ced0b93d9684b044e0880691768f9aa4394bungeman } 23bf0b9ced0b93d9684b044e0880691768f9aa4394bungeman if (flags & kWrite_SkFILE_Flag) { 24bf0b9ced0b93d9684b044e0880691768f9aa4394bungeman mode |= W_OK; 25bf0b9ced0b93d9684b044e0880691768f9aa4394bungeman } 26bf0b9ced0b93d9684b044e0880691768f9aa4394bungeman return (0 == access(path, mode)); 27bf0b9ced0b93d9684b044e0880691768f9aa4394bungeman} 286cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com 296cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.comtypedef struct { 306cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com dev_t dev; 316cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com ino_t ino; 326cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com} SkFILEID; 336cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com 346cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.comstatic bool sk_ino(SkFILE* a, SkFILEID* id) { 356cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com int fd = fileno((FILE*)a); 366cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com if (fd < 0) { 376cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com return 0; 386cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com } 396cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com struct stat status; 406cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com if (0 != fstat(fd, &status)) { 416cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com return 0; 426cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com } 436cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com id->dev = status.st_dev; 446cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com id->ino = status.st_ino; 456cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com return true; 466cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com} 476cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com 486cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.combool sk_fidentical(SkFILE* a, SkFILE* b) { 496cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com SkFILEID aID, bID; 506cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com return sk_ino(a, &aID) && sk_ino(b, &bID) 516cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com && aID.ino == bID.ino 526cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com && aID.dev == bID.dev; 536cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com} 546cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com 556cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.comvoid sk_fmunmap(const void* addr, size_t length) { 566cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com munmap(const_cast<void*>(addr), length); 576cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com} 586cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com 5911c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.comvoid* sk_fdmmap(int fd, size_t* size) { 6011c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com struct stat status; 6111c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com if (0 != fstat(fd, &status)) { 626cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com return NULL; 636cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com } 6411c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com if (!S_ISREG(status.st_mode)) { 6511c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com return NULL; 6611c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com } 6711c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com if (!SkTFitsIn<size_t>(status.st_size)) { 686cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com return NULL; 696cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com } 7011c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com size_t fileSize = static_cast<size_t>(status.st_size); 716cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com 726cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com void* addr = mmap(NULL, fileSize, PROT_READ, MAP_PRIVATE, fd, 0); 736cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com if (MAP_FAILED == addr) { 746cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com return NULL; 756cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com } 766cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com 776cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com *size = fileSize; 786cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com return addr; 796cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.com} 8011c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com 8111c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.comint sk_fileno(SkFILE* f) { 8211c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com return fileno((FILE*)f); 8311c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com} 8411c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com 8511c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.comvoid* sk_fmmap(SkFILE* f, size_t* size) { 8611c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com int fd = sk_fileno(f); 8711c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com if (fd < 0) { 8811c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com return NULL; 8911c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com } 9011f2b444500d552031fcae0b381a0770600400fdskia.committer@gmail.com 9111c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com return sk_fdmmap(fd, size); 9211c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com} 93