Some older ARM embedded settings set errno to EPERM instead of ENOSYS
for missing implementations (e.g. Freescale ARM 2.6.35)
* the legacy accept() + fcntl().
*/
if (unlikely(accept4_broken) ||
+ /* Albeit it appears it does not make sense to carry on with accept
+ * if we encounter EPERM, some old embedded ARM Linux 2.6.x sets as
+ * such instead of ENOSYS.
+ */
(((cfd = accept4(l->rx.fd, (struct sockaddr*)addr, &laddr,
SOCK_NONBLOCK | (master ? SOCK_CLOEXEC : 0))) == -1) &&
- (errno == ENOSYS || errno == EINVAL || errno == EBADF) &&
+ (errno == ENOSYS || errno == EINVAL || errno == EBADF || errno == EPERM) &&
((accept4_broken = 1))))
#endif
{