aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2019-12-16 15:11:00 +0100
committerlaforge <laforge@osmocom.org>2019-12-17 12:46:21 +0000
commit563601cff24a5fc33b47a112d1f951e0597531ca (patch)
tree969a0a3f329b2c7bb7328b68a8c5b5dd6f062a80
parente9556efe88aa6b64f4b83aec4fe89c867620b16d (diff)
[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
-rw-r--r--host/include/osmocom/simtrace2/apdu_dispatch.h4
-rw-r--r--host/lib/apdu_dispatch.c21
2 files changed, 16 insertions, 9 deletions
diff --git a/host/include/osmocom/simtrace2/apdu_dispatch.h b/host/include/osmocom/simtrace2/apdu_dispatch.h
index af9c989..42a097a 100644
--- a/host/include/osmocom/simtrace2/apdu_dispatch.h
+++ b/host/include/osmocom/simtrace2/apdu_dispatch.h
@@ -1,6 +1,6 @@
/* 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
* 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,
};
+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,
unsigned int apdu_len, bool new_apdu);
diff --git a/host/lib/apdu_dispatch.c b/host/lib/apdu_dispatch.c
index 835b8bc..ec368b2 100644
--- a/host/lib/apdu_dispatch.c
+++ b/host/lib/apdu_dispatch.c
@@ -42,7 +42,7 @@ static inline bool is_de_complete(struct osmo_apdu_context *ac)
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];
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;
}
-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",
- dump_apdu_hdr(&ac->hdr), ac->apdu_case,
- ac->lc.tot, ac->lc.cur,
- ac->le.tot, ac->le.cur);
+ snprintf(buf, buf_len, "%s; case=%d, lc=%d(%d), le=%d(%d)\n",
+ stringify_apdu_hdr(&ac->hdr), ac->apdu_case,
+ ac->lc.tot, ac->lc.cur,
+ ac->le.tot, ac->le.cur);
+ return buf;
}
/*! \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;
}
- dump_apdu_ctx(ac);
-
return rc;
}