diff -Nru xine-lib/src/vdr/input_vdr.c xine-lib+net/src/vdr/input_vdr.c --- xine-lib/src/vdr/input_vdr.c 2005-09-14 23:04:14.000000000 +0200 +++ xine-lib+net/src/vdr/input_vdr.c 2005-08-16 12:03:03.000000000 +0200 @@ -34,6 +34,10 @@ #include #include +#include +#include +#include + #define LOG_MODULE "input_vdr" #define LOG_VERBOSE /* @@ -51,8 +55,6 @@ #define VDR_MAX_NUM_WINDOWS 16 #define VDR_ABS_FIFO_DIR "/tmp/vdr-xine" - - #define BUF_SIZE 1024 #define LOG_OSD(x) @@ -1455,108 +1457,203 @@ return INPUT_OPTIONAL_UNSUPPORTED; } -static int vdr_plugin_open(input_plugin_t *this_gen) +static int vdr_plugin_open_socket(vdr_input_plugin_t *this, struct hostent *host, unsigned short port) +{ + int fd; + struct sockaddr_in sain; + struct in_addr iaddr; + + if ((fd = socket(PF_INET,SOCK_STREAM,0)) == -1) { + xprintf(this->stream->xine, XINE_VERBOSITY_LOG, + _("vdr: failed to create socket for port %d (%s)\n"), + port,strerror(errno)); + return -1; + } + + iaddr.s_addr = * ((unsigned int *) host->h_addr_list[0]); + + sain.sin_port = htons(port); + sain.sin_family = AF_INET; + sain.sin_addr = iaddr; + + if (connect(fd,(struct sockaddr*) &sain, sizeof(sain)) < 0) { + xprintf(this->stream->xine, XINE_VERBOSITY_LOG, + _("vdr: failed to connect to port %d (%s)\n"),port, + strerror(errno)); + return -1; + } + + xprintf(this->stream->xine, XINE_VERBOSITY_LOG, + "vdr: socket opening successful, fd = %d\n",fd); + return fd; +} + +static int vdr_plugin_open_sockets(vdr_input_plugin_t *this) +{ +// struct hostent *host = gethostbyname(VDR_SERVER_ADDRESS); + struct hostent *host = gethostbyname(&this->mrl[12]); + + xprintf(this->stream->xine, XINE_VERBOSITY_LOG,"vdr: connecting to vdr.\n"); + if (host == NULL) { + xprintf(this->stream->xine, XINE_VERBOSITY_LOG, + _("vdr: failed to resolve hostname '%s' (%s)\n"), + &this->mrl[12], + strerror(errno)); + return 0; + } + + if ((this->fh = vdr_plugin_open_socket(this,host,18701)) == -1) + return 0; + + fcntl(this->fh, F_SETFL, ~O_NONBLOCK & fcntl(this->fh, F_GETFL, 0)); + + if ((this->fh_control = vdr_plugin_open_socket(this,host,18702)) == -1) + return 0; + + if ((this->fh_result = vdr_plugin_open_socket(this,host,18703)) == -1) + return 0; + + if ((this->fh_event = vdr_plugin_open_socket(this,host,18704)) == -1) + return 0; + xprintf(this->stream->xine, XINE_VERBOSITY_LOG, + "vdr: connecting to all sockets was successful.\n"); + return 1; +} + +static int vdr_plugin_open_vdr(input_plugin_t *this_gen) { vdr_input_plugin_t *this = (vdr_input_plugin_t *)this_gen; - lprintf("trying to open '%s'...\n", this->mrl); + char *filename; - if (this->fh == -1) - { - char *filename; - int err = 0; + filename = (char *)&this->mrl[ 4 ]; + this->fh = open(filename, O_RDONLY | O_NONBLOCK); - filename = (char *)&this->mrl[ 4 ]; - this->fh = open(filename, O_RDONLY | O_NONBLOCK); + lprintf("filename '%s'\n", filename); - lprintf("filename '%s'\n", filename); + if (this->fh == -1) + { + xprintf(this->stream->xine, XINE_VERBOSITY_LOG, + _(LOG_MODULE ": failed to open '%s' (%s)\n"), + filename, + strerror(errno)); + + return 0; + } - if (this->fh == -1) + { + struct pollfd poll_fh = { this->fh, POLLIN, 0 }; + + int r = poll(&poll_fh, 1, 300); + if (1 != r) { xprintf(this->stream->xine, XINE_VERBOSITY_LOG, _(LOG_MODULE ": failed to open '%s' (%s)\n"), filename, - strerror(errno)); - - return 0; - } - - { - struct pollfd poll_fh = { this->fh, POLLIN, 0 }; - - int r = poll(&poll_fh, 1, 300); - if (1 != r) - { - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - _(LOG_MODULE ": failed to open '%s' (%s)\n"), - filename, - _("timeout expired during setup phase")); + _("timeout expired during setup phase")); - return 0; - } + return 0; } + } - fcntl(this->fh, F_SETFL, ~O_NONBLOCK & fcntl(this->fh, F_GETFL, 0)); + fcntl(this->fh, F_SETFL, ~O_NONBLOCK & fcntl(this->fh, F_GETFL, 0)); - { - char *filename_control = 0; - asprintf(&filename_control, "%s.control", filename); - - this->fh_control = open(filename_control, O_RDONLY); - - if (this->fh_control == -1) { - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - _(LOG_MODULE ": failed to open '%s' (%s)\n"), - filename_control, - strerror(errno)); + { + char *filename_control = 0; + asprintf(&filename_control, "%s.control", filename); - free(filename_control); - return 0; - } + this->fh_control = open(filename_control, O_RDONLY); - free(filename_control); + if (this->fh_control == -1) { + xprintf(this->stream->xine, XINE_VERBOSITY_LOG, + _(LOG_MODULE ": failed to open '%s' (%s)\n"), + filename_control, + strerror(errno)); + free(filename_control); + return 0; } + free(filename_control); + } - { - char *filename_result = 0; - asprintf(&filename_result, "%s.result", filename); + { + char *filename_result = 0; + asprintf(&filename_result, "%s.result", filename); - this->fh_result = open(filename_result, O_WRONLY); + this->fh_result = open(filename_result, O_WRONLY); - if (this->fh_result == -1) { - perror("failed"); + if (this->fh_result == -1) { + perror("failed"); - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - _(LOG_MODULE ": failed to open '%s' (%s)\n"), - filename_result, - strerror(errno)); + xprintf(this->stream->xine, XINE_VERBOSITY_LOG, + _(LOG_MODULE ": failed to open '%s' (%s)\n"), + filename_result, + strerror(errno)); - free(filename_result); - return 0; - } - free(filename_result); + return 0; } - { - char *filename_event = 0; - asprintf(&filename_event, "%s.event", filename); + free(filename_result); + } - this->fh_event = open(filename_event, O_WRONLY); + { + char *filename_event = 0; + asprintf(&filename_event, "%s.event", filename); - if (this->fh_event == -1) { - perror("failed"); + this->fh_event = open(filename_event, O_WRONLY); - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - _(LOG_MODULE ": failed to open '%s' (%s)\n"), - filename_event, - strerror(errno)); - - free(filename_event); - return 0; - } + if (this->fh_event == -1) { + perror("failed"); + xprintf(this->stream->xine, XINE_VERBOSITY_LOG, + _(LOG_MODULE ": failed to open '%s' (%s)\n"), + filename_event, + strerror(errno)); + free(filename_event); + return 0; + } + + free(filename_event); + } + + return 1; +} + +static int vdr_plugin_open_vdr_socket(input_plugin_t *this_gen) +{ + vdr_input_plugin_t *this = (vdr_input_plugin_t *)this_gen; + + lprintf("input_vdr: connecting to vdr-xine-server...\n"); + + if (!vdr_plugin_open_sockets(this)) + return 0; + + return 1; +} + +static int vdr_plugin_open(input_plugin_t *this_gen) +{ + vdr_input_plugin_t *this = (vdr_input_plugin_t *)this_gen; + + lprintf("trying to open '%s'...\n", this->mrl); + + if (this->fh == -1) + { + int err = 0; + + if (!strncasecmp(&this->mrl[0], "vdr:/", 5)) + { + if (!vdr_plugin_open_vdr(this_gen)) + return 0; + } + else + { + if (!strncasecmp(&this->mrl[0], "vdr-socket:/", 12)) + { + if (!vdr_plugin_open_vdr_socket(this_gen)) + return 0; + } } this->rpc_thread_shutdown = 0; @@ -1571,7 +1668,6 @@ } } - /* * mrl accepted and opened successfully at this point * @@ -1703,14 +1799,21 @@ vdr_input_plugin_t *this; char *mrl = strdup(data); - if (!strncasecmp(mrl, "vdr:/", 5)) + if (!strncasecmp(mrl, "vdr-socket:/", 12)) { - lprintf("filename '%s'\n", (char *)&mrl[ 4 ]); + lprintf("host '%s'\n", (char *)&mrl[ 12 ]); } else { - free(mrl); - return NULL; + if (!strncasecmp(mrl, "vdr:/", 5)) + { + lprintf("filename '%s'\n", (char *)&mrl[ 4 ]); + } + else + { + free(mrl); + return NULL; + } } /*