diff options
author | Dmitry V. Levin <ldv@altlinux.org> | 2020-07-08 08:00:00 +0000 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2020-07-08 08:00:00 +0000 |
commit | 1253dbc1efb35238347ac16b58874b1514bb77ff (patch) | |
tree | c155ece8cdf3371abddf2f7d0d3fc146b0f92ad0 | |
parent | ac50c254ce492be16777f54929f9a73848a5c02b (diff) | |
download | strace-1253dbc1efb35238347ac16b58874b1514bb77ff.tar.gz |
loop: factor out print_loop_info64
It is going to be used to implement LOOP_CONFIGURE decoding.
* loop.c (print_loop_info64): New function.
(decode_loop_info64): Use it.
-rw-r--r-- | loop.c | 54 |
1 files changed, 29 insertions, 25 deletions
@@ -77,53 +77,57 @@ decode_loop_info(struct tcb *const tcp, const kernel_ulong_t addr) } static void -decode_loop_info64(struct tcb *const tcp, const kernel_ulong_t addr) +print_loop_info64(struct tcb *const tcp, const struct loop_info64 *const info64) { - struct loop_info64 info64; - - tprints(", "); - if (umove_or_printaddr(tcp, addr, &info64)) - return; - if (!abbrev(tcp)) { - PRINT_FIELD_DEV("{", info64, lo_device); - PRINT_FIELD_U(", ", info64, lo_inode); - PRINT_FIELD_DEV(", ", info64, lo_rdevice); - PRINT_FIELD_X(", ", info64, lo_offset); - PRINT_FIELD_U(", ", info64, lo_sizelimit); - PRINT_FIELD_U(", ", info64, lo_number); + PRINT_FIELD_DEV("{", *info64, lo_device); + PRINT_FIELD_U(", ", *info64, lo_inode); + PRINT_FIELD_DEV(", ", *info64, lo_rdevice); + PRINT_FIELD_X(", ", *info64, lo_offset); + PRINT_FIELD_U(", ", *info64, lo_sizelimit); + PRINT_FIELD_U(", ", *info64, lo_number); } else { - PRINT_FIELD_X("{", info64, lo_offset); - PRINT_FIELD_U(", ", info64, lo_number); + PRINT_FIELD_X("{", *info64, lo_offset); + PRINT_FIELD_U(", ", *info64, lo_number); } - if (!abbrev(tcp) || info64.lo_encrypt_type != LO_CRYPT_NONE) { - PRINT_FIELD_XVAL(", ", info64, lo_encrypt_type, + if (!abbrev(tcp) || info64->lo_encrypt_type != LO_CRYPT_NONE) { + PRINT_FIELD_XVAL(", ", *info64, lo_encrypt_type, loop_crypt_type_options, "LO_CRYPT_???"); - PRINT_FIELD_U(", ", info64, lo_encrypt_key_size); + PRINT_FIELD_U(", ", *info64, lo_encrypt_key_size); } - PRINT_FIELD_FLAGS(", ", info64, lo_flags, + PRINT_FIELD_FLAGS(", ", *info64, lo_flags, loop_flags_options, "LO_FLAGS_???"); - PRINT_FIELD_CSTRING(", ", info64, lo_file_name); + PRINT_FIELD_CSTRING(", ", *info64, lo_file_name); - if (!abbrev(tcp) || info64.lo_encrypt_type != LO_CRYPT_NONE) { - PRINT_FIELD_CSTRING(", ", info64, lo_crypt_name); + if (!abbrev(tcp) || info64->lo_encrypt_type != LO_CRYPT_NONE) { + PRINT_FIELD_CSTRING(", ", *info64, lo_crypt_name); const unsigned int lo_encrypt_key_size = - MIN((unsigned) info64.lo_encrypt_key_size, LO_KEY_SIZE); - PRINT_FIELD_STRING(", ", info64, lo_encrypt_key, + MIN((unsigned) info64->lo_encrypt_key_size, LO_KEY_SIZE); + PRINT_FIELD_STRING(", ", *info64, lo_encrypt_key, lo_encrypt_key_size, 0); } if (!abbrev(tcp)) - PRINT_FIELD_X_ARRAY(", ", info64, lo_init); + PRINT_FIELD_X_ARRAY(", ", *info64, lo_init); else tprints(", ..."); tprints("}"); } +static void +decode_loop_info64(struct tcb *const tcp, const kernel_ulong_t addr) +{ + struct loop_info64 info64; + + tprints(", "); + if (!umove_or_printaddr(tcp, addr, &info64)) + print_loop_info64(tcp, &info64); +} + MPERS_PRINTER_DECL(int, loop_ioctl, struct tcb *tcp, const unsigned int code, const kernel_ulong_t arg) |