- Initial support for win32
git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@654 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
parent
523b680f32
commit
7635468ed9
|
@ -0,0 +1,8 @@
|
||||||
|
|
||||||
|
SUBDIRS = src
|
||||||
|
|
||||||
|
all::
|
||||||
|
|
||||||
|
all depend install clean::
|
||||||
|
@for %i in ( $(SUBDIRS) ) do \
|
||||||
|
@cmd /c "cd %i && $(MAKE) /nologo /f Makefile.mak $@"
|
|
@ -0,0 +1,26 @@
|
||||||
|
README for Win32 port of OpenSC
|
||||||
|
|
||||||
|
|
||||||
|
Compiling
|
||||||
|
=========
|
||||||
|
|
||||||
|
Type "nmake -f makefile.mak" to compile.
|
||||||
|
|
||||||
|
You need also perl and flex installed for the compile process
|
||||||
|
to complete succesfully.
|
||||||
|
|
||||||
|
What works
|
||||||
|
==========
|
||||||
|
|
||||||
|
At the moment only libopensc and basic tools have been ported
|
||||||
|
to windows. They should at least compile.
|
||||||
|
|
||||||
|
What needs to be done
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Other parts of OpenSC should ported as well (other tools & pkcs11
|
||||||
|
module). Also we should implement native Win32 APIs such as
|
||||||
|
CryptoAPI Provider, some login stuff and ActiveX plugin for
|
||||||
|
Explorer to do the signing.
|
||||||
|
|
||||||
|
|
|
@ -2,5 +2,8 @@
|
||||||
|
|
||||||
MAINTAINERCLEANFILES = Makefile.in
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
|
EXTRA_DIST = Makefile.mak
|
||||||
|
|
||||||
# Order IS important
|
# Order IS important
|
||||||
SUBDIRS = common include scconf scldap scrandom libopensc pkcs15init tests tools openssh scam pam sia signer pkcs11
|
SUBDIRS = common include scconf scldap scrandom libopensc pkcs15init tests tools openssh scam pam sia signer pkcs11
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
|
||||||
|
SUBDIRS = include common scconf libopensc tools
|
||||||
|
|
||||||
|
all::
|
||||||
|
|
||||||
|
all depend install clean::
|
||||||
|
@for %i in ( $(SUBDIRS) ) do \
|
||||||
|
@cmd /c "cd %i && $(MAKE) /nologo /f Makefile.mak $@"
|
|
@ -2,4 +2,4 @@
|
||||||
|
|
||||||
MAINTAINERCLEANFILES = Makefile.in
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
EXTRA_DIST = getopt.c getopt.h getopt1.c
|
EXTRA_DIST = Makefile.mak getopt.c getopt.h getopt1.c getpass.c
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
TOPDIR = ..\..
|
||||||
|
|
||||||
|
HEADERS = getopt.h
|
||||||
|
TARGET = common.lib
|
||||||
|
OBJECTS = getopt.obj getopt1.obj getpass.obj
|
||||||
|
|
||||||
|
|
||||||
|
all: $(TARGET) install-headers
|
||||||
|
|
||||||
|
$(TARGET): $(OBJECTS)
|
||||||
|
lib /nologo /machine:ix86 /out:$(TARGET) $(OBJECTS)
|
||||||
|
|
||||||
|
!INCLUDE $(TOPDIR)\win32\Make.rules.mak
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
|
||||||
|
all: config.h
|
||||||
|
|
||||||
|
config.h: winconfig.h
|
||||||
|
@copy /y winconfig.h config.h
|
|
@ -0,0 +1,26 @@
|
||||||
|
#ifndef _OPENSC_WINCONFIG_H
|
||||||
|
#define _OPENSC_WINCONFIG_H
|
||||||
|
|
||||||
|
#ifndef strcasecmp
|
||||||
|
#define strcasecmp stricmp
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef strncasecmp
|
||||||
|
#define strncasecmp strnicmp
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef snprintf
|
||||||
|
#define snprintf _snprintf
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef vsnprintf
|
||||||
|
#define vsnprintf _vsnprintf
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef isatty
|
||||||
|
#define isatty _isatty
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define OPENSC_CONF_PATH "C:\\WINNT\\opensc.conf"
|
||||||
|
|
||||||
|
#endif
|
|
@ -4,7 +4,7 @@ includedir = ${prefix}/include/opensc
|
||||||
|
|
||||||
MAINTAINERCLEANFILES = Makefile.in
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
EXTRA_DIST = opensc-config.in
|
EXTRA_DIST = Makefile.mak opensc-config.in
|
||||||
|
|
||||||
if HAVE_SSL
|
if HAVE_SSL
|
||||||
SSL_LIB = @LIBCRYPTO@
|
SSL_LIB = @LIBCRYPTO@
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
TOPDIR = ..\..
|
||||||
|
|
||||||
|
|
||||||
|
TARGET = opensc.dll
|
||||||
|
|
||||||
|
HEADERS = opensc.h pkcs15.h emv.h \
|
||||||
|
errors.h types.h \
|
||||||
|
cardctl.h asn1.h log.h
|
||||||
|
|
||||||
|
OBJECTS = sc.obj ctx.obj module.obj asn1.obj log.obj base64.obj \
|
||||||
|
errors.obj sec.obj card.obj iso7816.obj dir.obj \
|
||||||
|
pkcs15.obj pkcs15-cert.obj pkcs15-pin.obj \
|
||||||
|
pkcs15-prkey.obj pkcs15-pubkey.obj pkcs15-sec.obj \
|
||||||
|
pkcs15-wrap.obj pkcs15-algo.obj \
|
||||||
|
pkcs15-cache.obj reader-pcsc.obj \
|
||||||
|
card-setcos.obj card-miocos.obj card-flex.obj card-gpk.obj \
|
||||||
|
card-etoken.obj card-tcos.obj card-emv.obj card-default.obj
|
||||||
|
|
||||||
|
all: $(TARGET) install-headers
|
||||||
|
|
||||||
|
!INCLUDE $(TOPDIR)\win32\Make.rules.mak
|
||||||
|
|
||||||
|
$(TARGET): $(OBJECTS)
|
||||||
|
perl $(TOPDIR)\win32\makedef.pl $*.def $* $(OBJECTS)
|
||||||
|
link $(LINKFLAGS) /dll /def:$*.def /implib:$*.lib /out:$(TARGET) $(OBJECTS) ..\scconf\scconf.lib winscard.lib
|
||||||
|
|
|
@ -153,7 +153,11 @@ static void sc_asn1_print_utf8string(const u8 * buf, size_t buflen)
|
||||||
|
|
||||||
static void sc_asn1_print_integer(const u8 * buf, size_t buflen)
|
static void sc_asn1_print_integer(const u8 * buf, size_t buflen)
|
||||||
{
|
{
|
||||||
|
#ifndef _WIN32
|
||||||
long long a = 0;
|
long long a = 0;
|
||||||
|
#else
|
||||||
|
__int64 a = 0;
|
||||||
|
#endif
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (buflen > sizeof(a)) {
|
if (buflen > sizeof(a)) {
|
||||||
|
@ -169,7 +173,11 @@ static void sc_asn1_print_integer(const u8 * buf, size_t buflen)
|
||||||
|
|
||||||
static void sc_asn1_print_bit_string(const u8 * buf, size_t buflen)
|
static void sc_asn1_print_bit_string(const u8 * buf, size_t buflen)
|
||||||
{
|
{
|
||||||
unsigned long long a = 0;
|
#ifndef _WIN32
|
||||||
|
long long a = 0;
|
||||||
|
#else
|
||||||
|
__int64 a = 0;
|
||||||
|
#endif
|
||||||
int i, r;
|
int i, r;
|
||||||
|
|
||||||
if (buflen > sizeof(a) + 1) {
|
if (buflen > sizeof(a) + 1) {
|
||||||
|
|
|
@ -58,7 +58,8 @@ static int autodetect_class(struct sc_card *card)
|
||||||
apdu.datalen = 0;
|
apdu.datalen = 0;
|
||||||
apdu.lc = 0;
|
apdu.lc = 0;
|
||||||
apdu.le = 256;
|
apdu.le = 256;
|
||||||
apdu.resplen = sizeof(rbuf);
|
apdu.resp = rbuf;
|
||||||
|
apdu.resplen = sizeof(rbuf);
|
||||||
r = sc_transmit_apdu(card, &apdu);
|
r = sc_transmit_apdu(card, &apdu);
|
||||||
SC_TEST_RET(card->ctx, r, "APDU transmit failed");
|
SC_TEST_RET(card->ctx, r, "APDU transmit failed");
|
||||||
if (apdu.sw1 == 0x6E)
|
if (apdu.sw1 == 0x6E)
|
||||||
|
|
|
@ -386,7 +386,7 @@ static void parse_sec_attr(struct sc_file *file, const u8 *buf, size_t len)
|
||||||
/* acl defaults to 0xFF if unspecified */
|
/* acl defaults to 0xFF if unspecified */
|
||||||
for (i = 0; i < 9; i++)
|
for (i = 0; i < 9; i++)
|
||||||
if (idx[i] != -1)
|
if (idx[i] != -1)
|
||||||
add_acl_entry(file, idx[i], (i < len) ? buf[i] : 0xFF);
|
add_acl_entry(file, idx[i], (u8)((i < len) ? buf[i] : 0xFF));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int etoken_select_file(struct sc_card *card,
|
static int etoken_select_file(struct sc_card *card,
|
||||||
|
|
|
@ -195,18 +195,18 @@ static int parse_flex_sf_reply(struct sc_context *ctx, const u8 *buf, int buflen
|
||||||
}
|
}
|
||||||
p += 2;
|
p += 2;
|
||||||
if (file->type == SC_FILE_TYPE_DF) {
|
if (file->type == SC_FILE_TYPE_DF) {
|
||||||
add_acl_entry(file, SC_AC_OP_LIST_FILES, p[0] >> 4, is_mf);
|
add_acl_entry(file, SC_AC_OP_LIST_FILES, (u8)(p[0] >> 4), is_mf);
|
||||||
add_acl_entry(file, SC_AC_OP_DELETE, p[1] >> 4, is_mf);
|
add_acl_entry(file, SC_AC_OP_DELETE, (u8)(p[1] >> 4), is_mf);
|
||||||
add_acl_entry(file, SC_AC_OP_CREATE, p[1] & 0x0F, is_mf);
|
add_acl_entry(file, SC_AC_OP_CREATE, (u8)(p[1] & 0x0F), is_mf);
|
||||||
} else { /* EF */
|
} else { /* EF */
|
||||||
add_acl_entry(file, SC_AC_OP_READ, p[0] >> 4, 0);
|
add_acl_entry(file, SC_AC_OP_READ, (u8)(p[0] >> 4), 0);
|
||||||
switch (file->ef_structure) {
|
switch (file->ef_structure) {
|
||||||
case SC_FILE_EF_TRANSPARENT:
|
case SC_FILE_EF_TRANSPARENT:
|
||||||
add_acl_entry(file, SC_AC_OP_UPDATE, p[0] & 0x0F, 0);
|
add_acl_entry(file, SC_AC_OP_UPDATE, (u8)(p[0] & 0x0F), 0);
|
||||||
break;
|
break;
|
||||||
case SC_FILE_EF_LINEAR_FIXED:
|
case SC_FILE_EF_LINEAR_FIXED:
|
||||||
case SC_FILE_EF_LINEAR_VARIABLE:
|
case SC_FILE_EF_LINEAR_VARIABLE:
|
||||||
add_acl_entry(file, SC_AC_OP_UPDATE, p[0] & 0x0F, 0);
|
add_acl_entry(file, SC_AC_OP_UPDATE, (u8)(p[0] & 0x0F), 0);
|
||||||
break;
|
break;
|
||||||
case SC_FILE_EF_CYCLIC:
|
case SC_FILE_EF_CYCLIC:
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -216,8 +216,8 @@ static int parse_flex_sf_reply(struct sc_context *ctx, const u8 *buf, int buflen
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
add_acl_entry(file, SC_AC_OP_REHABILITATE, p[2] >> 4, is_mf);
|
add_acl_entry(file, SC_AC_OP_REHABILITATE, (u8)(p[2] >> 4), is_mf);
|
||||||
add_acl_entry(file, SC_AC_OP_INVALIDATE, p[2] & 0x0F, is_mf);
|
add_acl_entry(file, SC_AC_OP_INVALIDATE, (u8)(p[2] & 0x0F), is_mf);
|
||||||
p += 3;
|
p += 3;
|
||||||
if (*p++)
|
if (*p++)
|
||||||
file->status = SC_FILE_STATUS_ACTIVATED;
|
file->status = SC_FILE_STATUS_ACTIVATED;
|
||||||
|
|
|
@ -319,9 +319,9 @@ static void parse_sec_attr(struct sc_file *file, const u8 *buf, size_t len)
|
||||||
if (ops[i] == -1)
|
if (ops[i] == -1)
|
||||||
continue;
|
continue;
|
||||||
if ((i & 1) == 0)
|
if ((i & 1) == 0)
|
||||||
add_acl_entry(file, ops[i], buf[i / 2] >> 4);
|
add_acl_entry(file, ops[i], (u8)(buf[i / 2] >> 4));
|
||||||
else
|
else
|
||||||
add_acl_entry(file, ops[i], buf[i / 2] & 0x0F);
|
add_acl_entry(file, ops[i], (u8)(buf[i / 2] & 0x0F));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "cardctl.h"
|
#include "cardctl.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
static const char *tcos_atrs[] = {
|
static const char *tcos_atrs[] = {
|
||||||
"3B:BA:13:00:81:31:86:5D:00:64:05:0A:02:01:31:80:90:00:8B", /* SLE44 */
|
"3B:BA:13:00:81:31:86:5D:00:64:05:0A:02:01:31:80:90:00:8B", /* SLE44 */
|
||||||
|
|
|
@ -288,8 +288,10 @@ static struct sc_card * sc_card_new()
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
card->app_count = -1;
|
card->app_count = -1;
|
||||||
card->magic = SC_CARD_MAGIC;
|
card->magic = SC_CARD_MAGIC;
|
||||||
|
#ifdef HAVE_PTHREAD
|
||||||
pthread_mutex_init(&card->mutex, NULL);
|
pthread_mutex_init(&card->mutex, NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
return card;
|
return card;
|
||||||
}
|
}
|
||||||
|
@ -311,8 +313,10 @@ static void sc_card_free(struct sc_card *card)
|
||||||
free(card->ops);
|
free(card->ops);
|
||||||
if (card->algorithms != NULL)
|
if (card->algorithms != NULL)
|
||||||
free(card->algorithms);
|
free(card->algorithms);
|
||||||
|
#ifdef HAVE_PTHREAD
|
||||||
pthread_mutex_destroy(&card->mutex);
|
pthread_mutex_destroy(&card->mutex);
|
||||||
card->magic = 0;
|
#endif
|
||||||
|
card->magic = 0;
|
||||||
free(card);
|
free(card);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -429,8 +433,10 @@ int sc_lock(struct sc_card *card)
|
||||||
|
|
||||||
assert(card != NULL);
|
assert(card != NULL);
|
||||||
SC_FUNC_CALLED(card->ctx, 2);
|
SC_FUNC_CALLED(card->ctx, 2);
|
||||||
|
#ifdef HAVE_PTHREAD
|
||||||
pthread_mutex_lock(&card->mutex);
|
pthread_mutex_lock(&card->mutex);
|
||||||
if (card->lock_count == 0) {
|
#endif
|
||||||
|
if (card->lock_count == 0) {
|
||||||
if (card->reader->ops->lock != NULL)
|
if (card->reader->ops->lock != NULL)
|
||||||
r = card->reader->ops->lock(card->reader, card->slot);
|
r = card->reader->ops->lock(card->reader, card->slot);
|
||||||
if (r == 0)
|
if (r == 0)
|
||||||
|
@ -438,8 +444,10 @@ int sc_lock(struct sc_card *card)
|
||||||
}
|
}
|
||||||
if (r == 0)
|
if (r == 0)
|
||||||
card->lock_count++;
|
card->lock_count++;
|
||||||
|
#ifdef HAVE_PTHREAD
|
||||||
pthread_mutex_unlock(&card->mutex);
|
pthread_mutex_unlock(&card->mutex);
|
||||||
SC_FUNC_RETURN(card->ctx, 2, r);
|
#endif
|
||||||
|
SC_FUNC_RETURN(card->ctx, 2, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
int sc_unlock(struct sc_card *card)
|
int sc_unlock(struct sc_card *card)
|
||||||
|
@ -448,16 +456,20 @@ int sc_unlock(struct sc_card *card)
|
||||||
|
|
||||||
assert(card != NULL);
|
assert(card != NULL);
|
||||||
SC_FUNC_CALLED(card->ctx, 2);
|
SC_FUNC_CALLED(card->ctx, 2);
|
||||||
|
#ifdef HAVE_PTHREAD
|
||||||
pthread_mutex_lock(&card->mutex);
|
pthread_mutex_lock(&card->mutex);
|
||||||
card->lock_count--;
|
#endif
|
||||||
|
card->lock_count--;
|
||||||
assert(card->lock_count >= 0);
|
assert(card->lock_count >= 0);
|
||||||
if (card->lock_count == 0) {
|
if (card->lock_count == 0) {
|
||||||
if (card->reader->ops->unlock != NULL)
|
if (card->reader->ops->unlock != NULL)
|
||||||
r = card->reader->ops->unlock(card->reader, card->slot);
|
r = card->reader->ops->unlock(card->reader, card->slot);
|
||||||
card->cache_valid = 0;
|
card->cache_valid = 0;
|
||||||
memset(&card->cache, 0, sizeof(card->cache));
|
memset(&card->cache, 0, sizeof(card->cache));
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&card->mutex);
|
#ifdef HAVE_PTHREAD
|
||||||
|
pthread_mutex_unlock(&card->mutex);
|
||||||
|
#endif
|
||||||
SC_FUNC_RETURN(card->ctx, 2, r);
|
SC_FUNC_RETURN(card->ctx, 2, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,10 +60,12 @@ static const struct _sc_driver_entry internal_card_drivers[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct _sc_driver_entry internal_reader_drivers[] = {
|
static const struct _sc_driver_entry internal_reader_drivers[] = {
|
||||||
#ifdef HAVE_LIBPCSCLITE
|
#if defined(HAVE_LIBPCSCLITE) || defined(_WIN32)
|
||||||
{ "pcsc", (void *) sc_get_pcsc_driver, NULL },
|
{ "pcsc", (void *) sc_get_pcsc_driver, NULL },
|
||||||
#endif
|
#endif
|
||||||
{ "ctapi", (void *) sc_get_ctapi_driver, NULL },
|
#ifndef _WIN32
|
||||||
|
{ "ctapi", (void *) sc_get_ctapi_driver, NULL },
|
||||||
|
#endif
|
||||||
{ NULL, NULL, NULL }
|
{ NULL, NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -18,14 +18,21 @@
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include <config.h>
|
||||||
|
#endif
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#ifndef _WIN32
|
||||||
|
#include <unistd.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#else
|
||||||
|
#include <io.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef __GNUC__
|
#ifndef __GNUC__
|
||||||
void error(struct sc_context *ctx, const char *format, ...)
|
void error(struct sc_context *ctx, const char *format, ...)
|
||||||
|
@ -90,11 +97,9 @@ void do_log2(struct sc_context *ctx, int type, const char *file,
|
||||||
FILE *outf = NULL;
|
FILE *outf = NULL;
|
||||||
char buf[1024], *p;
|
char buf[1024], *p;
|
||||||
int left, r;
|
int left, r;
|
||||||
struct timeval tv;
|
|
||||||
const char *color_pfx = "", *color_sfx = "";
|
const char *color_pfx = "", *color_sfx = "";
|
||||||
|
|
||||||
assert(ctx != NULL);
|
assert(ctx != NULL);
|
||||||
gettimeofday(&tv, NULL);
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SC_LOG_TYPE_ERROR:
|
case SC_LOG_TYPE_ERROR:
|
||||||
if (ctx->log_errors == 0)
|
if (ctx->log_errors == 0)
|
||||||
|
|
|
@ -32,8 +32,9 @@ extern "C" {
|
||||||
#define SC_LOG_TYPE_VERBOSE 1
|
#define SC_LOG_TYPE_VERBOSE 1
|
||||||
#define SC_LOG_TYPE_DEBUG 2
|
#define SC_LOG_TYPE_DEBUG 2
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#if defined(__GNUC__)
|
||||||
#define error(ctx, format, args...) do_log(ctx, SC_LOG_TYPE_ERROR, __FILE__, __LINE__, __FUNCTION__ , format , ## args)
|
|
||||||
|
#define error(ctx, format, args...) do_log(ctx, SC_LOG_TYPE_ERROR, __FILE__, __LINE__, __FUNCTION__, format , ## args)
|
||||||
#define debug(ctx, format, args...) do_log(ctx, SC_LOG_TYPE_DEBUG, __FILE__, __LINE__, __FUNCTION__, format , ## args)
|
#define debug(ctx, format, args...) do_log(ctx, SC_LOG_TYPE_DEBUG, __FILE__, __LINE__, __FUNCTION__, format , ## args)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -27,6 +27,8 @@
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
|
|
||||||
int sc_module_open(struct sc_context *ctx, void **mod_handle, const char *filename)
|
int sc_module_open(struct sc_context *ctx, void **mod_handle, const char *filename)
|
||||||
{
|
{
|
||||||
const char *error;
|
const char *error;
|
||||||
|
@ -96,3 +98,8 @@ int sc_module_get_address(struct sc_context *ctx, void *mod_handle, void **sym_a
|
||||||
*sym_address = address;
|
*sym_address = address;
|
||||||
return SC_SUCCESS;
|
return SC_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -688,7 +688,7 @@ struct sc_card_error {
|
||||||
const char *errorstr;
|
const char *errorstr;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const char *sc_version;
|
extern const char *sc_get_version(void);
|
||||||
|
|
||||||
extern const struct sc_reader_driver *sc_get_pcsc_driver(void);
|
extern const struct sc_reader_driver *sc_get_pcsc_driver(void);
|
||||||
extern const struct sc_reader_driver *sc_get_ctapi_driver(void);
|
extern const struct sc_reader_driver *sc_get_ctapi_driver(void);
|
||||||
|
|
|
@ -21,7 +21,9 @@
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "pkcs15.h"
|
#include "pkcs15.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#ifndef _WIN32
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
|
@ -26,7 +26,9 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#ifndef _WIN32
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
static int parse_x509_cert(struct sc_context *ctx, const u8 *buf, size_t buflen, struct sc_pkcs15_cert *cert)
|
static int parse_x509_cert(struct sc_context *ctx, const u8 *buf, size_t buflen, struct sc_pkcs15_cert *cert)
|
||||||
|
|
|
@ -25,7 +25,9 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#ifndef _WIN32
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
static int pkcs1_strip_padding(u8 *data, size_t len)
|
static int pkcs1_strip_padding(u8 *data, size_t len)
|
||||||
{
|
{
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <wintypes.h>
|
/* #include <wintypes.h> */
|
||||||
#include <winscard.h>
|
#include <winscard.h>
|
||||||
|
|
||||||
/* Default timeout value for SCardGetStatusChange
|
/* Default timeout value for SCardGetStatusChange
|
||||||
|
@ -36,6 +36,20 @@
|
||||||
#define SC_STATUS_TIMEOUT SC_CUSTOM_STATUS_TIMEOUT
|
#define SC_STATUS_TIMEOUT SC_CUSTOM_STATUS_TIMEOUT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
/* Some windows specific kludge */
|
||||||
|
#define SCARD_PROTOCOL_ANY (SCARD_PROTOCOL_T0)
|
||||||
|
#define SCARD_SCOPE_GLOBAL SCARD_SCOPE_USER
|
||||||
|
|
||||||
|
/* Error printing */
|
||||||
|
#define PCSC_ERROR(ctx, desc, rv) error(ctx, desc ": %lx\n", rv);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define PCSC_ERROR(ctx, desc, rv) error(ctx, desc ": %s\n", pcsc_stringify_error(rv));
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#define GET_SLOT_PTR(s, i) (&(s)->slot[(i)])
|
#define GET_SLOT_PTR(s, i) (&(s)->slot[(i)])
|
||||||
#define GET_PRIV_DATA(r) ((struct pcsc_private_data *) (r)->drv_data)
|
#define GET_PRIV_DATA(r) ((struct pcsc_private_data *) (r)->drv_data)
|
||||||
#define GET_SLOT_DATA(r) ((struct pcsc_slot_data *) (r)->drv_data)
|
#define GET_SLOT_DATA(r) ((struct pcsc_slot_data *) (r)->drv_data)
|
||||||
|
@ -112,9 +126,9 @@ static int pcsc_transmit(struct sc_reader *reader, struct sc_slot_info *slot,
|
||||||
card = pslot->pcsc_card;
|
card = pslot->pcsc_card;
|
||||||
|
|
||||||
sSendPci.dwProtocol = opensc_proto_to_pcsc(slot->active_protocol);
|
sSendPci.dwProtocol = opensc_proto_to_pcsc(slot->active_protocol);
|
||||||
sSendPci.cbPciLength = 0;
|
sSendPci.cbPciLength = sizeof(sSendPci);
|
||||||
sRecvPci.dwProtocol = opensc_proto_to_pcsc(slot->active_protocol);
|
sRecvPci.dwProtocol = opensc_proto_to_pcsc(slot->active_protocol);
|
||||||
sRecvPci.cbPciLength = 0;
|
sRecvPci.cbPciLength = sizeof(sRecvPci);
|
||||||
|
|
||||||
if (prv->gpriv->apdu_fix && sendsize >= 6) {
|
if (prv->gpriv->apdu_fix && sendsize >= 6) {
|
||||||
/* Check if the APDU in question is of Case 4 */
|
/* Check if the APDU in question is of Case 4 */
|
||||||
|
@ -134,10 +148,13 @@ static int pcsc_transmit(struct sc_reader *reader, struct sc_slot_info *slot,
|
||||||
|
|
||||||
dwSendLength = sendsize;
|
dwSendLength = sendsize;
|
||||||
dwRecvLength = *recvsize;
|
dwRecvLength = *recvsize;
|
||||||
if (dwRecvLength > 255)
|
|
||||||
|
if (dwRecvLength > 255)
|
||||||
dwRecvLength = 255;
|
dwRecvLength = 255;
|
||||||
rv = SCardTransmit(card, &sSendPci, sendbuf, dwSendLength,
|
|
||||||
&sRecvPci, recvbuf, &dwRecvLength);
|
rv = SCardTransmit(card, &sSendPci, sendbuf, dwSendLength,
|
||||||
|
&sRecvPci, recvbuf, &dwRecvLength);
|
||||||
|
|
||||||
if (rv != SCARD_S_SUCCESS) {
|
if (rv != SCARD_S_SUCCESS) {
|
||||||
switch (rv) {
|
switch (rv) {
|
||||||
case SCARD_W_REMOVED_CARD:
|
case SCARD_W_REMOVED_CARD:
|
||||||
|
@ -151,8 +168,8 @@ static int pcsc_transmit(struct sc_reader *reader, struct sc_slot_info *slot,
|
||||||
return SC_ERROR_CARD_REMOVED;
|
return SC_ERROR_CARD_REMOVED;
|
||||||
#endif
|
#endif
|
||||||
return SC_ERROR_TRANSMIT_FAILED;
|
return SC_ERROR_TRANSMIT_FAILED;
|
||||||
default:
|
default:
|
||||||
error(reader->ctx, "SCardTransmit failed: %s\n", pcsc_stringify_error(rv));
|
PCSC_ERROR(reader->ctx, "SCardTransmit failed", rv);
|
||||||
return SC_ERROR_TRANSMIT_FAILED;
|
return SC_ERROR_TRANSMIT_FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -174,7 +191,7 @@ static int pcsc_detect_card_presence(struct sc_reader *reader, struct sc_slot_in
|
||||||
rgReaderStates[0].dwEventState = SCARD_STATE_UNAWARE;
|
rgReaderStates[0].dwEventState = SCARD_STATE_UNAWARE;
|
||||||
ret = SCardGetStatusChange(priv->pcsc_ctx, SC_STATUS_TIMEOUT, rgReaderStates, 1);
|
ret = SCardGetStatusChange(priv->pcsc_ctx, SC_STATUS_TIMEOUT, rgReaderStates, 1);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
error(reader->ctx, "SCardGetStatusChange failed: %s\n", pcsc_stringify_error(ret));
|
PCSC_ERROR(reader->ctx, "SCardGetStatusChange failed", ret);
|
||||||
SC_FUNC_RETURN(reader->ctx, 1, pcsc_ret_to_error(ret));
|
SC_FUNC_RETURN(reader->ctx, 1, pcsc_ret_to_error(ret));
|
||||||
}
|
}
|
||||||
if (rgReaderStates[0].dwEventState & SCARD_STATE_PRESENT) {
|
if (rgReaderStates[0].dwEventState & SCARD_STATE_PRESENT) {
|
||||||
|
@ -196,7 +213,7 @@ static int refresh_slot_attributes(struct sc_reader *reader, struct sc_slot_info
|
||||||
rgReaderStates[0].dwEventState = SCARD_STATE_UNAWARE;
|
rgReaderStates[0].dwEventState = SCARD_STATE_UNAWARE;
|
||||||
ret = SCardGetStatusChange(priv->pcsc_ctx, SC_STATUS_TIMEOUT, rgReaderStates, 1);
|
ret = SCardGetStatusChange(priv->pcsc_ctx, SC_STATUS_TIMEOUT, rgReaderStates, 1);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
error(reader->ctx, "SCardGetStatusChange failed: %s\n", pcsc_stringify_error(ret));
|
PCSC_ERROR(reader->ctx, "SCardGetStatusChange failed", ret);
|
||||||
return pcsc_ret_to_error(ret);
|
return pcsc_ret_to_error(ret);
|
||||||
}
|
}
|
||||||
slot->flags = 0;
|
slot->flags = 0;
|
||||||
|
@ -230,11 +247,11 @@ static int pcsc_connect(struct sc_reader *reader, struct sc_slot_info *slot)
|
||||||
pslot = (struct pcsc_slot_data *) malloc(sizeof(struct pcsc_slot_data));
|
pslot = (struct pcsc_slot_data *) malloc(sizeof(struct pcsc_slot_data));
|
||||||
if (pslot == NULL)
|
if (pslot == NULL)
|
||||||
return SC_ERROR_OUT_OF_MEMORY;
|
return SC_ERROR_OUT_OF_MEMORY;
|
||||||
rv = SCardConnect(priv->pcsc_ctx, priv->reader_name,
|
rv = SCardConnect(priv->pcsc_ctx, priv->reader_name,
|
||||||
SCARD_SHARE_SHARED, SCARD_PROTOCOL_ANY,
|
SCARD_SHARE_SHARED, SCARD_PROTOCOL_ANY,
|
||||||
&card_handle, &active_proto);
|
&card_handle, &active_proto);
|
||||||
if (rv != 0) {
|
if (rv != 0) {
|
||||||
error(reader->ctx, "SCardConnect failed: %s\n", pcsc_stringify_error(rv));
|
PCSC_ERROR(reader->ctx, "SCardConnect failed", rv);
|
||||||
free(pslot);
|
free(pslot);
|
||||||
return pcsc_ret_to_error(rv);
|
return pcsc_ret_to_error(rv);
|
||||||
}
|
}
|
||||||
|
@ -265,7 +282,7 @@ static int pcsc_lock(struct sc_reader *reader, struct sc_slot_info *slot)
|
||||||
assert(pslot != NULL);
|
assert(pslot != NULL);
|
||||||
rv = SCardBeginTransaction(pslot->pcsc_card);
|
rv = SCardBeginTransaction(pslot->pcsc_card);
|
||||||
if (rv != SCARD_S_SUCCESS) {
|
if (rv != SCARD_S_SUCCESS) {
|
||||||
error(reader->ctx, "SCardBeginTransaction failed: %s\n", pcsc_stringify_error(rv));
|
PCSC_ERROR(reader->ctx, "SCardBeginTransaction failed", rv);
|
||||||
return pcsc_ret_to_error(rv);
|
return pcsc_ret_to_error(rv);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -279,7 +296,7 @@ static int pcsc_unlock(struct sc_reader *reader, struct sc_slot_info *slot)
|
||||||
assert(pslot != NULL);
|
assert(pslot != NULL);
|
||||||
rv = SCardEndTransaction(pslot->pcsc_card, SCARD_LEAVE_CARD);
|
rv = SCardEndTransaction(pslot->pcsc_card, SCARD_LEAVE_CARD);
|
||||||
if (rv != SCARD_S_SUCCESS) {
|
if (rv != SCARD_S_SUCCESS) {
|
||||||
error(reader->ctx, "SCardEndTransaction failed: %s\n", pcsc_stringify_error(rv));
|
PCSC_ERROR(reader->ctx, "SCardEndTransaction failed", rv);
|
||||||
return pcsc_ret_to_error(rv);
|
return pcsc_ret_to_error(rv);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -313,7 +330,13 @@ static int pcsc_init(struct sc_context *ctx, void **reader_data)
|
||||||
struct pcsc_global_private_data *gpriv;
|
struct pcsc_global_private_data *gpriv;
|
||||||
scconf_block **blocks = NULL, *conf_block = NULL;
|
scconf_block **blocks = NULL, *conf_block = NULL;
|
||||||
|
|
||||||
rv = SCardEstablishContext(SCARD_SCOPE_GLOBAL, "localhost", NULL,
|
rv = SCardEstablishContext(SCARD_SCOPE_GLOBAL,
|
||||||
|
#ifndef _WIN32
|
||||||
|
"localhost",
|
||||||
|
#else
|
||||||
|
NULL,
|
||||||
|
#endif
|
||||||
|
NULL,
|
||||||
&pcsc_ctx);
|
&pcsc_ctx);
|
||||||
if (rv != SCARD_S_SUCCESS)
|
if (rv != SCARD_S_SUCCESS)
|
||||||
return pcsc_ret_to_error(rv);
|
return pcsc_ret_to_error(rv);
|
||||||
|
|
|
@ -26,13 +26,18 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
#undef sc_version
|
||||||
#ifdef VERSION
|
#ifdef VERSION
|
||||||
const char *sc_version = VERSION;
|
const char *sc_version = VERSION;
|
||||||
#else
|
#else
|
||||||
#warning FIXME: version info undefined
|
|
||||||
const char *sc_version = "(undef)";
|
const char *sc_version = "(undef)";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const char *sc_get_version(void)
|
||||||
|
{
|
||||||
|
return sc_version;
|
||||||
|
}
|
||||||
|
|
||||||
int sc_hex_to_bin(const char *in, u8 *out, size_t *outlen)
|
int sc_hex_to_bin(const char *in, u8 *out, size_t *outlen)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
|
@ -20,7 +20,9 @@
|
||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#ifndef _WIN32
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,8 @@ includedir = ${prefix}/include/opensc
|
||||||
|
|
||||||
MAINTAINERCLEANFILES = Makefile.in lex-parse.c
|
MAINTAINERCLEANFILES = Makefile.in lex-parse.c
|
||||||
|
|
||||||
|
EXTRA_DIST = Makefile.am
|
||||||
|
|
||||||
include_HEADERS = scconf.h
|
include_HEADERS = scconf.h
|
||||||
noinst_HEADERS = internal.h
|
noinst_HEADERS = internal.h
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
TOPDIR = ..\..
|
||||||
|
|
||||||
|
TARGET = scconf.lib
|
||||||
|
HEADERS = scconf.h
|
||||||
|
OBJECTS = parse.obj scconf.obj write.obj lex-parse.obj
|
||||||
|
|
||||||
|
.SUFFIXES : .l
|
||||||
|
|
||||||
|
all: $(TARGET) install-headers
|
||||||
|
|
||||||
|
lex-parse.c: lex-parse.l
|
||||||
|
flex -olex-parse.c < lex-parse.l
|
||||||
|
|
||||||
|
$(TARGET): $(OBJECTS)
|
||||||
|
lib /nologo /machine:ix86 /out:$(TARGET) $(OBJECTS)
|
||||||
|
|
||||||
|
!INCLUDE $(TOPDIR)\win32\Make.rules.mak
|
|
@ -25,7 +25,9 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#ifndef _WIN32
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
|
#endif
|
||||||
#include "scconf.h"
|
#include "scconf.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,11 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#ifndef _WIN32
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
|
#else
|
||||||
|
#define strcasecmp stricmp
|
||||||
|
#endif
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include "scconf.h"
|
#include "scconf.h"
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Process this file with automake to create Makefile.in
|
# Process this file with automake to create Makefile.in
|
||||||
|
|
||||||
MAINTAINERCLEANFILES = Makefile.in
|
MAINTAINERCLEANFILES = Makefile.in Makefile.mak
|
||||||
|
|
||||||
INCLUDES = @CFLAGS_OPENSC@
|
INCLUDES = @CFLAGS_OPENSC@
|
||||||
LDFLAGS = @LDFLAGS@ @LIBOPENSC@
|
LDFLAGS = @LDFLAGS@ @LIBOPENSC@
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <opensc/opensc.h>
|
#include <opensc/opensc.h>
|
||||||
#include <opensc/pkcs15.h>
|
#include <opensc/pkcs15.h>
|
||||||
|
|
|
@ -16,7 +16,7 @@ int sc_test_init(int *argc, char *argv[])
|
||||||
{
|
{
|
||||||
int i, c;
|
int i, c;
|
||||||
|
|
||||||
printf("Using libopensc version %s.\n", sc_version);
|
printf("Using libopensc version %s.\n", sc_get_version());
|
||||||
i = sc_establish_context(&ctx, "tests");
|
i = sc_establish_context(&ctx, "tests");
|
||||||
if (i != SC_SUCCESS) {
|
if (i != SC_SUCCESS) {
|
||||||
printf("Failed to establish context: %s\n", sc_strerror(i));
|
printf("Failed to establish context: %s\n", sc_strerror(i));
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
MAINTAINERCLEANFILES = Makefile.in
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
|
EXTRA_DIST = Makefile.mak
|
||||||
|
|
||||||
INCLUDES = @CFLAGS_OPENSC@
|
INCLUDES = @CFLAGS_OPENSC@
|
||||||
LDFLAGS = @LDFLAGS@ @LIBOPENSC@
|
LDFLAGS = @LDFLAGS@ @LIBOPENSC@
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
|
||||||
|
TOPDIR = ..\..
|
||||||
|
|
||||||
|
TARGETS = opensc-explorer.exe opensc-tool.exe \
|
||||||
|
pkcs15-tool.exe pkcs15-crypt.exe #pkcs15-init.exe
|
||||||
|
|
||||||
|
all: util.obj $(TARGETS)
|
||||||
|
|
||||||
|
!INCLUDE $(TOPDIR)\win32\Make.rules.mak
|
||||||
|
|
||||||
|
.c.obj:
|
||||||
|
cl $(COPTS) /c $<
|
||||||
|
|
||||||
|
.c.exe:
|
||||||
|
cl $(COPTS) /c $<
|
||||||
|
link $(LINKFLAGS) /pdb:$*.pdb /out:$@ $*.obj util.obj ..\common\common.lib ..\libopensc\opensc.lib
|
||||||
|
|
|
@ -1169,7 +1169,7 @@ int main(int argc, char * const argv[])
|
||||||
int cargc;
|
int cargc;
|
||||||
char *cargv[20];
|
char *cargv[20];
|
||||||
|
|
||||||
printf("OpenSC Explorer version %s\n", sc_version);
|
printf("OpenSC Explorer version %s\n", sc_get_version());
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
c = getopt_long(argc, argv, "r:c:d", options, &long_optind);
|
c = getopt_long(argc, argv, "r:c:d", options, &long_optind);
|
||||||
|
|
|
@ -23,7 +23,9 @@
|
||||||
#endif
|
#endif
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#ifndef _WIN32
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
|
@ -23,7 +23,9 @@
|
||||||
#endif
|
#endif
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#ifndef _WIN32
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -128,7 +130,7 @@ int write_output(const u8 *buf, int len)
|
||||||
int output_binary = 1;
|
int output_binary = 1;
|
||||||
|
|
||||||
if (opt_output != NULL) {
|
if (opt_output != NULL) {
|
||||||
outf = fopen(opt_output, "w");
|
outf = fopen(opt_output, "wb");
|
||||||
if (outf == NULL) {
|
if (outf == NULL) {
|
||||||
fprintf(stderr, "Unable to open '%s' for writing.\n", opt_output);
|
fprintf(stderr, "Unable to open '%s' for writing.\n", opt_output);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -9,11 +9,14 @@
|
||||||
#endif
|
#endif
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <strings.h>
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
#ifndef _WIN32
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <strings.h>
|
||||||
|
#endif
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <opensc/opensc.h>
|
#include <opensc/opensc.h>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
COPTS = /Zi /ML /nologo /DHAVE_CONFIG_H /DVERSION=\"0.7.0\" /I$(TOPDIR)\src\include
|
||||||
|
LINKFLAGS = /DEBUG /NOLOGO /INCREMENTAL:NO /MACHINE:IX86
|
||||||
|
|
||||||
|
|
||||||
|
install-headers:
|
||||||
|
@for %i in ( $(HEADERS) ) do \
|
||||||
|
@xcopy /d /q /y %i ..\include > nul
|
||||||
|
|
||||||
|
.c.obj::
|
||||||
|
cl $(COPTS) /c $<
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
$def = $ARGV[0];
|
||||||
|
shift @ARGV;
|
||||||
|
$lib = $ARGV[0];
|
||||||
|
shift @ARGV;
|
||||||
|
$dumpbin = "dumpbin /symbols @ARGV";
|
||||||
|
|
||||||
|
open(DUMP, "$dumpbin |")
|
||||||
|
|| die "Can't run `$dumpbin': $!.\n";
|
||||||
|
|
||||||
|
open(DEF, "> $def")
|
||||||
|
|| die "Can't open `$def': $!.\n";
|
||||||
|
|
||||||
|
print DEF "LIBRARY $lib\n";
|
||||||
|
print DEF "EXPORTS\n";
|
||||||
|
|
||||||
|
while(<DUMP>)
|
||||||
|
{
|
||||||
|
if(!/\bUNDEF\b/ && /\bExternal\b/)
|
||||||
|
{
|
||||||
|
s/^.*\|\s+//;
|
||||||
|
split;
|
||||||
|
$_ = $_[0];
|
||||||
|
|
||||||
|
if(!/^\?\?_G/ && !/^\?\?_E/)
|
||||||
|
{
|
||||||
|
# Stupid windows linker needs to have
|
||||||
|
# preceding underscore for ANSI C programs
|
||||||
|
s/^_//;
|
||||||
|
|
||||||
|
print DEF " $_\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue