--- PT1-arib25/arib25/src/Makefile 2011/10/07 03:45:12 1.1 +++ PT1-arib25/arib25/src/Makefile 2011/10/19 19:30:46 @@ -9,13 +9,15 @@ DEST_HEADER = $(PREFIX)/include/arib25 CC = gcc PCSC_CFLAGS ?= `pkg-config libpcsclite --cflags` CPPFLAGS = -Wall $(PCSC_CFLAGS) -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -CFLAGS = -O2 -g -fPIC +##CFLAGS = -O2 -g -fPIC +CFLAGS = -O -g -fPIC PCSC_LIBS ?= `pkg-config libpcsclite --libs` LIBS = $(PCSC_LIBS) -lm LDFLAGS ?= OBJS = arib_std_b25.o b_cas_card.o multi2.o ts_section_parser.o +OBJS += bcc.o HEADERS = arib_std_b25.h b_cas_card.h portable.h TARGET_APP = b25 TARGET_LIB = libarib25.so @@ -40,9 +42,9 @@ $(DEPEND): install: $(TARGET) install-headers install -m755 b25 $(PREFIX)/bin install -m755 $(TARGET_LIB) $(PREFIX)/lib/$(TARGET_LIB).$(VER) - ln -sf $(PREFIX)/lib/$(TARGET_LIB).$(VER) $(PREFIX)/lib/$(TARGET_LIB).$(MAJOR) - ln -sf $(PREFIX)/lib/$(TARGET_LIB).$(MAJOR) $(PREFIX)/lib/$(TARGET_LIB) - ldconfig + ln -sf $(TARGET_LIB).$(VER) $(PREFIX)/lib/$(TARGET_LIB).$(MAJOR) + ln -sf $(TARGET_LIB).$(MAJOR) $(PREFIX)/lib/$(TARGET_LIB) +## ldconfig install-headers: mkdir -p $(DEST_HEADER) --- PT1-arib25/arib25/src/b_cas_card.h 2012/07/10 23:51:02 1.1 +++ PT1-arib25/arib25/src/b_cas_card.h 2011/10/19 22:56:38 @@ -72,4 +72,12 @@ extern B_CAS_CARD *create_b_cas_card(); } #endif +#ifdef USE_BCC +#define SCardConnect SCardConnect_bcc +#define SCardDisconnect SCardDisconnect_bcc +#define SCardEstablishContext SCardEstablishContext_bcc +#define SCardListReaders SCardListReaders_bcc +#define SCardReleaseContext SCardReleaseContext_bcc +#define SCardTransmit SCardTransmit_bcc +#endif #endif /* B_CAS_CARD_H */ --- PT1-arib25/arib25/src/bcc.c 2012/07/10 23:53:30 1.1 +++ PT1-arib25/arib25/src/bcc.c 2012/07/10 23:56:46 @@ -0,0 +1,172 @@ +/* $Header: /home/hiro/projects/dvr2/PT1-arib25/arib25/src/RCS/bcc.c,v 1.2 2012/07/10 23:56:32 hiro Exp $ + * + * bcc.c - BonCasClient + * + * Replaces major SCard API functions used in libarib25 with BonCasClient + * counterparts + * + * Copyright (c) 2011 Hiro Sugawara + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static const char *boncas = "BonCasClient at "; +static char cardreader[256]; +static char *server; + +static int checkBCC(void) +{ + if (server != NULL); + return 1; + server = getenv("BONCASSERVER"); + return (server != NULL); +} + +static int openbcc(const char *server) +{ + int sock = -1; + struct hostent *h; + struct sockaddr_in sa; + int port = 6900; + char *p = index(server, ':'); + + if (p) { + *p++ = '\0'; + port = atoi(p); + if (port <= 0) + return -1; + } + + h = gethostbyname(server); + if (!h) + return -1; + if (p) + *--p = ':'; + + memset(&sa, 0, sizeof sa); + sa.sin_family = AF_INET; + sa.sin_port = htons(port); + memcpy(&sa.sin_addr.s_addr, h->h_addr, h->h_length); + + sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0) + return sock; + if (connect(sock, &sa, sizeof sa) < 0) { + close(sock); + sock = -1; + } + return sock; +} + +PCSC_API LONG SCardTransmit_bcc(SCARDHANDLE hCard, + LPCSCARD_IO_REQUEST pioSendPci, + LPCBYTE pbSendBuffer, DWORD cbSendLength, + /*@out@*/ LPSCARD_IO_REQUEST pioRecvPci, + /*@out@*/ LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength) +{ +#define BUF_MAX 254 + char sbuf[BUF_MAX + 2], rbuf[BUF_MAX + 2]; + int retry = 10; + + if (!checkBCC()) + return SCardTransmit(hCard, pioSendPci, + pbSendBuffer, cbSendLength, + pioRecvPci, + pbRecvBuffer, pcbRecvLength); + + + if (!cbSendLength) { + *pcbRecvLength = 0; + return SCARD_S_SUCCESS; + } + if (cbSendLength > BUF_MAX) + return SCARD_E_NO_MEMORY; + sbuf[0] = cbSendLength; + memcpy(&sbuf[1], pbSendBuffer, cbSendLength); + + while (retry-- > 0) { + if (send(hCard, sbuf, cbSendLength + 1, 0) != cbSendLength + 1) + goto fail; + if (recv(hCard, rbuf, sizeof sbuf, 0) > 0) + break; +fail: + sleep(1); + } + + if (!retry) + return SCARD_F_COMM_ERROR; + + *pcbRecvLength = (unsigned int)rbuf[0]; + memcpy(pbRecvBuffer, &rbuf[1], *pcbRecvLength); + return SCARD_S_SUCCESS; +} + +PCSC_API LONG SCardConnect_bcc(SCARDCONTEXT hContext, + LPCSTR szReader, + DWORD dwShareMode, + DWORD dwPreferredProtocols, + /*@out@*/ LPSCARDHANDLE phCard, + /*@out@*/ LPDWORD pdwActiveProtocol) +{ + int sock; + + if (!checkBCC()) + return SCardConnect(hContext, szReader, dwShareMode, + dwPreferredProtocols, phCard, pdwActiveProtocol); + sock = openbcc(server); + if (sock < 0) + return SCARD_F_COMM_ERROR; + *phCard = sock; + return SCARD_S_SUCCESS; +} + + +PCSC_API LONG SCardDisconnect_bcc(SCARDHANDLE hCard, DWORD dwDisposition) +{ + if (!checkBCC()) + return SCardDisconnect(hCard, dwDisposition); + + close(hCard); + return SCARD_S_SUCCESS; +} + +PCSC_API LONG SCardEstablishContext_bcc(DWORD dwScope, + /*@null@*/ LPCVOID pvReserved1, /*@null@*/ LPCVOID pvReserved2, + /*@out@*/ LPSCARDCONTEXT phContext) +{ + if (!checkBCC()) + return SCardEstablishContext(dwScope, pvReserved1, pvReserved2, phContext); + return SCARD_S_SUCCESS; +} + +PCSC_API LONG SCardListReaders_bcc(SCARDCONTEXT hContext, + /*@null@*/ /*@out@*/ LPCSTR mszGroups, + /*@null@*/ /*@out@*/ LPSTR mszReaders, + /*@out@*/ LPDWORD pcchReaders) +{ + if (!checkBCC()) + return SCardListReaders(hContext, mszGroups, mszReaders, pcchReaders); + + sprintf(cardreader, "%s %s", boncas, server); + cardreader[strlen(cardreader) + 1] = '\0'; + *pcchReaders = strlen(cardreader) + 1; + if (mszReaders) + strcpy(mszReaders, cardreader); + return SCARD_S_SUCCESS; +} + +PCSC_API LONG SCardReleaseContext_bcc(SCARDCONTEXT hContext) +{ + if (!checkBCC()) + return SCardReleaseContext(hContext); + return SCARD_S_SUCCESS; +}