X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=src%2Futils%2Fproto.c;h=26c4826a7f949a003d67932bd283cc59eff2befd;hp=29783efd5aefb3db7cd09037f6f534fa4363b020;hb=56b97a180a53aecbfe9f7162b8ece3faae973cf9;hpb=ddb933096618a6bceded29e4dc2b37cb72134366 diff --git a/src/utils/proto.c b/src/utils/proto.c index 29783ef..26c4826 100644 --- a/src/utils/proto.c +++ b/src/utils/proto.c @@ -36,10 +36,57 @@ #include #include +#include + /* * public API */ +int +sdb_proto_select(int fd, int type) +{ + fd_set fds; + fd_set *readfds = NULL; + fd_set *writefds = NULL; + fd_set *exceptfds = NULL; + + if (fd < 0) { + errno = EBADF; + return -1; + } + + FD_ZERO(&fds); + + switch (type) { + case SDB_PROTO_SELECTIN: + readfds = &fds; + break; + case SDB_PROTO_SELECTOUT: + writefds = &fds; + break; + case SDB_PROTO_SELECTERR: + exceptfds = &fds; + break; + default: + errno = EINVAL; + return -1; + } + + FD_SET(fd, &fds); + + while (42) { + int n; + errno = 0; + n = select(fd + 1, readfds, writefds, exceptfds, NULL); + + if ((n < 0) && (errno != EINTR)) + return n; + if (n > 0) + break; + } + return 0; +} /* sdb_proto_select */ + ssize_t sdb_proto_send(int fd, size_t msg_len, const char *msg) { @@ -56,7 +103,8 @@ sdb_proto_send(int fd, size_t msg_len, const char *msg) while (len > 0) { ssize_t status; - /* XXX: use select() */ + if (sdb_proto_select(fd, SDB_PROTO_SELECTOUT)) + return -1; errno = 0; status = write(fd, buf, len);