Mercurial > minori
comparison dep/animia/src/fd/proc.cc @ 233:0a5b6a088886
dep/animia: fix proc readlink
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Mon, 15 Jan 2024 08:10:58 -0500 |
parents | 031a257ee019 |
children | a7d0d543b334 |
comparison
equal
deleted
inserted
replaced
232:ff0061e75f0f | 233:0a5b6a088886 |
---|---|
4 | 4 |
5 #include <filesystem> | 5 #include <filesystem> |
6 #include <fstream> | 6 #include <fstream> |
7 #include <sstream> | 7 #include <sstream> |
8 #include <string> | 8 #include <string> |
9 | |
10 #include <iostream> | |
9 | 11 |
10 #include <sys/stat.h> | 12 #include <sys/stat.h> |
11 #include <fcntl.h> | 13 #include <fcntl.h> |
12 #include <unistd.h> | 14 #include <unistd.h> |
13 | 15 |
54 */ | 56 */ |
55 constexpr size_t OUT_MAX = (1ul << 15); // 32KiB | 57 constexpr size_t OUT_MAX = (1ul << 15); // 32KiB |
56 out.resize(32); | 58 out.resize(32); |
57 | 59 |
58 ssize_t exe_used = 0; | 60 ssize_t exe_used = 0; |
59 while (out.length() < OUT_MAX && exe_used >= static_cast<ssize_t>(out.length())) { | 61 do { |
60 out.resize(out.length() * 2); | 62 out.resize(out.length() * 2); |
61 | 63 |
62 exe_used = readlink(link.c_str(), &out.front(), out.length()); | 64 exe_used = readlink(link.c_str(), &out.front(), out.length()); |
63 if (exe_used == (ssize_t)-1 || exe_used < (ssize_t)1) | 65 if (exe_used == (ssize_t)-1 || exe_used < (ssize_t)1) |
64 return false; // we got a bad result. SAD! | 66 return false; // we got a bad result. SAD! |
65 } | 67 } while (out.length() < OUT_MAX && exe_used >= static_cast<ssize_t>(out.length())); |
66 | 68 |
67 out.resize(out.find('\0')); | 69 out.resize(out.find('\0')); |
68 | 70 |
69 return true; | 71 return true; |
70 } | 72 } |