mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-23 08:48:35 +03:00
[lib] apdu_dispatch: Don't print APDU state to stdout
The printing was always only done at the end of osmo_apdu_segment_in(), so let's leave the decision up to the user if he wants to print the state at every iteration or not. We now provide osmo_apdu_dump_context_buf() to the user so he can obtain a string representation of the internal state for logging at any time he requires. Change-Id: Id3e3cf1605dec84077b158c1c5715f8eef2641d5
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
/* apdu_dispatch - State machine to determine Rx/Tx phases of APDU
|
/* apdu_dispatch - State machine to determine Rx/Tx phases of APDU
|
||||||
*
|
*
|
||||||
* (C) 2016 by Harald Welte <hwelte@hmw-consulting.de>
|
* (C) 2016-2019 by Harald Welte <hwelte@hmw-consulting.de>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@@ -44,6 +44,8 @@ enum osmo_apdu_action {
|
|||||||
APDU_ACT_RX_MORE_CAPDU_FROM_READER = 0x0002,
|
APDU_ACT_RX_MORE_CAPDU_FROM_READER = 0x0002,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const char *osmo_apdu_dump_context_buf(char *buf, unsigned int buf_len,
|
||||||
|
const struct osmo_apdu_context *ac);
|
||||||
|
|
||||||
int osmo_apdu_segment_in(struct osmo_apdu_context *ac, const uint8_t *apdu_buf,
|
int osmo_apdu_segment_in(struct osmo_apdu_context *ac, const uint8_t *apdu_buf,
|
||||||
unsigned int apdu_len, bool new_apdu);
|
unsigned int apdu_len, bool new_apdu);
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ static inline bool is_de_complete(struct osmo_apdu_context *ac)
|
|||||||
return (ac->le.tot == ac->le.cur);
|
return (ac->le.tot == ac->le.cur);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *dump_apdu_hdr(const struct osim_apdu_cmd_hdr *h)
|
static const char *stringify_apdu_hdr(const struct osim_apdu_cmd_hdr *h)
|
||||||
{
|
{
|
||||||
static char buf[256];
|
static char buf[256];
|
||||||
sprintf(buf, "CLA=%02x INS=%02x P1=%02x P2=%02x P3=%02x",
|
sprintf(buf, "CLA=%02x INS=%02x P1=%02x P2=%02x P3=%02x",
|
||||||
@@ -51,12 +51,19 @@ static const char *dump_apdu_hdr(const struct osim_apdu_cmd_hdr *h)
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dump_apdu_ctx(const struct osmo_apdu_context *ac)
|
/*! generate string representation of APDU context in specified output buffer.
|
||||||
|
* \param[in] buf output string buffer provided by caller
|
||||||
|
* \param[in] buf_len size of buf in bytes
|
||||||
|
* \param[in] ac APDU context to dump in buffer
|
||||||
|
* \returns pointer to buf on success */
|
||||||
|
const char *osmo_apdu_dump_context_buf(char *buf, unsigned int buf_len,
|
||||||
|
const struct osmo_apdu_context *ac)
|
||||||
{
|
{
|
||||||
printf("%s; case=%d, lc=%d(%d), le=%d(%d)\n",
|
snprintf(buf, buf_len, "%s; case=%d, lc=%d(%d), le=%d(%d)\n",
|
||||||
dump_apdu_hdr(&ac->hdr), ac->apdu_case,
|
stringify_apdu_hdr(&ac->hdr), ac->apdu_case,
|
||||||
ac->lc.tot, ac->lc.cur,
|
ac->lc.tot, ac->lc.cur,
|
||||||
ac->le.tot, ac->le.cur);
|
ac->le.tot, ac->le.cur);
|
||||||
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief input function for APDU segmentation
|
/*! \brief input function for APDU segmentation
|
||||||
@@ -168,7 +175,5 @@ int osmo_apdu_segment_in(struct osmo_apdu_context *ac, const uint8_t *apdu_buf,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
dump_apdu_ctx(ac);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user