#include "pth_p.h"
#if cpp
#define pth_util_min(a,b) \
((a) > (b) ? (b) : (a))
#endif
static void pth_util_sigdelete_sighandler(int _sig)
{
return;
}
intern int pth_util_sigdelete(int sig)
{
sigset_t ss, oss;
struct sigaction sa, osa;
sigpending(&ss);
if (!sigismember(&ss, sig))
return FALSE;
sigemptyset(&ss);
sigaddset(&ss, sig);
pth_sc(sigprocmask)(SIG_BLOCK, &ss, &oss);
sa.sa_handler = pth_util_sigdelete_sighandler;
sigfillset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(sig, &sa, &osa) != 0) {
pth_sc(sigprocmask)(SIG_SETMASK, &oss, NULL);
return FALSE;
}
sigfillset(&ss);
sigdelset(&ss, sig);
sigsuspend(&ss);
sigaction(sig, &osa, NULL);
pth_sc(sigprocmask)(SIG_SETMASK, &oss, NULL);
return TRUE;
}
intern char *pth_util_cpystrn(char *dst, const char *src, size_t dst_size)
{
register char *d, *end;
if (dst_size == 0)
return dst;
d = dst;
end = dst + dst_size - 1;
for (; d < end; ++d, ++src) {
if ((*d = *src) == '\0')
return d;
}
*d = '\0';
return d;
}
intern void pth_util_fds_merge(int nfd,
fd_set *ifds1, fd_set *ofds1,
fd_set *ifds2, fd_set *ofds2,
fd_set *ifds3, fd_set *ofds3)
{
register int s;
for (s = 0; s < nfd; s++) {
if (ifds1 != NULL)
if (FD_ISSET(s, ifds1))
FD_SET(s, ofds1);
if (ifds2 != NULL)
if (FD_ISSET(s, ifds2))
FD_SET(s, ofds2);
if (ifds3 != NULL)
if (FD_ISSET(s, ifds3))
FD_SET(s, ofds3);
}
return;
}
intern int pth_util_fds_test(int nfd,
fd_set *ifds1, fd_set *ofds1,
fd_set *ifds2, fd_set *ofds2,
fd_set *ifds3, fd_set *ofds3)
{
register int s;
for (s = 0; s < nfd; s++) {
if (ifds1 != NULL)
if (FD_ISSET(s, ifds1) && FD_ISSET(s, ofds1))
return TRUE;
if (ifds2 != NULL)
if (FD_ISSET(s, ifds2) && FD_ISSET(s, ofds2))
return TRUE;
if (ifds3 != NULL)
if (FD_ISSET(s, ifds3) && FD_ISSET(s, ofds3))
return TRUE;
}
return FALSE;
}
intern int pth_util_fds_select(int nfd,
fd_set *ifds1, fd_set *ofds1,
fd_set *ifds2, fd_set *ofds2,
fd_set *ifds3, fd_set *ofds3)
{
register int s;
register int n;
n = 0;
for (s = 0; s < nfd; s++) {
if (ifds1 != NULL && FD_ISSET(s, ifds1)) {
if (!FD_ISSET(s, ofds1))
FD_CLR(s, ifds1);
else
n++;
}
if (ifds2 != NULL && FD_ISSET(s, ifds2)) {
if (!FD_ISSET(s, ofds2))
FD_CLR(s, ifds2);
else
n++;
}
if (ifds3 != NULL && FD_ISSET(s, ifds3)) {
if (!FD_ISSET(s, ofds3))
FD_CLR(s, ifds3);
else
n++;
}
}
return n;
}