1d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/* 2d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* Copyright (c) 2015, The Linux Foundation. All rights reserved. 3d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* 4d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* Redistribution and use in source and binary forms, with or without modification, are permitted 5d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* provided that the following conditions are met: 6d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* * Redistributions of source code must retain the above copyright notice, this list of 7d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* conditions and the following disclaimer. 8d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* * Redistributions in binary form must reproduce the above copyright notice, this list of 9d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* conditions and the following disclaimer in the documentation and/or other materials provided 10d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* with the distribution. 11d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* * Neither the name of The Linux Foundation nor the names of its contributors may be used to 12d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* endorse or promote products derived from this software without specific prior written 13d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* permission. 14d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* 15d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 16d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 18d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 19d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 20d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 21d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 22d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin*/ 24d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 25d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#ifndef __SYS_H__ 26d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#define __SYS_H__ 27d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 288089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <sys/eventfd.h> 29efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed#include <dlfcn.h> 308089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <unistd.h> 31d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <stdio.h> 32d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <stdlib.h> 33d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <poll.h> 34d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <pthread.h> 35efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed#include <fstream> 36efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed 37efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed#ifdef SDM_VIRTUAL_DRIVER 38efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed#include <virtual_driver.h> 39efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed#endif 40d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 41d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinnamespace sdm { 42d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 43d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinclass Sys { 44d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin public: 45efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed#ifndef SDM_VIRTUAL_DRIVER 46efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed typedef std::fstream fstream; 47efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed#else 48efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed typedef VirtualFStream fstream; 49efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed#endif 50efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed 51d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin // Pointers to system calls which are either mapped to actual system call or virtual driver. 52d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin typedef int (*ioctl)(int, int, ...); 53d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin typedef int (*open)(const char *, int, ...); 54d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin typedef int (*close)(int); 55d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin typedef int (*poll)(struct pollfd *, nfds_t, int); 56d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin typedef ssize_t (*pread)(int, void *, size_t, off_t); 57d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin typedef ssize_t (*pwrite)(int, const void *, size_t, off_t); 58d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin typedef int (*pthread_cancel)(pthread_t thread); 59d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin typedef int (*dup)(int fd); 608089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch typedef ssize_t (*read)(int, void *, size_t); 618089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch typedef ssize_t (*write)(int, const void *, size_t); 628089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch typedef int (*eventfd)(unsigned int, int); 63d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 64efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed static bool getline_(fstream &fs, std::string &line); // NOLINT 65efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed 66d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin static ioctl ioctl_; 67d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin static open open_; 68d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin static close close_; 69d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin static poll poll_; 70d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin static pread pread_; 71d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin static pwrite pwrite_; 72d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin static pthread_cancel pthread_cancel_; 73d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin static dup dup_; 748089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch static read read_; 758089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch static write write_; 768089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch static eventfd eventfd_; 77d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}; 78d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 79efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmedclass DynLib { 80efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed public: 81efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed ~DynLib(); 82efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed bool Open(const char *lib_name); 83efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed bool Sym(const char *func_name, void **func_ptr); 84efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed const char * Error() { return ::dlerror(); } 85efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed operator bool() const { return lib_ != NULL; } 86efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed 87efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed private: 88efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed void Close(); 89efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed 90efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed void *lib_ = NULL; 91efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed}; 92efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed 93d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} // namespace sdm 94d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 95d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#endif // __SYS_H__ 96