/* * If we detect that stdio cannot handle file descriptors above 255, this * functions tries to reassign 'fd' to a file descriptor above 255 in order to * reserve lower file descriptors for stdio. File descriptors below 3 or above * 255 are returned as-is. The original file descriptor is closed if it was * reassigned. On systems which do not need this workaround, the original * file descriptor is returned. * * @note The FD_CLOEXEC flag set will be cleared on the new file descriptor if * the file descriptor is successfully reassigned. * * @return On success a new file descriptor above 255 is returned. * On failure or if reassigning was not necessary the original file * descriptor is returned. */ int fd_get_non_stdio(int fd) { if (fd_need_non_stdio() && fd > 2 && fd < 256) { int nfd, saved_errno; saved_errno = errno; nfd = fcntl(fd, F_DUPFD, 256); if (nfd > 0) { close(fd); compat_socket_duped(fd, nfd); fd = nfd; } errno = saved_errno; } /* * On Windows, files and sockets do not share the same ID space. * Therefore, on that platform we use this routine as a hook to * record active socket descriptors in a table. * --RAM, 2015-04-05 */ if (is_running_on_mingw()) { /* We don't expect thread race conditions here */ if G_UNLIKELY(NULL == fd_sockets) fd_sockets = hset_create(HASH_KEY_SELF, 0); if (is_a_socket(fd)) hset_insert(fd_sockets, int_to_pointer(fd)); } return fd; }
/* * If we detect that stdio cannot handle file descriptors above 255, this * functions tries to reassign 'fd' to a file descriptor above 255 in order to * reserve lower file descriptors for stdio. File descriptors below 3 or above * 255 are returned as-is. The original file descriptor is closed if it was * reassigned. On systems which do not need this workaround, the original * file descriptor is returned. * * @note The FD_CLOEXEC flag set will be cleared on the new file descriptor if * the file descriptor is successfully reassigned. * * @return On success a new file descriptor above 255 is returned. * On failure or if reassigning was not necessary the original file * descriptor is returned. */ int get_non_stdio_fd(int fd) { if (need_get_non_stdio_fd() && fd > 2 && fd < 256) { int nfd, saved_errno; saved_errno = errno; nfd = fcntl(fd, F_DUPFD, 256); if (nfd > 0) { close(fd); compat_socket_duped(fd, nfd); fd = nfd; } errno = saved_errno; } return fd; }