Index: ossp-pkg/sio/sio.c RCS File: /v/ossp/cvs/ossp-pkg/sio/sio.c,v rcsdiff -q -kk '-r1.14' '-r1.15' -u '/v/ossp/cvs/ossp-pkg/sio/sio.c,v' 2>/dev/null --- sio.c 2002/11/28 16:29:37 1.14 +++ sio.c 2002/11/28 16:39:40 1.15 @@ -96,7 +96,6 @@ sio_labelnum_t label_eof; int eof_flag; /* accumulating flags */ int error_flag; - char *dst; /* write pointer for sio_read */ }; /* @@ -659,32 +658,6 @@ } /* - * callback used by sio_read to scan through - * reader assembly line - * - * data chunks are copied to the destination buffer - * error chunks set the error flag - * eof chunks set the eof flag - */ -static al_rc_t sio_readchunk(al_chunk_t *alc, void *u) -{ - sio_t *sio = (sio_t *)u; - size_t len; - - if (al_same_label(alc, SIO_LABEL_DATA(sio))) { - len = al_chunk_len(alc); - memcpy(sio->dst, al_chunk_ptr(alc,0), len); - sio->dst += len; - } else if (al_same_label(alc, SIO_LABEL_ERROR(sio))) { - sio->error_flag = 1; - } else if (al_same_label(alc, SIO_LABEL_EOF(sio))) { - sio->eof_flag = 1; - } - - return AL_OK; -} - -/* * retrieve data from the pipe into a buffer much like read() * * handles error and eof signals @@ -702,11 +675,18 @@ arc = al_create(&al); if (arc != AL_OK) return SIO_RC(SIO_ERR_INT); - rc = sio_input(sio, al, n, NULL); - if (rc == SIO_OK) { - sio->dst = dst; - al_traverse_cb(al, 0, n, AL_FORWARD, NULL, sio_readchunk, (void*)sio); - *actualp = sio->dst - dst; + rc = sio_input(sio, al, n, SIO_LABEL_DATA(sio)); + if (rc == SIO_OK && al_bytes(al) > 0) + al_flatten(al, 0, n, AL_FORWARD, NULL, dst, actualp); + else { + rc = sio_input(sio, al, n, SIO_LABEL_ERROR(sio)); + if (rc == SIO_OK && al_bytes(al) > 0) + sio->error_flag = 1; + else { + rc = sio_input(sio, al, n, SIO_LABEL_EOF(sio)); + if (rc == SIO_OK && al_bytes(al) > 0) + sio->eof_flag = 1; + } } arc = al_destroy(al);