<br><br><div class="gmail_quote">On Sun, Mar 21, 2010 at 12:45 AM, Matthew Mondor <span dir="ltr"><<a href="mailto:mm_lists@pulsar-zone.net">mm_lists@pulsar-zone.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
On Sat, 20 Mar 2010 19:35:46 -0400<br>
<div class="im">Matthew Mondor <<a href="mailto:mm_lists@pulsar-zone.net">mm_lists@pulsar-zone.net</a>> wrote:<br>
<br>
</div><div class="im">> I think that this is different, for the stream now works fine, and an<br>
> error is signalled properly when fdopen(2) fails...  So here fdopen(2)<br>
> succeeded, the stream was created and I could read-char and read-line<br>
> from it, but the functions which now crash are the ones to query the<br>
> underlaying file descriptor afterwards (si:file-stream-fd,<br>
> gray:stream-file-descriptor).<br>
<br>
</div>When I tested si:file-stream-fd the intention was to verify if it works<br>
so that I could possibly implement an alternative function which<br>
instead of using fileno(3) on the file handle could possibly report the<br>
fh error/eof state.  Because unfortunately, FORCE-OUTPUT will not<br>
report at all why it stopped flushing if an error occurred, so I should<br>
either be able to use fflush(3) from C and/or ferror(3)/feof(3), but<br>
for that I need the pointer to the underlaying stdio FILE stream.</blockquote><div><br></div><div>FORCE-OUTPUT (on streams that are not file streams) does report errors. It looks at the output of fflush() and when this is EOF, it calls the following function, which inspects the error condition and _always_ reports an error unless the error was an interrupt, in which case it retries.</div>
<div><br></div><div>static int</div><div>restartable_io_error(cl_object strm)</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>cl_env_ptr the_env = ecl_process_env();</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>volatile int old_errno = errno;</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>/* ecl_disable_interrupts(); ** done by caller */</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>maybe_clearerr(strm);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>ecl_enable_interrupts_env(the_env);</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>if (old_errno == EINTR) {</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>return 1;</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>} else {</div>
<div><span class="Apple-tab-span" style="white-space:pre">              </span>FElibc_error("Read or write operation to stream ~S signaled an error.",</div><div><span class="Apple-tab-span" style="white-space:pre">                    </span>     1, strm);</div>
<div><span class="Apple-tab-span" style="white-space:pre">              </span>return 0;</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>}</div><div>}</div><div> </div></div><br>-- <br>Instituto de Física Fundamental, CSIC<br>
c/ Serrano, 113b, Madrid 28006 (Spain) <br><a href="http://tream.dreamhosters.com">http://tream.dreamhosters.com</a><br>