/* Reads a buffer of file entry data from EWF file(s) * Returns a Python object holding the data if successful or NULL on error */ PyObject *pyewf_file_entry_read_buffer( pyewf_file_entry_t *pyewf_file_entry, PyObject *arguments, PyObject *keywords ) { libcerror_error_t *error = NULL; PyObject *string_object = NULL; static char *function = "pyewf_file_entry_read_buffer"; static char *keyword_list[] = { "size", NULL }; char *buffer = NULL; ssize_t read_count = 0; int read_size = -1; if( pyewf_file_entry == NULL ) { PyErr_Format( PyExc_TypeError, "%s: invalid pyewf file_entry.", function ); return( NULL ); } if( pyewf_file_entry->file_entry == NULL ) { PyErr_Format( PyExc_TypeError, "%s: invalid pyewf file_entry - missing libewf file_entry.", function ); return( NULL ); } if( PyArg_ParseTupleAndKeywords( arguments, keywords, "|i", keyword_list, &read_size ) == 0 ) { return( NULL ); } if( read_size < 0 ) { PyErr_Format( PyExc_ValueError, "%s: invalid argument read size value less than zero.", function ); return( NULL ); } /* Make sure the data fits into a memory buffer */ if( read_size > INT_MAX ) { PyErr_Format( PyExc_ValueError, "%s: invalid argument read size value exceeds maximum.", function ); return( NULL ); } #if PY_MAJOR_VERSION >= 3 string_object = PyBytes_FromStringAndSize( NULL, read_size ); buffer = PyBytes_AsString( string_object ); #else string_object = PyString_FromStringAndSize( NULL, read_size ); buffer = PyString_AsString( string_object ); #endif Py_BEGIN_ALLOW_THREADS read_count = libewf_file_entry_read_buffer( pyewf_file_entry->file_entry, (uint8_t *) buffer, (size_t) read_size, &error ); Py_END_ALLOW_THREADS if( read_count <= -1 ) { pyewf_error_raise( error, PyExc_IOError, "%s: unable to read data.", function ); libcerror_error_free( &error ); Py_DecRef( (PyObject *) string_object ); return( NULL ); } /* Need to resize the string here in case read_size was not fully read. */ #if PY_MAJOR_VERSION >= 3 if( _PyBytes_Resize( &string_object, (Py_ssize_t) read_count ) != 0 ) #else if( _PyString_Resize( &string_object, (Py_ssize_t) read_count ) != 0 ) #endif { Py_DecRef( (PyObject *) string_object ); return( NULL ); } return( string_object ); }
/* Reads a buffer of file entry data from EWF file(s) * Returns a Python object holding the data if successful or NULL on error */ PyObject *pyewf_file_entry_read_buffer( pyewf_file_entry_t *pyewf_file_entry, PyObject *arguments, PyObject *keywords ) { char error_string[ PYEWF_ERROR_STRING_SIZE ]; libcerror_error_t *error = NULL; PyObject *result_data = NULL; static char *function = "pyewf_file_entry_read_buffer"; static char *keyword_list[] = { "size", NULL }; ssize_t read_count = 0; int read_size = -1; if( pyewf_file_entry == NULL ) { PyErr_Format( PyExc_TypeError, "%s: invalid pyewf file_entry.", function ); return( NULL ); } if( pyewf_file_entry->file_entry == NULL ) { PyErr_Format( PyExc_TypeError, "%s: invalid pyewf file_entry - missing libewf file_entry.", function ); return( NULL ); } if( PyArg_ParseTupleAndKeywords( arguments, keywords, "|i", keyword_list, &read_size ) == 0 ) { return( NULL ); } if( read_size < 0 ) { PyErr_Format( PyExc_ValueError, "%s: invalid argument read size value less than zero.", function ); return( NULL ); } /* Make sure the data fits into a memory buffer */ if( read_size > INT_MAX ) { PyErr_Format( PyExc_ValueError, "%s: invalid argument read size value exceeds maximum.", function ); return( NULL ); } result_data = PyString_FromStringAndSize( NULL, read_size ); Py_BEGIN_ALLOW_THREADS read_count = libewf_file_entry_read_buffer( pyewf_file_entry->file_entry, PyString_AsString( result_data ), (size_t) read_size, &error ); Py_END_ALLOW_THREADS if( read_count != (ssize_t) read_size ) { if( libcerror_error_backtrace_sprint( error, error_string, PYEWF_ERROR_STRING_SIZE ) == -1 ) { PyErr_Format( PyExc_IOError, "%s: unable to read data.", function ); } else { PyErr_Format( PyExc_IOError, "%s: unable to read data.\n%s", function, error_string ); } libcerror_error_free( &error ); return( NULL ); } return( result_data ); }