mirror of
git://git.gnupg.org/gnupg.git
synced 2024-12-22 10:19:57 +01:00
scd: Add reder information to --card-status.
* g10/call-agent.h, g10/call-agent.c (agent_release_card_info) g10/card-util.c (card_status): Add READER. * scd/apdu.c (close_ccid_reader, open_ccid_reader): Handle RDRNAME. (apdu_get_reader_name): New. * scd/ccid-driver.c (ccid_open_reader): Add argument to RDRNAME_P. * scd/command.c (cmd_learn): Return READER information.
This commit is contained in:
parent
2242658efe
commit
bce0e3f71d
@ -480,6 +480,7 @@ agent_release_card_info (struct agent_card_info_s *info)
|
|||||||
if (!info)
|
if (!info)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
xfree (info->reader); info->reader = NULL;
|
||||||
xfree (info->serialno); info->serialno = NULL;
|
xfree (info->serialno); info->serialno = NULL;
|
||||||
xfree (info->apptype); info->apptype = NULL;
|
xfree (info->apptype); info->apptype = NULL;
|
||||||
xfree (info->disp_name); info->disp_name = NULL;
|
xfree (info->disp_name); info->disp_name = NULL;
|
||||||
@ -509,7 +510,12 @@ learn_status_cb (void *opaque, const char *line)
|
|||||||
while (spacep (line))
|
while (spacep (line))
|
||||||
line++;
|
line++;
|
||||||
|
|
||||||
if (keywordlen == 8 && !memcmp (keyword, "SERIALNO", keywordlen))
|
if (keywordlen == 6 && !memcmp (keyword, "READER", keywordlen))
|
||||||
|
{
|
||||||
|
xfree (parm->reader);
|
||||||
|
parm->reader = unescape_status_string (line);
|
||||||
|
}
|
||||||
|
else if (keywordlen == 8 && !memcmp (keyword, "SERIALNO", keywordlen))
|
||||||
{
|
{
|
||||||
xfree (parm->serialno);
|
xfree (parm->serialno);
|
||||||
parm->serialno = store_serialno (line);
|
parm->serialno = store_serialno (line);
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
struct agent_card_info_s
|
struct agent_card_info_s
|
||||||
{
|
{
|
||||||
int error; /* private. */
|
int error; /* private. */
|
||||||
|
char *reader; /* Reader information. */
|
||||||
char *apptype; /* Malloced application type string. */
|
char *apptype; /* Malloced application type string. */
|
||||||
char *serialno; /* malloced hex string. */
|
char *serialno; /* malloced hex string. */
|
||||||
char *disp_name; /* malloced. */
|
char *disp_name; /* malloced. */
|
||||||
|
@ -386,6 +386,11 @@ card_status (estream_t fp, char *serialno, size_t serialnobuflen)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (opt.with_colons)
|
||||||
|
es_fprintf (fp, "Reader:%s:", info.reader? info.reader : "");
|
||||||
|
else
|
||||||
|
tty_fprintf (fp, "Reader ...........: %s\n",
|
||||||
|
info.reader? info.reader : "[none]");
|
||||||
if (opt.with_colons)
|
if (opt.with_colons)
|
||||||
es_fprintf (fp, "AID:%s:", info.serialno? info.serialno : "");
|
es_fprintf (fp, "AID:%s:", info.serialno? info.serialno : "");
|
||||||
else
|
else
|
||||||
|
11
scd/apdu.c
11
scd/apdu.c
@ -2466,6 +2466,7 @@ static int
|
|||||||
close_ccid_reader (int slot)
|
close_ccid_reader (int slot)
|
||||||
{
|
{
|
||||||
ccid_close_reader (reader_table[slot].ccid.handle);
|
ccid_close_reader (reader_table[slot].ccid.handle);
|
||||||
|
reader_table[slot].rdrname = NULL;
|
||||||
reader_table[slot].used = 0;
|
reader_table[slot].used = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -2619,7 +2620,8 @@ open_ccid_reader (const char *portstr)
|
|||||||
return -1;
|
return -1;
|
||||||
slotp = reader_table + slot;
|
slotp = reader_table + slot;
|
||||||
|
|
||||||
err = ccid_open_reader (&slotp->ccid.handle, portstr);
|
err = ccid_open_reader (&slotp->ccid.handle, portstr,
|
||||||
|
(const char **)&slotp->rdrname);
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
slotp->used = 0;
|
slotp->used = 0;
|
||||||
@ -4326,3 +4328,10 @@ apdu_send_direct (int slot, size_t extended_length,
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char *
|
||||||
|
apdu_get_reader_name (int slot)
|
||||||
|
{
|
||||||
|
return reader_table[slot].rdrname;
|
||||||
|
}
|
||||||
|
@ -134,6 +134,6 @@ int apdu_send_direct (int slot, size_t extended_length,
|
|||||||
const unsigned char *apdudata, size_t apdudatalen,
|
const unsigned char *apdudata, size_t apdudatalen,
|
||||||
int handle_more,
|
int handle_more,
|
||||||
unsigned char **retbuf, size_t *retbuflen);
|
unsigned char **retbuf, size_t *retbuflen);
|
||||||
|
const char *apdu_get_reader_name (int slot);
|
||||||
|
|
||||||
#endif /*APDU_H*/
|
#endif /*APDU_H*/
|
||||||
|
@ -1542,7 +1542,8 @@ ccid_vendor_specific_init (ccid_driver_t handle)
|
|||||||
/* Open the reader with the internal number READERNO and return a
|
/* Open the reader with the internal number READERNO and return a
|
||||||
pointer to be used as handle in HANDLE. Returns 0 on success. */
|
pointer to be used as handle in HANDLE. Returns 0 on success. */
|
||||||
int
|
int
|
||||||
ccid_open_reader (ccid_driver_t *handle, const char *readerid)
|
ccid_open_reader (ccid_driver_t *handle, const char *readerid,
|
||||||
|
const char **rdrname_p)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
struct usb_device *dev = NULL;
|
struct usb_device *dev = NULL;
|
||||||
@ -1661,6 +1662,9 @@ ccid_open_reader (ccid_driver_t *handle, const char *readerid)
|
|||||||
free (*handle);
|
free (*handle);
|
||||||
*handle = NULL;
|
*handle = NULL;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
if (rdrname_p)
|
||||||
|
*rdrname_p = (*handle)->rid;
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -3735,7 +3739,7 @@ main (int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = ccid_open_reader (&ccid, argc? *argv:NULL);
|
rc = ccid_open_reader (&ccid, argc? *argv:NULL, NULL);
|
||||||
if (rc)
|
if (rc)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
@ -111,7 +111,8 @@ typedef struct ccid_driver_s *ccid_driver_t;
|
|||||||
|
|
||||||
int ccid_set_debug_level (int level);
|
int ccid_set_debug_level (int level);
|
||||||
char *ccid_get_reader_list (void);
|
char *ccid_get_reader_list (void);
|
||||||
int ccid_open_reader (ccid_driver_t *handle, const char *readerid);
|
int ccid_open_reader (ccid_driver_t *handle, const char *readerid,
|
||||||
|
const char **rdrname_p);
|
||||||
int ccid_set_progress_cb (ccid_driver_t handle,
|
int ccid_set_progress_cb (ccid_driver_t handle,
|
||||||
void (*cb)(void *, const char *, int, int, int),
|
void (*cb)(void *, const char *, int, int, int),
|
||||||
void *cb_arg);
|
void *cb_arg);
|
||||||
|
@ -667,9 +667,18 @@ cmd_learn (assuan_context_t ctx, char *line)
|
|||||||
knows about this card */
|
knows about this card */
|
||||||
if (!only_keypairinfo)
|
if (!only_keypairinfo)
|
||||||
{
|
{
|
||||||
|
int slot;
|
||||||
|
const char *reader;
|
||||||
char *serial;
|
char *serial;
|
||||||
time_t stamp;
|
time_t stamp;
|
||||||
|
|
||||||
|
slot = vreader_slot (ctrl->server_local->vreader_idx);
|
||||||
|
reader = apdu_get_reader_name (slot);
|
||||||
|
if (!reader)
|
||||||
|
return out_of_core ();
|
||||||
|
send_status_direct (ctrl, "READER", reader);
|
||||||
|
/* No need to free the string of READER. */
|
||||||
|
|
||||||
rc = app_get_serial_and_stamp (ctrl->app_ctx, &serial, &stamp);
|
rc = app_get_serial_and_stamp (ctrl->app_ctx, &serial, &stamp);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user