From 81de862996c8af79e73f550b0160e9c091722a71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Dvo=C5=99=C3=A1k?= Date: Tue, 6 Apr 2004 18:40:32 +0000 Subject: 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 --- src/xine-engine/io_helper.c | 53 +++++++++++++++++++++++++++++++++++++++++++++ src/xine-engine/io_helper.h | 10 +++++++++ 2 files changed, 63 insertions(+) (limited to 'src/xine-engine') 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; +} diff --git a/src/xine-engine/io_helper.h b/src/xine-engine/io_helper.h index bcaff1b08..0b1d522e3 100644 --- a/src/xine-engine/io_helper.h +++ b/src/xine-engine/io_helper.h @@ -65,6 +65,11 @@ int _x_io_select (xine_stream_t *stream, int fd, int state, int timeout_msec); */ int _x_io_tcp_connect(xine_stream_t *stream, const char *host, int port); +/* + * wait for finish connection + */ +int _x_io_tcp_connect_finish(xine_stream_t *stream, int fd, int timeout_msec); + /* * read from tcp socket checking demux_action_pending * @@ -107,4 +112,9 @@ off_t _x_io_file_read (xine_stream_t *stream, int fd, char *buf, off_t todo); */ off_t _x_io_file_write (xine_stream_t *stream, int fd, char *buf, off_t 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); + #endif -- cgit v1.2.3