#include <assert.h>
#include <sys/select.h>
#include <sys/socket.h>
-#include <sys/fcntl.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <netdb.h>
free(reply);
return reply != 0;
}
-
-/* The functions beyond this point still use only public interfaces,
- * but are not themselves part of the public interface. So their
- * prototypes are in xcbint.h. */
-
-#include "xcbint.h"
-
-int _xcb_set_fd_flags(const int fd)
-{
- long flags = fcntl(fd, F_GETFL, 0);
- if(flags == -1)
- return 0;
- flags |= O_NONBLOCK;
- if(fcntl(fd, F_SETFL, flags) == -1)
- return 0;
- if(fcntl(fd, F_SETFD, FD_CLOEXEC) == -1)
- return 0;
- return 1;
-}
-
-int _xcb_readn(const int fd, void *buf, const int buflen, int *count)
-{
- int n = read(fd, ((char *) buf) + *count, buflen - *count);
- if(n > 0)
- *count += n;
- return n;
-}
-
-int _xcb_read_block(const int fd, void *buf, const size_t len)
-{
- int done = 0;
- while(done < len)
- {
- int ret = _xcb_readn(fd, buf, len, &done);
- if(ret < 0 && errno == EAGAIN)
- {
- fd_set fds;
- FD_ZERO(&fds);
- FD_SET(fd, &fds);
- ret = select(fd + 1, &fds, 0, 0, 0);
- }
- if(ret <= 0)
- return ret;
- }
- return len;
-}
-
-int _xcb_write(const int fd, char (*buf)[], int *count)
-{
- int n = write(fd, *buf, *count);
- if(n > 0)
- {
- *count -= n;
- if(*count)
- memmove(*buf, *buf + n, *count);
- }
- return n;
-}
-
-int _xcb_writev(const int fd, struct iovec *vec, int count)
-{
- int n = writev(fd, vec, count);
- if(n > 0)
- {
- int rem = n;
- for(; count; --count, ++vec)
- {
- int cur = vec->iov_len;
- if(cur > rem)
- cur = rem;
- vec->iov_len -= cur;
- vec->iov_base = (char *) vec->iov_base + cur;
- rem -= cur;
- if(vec->iov_len)
- break;
- }
- assert(rem == 0);
- }
- return n;
-}