// clang-format off
/********************************************************************************
*                       HON HAI Precision IND.Co., LTD.                         *
*            Personal Computer & Enterprise Product Business Group              *
*                      Enterprise Product Business Group                        *
*                                                                               *
*     Copyright (c) 2010 by FOXCONN/CESBG/CABG/SRD. All rights reserved.        *
*     All data and information contained in this document is confidential       *
*     and proprietary information of FOXCONN/CESBG/CABG/SRD and all rights      *
*     are reserved. By accepting this material the recipient agrees that        *
*     the information contained therein is held in confidence and in trust      *
*     and will not be used, copied, reproduced in whole or in part, nor its     *
*     contents revealed in any manner to others without the express written     *
*     permission of FOXCONN/CESBG/CABG/SRD.                                     *
*                                                                               *
********************************************************************************/
// clang-format on
#include <unistd.h>

#include <system_error>

std::system_error errnoException(const std::string& message);

int sysopen(const std::string& path);

void sysclose(int fd_);

void lseeker(int fd_, size_t offset);

void readBin(int fd_, size_t offset, void* ptr, size_t size);

void writeBin(int fd_, size_t offset, void* ptr, size_t size);
