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