diff --git a/src/bin/debug/strace/NetworkTypes.cpp b/src/bin/debug/strace/NetworkTypes.cpp index 80f042d1be..3b8b6bdafb 100644 --- a/src/bin/debug/strace/NetworkTypes.cpp +++ b/src/bin/debug/strace/NetworkTypes.cpp @@ -51,6 +51,52 @@ format_number(uint32 value) } +static string +format_iovecs(Context &context, const iovec *iov, int iovlen) +{ + if (iov == NULL && iovlen == 0) + return "(empty)"; + + iovec vecs[iovlen]; + int32 bytesRead; + + string r = "["; + status_t err = context.Reader().Read((void*)iov, vecs, sizeof(vecs), bytesRead); + if (err != B_OK) { + r += context.FormatPointer(iov); + r += ", " + context.FormatSigned(iovlen); + } else { + for (int i = 0; i < iovlen; i++) { + if (i > 0) + r += ", "; + r += "{iov_base=" + context.FormatPointer(vecs[i].iov_base); + r += ", iov_len=" + context.FormatUnsigned(vecs[i].iov_len); + r += "}"; + } + } + return r + "]"; +} + + +template<> +string +TypeHandlerImpl::GetParameterValue(Context &context, Parameter *param, + const void *address) +{ + Parameter *size = context.GetNextSibling(param); + return format_iovecs(context, (const iovec*)*(void **)address, + context.ReadValue(size)); +} + + +template<> +string +TypeHandlerImpl::GetReturnValue(Context &context, uint64 value) +{ + return context.FormatPointer((void *)value); +} + + static string read_fdset(Context &context, void *data) { @@ -731,6 +777,7 @@ class SpecializedPointerTypeHandler : public TypeHandler { return new SpecializedPointerTypeHandler(); \ } +DEFINE_TYPE(iovec_ptr, iovec *); DEFINE_TYPE(fdset_ptr, fd_set *); POINTER_TYPE(flock_ptr, flock); POINTER_TYPE(ifconf_ptr, ifconf); diff --git a/src/bin/debug/strace/TypeHandler.cpp b/src/bin/debug/strace/TypeHandler.cpp index 54ea04f4cf..c3e69cd0d2 100644 --- a/src/bin/debug/strace/TypeHandler.cpp +++ b/src/bin/debug/strace/TypeHandler.cpp @@ -126,56 +126,6 @@ create_status_t_type_handler() } -// iovec* -string -format_iovecs(Context &context, const iovec *iov, int iovlen) -{ - if (iov == NULL && iovlen == 0) - return "(empty)"; - - iovec vecs[iovlen]; - int32 bytesRead; - - string r = "["; - status_t err = context.Reader().Read((void*)iov, vecs, sizeof(vecs), bytesRead); - if (err != B_OK) { - r += context.FormatPointer(iov); - r += ", " + context.FormatSigned(iovlen); - } else { - for (int i = 0; i < iovlen; i++) { - if (i > 0) - r += ", "; - r += "{iov_base=" + context.FormatPointer(vecs[i].iov_base); - r += ", iov_len=" + context.FormatUnsigned(vecs[i].iov_len); - r += "}"; - } - } - return r + "]"; -} - -class IovecTypeHandler : public TypeHandler { -public: - IovecTypeHandler() {} - - string GetParameterValue(Context &context, Parameter *param, const void *address) - { - Parameter *size = context.GetNextSibling(param); - return format_iovecs(context, (const iovec*)*(void **)address, - context.ReadValue(size)); - } - - string GetReturnValue(Context &context, uint64 value) - { - return context.FormatPointer((void *)value); - } -}; - -TypeHandler * -create_iovec_ptr_type_handler() -{ - return new IovecTypeHandler; -} - // read_string static string diff --git a/src/bin/debug/strace/TypeHandler.h b/src/bin/debug/strace/TypeHandler.h index 0e2abeafff..15057b179b 100644 --- a/src/bin/debug/strace/TypeHandler.h +++ b/src/bin/debug/strace/TypeHandler.h @@ -100,8 +100,6 @@ extern TypeHandler *create_pointer_type_handler(); extern TypeHandler *create_string_type_handler(); extern TypeHandler *create_status_t_type_handler(); -extern string format_iovecs(Context &context, const struct iovec *iov, int iovlen); - // specialization for "const char*" template<> struct TypeHandlerFactory {