Mercurial > minori
comparison dep/animia/src/fd/linux.cc @ 164:99fdf5a90b0f
fd/linux: avoid reading buffers multiple times
| author | Paper <mrpapersonic@gmail.com> |
|---|---|
| date | Sat, 18 Nov 2023 00:54:29 -0500 |
| parents | 44c5e6dd9488 |
| children |
comparison
equal
deleted
inserted
replaced
| 163:44c5e6dd9488 | 164:99fdf5a90b0f |
|---|---|
| 50 return S_ISREG(sb.st_mode); | 50 return S_ISREG(sb.st_mode); |
| 51 } | 51 } |
| 52 | 52 |
| 53 static bool AreFlagsOk(pid_t pid, int fd) { | 53 static bool AreFlagsOk(pid_t pid, int fd) { |
| 54 const std::string path = PROC_LOCATION "/" + std::to_string(pid) + "/fdinfo/" + std::to_string(fd); | 54 const std::string path = PROC_LOCATION "/" + std::to_string(pid) + "/fdinfo/" + std::to_string(fd); |
| 55 std::stringstream buffer; | 55 |
| 56 { | 56 std::ifstream file(path.c_str()); |
| 57 std::string data; | 57 if (!file) |
| 58 if (!util::ReadFile(path, data)) | 58 return false; |
| 59 return false; | |
| 60 buffer << data; | |
| 61 } | |
| 62 | 59 |
| 63 int flags = 0; | 60 int flags = 0; |
| 64 for (std::string line; std::getline(buffer, line);) { | 61 for (std::string line; std::getline(file, line); ) |
| 65 /* FIXME: exception handling here!! */ | 62 if (line.find("flags:", 0) == 0) |
| 66 if (line.rfind("flags:", 0) == 0) { | |
| 67 flags = std::stoi(line.substr(line.find_last_not_of("0123456789") + 1)); | 63 flags = std::stoi(line.substr(line.find_last_not_of("0123456789") + 1)); |
| 68 } | 64 |
| 69 } | |
| 70 if (flags & O_WRONLY || flags & O_RDWR) | 65 if (flags & O_WRONLY || flags & O_RDWR) |
| 71 return false; | 66 return false; |
| 72 return true; | 67 return true; |
| 73 } | 68 } |
| 74 | 69 |
