diff --git a/tsk3/img/img_open.c b/tsk3/img/img_open.c index fbd8f5b3384793e55665841992df3dabf759b69c..f44d13ba6762aa703805d5777ece69cc17f38273 100644 --- a/tsk3/img/img_open.c +++ b/tsk3/img/img_open.c @@ -168,90 +168,116 @@ tsk_img_open(int num_img, if (img_set != NULL) return img_set; - /* We'll use the (possibly split) raw format. If the user - * specifies only one file and does not want subsequent - * segments automatically detected, they'll need to specify - * TSK_IMG_TYPE_RAW_SING. */ - if ((img_info = split_open(num_img, images, a_ssize)) != NULL) { - return img_info; + // @@@ NEED to modify this so that we find addtl. split images. + // REMOVE NOTION of sing / split RAW. Just a single object. + /* We'll use the raw format */ + if (num_img == 1) { + if ((img_info = raw_open(images[0], a_ssize)) != NULL) { + return img_info; + } + else if (tsk_error_get_errno() != 0) { + return NULL; + } } - else if (tsk_error_get_errno() != 0) { - return NULL; + else { + if ((img_info = + split_open(num_img, images, a_ssize)) != NULL) { + return img_info; + } + else if (tsk_error_get_errno() != 0) { + return NULL; + + } } +#if 0 + // Commented out until split_open has all of the + // platform-specific file size and opening routines + + /* We'll use the (possibly split) raw format. If the user + * specifies only one file and does not want subsequent + * segments automatically detected, they'll need to specify + * TSK_IMG_TYPE_RAW_SING. */ + if ((img_info = split_open(num_img, images, a_ssize)) != NULL) { + return img_info; + } + else if (tsk_error_get_errno() != 0) { + return NULL; + } +#endif - /* To improve the error message, verify the file can be read. */ - if (TSTAT(images[0], &stat_buf) < 0) { - // special case to handle windows objects + /* To improve the error message, verify the file can be read. */ + if (TSTAT(images[0], &stat_buf) < 0) { + // special case to handle windows objects #if defined(TSK_WIN32) || defined(__CYGWIN__) - if (TSTRNCMP(_TSK_T("\\\\.\\"), images[0], 4) == 0) { - if (tsk_verbose) - TFPRINTF(stderr, - _TSK_T - ("tsk_img_open: Ignoring stat error because of windows object: %s\n"), - images[0]); - } - else { + if (TSTRNCMP(_TSK_T("\\\\.\\"), images[0], 4) == 0) { + if (tsk_verbose) + TFPRINTF(stderr, + _TSK_T + ("tsk_img_open: Ignoring stat error because of windows object: %s\n"), + images[0]); + } + else { #endif - tsk_error_reset(); - tsk_error_set_errno(TSK_ERR_IMG_STAT); - tsk_error_set_errstr("%" PRIttocTSK " : %s", - images[0], strerror(errno)); - return NULL; + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_IMG_STAT); + tsk_error_set_errstr("%" PRIttocTSK " : %s", + images[0], strerror(errno)); + return NULL; #if defined(TSK_WIN32) || defined(__CYGWIN__) - } + } #endif + } + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_IMG_UNKTYPE); + return NULL; } - tsk_error_reset(); - tsk_error_set_errno(TSK_ERR_IMG_UNKTYPE); - return NULL; - } - /* - * Type values - */ + /* + * Type values + */ - switch (type) { - case TSK_IMG_TYPE_RAW_SING: + switch (type) { + case TSK_IMG_TYPE_RAW_SING: - /* If we have more than one image name, and raw was the only - * type given, then use split */ - if (num_img > 1) - img_info = split_open(num_img, images, a_ssize); - else - img_info = raw_open(images[0], a_ssize); - break; + /* If we have more than one image name, and raw was the only + * type given, then use split */ + if (num_img > 1) + img_info = split_open(num_img, images, a_ssize); + else + img_info = raw_open(images[0], a_ssize); + break; - case TSK_IMG_TYPE_RAW_SPLIT: + case TSK_IMG_TYPE_RAW_SPLIT: - /* Even if only one image file is given, assume we should - * look for more segments */ - img_info = split_open(num_img, images, a_ssize); - break; + /* Even if only one image file is given, assume we should + * look for more segments */ + img_info = split_open(num_img, images, a_ssize); + break; #if HAVE_LIBAFFLIB - case TSK_IMG_TYPE_AFF_AFF: - case TSK_IMG_TYPE_AFF_AFD: - case TSK_IMG_TYPE_AFF_AFM: - case TSK_IMG_TYPE_AFF_ANY: - img_info = aff_open(images, a_ssize); - break; + case TSK_IMG_TYPE_AFF_AFF: + case TSK_IMG_TYPE_AFF_AFD: + case TSK_IMG_TYPE_AFF_AFM: + case TSK_IMG_TYPE_AFF_ANY: + img_info = aff_open(images, a_ssize); + break; #endif #if HAVE_LIBEWF - case TSK_IMG_TYPE_EWF_EWF: - img_info = ewf_open(num_img, images, a_ssize); - break; + case TSK_IMG_TYPE_EWF_EWF: + img_info = ewf_open(num_img, images, a_ssize); + break; #endif - default: - tsk_error_reset(); - tsk_error_set_errno(TSK_ERR_IMG_UNSUPTYPE); - tsk_error_set_errstr("%d", type); - return NULL; - } + default: + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_IMG_UNSUPTYPE); + tsk_error_set_errstr("%d", type); + return NULL; + } - return img_info; -} + return img_info; + } /** @@ -267,13 +293,11 @@ tsk_img_open(int num_img, * * @return Pointer to TSK_IMG_INFO or NULL on error */ -TSK_IMG_INFO * -tsk_img_open_utf8_sing(const char *a_image, TSK_IMG_TYPE_ENUM type, - unsigned int a_ssize) -{ - const char *const a = a_image; - return tsk_img_open_utf8(1, &a, type, a_ssize); -} + TSK_IMG_INFO *tsk_img_open_utf8_sing(const char *a_image, + TSK_IMG_TYPE_ENUM type, unsigned int a_ssize) { + const char *const a = a_image; + return tsk_img_open_utf8(1, &a, type, a_ssize); + } /** @@ -290,72 +314,71 @@ tsk_img_open_utf8_sing(const char *a_image, TSK_IMG_TYPE_ENUM type, * * @return Pointer to TSK_IMG_INFO or NULL on error */ -TSK_IMG_INFO * -tsk_img_open_utf8(int num_img, const char *const images[], - TSK_IMG_TYPE_ENUM type, unsigned int a_ssize) -{ + TSK_IMG_INFO *tsk_img_open_utf8(int num_img, + const char *const images[], TSK_IMG_TYPE_ENUM type, + unsigned int a_ssize) { #ifdef TSK_WIN32 - { - /* Note that there is an assumption in this code that wchar_t is 2-bytes. - * this is a correct assumption for Windows, but not for all systems... */ - - TSK_IMG_INFO *retval = NULL; - wchar_t **images16; - int i; - - // allocate a buffer to store the UTF-16 version of the images. - if ((images16 = - (wchar_t **) tsk_malloc(sizeof(wchar_t *) * num_img)) == - NULL) { - return NULL; - } - - for (i = 0; i < num_img; i++) { - size_t ilen; - UTF16 *utf16; - UTF8 *utf8; - TSKConversionResult retval2; - - // we allocate the buffer with the same number of chars as the UTF-8 length - ilen = strlen(images[i]); - if ((images16[i] = - (wchar_t *) tsk_malloc((ilen + - 1) * sizeof(wchar_t))) == NULL) { - goto tsk_utf8_cleanup; + { + /* Note that there is an assumption in this code that wchar_t is 2-bytes. + * this is a correct assumption for Windows, but not for all systems... */ + + TSK_IMG_INFO *retval = NULL; + wchar_t **images16; + int i; + + // allocate a buffer to store the UTF-16 version of the images. + if ((images16 = + (wchar_t **) tsk_malloc(sizeof(wchar_t *) * + num_img)) == NULL) { + return NULL; } - utf8 = (UTF8 *) images[i]; - utf16 = (UTF16 *) images16[i]; - - retval2 = - tsk_UTF8toUTF16((const UTF8 **) &utf8, &utf8[ilen], - &utf16, &utf16[ilen], TSKlenientConversion); - if (retval2 != TSKconversionOK) { - tsk_error_set_errno(TSK_ERR_IMG_CONVERT); - tsk_error_set_errstr - ("tsk_img_open_utf8: Error converting image %s %d", - images[i], retval2); - goto tsk_utf8_cleanup; + for (i = 0; i < num_img; i++) { + size_t ilen; + UTF16 *utf16; + UTF8 *utf8; + TSKConversionResult retval2; + + // we allocate the buffer with the same number of chars as the UTF-8 length + ilen = strlen(images[i]); + if ((images16[i] = + (wchar_t *) tsk_malloc((ilen + + 1) * sizeof(wchar_t))) == NULL) { + goto tsk_utf8_cleanup; + } + + utf8 = (UTF8 *) images[i]; + utf16 = (UTF16 *) images16[i]; + + retval2 = + tsk_UTF8toUTF16((const UTF8 **) &utf8, &utf8[ilen], + &utf16, &utf16[ilen], TSKlenientConversion); + if (retval2 != TSKconversionOK) { + tsk_error_set_errno(TSK_ERR_IMG_CONVERT); + tsk_error_set_errstr + ("tsk_img_open_utf8: Error converting image %s %d", + images[i], retval2); + goto tsk_utf8_cleanup; + } + *utf16 = '\0'; } - *utf16 = '\0'; - } - retval = tsk_img_open(num_img, images16, type, a_ssize); + retval = tsk_img_open(num_img, images16, type, a_ssize); - // free up the memory - tsk_utf8_cleanup: - for (i = 0; i < num_img; i++) { - if (images16[i]) - free(images16[i]); - } - free(images16); + // free up the memory + tsk_utf8_cleanup: + for (i = 0; i < num_img; i++) { + if (images16[i]) + free(images16[i]); + } + free(images16); - return retval; - } + return retval; + } #else - return tsk_img_open(num_img, images, type, a_ssize); + return tsk_img_open(num_img, images, type, a_ssize); #endif -} + } #if 0 @@ -364,80 +387,80 @@ tsk_img_open_utf8(int num_img, const char *const images[], * UTF-32 to UTF-8 support as well. If the goal is to provide a standard UTF-16 * interface, we should use another type besiddes wchar_t. */ -TSK_IMG_INFO * -tsk_img_open_utf16(int num_img, - wchar_t * const images[], TSK_IMG_TYPE_ENUM type) -{ + TSK_IMG_INFO *tsk_img_open_utf16(int num_img, + wchar_t * const images[], TSK_IMG_TYPE_ENUM type) { #if TSK_WIN32 - return tsk_img_open(num_img, images, type); + return tsk_img_open(num_img, images, type); #else - { - TSK_IMG_INFO *retval; - int i; - char **images8; - TSK_ENDIAN_ENUM endian; - uint16_t tmp1; - - /* The unicode conversio routines are primarily to convert Unicode - * in file and volume system images, which means they could be in - * an endian ordering different from the local one. We need to figure - * out our local ordering so we can give it the right flag */ - tmp1 = 1; - if (tsk_guess_end_u16(&endian, (uint8_t *) & tmp1, 1)) { - // @@@@ - return NULL; - } - - - // convert UTF16 to UTF8 - if ((images8 = - (char **) tsk_malloc(sizeof(char *) * num_img)) == NULL) { - return NULL; - } - - for (i = 0; i < num_img; i++) { - size_t ilen; - UTF16 *utf16; - UTF8 *utf8; - TSKConversionResult retval2; - + { + TSK_IMG_INFO *retval; + int i; + char **images8; + TSK_ENDIAN_ENUM endian; + uint16_t tmp1; + + /* The unicode conversio routines are primarily to convert Unicode + * in file and volume system images, which means they could be in + * an endian ordering different from the local one. We need to figure + * out our local ordering so we can give it the right flag */ + tmp1 = 1; + if (tsk_guess_end_u16(&endian, (uint8_t *) & tmp1, 1)) { + // @@@@ + return NULL; + } - // we allocate the buffer to be four times the utf-16 length. - ilen = wcslen(images[i]); - ilen <<= 2; - if ((images8[i] = (char *) tsk_malloc(ilen)) == NULL) { + // convert UTF16 to UTF8 + if ((images8 = + (char **) tsk_malloc(sizeof(char *) * num_img)) == + NULL) { return NULL; } - utf16 = (UTF16 *) images[i]; - utf8 = (UTF8 *) images8[i]; - - retval2 = - tsk_UTF16toUTF8_lclorder((const UTF16 **) &utf16, - &utf16[wcslen(images[i]) + 1], &utf8, - &utf8[ilen + 1], TSKlenientConversion); - if (retval2 != TSKconversionOK) { - tsk_error_set_errno(TSK_ERR_IMG_CONVERT); - tsk_error_set_errstr - ("tsk_img_open_utf16: Error converting image %d %d", i, - retval2); - return NULL; + for (i = 0; i < num_img; i++) { + size_t ilen; + UTF16 *utf16; + UTF8 *utf8; + TSKConversionResult retval2; + + + // we allocate the buffer to be four times the utf-16 length. + ilen = wcslen(images[i]); + ilen <<= 2; + + if ((images8[i] = (char *) tsk_malloc(ilen)) == NULL) { + return NULL; + } + + utf16 = (UTF16 *) images[i]; + utf8 = (UTF8 *) images8[i]; + + retval2 = + tsk_UTF16toUTF8_lclorder((const UTF16 **) &utf16, + &utf16[wcslen(images[i]) + 1], &utf8, + &utf8[ilen + 1], TSKlenientConversion); + if (retval2 != TSKconversionOK) { + tsk_error_set_errno(TSK_ERR_IMG_CONVERT); + tsk_error_set_errstr + ("tsk_img_open_utf16: Error converting image %d %d", + i, retval2); + return NULL; + } + *utf8 = '\0'; } - *utf8 = '\0'; - } - retval = tsk_img_open(num_img, (const TSK_TCHAR **) images8, type); + retval = + tsk_img_open(num_img, (const TSK_TCHAR **) images8, type); - for (i = 0; i < num_img; i++) { - free(images8[i]); - } - free(images8); + for (i = 0; i < num_img; i++) { + free(images8[i]); + } + free(images8); - return retval; - } + return retval; + } #endif -} + } #endif @@ -448,11 +471,10 @@ tsk_img_open_utf16(int num_img, * Closes an open disk image. * @param a_img_info Pointer to the open disk image structure. */ -void -tsk_img_close(TSK_IMG_INFO * a_img_info) -{ - if (a_img_info == NULL) { - return; + void + tsk_img_close(TSK_IMG_INFO * a_img_info) { + if (a_img_info == NULL) { + return; + } + a_img_info->close(a_img_info); } - a_img_info->close(a_img_info); -}