From: Andre Noll <maan@systemlinux.org>
Date: Tue, 11 Jun 2013 18:41:49 +0000 (+0200)
Subject: Merge branch 't/stdin_stdout_fixes'
X-Git-Tag: v0.4.13~31
X-Git-Url: https://git.tue.mpg.de/?a=commitdiff_plain;h=d46a0767b58654f15f16406cf99296287bd0d534;p=paraslash.git

Merge branch 't/stdin_stdout_fixes'

Was cooking for almost a month.

	b99b4a stdin/stdout: Restore fd flags on shutdown.

Conflicts:
	stdin.c
	stdout.c
---

d46a0767b58654f15f16406cf99296287bd0d534
diff --cc NEWS
index a93fb2e3,f323df1d..07481964
--- a/NEWS
+++ b/NEWS
@@@ -2,12 -2,6 +2,14 @@@
  0.?.? (to be announced) "spectral gravity"
  ------------------------------------------
  
 +	- UTF8 support for para_gui and the mp3 audio format handler.
 +	- Scheduler improvements and fixes.
 +	- The obsolete gettimeofday() function has been replaced
 +	  by clock_gettime() on systems which support it.
 +	- Speed and usability improvements for para_gui.
++	- para_client now restores the fd flags of stdin and stdout
++	  on shutdown
 +
  -----------------------------------------
  0.4.12 (2012-12-20) "volatile relativity"
  -----------------------------------------
diff --cc stdin.c
index b25a0ba0,08bc1f9a..20b9250e
--- a/stdin.c
+++ b/stdin.c
@@@ -65,10 -67,16 +65,16 @@@ static int stdin_post_select(struct sch
  	if (ret < 0)
  		goto err;
  	if (ret == 0)
 -		return;
 +		return 0;
  	sz = btr_pool_get_buffer(sit->btrp, &buf);
  	if (sz == 0)
 -		return;
 +		return 0;
+ 	if (sit->must_set_nonblock_flag) {
+ 		ret = mark_fd_nonblocking(STDIN_FILENO);
+ 		if (ret < 0)
+ 			goto err;
+ 		sit->must_set_nonblock_flag = false;
+ 	}
  	/*
  	 * Do not use the maximal size to avoid having only a single buffer
  	 * reference for the whole pool. This is bad because if that single
@@@ -79,11 -87,13 +85,13 @@@
  	if (n > 0)
  		btr_add_output_pool(sit->btrp, n, sit->btrn);
  	if (ret >= 0)
 -		return;
 +		return 0;
  err:
  	btr_remove_node(&sit->btrn);
+ 	/* Revert to blocking mode if necessary. */
+ 	fcntl(STDIN_FILENO, F_SETFL, sit->fd_flags);
  	//btr_pool_free(sit->btrp);
 -	t->error = ret;
 +	return ret;
  }
  
  /**
diff --cc stdout.c
index abf3d06f,0cf4876d..cf33bf6d
--- a/stdout.c
+++ b/stdout.c
@@@ -58,10 -60,16 +58,16 @@@ static int stdout_post_select(struct sc
  	if (ret < 0)
  		goto out;
  	if (ret == 0)
 -		return;
 +		return 0;
  	if (!FD_ISSET(STDOUT_FILENO, &s->wfds))
 -		return;
 +		return 0;
  
+ 	if (sot->must_set_nonblock_flag) {
+ 		ret = mark_fd_nonblocking(STDOUT_FILENO);
+ 		if (ret < 0)
+ 			goto out;
+ 		sot->must_set_nonblock_flag = false;
+ 	}
  	for (;;) {
  		sz = btr_next_buffer(btrn, &buf);
  		if (sz == 0)
@@@ -72,9 -80,12 +78,12 @@@
  		btr_consume(btrn, ret);
  	}
  out:
- 	if (ret < 0)
+ 	if (ret < 0) {
  		btr_remove_node(&sot->btrn);
+ 		/* Revert to blocking mode if necessary. */
+ 		fcntl(STDOUT_FILENO, F_SETFL, sot->fd_flags);
+ 	}
 -	t->error = ret;
 +	return ret;
  }
  /**
   * Initialize a stdout task structure with default values.