summaryrefslogtreecommitdiff
path: root/audio/grip/files/patch-cddb.c
diff options
context:
space:
mode:
Diffstat (limited to 'audio/grip/files/patch-cddb.c')
-rw-r--r--audio/grip/files/patch-cddb.c160
1 files changed, 160 insertions, 0 deletions
diff --git a/audio/grip/files/patch-cddb.c b/audio/grip/files/patch-cddb.c
new file mode 100644
index 000000000000..14f8fa672850
--- /dev/null
+++ b/audio/grip/files/patch-cddb.c
@@ -0,0 +1,160 @@
+--- cddb.c.orig Mon Jul 16 12:15:32 2001
++++ cddb.c Mon Jan 21 22:51:21 2002
+@@ -27,6 +27,9 @@
+ #include <strings.h>
+ #endif
+ #include <ctype.h>
++#include <fcntl.h>
++#include <pthread.h>
++#include <sys/time.h>
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <sys/stat.h>
+@@ -43,7 +46,7 @@
+ extern char *Version;
+
+ static int CDDBSum(int val);
+-static int CDDBConnect(CDDBServer *server);
++static int CDDBConnect(CDDBServer *server, int ns);
+ static void CDDBDisconnect(int sock);
+ static void CDDBSkipHTTP(int sock);
+ static int CDDBReadLine(int sock,char *inbuffer,int len);
+@@ -59,6 +62,81 @@
+ "data","folk","jazz","misc","newage",
+ "reggae","rock","soundtrack"};
+
++/* nonblocking connect */
++
++static int
++nonbconnect(int fd, struct sockaddr *pa, socklen_t cba, int ns)
++{
++ int n;
++ int s;
++ int fl;
++ fd_set rfds, wfds;
++ struct timeval tv;
++
++ if (!ns) {
++ n = connect(fd, pa, cba);
++ pthread_testcancel();
++ return n;
++ }
++
++ fl = fcntl(fd, F_GETFL, 0);
++ fcntl(fd, F_SETFL, fl | O_NONBLOCK);
++
++ if ((n = connect(fd, pa, cba)) < 0) {
++ if (errno != EINPROGRESS) {
++ return -1;
++ }
++ } else if (n == 0) {
++ fcntl(fd, F_SETFL, fl);
++ return 0;
++ }
++
++
++ for (s = 0; s < ns; s++) {
++ tv.tv_sec = 1;
++ tv.tv_usec = 0;
++ FD_ZERO(&rfds);
++ FD_SET(fd, &rfds);
++ wfds = rfds;
++ if ((n = select(fd + 1, &rfds, &wfds, 0, &tv)) > 0) {
++ break;
++ } else if (n < 0) {
++ if (errno == EINTR) {
++ s--;
++ } else {
++ return -1;
++ }
++ }
++ pthread_testcancel();
++ }
++
++ if (n == 0 && s == ns) {
++ errno = ETIMEDOUT;
++ return -1;
++ }
++
++ if (FD_ISSET(fd, &rfds) || FD_ISSET(fd, &wfds)) {
++ int err;
++ int cberr = sizeof(err);
++
++ getsockopt(fd, SOL_SOCKET, SO_ERROR, &err, &cberr);
++ if (err) {
++ errno = err;
++ return -1;
++ }
++ fcntl(fd, F_SETFL, fl);
++ tv.tv_sec = ns;
++ tv.tv_usec = 0;
++ setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
++ return 0;
++ }
++
++ /* ohshit */
++
++ errno = EIO; /* WTF? */
++ return -1;
++}
++
+ /* CDDB sum function */
+
+ static int CDDBSum(int val)
+@@ -115,7 +193,7 @@
+ }
+
+ /* Connect to a CDDB server */
+-static int CDDBConnect(CDDBServer *server)
++static int CDDBConnect(CDDBServer *server, int ns)
+ {
+ int sock;
+ struct sockaddr_in sin;
+@@ -146,8 +224,10 @@
+
+ if((sock=socket(AF_INET,SOCK_STREAM,0))<0) return -1;
+
+- if(connect(sock,(struct sockaddr *)&sin,sizeof(sin))<0) return -1;
+-
++ if(nonbconnect(sock,(struct sockaddr *)&sin,sizeof(sin),ns)<0) {
++ close(sock);
++ sock = -1;
++ }
+ return sock;
+ }
+
+@@ -243,7 +323,7 @@
+ /* Query the CDDB for the CD currently in the CD-ROM */
+
+ gboolean CDDBDoQuery(int cd_desc,CDDBServer *server,
+- CDDBHello *hello,CDDBQuery *query)
++ CDDBHello *hello,CDDBQuery *query, int ns)
+ {
+ int socket;
+ int index;
+@@ -251,7 +331,7 @@
+ char *offset_buffer,*query_buffer,*http_buffer,inbuffer[256];
+ int tot_len,len;
+
+- socket=CDDBConnect(server);
++ socket=CDDBConnect(server,ns);
+
+ if(socket==-1) return FALSE;
+
+@@ -476,14 +556,14 @@
+
+ gboolean CDDBRead(int cd_desc,CDDBServer *server,
+ CDDBHello *hello,CDDBEntry *entry,
+- DiscData *data)
++ DiscData *data, int ns)
+ {
+ int socket;
+ int index;
+ char outbuffer[256], inbuffer[512],cmdbuffer[256];
+ struct disc_info disc;
+
+- socket=CDDBConnect(server);
++ socket=CDDBConnect(server,ns);
+ if(socket==-1) return FALSE;
+
+ CDStat(cd_desc,&disc,TRUE);