Sophie

Sophie

distrib > Mandriva > current > i586 > media > contrib-release-src > by-pkgid > ea7710e9d88b1b05b8d30c36cfe50a68 > files > 17

xcdroast-0.98-0.a15.39mdv2010.1.src.rpm

diff -ur xcdroast-0.98alpha15/src/main.h xcdroast-0.98alpha15.new/src/main.h
--- xcdroast-0.98alpha15/src/main.h	2003-10-30 13:49:04.000000000 +0100
+++ xcdroast-0.98alpha15.new/src/main.h	2004-12-15 10:21:34.000000000 +0100
@@ -137,6 +137,7 @@
 gint determine_cd_type(gchar *ret, gint mode);
 gint determine_free_space(gint *biggestfree);
 gint read_line(gint fd, gchar *ptr, gint maxlen);
+gint read_line_wait(gint fd, gchar *ptr, gint maxlen);
 gint allocate_track_filenames(gint *overwrite, gint *overwritebiggest);
 gint scan_for_toc_files();
 void print_trackreadset();
diff -ur xcdroast-0.98alpha15/src/tools.c xcdroast-0.98alpha15.new/src/tools.c
--- xcdroast-0.98alpha15/src/tools.c	2004-12-15 10:28:52.612444656 +0100
+++ xcdroast-0.98alpha15.new/src/tools.c	2004-12-15 10:24:35.000000000 +0100
@@ -596,6 +596,69 @@
 			if (rc == -1 && errno == EAGAIN) {
 				if (n == 1) 
 					return(-1);
+				else
+					break;
+			}	
+                        return(-1);     /* error */
+		}
+        }
+
+	/* terminate the string */
+	*ptr = 0;
+ 
+        /* strip of some trailing chars - yes..we need both levels */
+        ptr--;
+        if ((*ptr == '\n') || (*ptr == '\r') ) {
+                *ptr = 0;
+        }
+        ptr--;
+        if ((*ptr == '\n') || (*ptr == '\r') ) {
+                *ptr = 0;
+        }
+ 
+	if (strlen(str) == 0) {
+		/* if we read an empty string, but are NOT on EOF return 1 */
+		return 1;
+	} else {
+        	return(strlen(str));
+	}
+}
+
+
+/*
+ * Use this version to work around some of the critical races
+ * such as bz 127658. This issue should be solved on a case by case basis.
+ * Expected side effects: GUI freezes (e.g. if called from read_write_out() in io.c).
+ */
+
+gint read_line_wait(gint fd, gchar *ptr, gint maxlen) {
+gint n, rc;
+gchar c;
+gchar *str;
+
+	str = ptr;
+ 
+        for (n = 1; n < maxlen; n++) {
+                if ( (rc = read(fd, &c, 1)) == 1) {
+                        *ptr++ = c;
+                        if (c == '\n') {
+                                break;
+                        }
+
+                } else if (rc == 0) {
+			/* EOF */
+                        if (n == 1)
+                                return(0);      /* EOF, no data read */
+                        else
+                                break;          /* EOF, some data was read */
+                } else if (rc == -2) {
+			/* timeout while reading string */
+			return(-2);
+		} else {
+			/* nonblocking mode an nothing to read? */
+			if (rc == -1 && errno == EAGAIN) {
+				if (n == 1) 
+					return(-1);
 				else {
 					/* Partial line read.  Wait a
 					 * bit longer in case there's