18389bf646
Fix crash in lsi_soft_reset (bz #1000947) Fix crash in scsi_dma_complete (bz #1001617) Fix initial /dev/kvm permissions (bz #993491)
159 lines
4.7 KiB
Diff
159 lines
4.7 KiB
Diff
From 3cab527b3f9be5bbc8b8d3637ff0a8d1cddd6356 Mon Sep 17 00:00:00 2001
|
|
From: Alon Levy <alevy@redhat.com>
|
|
Date: Tue, 5 Mar 2013 16:27:43 +0200
|
|
Subject: [PATCH] libcacard: move atr setting from macro to function
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Only because qemu's checkpatch complains about it.
|
|
|
|
Signed-off-by: Alon Levy <alevy@redhat.com>
|
|
Reviewed-by: Marc-André Lureau <mlureau@redhat.com>
|
|
(cherry picked from commit 0b6a16c1a47b622b1a692ab179013d9e30e9cf3b)
|
|
---
|
|
Makefile.objs | 1 +
|
|
libcacard/vcard_emul_nss.c | 14 +++++++++++---
|
|
libcacard/vcardt.c | 40 ++++++++++++++++++++++++++++++++++++++++
|
|
libcacard/vcardt.h | 13 -------------
|
|
libcacard/vcardt_internal.h | 6 ++++++
|
|
5 files changed, 58 insertions(+), 16 deletions(-)
|
|
create mode 100644 libcacard/vcardt.c
|
|
create mode 100644 libcacard/vcardt_internal.h
|
|
|
|
diff --git a/Makefile.objs b/Makefile.objs
|
|
index 3884790..729be2b 100644
|
|
--- a/Makefile.objs
|
|
+++ b/Makefile.objs
|
|
@@ -32,6 +32,7 @@ libcacard-y += libcacard/vcard.o libcacard/vreader.o
|
|
libcacard-y += libcacard/vcard_emul_nss.o
|
|
libcacard-y += libcacard/vcard_emul_type.o
|
|
libcacard-y += libcacard/card_7816.o
|
|
+libcacard-y += libcacard/vcardt.o
|
|
|
|
######################################################################
|
|
# Target independent part of system emulation. The long term path is to
|
|
diff --git a/libcacard/vcard_emul_nss.c b/libcacard/vcard_emul_nss.c
|
|
index 9ba80fb..1a3e568 100644
|
|
--- a/libcacard/vcard_emul_nss.c
|
|
+++ b/libcacard/vcard_emul_nss.c
|
|
@@ -33,6 +33,9 @@
|
|
#include "vreader.h"
|
|
#include "vevent.h"
|
|
|
|
+#include "libcacard/vcardt_internal.h"
|
|
+
|
|
+
|
|
typedef enum {
|
|
VCardEmulUnknown = -1,
|
|
VCardEmulFalse = 0,
|
|
@@ -519,18 +522,23 @@ vcard_emul_reader_get_slot(VReader *vreader)
|
|
}
|
|
|
|
/*
|
|
- * Card ATR's map to physical cards. VCARD_ATR_PREFIX will set appropriate
|
|
+ * Card ATR's map to physical cards. vcard_alloc_atr will set appropriate
|
|
* historical bytes for any software emulated card. The remaining bytes can be
|
|
* used to indicate the actual emulator
|
|
*/
|
|
-static const unsigned char nss_atr[] = { VCARD_ATR_PREFIX(3), 'N', 'S', 'S' };
|
|
+static unsigned char *nss_atr;
|
|
+static int nss_atr_len;
|
|
|
|
void
|
|
vcard_emul_get_atr(VCard *card, unsigned char *atr, int *atr_len)
|
|
{
|
|
- int len = MIN(sizeof(nss_atr), *atr_len);
|
|
+ int len;
|
|
assert(atr != NULL);
|
|
|
|
+ if (nss_atr == NULL) {
|
|
+ nss_atr = vcard_alloc_atr("NSS", &nss_atr_len);
|
|
+ }
|
|
+ len = MIN(nss_atr_len, *atr_len);
|
|
memcpy(atr, nss_atr, len);
|
|
*atr_len = len;
|
|
}
|
|
diff --git a/libcacard/vcardt.c b/libcacard/vcardt.c
|
|
new file mode 100644
|
|
index 0000000..9ce4648
|
|
--- /dev/null
|
|
+++ b/libcacard/vcardt.c
|
|
@@ -0,0 +1,40 @@
|
|
+#include <stdlib.h>
|
|
+#include <string.h>
|
|
+#include <glib.h>
|
|
+
|
|
+#include "libcacard/vcardt.h"
|
|
+
|
|
+#include "libcacard/vcardt_internal.h"
|
|
+
|
|
+/* create an ATR with appropriate historical bytes */
|
|
+#define ATR_TS_DIRECT_CONVENTION 0x3b
|
|
+#define ATR_TA_PRESENT 0x10
|
|
+#define ATR_TB_PRESENT 0x20
|
|
+#define ATR_TC_PRESENT 0x40
|
|
+#define ATR_TD_PRESENT 0x80
|
|
+
|
|
+unsigned char *vcard_alloc_atr(const char *postfix, int *atr_len)
|
|
+{
|
|
+ int postfix_len;
|
|
+ const char prefix[] = "VCARD_";
|
|
+ const char default_postfix[] = "DEFAULT";
|
|
+ const int prefix_len = sizeof(prefix) - 1;
|
|
+ int total_len;
|
|
+ unsigned char *atr;
|
|
+
|
|
+ if (postfix == NULL) {
|
|
+ postfix = default_postfix;
|
|
+ }
|
|
+ postfix_len = strlen(postfix);
|
|
+ total_len = 3 + prefix_len + postfix_len;
|
|
+ atr = g_malloc(total_len);
|
|
+ atr[0] = ATR_TS_DIRECT_CONVENTION;
|
|
+ atr[1] = ATR_TD_PRESENT + prefix_len + postfix_len;
|
|
+ atr[2] = 0x00;
|
|
+ memcpy(&atr[3], prefix, prefix_len);
|
|
+ memcpy(&atr[3 + prefix_len], postfix, postfix_len);
|
|
+ if (atr_len) {
|
|
+ *atr_len = total_len;
|
|
+ }
|
|
+ return atr;
|
|
+}
|
|
diff --git a/libcacard/vcardt.h b/libcacard/vcardt.h
|
|
index 3b9a619..795e265 100644
|
|
--- a/libcacard/vcardt.h
|
|
+++ b/libcacard/vcardt.h
|
|
@@ -25,19 +25,6 @@ typedef struct VCardEmulStruct VCardEmul;
|
|
|
|
#define MAX_CHANNEL 4
|
|
|
|
-/* create an ATR with appropriate historical bytes */
|
|
-#define TS_DIRECT_CONVENTION 0x3b
|
|
-#define TA_PRESENT 0x10
|
|
-#define TB_PRESENT 0x20
|
|
-#define TC_PRESENT 0x40
|
|
-#define TD_PRESENT 0x80
|
|
-
|
|
-#define VCARD_ATR_PREFIX(size) \
|
|
- TS_DIRECT_CONVENTION, \
|
|
- TD_PRESENT + (6 + size), \
|
|
- 0x00, \
|
|
- 'V', 'C', 'A', 'R', 'D', '_'
|
|
-
|
|
typedef enum {
|
|
VCARD_DONE,
|
|
VCARD_NEXT,
|
|
diff --git a/libcacard/vcardt_internal.h b/libcacard/vcardt_internal.h
|
|
new file mode 100644
|
|
index 0000000..e5c8d2d
|
|
--- /dev/null
|
|
+++ b/libcacard/vcardt_internal.h
|
|
@@ -0,0 +1,6 @@
|
|
+#ifndef VCARDT_INTERNAL_H
|
|
+#define VCARDT_INTERNAL_H
|
|
+
|
|
+unsigned char *vcard_alloc_atr(const char *postfix, int *atr_len);
|
|
+
|
|
+#endif
|