1bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao/* 2bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao * Copyright 2012, The Android Open Source Project 3bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao * 4bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License"); 5bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao * you may not use this file except in compliance with the License. 6bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao * You may obtain a copy of the License at 7bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao * 8bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao * http://www.apache.org/licenses/LICENSE-2.0 9bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao * 10bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao * Unless required by applicable law or agreed to in writing, software 11bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS, 12bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao * See the License for the specific language governing permissions and 14bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao * limitations under the License. 15bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao */ 16bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao 176433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsieh#include <portability.h> 18bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao#include <unistd.h> 19bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao#include <fcntl.h> 20bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao#include <stdarg.h> 214977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney#include <portability.h> 22bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao#include <fcntl_portable.h> 23c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney#include <filefd_portable.h> 24bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao 254977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney#define PORTABLE_TAG "open_portable" 264977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney#include <log_portable.h> 274977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney 28bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao 29bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao#if O_CREAT_PORTABLE==O_CREAT 30bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao#error Bad build environment 31bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao#endif 32bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao 33c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney 344977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaneystatic inline int open_flags_pton(int flags) 35bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao{ 36bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao int mipsflags = flags & O_ACCMODE_PORTABLE; 374977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney 384977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney ALOGV("%s(flags:0x%x) {", __func__, flags); 394977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney 40bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao if (flags & O_CREAT_PORTABLE) 418930ac553438f5265d36ba048493d1bc4a89dde3Pete Delaney mipsflags |= O_CREAT; 42bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao if (flags & O_EXCL_PORTABLE) 438930ac553438f5265d36ba048493d1bc4a89dde3Pete Delaney mipsflags |= O_EXCL; 44bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao if (flags & O_NOCTTY_PORTABLE) 458930ac553438f5265d36ba048493d1bc4a89dde3Pete Delaney mipsflags |= O_NOCTTY; 46bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao if (flags & O_TRUNC_PORTABLE) 478930ac553438f5265d36ba048493d1bc4a89dde3Pete Delaney mipsflags |= O_TRUNC; 48bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao if (flags & O_APPEND_PORTABLE) 498930ac553438f5265d36ba048493d1bc4a89dde3Pete Delaney mipsflags |= O_APPEND; 50bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao if (flags & O_NONBLOCK_PORTABLE) 518930ac553438f5265d36ba048493d1bc4a89dde3Pete Delaney mipsflags |= O_NONBLOCK; 52bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao if (flags & O_SYNC_PORTABLE) 538930ac553438f5265d36ba048493d1bc4a89dde3Pete Delaney mipsflags |= O_SYNC; 54bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao if (flags & FASYNC_PORTABLE) 558930ac553438f5265d36ba048493d1bc4a89dde3Pete Delaney mipsflags |= FASYNC; 56bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao if (flags & O_DIRECT_PORTABLE) 578930ac553438f5265d36ba048493d1bc4a89dde3Pete Delaney mipsflags |= O_DIRECT; 58bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao if (flags & O_LARGEFILE_PORTABLE) 598930ac553438f5265d36ba048493d1bc4a89dde3Pete Delaney mipsflags |= O_LARGEFILE; 60bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao if (flags & O_DIRECTORY_PORTABLE) 618930ac553438f5265d36ba048493d1bc4a89dde3Pete Delaney mipsflags |= O_DIRECTORY; 62bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao if (flags & O_NOFOLLOW_PORTABLE) 638930ac553438f5265d36ba048493d1bc4a89dde3Pete Delaney mipsflags |= O_NOFOLLOW; 64bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao if (flags & O_NOATIME_PORTABLE) 658930ac553438f5265d36ba048493d1bc4a89dde3Pete Delaney mipsflags |= O_NOATIME; 66bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao if (flags & O_NDELAY_PORTABLE) 678930ac553438f5265d36ba048493d1bc4a89dde3Pete Delaney mipsflags |= O_NDELAY; 68bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao 694977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney ALOGV("%s: return(mipsflags:0x%x); }", __func__, mipsflags); 70bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao return mipsflags; 71bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao} 72bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao 73c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney 74bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liaoextern int __open(const char*, int, int); 75c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney 766433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsiehint WRAP(open)(const char *pathname, int flags, ...) 77bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao{ 78bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao mode_t mode = 0; 794977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney int native_flags; 804977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney int fd; 814977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney 824977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney ALOGV(" "); 834977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney ALOGV("%s(pathname:%p, flags:0x%x, ...) {", __func__, 844977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney pathname, flags); 854977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney 861d34dd0c275c37cbf5d470e80b52fffc4375d6cfChao-Ying Fu flags |= O_LARGEFILE_PORTABLE; 87bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao 884977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney if (flags & O_CREAT_PORTABLE) { 89bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao va_list args; 90bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao 91bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao va_start(args, flags); 92bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao mode = (mode_t) va_arg(args, int); 93bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao va_end(args); 94bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao } 95bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao 964977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney native_flags = open_flags_pton(flags); 974977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney 984977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney fd = __open(pathname, native_flags, mode); 994977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney if (fd == -1) { 1004977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney /* Can't print pathname as a string, might be bogus */ 1014977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney ALOGV("%s: fd = %d = __open(pathname:%p, native_flags:0x%x, mode:0x%x);", __func__, 1024977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney fd, pathname, native_flags, mode); 103c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney } else { 104c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney if (flags & O_CLOEXEC) { 105c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney filefd_CLOEXEC_enabled(fd); 106c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney } else { 107c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney filefd_CLOEXEC_disabled(fd); 108c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney } 1094977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney } 1104977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney ALOGV("%s: return(fd:%d); }", __func__, fd); 1114977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney return fd; 112bf1b1e6c7f2fb0f912940232c7807506e63df2d2Shih-wei Liao} 1131d34dd0c275c37cbf5d470e80b52fffc4375d6cfChao-Ying Fu 114c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney 1151d34dd0c275c37cbf5d470e80b52fffc4375d6cfChao-Ying Fuextern int __openat(int, const char*, int, int); 116c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney 1176433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsiehint WRAP(openat)(int dirfd, const char *pathname, int flags, ...) 1181d34dd0c275c37cbf5d470e80b52fffc4375d6cfChao-Ying Fu{ 1191d34dd0c275c37cbf5d470e80b52fffc4375d6cfChao-Ying Fu mode_t mode = 0; 1204977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney int native_flags; 1214977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney int fd; 1224977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney 1234977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney ALOGV(" "); 1244977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney ALOGV("%s(dirfd:%d, pathname:0x%p, flags:0x%x, ...) {", __func__, 1254977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney dirfd, pathname, flags); 1261d34dd0c275c37cbf5d470e80b52fffc4375d6cfChao-Ying Fu 1271d34dd0c275c37cbf5d470e80b52fffc4375d6cfChao-Ying Fu flags |= O_LARGEFILE_PORTABLE; 1281d34dd0c275c37cbf5d470e80b52fffc4375d6cfChao-Ying Fu 1294977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney if (flags & O_CREAT_PORTABLE) { 1301d34dd0c275c37cbf5d470e80b52fffc4375d6cfChao-Ying Fu va_list args; 1311d34dd0c275c37cbf5d470e80b52fffc4375d6cfChao-Ying Fu 1321d34dd0c275c37cbf5d470e80b52fffc4375d6cfChao-Ying Fu va_start(args, flags); 1331d34dd0c275c37cbf5d470e80b52fffc4375d6cfChao-Ying Fu mode = (mode_t) va_arg(args, int); 1341d34dd0c275c37cbf5d470e80b52fffc4375d6cfChao-Ying Fu va_end(args); 1351d34dd0c275c37cbf5d470e80b52fffc4375d6cfChao-Ying Fu } 1361d34dd0c275c37cbf5d470e80b52fffc4375d6cfChao-Ying Fu 1374977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney native_flags = open_flags_pton(flags); 1384977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney 1394977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney fd = __openat(dirfd, pathname, native_flags, mode); 1404977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney 1414977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney if (fd == -1) { 1424977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney ALOGV("%s: fd = %d = __open(pathname:0x%p, native_flags:0x%x, mode:0x%d);", __func__, 1434977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney fd, pathname, native_flags, mode); 144c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney } else { 145c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney if (flags & O_CLOEXEC) { 146c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney filefd_CLOEXEC_enabled(fd); 147c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney } else { 148c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney filefd_CLOEXEC_disabled(fd); 149c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney } 1504977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney } 1514977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney ALOGV("%s: return(fd:%d); }", __func__, fd); 1524977f77e790c29d9321f9731511fb6fc54cdbec6Pete Delaney return fd; 1531d34dd0c275c37cbf5d470e80b52fffc4375d6cfChao-Ying Fu} 154