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