return 1;
}
-// returns -1 in case of error, 0 if no data is available, 1 if there is. In the first two cases, errno is set
-int waitFor2Data(int fd1, int fd2, int seconds, int mseconds, int* fdPtr)
-{
- std::array<pollfd,2> pfds{};
- memset(pfds.data(), 0, pfds.size() * sizeof(struct pollfd));
- pfds[0].fd = fd1;
- pfds[1].fd = fd2;
-
- pfds[0].events= pfds[1].events = POLLIN;
-
- int nsocks = 1 + static_cast<int>(fd2 >= 0); // fd2 can optionally be -1
-
- int ret{};
- if (seconds >= 0) {
- ret = poll(pfds.data(), nsocks, seconds * 1000 + mseconds);
- }
- else {
- ret = poll(pfds.data(), nsocks, -1);
- }
- if (ret <= 0) {
- return ret;
- }
-
- if ((pfds[0].revents & POLLIN) != 0 && (pfds[1].revents & POLLIN) == 0) {
- *fdPtr = pfds[0].fd;
- }
- else if ((pfds[1].revents & POLLIN) != 0 && (pfds[0].revents & POLLIN) == 0) {
- *fdPtr = pfds[1].fd;
- }
- else if(ret == 2) {
- *fdPtr = pfds.at(dns_random_uint32() % 2).fd;
- }
- else {
- *fdPtr = -1; // should never happen
- }
-
- return 1;
-}
-
-
string humanDuration(time_t passed)
{
ostringstream ret;
string urlEncode(const string &text);
int waitForData(int fileDesc, int seconds, int mseconds = 0);
int waitForData(int fileDesc, struct timeval timeout);
-int waitFor2Data(int fd1, int fd2, int seconds, int mseconds, int* fd);
int waitForMultiData(const set<int>& fds, const int seconds, const int mseconds, int* fd);
int waitForRWData(int fileDesc, bool waitForRead, int seconds, int mseconds, bool* error = nullptr, bool* disconnected = nullptr);
int waitForRWData(int fileDesc, bool waitForRead, struct timeval timeout, bool* error = nullptr, bool* disconnected = nullptr);