/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#if defined (TARGET_INJECT_FAULTS)
#include <map>
#endif

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>

#include "ota_io.h"

#if defined (TARGET_INJECT_FAULTS)
static std::map<int, const char*> FilenameCache;
static std::string FaultFileName =
#if defined (TARGET_READ_FAULT)
        TARGET_READ_FAULT;
#elif defined (TARGET_WRITE_FAULT)
        TARGET_WRITE_FAULT;
#elif defined (TARGET_FSYNC_FAULT)
        TARGET_FSYNC_FAULT;
#endif // defined (TARGET_READ_FAULT)
#endif // defined (TARGET_INJECT_FAULTS)

int ota_open(const char* path, int oflags) {
#if defined (TARGET_INJECT_FAULTS)
    // Let the caller handle errors; we do not care if open succeeds or fails
    int fd = open(path, oflags);
    FilenameCache[fd] = path;
    return fd;
#else
    return open(path, oflags);
#endif
}

int ota_open(const char* path, int oflags, mode_t mode) {
#if defined (TARGET_INJECT_FAULTS)
    int fd = open(path, oflags, mode);
    FilenameCache[fd] = path;
    return fd;
#else
    return open(path, oflags, mode);
#endif
}

FILE* ota_fopen(const char* path, const char* mode) {
#if defined (TARGET_INJECT_FAULTS)
    FILE* fh = fopen(path, mode);
    FilenameCache[(intptr_t)fh] = path;
    return fh;
#else
    return fopen(path, mode);
#endif
}

int ota_close(int fd) {
#if defined (TARGET_INJECT_FAULTS)
    // descriptors can be reused, so make sure not to leave them in the cahce
    FilenameCache.erase(fd);
#endif
    return close(fd);
}

int ota_fclose(FILE* fh) {
#if defined (TARGET_INJECT_FAULTS)
    FilenameCache.erase((intptr_t)fh);
#endif
    return fclose(fh);
}

size_t ota_fread(void* ptr, size_t size, size_t nitems, FILE* stream) {
#if defined (TARGET_READ_FAULT)
    if (FilenameCache.find((intptr_t)stream) != FilenameCache.end()
            && FilenameCache[(intptr_t)stream] == FaultFileName) {
        FaultFileName = "";
        errno = EIO;
        return 0;
    } else {
        return fread(ptr, size, nitems, stream);
    }
#else
    return fread(ptr, size, nitems, stream);
#endif
}

ssize_t ota_read(int fd, void* buf, size_t nbyte) {
#if defined (TARGET_READ_FAULT)
    if (FilenameCache.find(fd) != FilenameCache.end()
            && FilenameCache[fd] == FaultFileName) {
        FaultFileName = "";
        errno = EIO;
        return -1;
    } else {
        return read(fd, buf, nbyte);
    }
#else
    return read(fd, buf, nbyte);
#endif
}

size_t ota_fwrite(const void* ptr, size_t size, size_t count, FILE* stream) {
#if defined (TARGET_WRITE_FAULT)
    if (FilenameCache.find((intptr_t)stream) != FilenameCache.end()
            && FilenameCache[(intptr_t)stream] == FaultFileName) {
        FaultFileName = "";
        errno = EIO;
        return 0;
    } else {
        return fwrite(ptr, size, count, stream);
    }
#else
    return fwrite(ptr, size, count, stream);
#endif
}

ssize_t ota_write(int fd, const void* buf, size_t nbyte) {
#if defined (TARGET_WRITE_FAULT)
    if (FilenameCache.find(fd) != FilenameCache.end()
            && FilenameCache[fd] == FaultFileName) {
        FaultFileName = "";
        errno = EIO;
        return -1;
    } else {
        return write(fd, buf, nbyte);
    }
#else
    return write(fd, buf, nbyte);
#endif
}

int ota_fsync(int fd) {
#if defined (TARGET_FSYNC_FAULT)
    if (FilenameCache.find(fd) != FilenameCache.end()
            && FilenameCache[fd] == FaultFileName) {
        FaultFileName = "";
        errno = EIO;
        return -1;
    } else {
        return fsync(fd);
    }
#else
    return fsync(fd);
#endif
}
