On Thu, 5 Jul 2001, Bill Stoddard wrote: > If you perform a read on a file and don't specifiy an offset, then you > should assume you will be reading from the current file pointer > maintained by the system (or by apr_file_t in the XTHREAD case). If > you have an apr_file_t open and you are reading from the file > someplace else using the fd, then you are screwed. You shouldn't be > mixing apr_file_* calls with non apr_file_* calls on the same fd. If > you insist on doing this, then you need to ensure that your non > apr_file_* calls leaves the file pointer in the proper state when they > are done. You definitely shouldn't be horking up apr_file* calls to > defend against this case.
[scratching head] I don't think we're talking about mixing apr_file_* and non apr_file_* calls. A file bucket *always* specifies an offset [although sometimes that offset might be 0]. Consider this: apr_file_t *f = ... apr_bucket *a, *b; a = apr_bucket_file_create(f, 0, len, pool); b = apr_bucket_split(a, 500); APR_BUCKET_INSERT_BEFORE(a, b); Now you have two file buckets referencing the same apr_file_t, one at offset 0 and one at offset 500. The one at offset 500 is BEFORE the one at offset 0 in the brigade. When you read from the buckets in the brigade (assume for a minute that !APR_HAS_MMAP), you get to the offset==500 bucket first, seek to offset 500, and read from there. Then you get to the offset==0 bucket, so you sure as hell better seek back to offset 0 before you read! Not doing so is a bug in the file buckets code, not in APR. If you want to combine the apr_file_seek/apr_file_read calls, that's fine, but you'll STILL need to have removed this offset-test conditional. So Ryan's patch is a correct fix either way, not just a hack. --Cliff -------------------------------------------------------------- Cliff Woolley [EMAIL PROTECTED] Charlottesville, VA