1 |
// Truck Computer Dooom! |
2 |
// |
3 |
// Douglas Thrift |
4 |
// |
5 |
// $Id$ |
6 |
|
7 |
#ifdef _GNU_SOURCE |
8 |
#undef _GNU_SOURCE |
9 |
#endif |
10 |
|
11 |
#define _XOPEN_SOURCE 600 |
12 |
|
13 |
#include <fcntl.h> |
14 |
|
15 |
#include "posix.hpp" |
16 |
|
17 |
namespace Posix |
18 |
{ |
19 |
|
20 |
Error::Error() : code(errno) |
21 |
{ |
22 |
CheckError(::strerror_r(code, message, sizeof (message))); |
23 |
} |
24 |
|
25 |
int Open(const std::string &path, int flags, ::mode_t mode) |
26 |
{ |
27 |
return SysCall(::open, path.c_str(), flags, mode); |
28 |
} |
29 |
|
30 |
size_t Read(int fd, void *buffer, size_t bytes) |
31 |
{ |
32 |
return SysCall(::read, fd, buffer, bytes); |
33 |
} |
34 |
|
35 |
size_t ReadMost(int fd, void *buffer, size_t bytes) |
36 |
{ |
37 |
size_t rest(bytes); |
38 |
uint8_t *data = reinterpret_cast<uint8_t *>(buffer); |
39 |
|
40 |
while (rest != 0) |
41 |
{ |
42 |
size_t read(Read(fd, data, rest)); |
43 |
|
44 |
if (read == 0) |
45 |
return bytes - rest; |
46 |
|
47 |
data += read; |
48 |
rest -= read; |
49 |
} |
50 |
|
51 |
return bytes; |
52 |
} |
53 |
|
54 |
} |