diff options
Diffstat (limited to 'indra/llcommon/llapr.cpp')
-rw-r--r-- | indra/llcommon/llapr.cpp | 174 |
1 files changed, 166 insertions, 8 deletions
diff --git a/indra/llcommon/llapr.cpp b/indra/llcommon/llapr.cpp index a7fc6a40a7..bf6a4d1b21 100644 --- a/indra/llcommon/llapr.cpp +++ b/indra/llcommon/llapr.cpp @@ -103,11 +103,13 @@ void ll_apr_assert_status(apr_status_t status) llassert(ll_apr_warn_status(status) == false); } -apr_file_t* ll_apr_file_open(const LLString& filename, apr_int32_t flags, S32* sizep) +// File I/O +apr_file_t* ll_apr_file_open(const LLString& filename, apr_int32_t flags, S32* sizep, apr_pool_t* pool) { apr_file_t* apr_file; apr_status_t s; - s = apr_file_open(&apr_file, filename.c_str(), flags, APR_OS_DEFAULT, gAPRPoolp); + if (pool == NULL) pool = gAPRPoolp; + s = apr_file_open(&apr_file, filename.c_str(), flags, APR_OS_DEFAULT, pool); if (s != APR_SUCCESS) { if (sizep) @@ -123,6 +125,7 @@ apr_file_t* ll_apr_file_open(const LLString& filename, apr_int32_t flags, S32* s apr_off_t offset = 0; if (apr_file_seek(apr_file, APR_END, &offset) == APR_SUCCESS) { + llassert_always(offset <= 0x7fffffff); file_size = (S32)offset; offset = 0; apr_file_seek(apr_file, APR_SET, &offset); @@ -132,6 +135,18 @@ apr_file_t* ll_apr_file_open(const LLString& filename, apr_int32_t flags, S32* s return apr_file; } +apr_file_t* ll_apr_file_open(const LLString& filename, apr_int32_t flags, S32* sizep) +{ + return ll_apr_file_open(filename, flags, sizep, NULL); +} +apr_file_t* ll_apr_file_open(const LLString& filename, apr_int32_t flags, apr_pool_t* pool) +{ + return ll_apr_file_open(filename, flags, NULL, pool); +} +apr_file_t* ll_apr_file_open(const LLString& filename, apr_int32_t flags) +{ + return ll_apr_file_open(filename, flags, NULL, NULL); +} S32 ll_apr_file_read(apr_file_t* apr_file, void *buf, S32 nbytes) { @@ -143,10 +158,37 @@ S32 ll_apr_file_read(apr_file_t* apr_file, void *buf, S32 nbytes) } else { + llassert_always(sz <= 0x7fffffff); return (S32)sz; } } +S32 ll_apr_file_read_ex(const LLString& filename, apr_pool_t* pool, void *buf, S32 offset, S32 nbytes) +{ + if (pool == NULL) pool = gAPRPoolp; + apr_file_t* filep = ll_apr_file_open(filename, APR_READ|APR_BINARY, pool); + if (!filep) + { + return 0; + } + S32 off; + if (offset < 0) + off = ll_apr_file_seek(filep, APR_END, 0); + else + off = ll_apr_file_seek(filep, APR_SET, offset); + S32 bytes_read; + if (off < 0) + { + bytes_read = 0; + } + else + { + bytes_read = ll_apr_file_read(filep, buf, nbytes ); + } + apr_file_close(filep); + + return bytes_read; +} S32 ll_apr_file_write(apr_file_t* apr_file, const void *buf, S32 nbytes) { @@ -158,28 +200,73 @@ S32 ll_apr_file_write(apr_file_t* apr_file, const void *buf, S32 nbytes) } else { + llassert_always(sz <= 0x7fffffff); return (S32)sz; } } +S32 ll_apr_file_write_ex(const LLString& filename, apr_pool_t* pool, void *buf, S32 offset, S32 nbytes) +{ + if (pool == NULL) pool = gAPRPoolp; + apr_int32_t flags = APR_CREATE|APR_WRITE|APR_BINARY; + if (offset < 0) + { + flags |= APR_APPEND; + offset = 0; + } + apr_file_t* filep = ll_apr_file_open(filename, flags, pool); + if (!filep) + { + return 0; + } + if (offset > 0) + { + offset = ll_apr_file_seek(filep, APR_SET, offset); + } + S32 bytes_written; + if (offset < 0) + { + bytes_written = 0; + } + else + { + bytes_written = ll_apr_file_write(filep, buf, nbytes ); + } + apr_file_close(filep); + + return bytes_written; +} + S32 ll_apr_file_seek(apr_file_t* apr_file, apr_seek_where_t where, S32 offset) { - apr_off_t apr_offset = offset; - apr_status_t s = apr_file_seek(apr_file, where, &apr_offset); + apr_status_t s; + apr_off_t apr_offset; + if (offset >= 0) + { + apr_offset = (apr_off_t)offset; + s = apr_file_seek(apr_file, where, &apr_offset); + } + else + { + apr_offset = 0; + s = apr_file_seek(apr_file, APR_END, &apr_offset); + } if (s != APR_SUCCESS) { return -1; } else { + llassert_always(apr_offset <= 0x7fffffff); return (S32)apr_offset; } } -bool ll_apr_file_remove(const LLString& filename) +bool ll_apr_file_remove(const LLString& filename, apr_pool_t* pool) { apr_status_t s; - s = apr_file_remove(filename.c_str(), gAPRPoolp); + if (pool == NULL) pool = gAPRPoolp; + s = apr_file_remove(filename.c_str(), pool); if (s != APR_SUCCESS) { llwarns << "ll_apr_file_remove failed on file: " << filename << llendl; @@ -188,10 +275,11 @@ bool ll_apr_file_remove(const LLString& filename) return true; } -bool ll_apr_file_rename(const LLString& filename, const LLString& newname) +bool ll_apr_file_rename(const LLString& filename, const LLString& newname, apr_pool_t* pool) { apr_status_t s; - s = apr_file_rename(filename.c_str(), newname.c_str(), gAPRPoolp); + if (pool == NULL) pool = gAPRPoolp; + s = apr_file_rename(filename.c_str(), newname.c_str(), pool); if (s != APR_SUCCESS) { llwarns << "ll_apr_file_rename failed on file: " << filename << llendl; @@ -199,3 +287,73 @@ bool ll_apr_file_rename(const LLString& filename, const LLString& newname) } return true; } + +bool ll_apr_file_exists(const LLString& filename, apr_pool_t* pool) +{ + apr_file_t* apr_file; + apr_status_t s; + if (pool == NULL) pool = gAPRPoolp; + s = apr_file_open(&apr_file, filename.c_str(), APR_READ, APR_OS_DEFAULT, pool); + if (s != APR_SUCCESS || !apr_file) + { + return false; + } + else + { + apr_file_close(apr_file); + return true; + } +} + +S32 ll_apr_file_size(const LLString& filename, apr_pool_t* pool) +{ + apr_file_t* apr_file; + apr_finfo_t info; + apr_status_t s; + if (pool == NULL) pool = gAPRPoolp; + s = apr_file_open(&apr_file, filename.c_str(), APR_READ, APR_OS_DEFAULT, pool); + if (s != APR_SUCCESS || !apr_file) + { + return 0; + } + else + { + apr_status_t s = apr_file_info_get(&info, APR_FINFO_SIZE, apr_file); + apr_file_close(apr_file); + if (s == APR_SUCCESS) + { + return (S32)info.size; + } + else + { + return 0; + } + } +} + +bool ll_apr_dir_make(const LLString& dirname, apr_pool_t* pool) +{ + apr_status_t s; + if (pool == NULL) pool = gAPRPoolp; + s = apr_dir_make(dirname.c_str(), APR_FPROT_OS_DEFAULT, pool); + if (s != APR_SUCCESS) + { + llwarns << "ll_apr_file_remove failed on file: " << dirname << llendl; + return false; + } + return true; +} + +bool ll_apr_dir_remove(const LLString& dirname, apr_pool_t* pool) +{ + apr_status_t s; + if (pool == NULL) pool = gAPRPoolp; + s = apr_file_remove(dirname.c_str(), pool); + if (s != APR_SUCCESS) + { + llwarns << "ll_apr_file_remove failed on file: " << dirname << llendl; + return false; + } + return true; +} + |