<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/24504">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">sim: Add osim_card_{reset,close}() API<br><br>This is required to reset and close a card under software control<br>after opening it with osim_card_open()<br><br>Change-Id: Ie9ec66db4d54fdb1331f4ae05ca3ca4274912e9d<br>---<br>M TODO-RELEASE<br>M include/osmocom/sim/sim.h<br>M src/sim/reader.c<br>M src/sim/reader_pcsc.c<br>4 files changed, 56 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/04/24504/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/TODO-RELEASE b/TODO-RELEASE</span><br><span>index e57ffab..ad644aa 100644</span><br><span>--- a/TODO-RELEASE</span><br><span>+++ b/TODO-RELEASE</span><br><span>@@ -12,3 +12,4 @@</span><br><span> libosmosim   osim_card_hdl           ABI + API breakage due to new struct members</span><br><span> libosmocore     osmo_tdef_fsm_inst_state_chg    change default_timeout arg from unsigned long to long type (API breakage, not ABI)</span><br><span> libosmovty      vty_read_config_filep   New API</span><br><span style="color: hsl(120, 100%, 40%);">+libosmosim       osim_card_{reset,close} New API</span><br><span>diff --git a/include/osmocom/sim/sim.h b/include/osmocom/sim/sim.h</span><br><span>index 16b9f1f..5e7099f 100644</span><br><span>--- a/include/osmocom/sim/sim.h</span><br><span>+++ b/include/osmocom/sim/sim.h</span><br><span>@@ -375,6 +375,8 @@</span><br><span>       const char *name;</span><br><span>    struct osim_reader_hdl *(*reader_open)(int idx, const char *name, void *ctx);</span><br><span>        struct osim_card_hdl *(*card_open)(struct osim_reader_hdl *rh, enum osim_proto proto);</span><br><span style="color: hsl(120, 100%, 40%);">+        int (*card_reset)(struct osim_card_hdl *card, bool cold_reset);</span><br><span style="color: hsl(120, 100%, 40%);">+       int (*card_close)(struct osim_card_hdl *card);</span><br><span>       int (*transceive)(struct osim_reader_hdl *rh, struct msgb *msg);</span><br><span> };</span><br><span> </span><br><span>@@ -441,4 +443,6 @@</span><br><span> struct osim_reader_hdl *osim_reader_open(enum osim_reader_driver drv, int idx,</span><br><span>                                    const char *name, void *ctx);</span><br><span> struct osim_card_hdl *osim_card_open(struct osim_reader_hdl *rh, enum osim_proto proto);</span><br><span style="color: hsl(120, 100%, 40%);">+int osim_card_reset(struct osim_card_hdl *card, bool cold_reset);</span><br><span style="color: hsl(120, 100%, 40%);">+int osim_card_close(struct osim_card_hdl *card);</span><br><span> #endif /* _OSMOCOM_SIM_H */</span><br><span>diff --git a/src/sim/reader.c b/src/sim/reader.c</span><br><span>index ae0aba9..7f3f18d 100644</span><br><span>--- a/src/sim/reader.c</span><br><span>+++ b/src/sim/reader.c</span><br><span>@@ -277,3 +277,24 @@</span><br><span> </span><br><span>       return ch;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int osim_card_reset(struct osim_card_hdl *card, bool cold_reset)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osim_reader_hdl *rh = card->reader;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       return rh->ops->card_reset(card, cold_reset);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int osim_card_close(struct osim_card_hdl *card)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osim_reader_hdl *rh = card->reader;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = rh->ops->card_close(card);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       card->reader = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+       talloc_free(card);</span><br><span style="color: hsl(120, 100%, 40%);">+    rh->card = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/sim/reader_pcsc.c b/src/sim/reader_pcsc.c</span><br><span>index 234a9a7..fa867c0 100644</span><br><span>--- a/src/sim/reader_pcsc.c</span><br><span>+++ b/src/sim/reader_pcsc.c</span><br><span>@@ -156,6 +156,34 @@</span><br><span>        return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int pcsc_card_reset(struct osim_card_hdl *card, bool cold_reset)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct pcsc_reader_state *st = card->reader->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+      LONG rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = SCardReconnect(st->hCard, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0,</span><br><span style="color: hsl(120, 100%, 40%);">+                          cold_reset ? SCARD_UNPOWER_CARD : SCARD_RESET_CARD,</span><br><span style="color: hsl(120, 100%, 40%);">+                           &st->dwActiveProtocol);</span><br><span style="color: hsl(120, 100%, 40%);">+    PCSC_ERROR(rc, "SCardReconnect");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+end:</span><br><span style="color: hsl(120, 100%, 40%);">+       return -EIO;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int pcsc_card_close(struct osim_card_hdl *card)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct pcsc_reader_state *st = card->reader->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+      LONG rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = SCardDisconnect(st->hCard, SCARD_UNPOWER_CARD);</span><br><span style="color: hsl(120, 100%, 40%);">+       PCSC_ERROR(rc, "SCardDisconnect");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+end:</span><br><span style="color: hsl(120, 100%, 40%);">+       return -EIO;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> static int pcsc_transceive(struct osim_reader_hdl *rh, struct msgb *msg)</span><br><span> {</span><br><span>@@ -179,6 +207,8 @@</span><br><span>         .name = "PC/SC",</span><br><span>   .reader_open = pcsc_reader_open,</span><br><span>     .card_open = pcsc_card_open,</span><br><span style="color: hsl(120, 100%, 40%);">+  .card_reset = pcsc_card_reset,</span><br><span style="color: hsl(120, 100%, 40%);">+        .card_close = pcsc_card_close,</span><br><span>       .transceive = pcsc_transceive,</span><br><span> };</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/24504">change 24504</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmocore/+/24504"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ie9ec66db4d54fdb1331f4ae05ca3ca4274912e9d </div>
<div style="display:none"> Gerrit-Change-Number: 24504 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>