diff options
author | František Dvořák <valtri@users.sourceforge.net> | 2004-04-06 18:40:32 +0000 |
---|---|---|
committer | František Dvořák <valtri@users.sourceforge.net> | 2004-04-06 18:40:32 +0000 |
commit | 81de862996c8af79e73f550b0160e9c091722a71 (patch) | |
tree | 4238cb0fc73853330703311997d476bb8da79265 /src/xine-engine/io_helper.c | |
parent | 97ea1a1a3bf93b3fd47fa2aa69ca7a9cc47ba7bf (diff) | |
download | xine-lib-81de862996c8af79e73f550b0160e9c091722a71.tar.gz xine-lib-81de862996c8af79e73f550b0160e9c091722a71.tar.bz2 |
Patch for using timeout in cddb lookup (xine was freezed just because of firewall!!!).
New functions into io_helper:
_x_io_tcp_connect_finish ... wait for successful connect with timeout
_x_io_tcp_read_line ... read the string from the socket (improvements neded)
Use io_helper functions in input_cdda.
Don't try connect again to freedb server, if previous connecting was failed.
CVS patchset: 6337
CVS date: 2004/04/06 18:40:32
Diffstat (limited to 'src/xine-engine/io_helper.c')
-rw-r--r-- | src/xine-engine/io_helper.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/xine-engine/io_helper.c b/src/xine-engine/io_helper.c index 9f14559b5..17473a654 100644 --- a/src/xine-engine/io_helper.c +++ b/src/xine-engine/io_helper.c @@ -233,6 +233,33 @@ int _x_io_select (xine_stream_t *stream, int fd, int state, int timeout_msec) { } +/* + * wait for finish connection + */ +int _x_io_tcp_connect_finish(xine_stream_t *stream, int fd, int timeout_msec) { + int ret; + + ret = _x_io_select(stream, fd, XIO_WRITE_READY, timeout_msec); + + /* find out, if connection is successfull */ + if (ret == XIO_READY) { + socklen_t len = sizeof(int); + int err; + + if ((getsockopt(fd, SOL_SOCKET, SO_ERROR, &err, &len)) == -1) { + _x_message(stream, XINE_MSG_CONNECTION_REFUSED, _("failed to get status of socket"), strerror(errno), NULL); + return XIO_ERROR; + } + if (err) { + _x_message(stream, XINE_MSG_CONNECTION_REFUSED, strerror(errno), NULL); + return XIO_ERROR; + } + } + + return ret; +} + + static off_t xio_rw_abort(xine_stream_t *stream, int fd, int cmd, char *buf, off_t todo) { off_t ret = -1; @@ -311,3 +338,29 @@ off_t _x_io_file_read (xine_stream_t *stream, int s, char *buf, off_t todo) { off_t _x_io_file_write (xine_stream_t *stream, int s, char *buf, off_t todo) { return xio_rw_abort (stream, s, XIO_FILE_WRITE, buf, todo); } + +/* + * read a string from socket, return size length + */ +int _x_io_tcp_read_line(xine_stream_t *stream, int sock, char *str, int size) { + int i = 0; + char c; + off_t r; + + while ((r = xio_rw_abort(stream, sock, XIO_TCP_READ, &c, 1)) != -1) { + if (c == '\r' || c == '\n') + break; + if (i > size) + break; + + str[i] = c; + i++; + } + + if (r != -1) + r = xio_rw_abort(stream, sock, XIO_TCP_READ, &c, 1); + + str[i] = '\0'; + + return (int)r; +} |