Hi,

Thanks for your reply , please find the attachment that contains the
modified code.
 check hte free memory using top command before executing the
applicationad and at the time of executiing the code.
 Please insert and remove the card at the time of application. Please let me
know how many daemons will actually run.
 Please give me your valuable suggestions.

Thanks,
Sudheer.




On Feb 3, 2008 1:57 PM, Ludovic Rousseau <[EMAIL PROTECTED]> wrote:

> On Feb 3, 2008 6:31 PM, Sudheer Vemana <[EMAIL PROTECTED]> wrote:
> > The testpcsc.c is modified like this.
>
> Can you send me the modified testpcsc.c application so I can use it
> and reproduce the problem myself?
>
> Thanks
>
> --
>  Dr. Ludovic Rousseau
> _______________________________________________
> Muscle mailing list
> [email protected]
> http://lists.drizzle.com/mailman/listinfo/muscle
>
/*
 * MUSCLE SmartCard Development ( http://www.linuxnet.com )
 *
 * Copyright (C) 1999
 *  David Corcoran <[EMAIL PROTECTED]>
 * Copyright (C) 2004-2006
 *  Ludovic Rousseau <[EMAIL PROTECTED]>
 *
 * $Id: testpcsc.c 2706 2007-11-17 20:01:43Z rousseau $
 */

/**
 * @file
 * @brief This is a test program for pcsc-lite.
 */

#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "pcsclite.h"
#include "winscard.h"
#include "reader.h"

#define PANIC 0
#define DONT_PANIC 1
#define RED_PRINTF_FORMAT "\33[01;31m%s\33[0m\n"

void test_rv(LONG rv, SCARDCONTEXT hContext, int dont_panic);
void test_rv(LONG rv, SCARDCONTEXT hContext, int dont_panic)
{
        if (rv != SCARD_S_SUCCESS)
        {
                if (dont_panic)
                        printf("\33[34m%s (don't panic)\33[0m\n", 
pcsc_stringify_error(rv));
                else
                {
                        printf(RED_PRINTF_FORMAT, pcsc_stringify_error(rv));
                        SCardReleaseContext(hContext);
                        exit(-1);
                }
        }
        else
                puts(pcsc_stringify_error(rv));
}

int main(int argc, char **argv)
{
        SCARDHANDLE hCard;
        SCARDCONTEXT hContext;
        SCARD_READERSTATE_A rgReaderStates[1];
        DWORD dwReaderLen, dwState, dwProt, dwAtrLen;
        DWORD dwPref, dwReaders;
        char *pcReaders, *mszReaders;
        unsigned char pbAtr[MAX_ATR_SIZE];
        char *mszGroups;
        DWORD dwGroups;
        long rv;
        DWORD i;
        int p, iReader;
        int iList[16];
        SCARD_IO_REQUEST pioRecvPci;
        SCARD_IO_REQUEST pioSendPci;
        unsigned char bSendBuffer[MAX_BUFFER_SIZE];
        unsigned char bRecvBuffer[MAX_BUFFER_SIZE];
        DWORD send_length, length;

      while(1){ // I added this to check the memory leak
        
      sleep(5);    
        printf("\nMUSCLE PC/SC Lite unitary test Program\n\n");

        printf("\33[35mTHIS PROGRAM IS NOT DESIGNED AS A TESTING TOOL FOR END 
USERS!\n");
        printf("Do NOT use it unless you really know what you do.\33[0m\n\n");

        printf("Testing SCardEstablishContext\t: ");
        rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
        test_rv(rv, hContext, PANIC);

        printf("Testing SCardIsValidContext\t: ");
        rv = SCardIsValidContext(hContext);
        test_rv(rv, hContext, PANIC);

        printf("Testing SCardIsValidContext\t: ");
        rv = SCardIsValidContext(hContext+1);
        test_rv(rv, hContext, DONT_PANIC);

        printf("Testing SCardGetStatusChange \n");
        printf("Please insert a working reader\t: ");
        fflush(stdout);
        rv = SCardGetStatusChange(hContext, INFINITE, 0, 0);
        test_rv(rv, hContext, PANIC);

        printf("Testing SCardListReaderGroups\t: ");
        rv = SCardListReaderGroups(hContext, 0, &dwGroups);
        test_rv(rv, hContext, PANIC);

        mszGroups = malloc(sizeof(char) * dwGroups);
        rv = SCardListReaderGroups(hContext, mszGroups, &dwGroups);
        test_rv(rv, hContext, PANIC);

        /*
         * Have to understand the multi-string here
         */
        p = 0;
        for (i = 0; i < dwGroups - 1; i++)
        {
                ++p;
                printf("Group %02d: %s\n", p, &mszGroups[i]);
                iList[p] = i;
                while (mszGroups[++i] != 0) ;
        }

wait_for_card_again:
        printf("Testing SCardListReaders\t: ");

        mszGroups = NULL;
        rv = SCardListReaders(hContext, mszGroups, 0, &dwReaders);
        test_rv(rv, hContext, PANIC);

        mszReaders = malloc(sizeof(char) * dwReaders);
        rv = SCardListReaders(hContext, mszGroups, mszReaders, &dwReaders);
        test_rv(rv, hContext, PANIC);

        /*
         * Have to understand the multi-string here
         */
        p = 0;
        for (i = 0; i < dwReaders - 1; i++)
        {
                ++p;
                printf("Reader %02d: %s\n", p, &mszReaders[i]);
                iList[p] = i;
                while (mszReaders[++i] != 0) ;
        }

        if (p > 1)
                do
                {
                        char input[80];

                        printf("Enter the reader number\t\t: ");
                        fgets(input, sizeof(input), stdin);
                        sscanf(input, "%d", &iReader);

                        if (iReader > p || iReader <= 0)
                                printf("Invalid Value - try again\n");
                }
                while (iReader > p || iReader <= 0);
        else
                iReader = 1;

        rgReaderStates[0].szReader = &mszReaders[iList[iReader]];
        rgReaderStates[0].dwCurrentState = SCARD_STATE_EMPTY;

        printf("Waiting for card insertion\t: ");
        fflush(stdout);
        rv = SCardGetStatusChange(hContext, INFINITE, rgReaderStates, 1);
        test_rv(rv, hContext, PANIC);
        if (SCARD_STATE_EMPTY == rgReaderStates[0].dwEventState)
        {
                printf("\nA reader has been connected/disconnected\n");
                goto wait_for_card_again;
        }

        printf("Testing SCardConnect\t\t: ");
        rv = SCardConnect(hContext, &mszReaders[iList[iReader]],
                SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,
                &hCard, &dwPref);
        test_rv(rv, hContext, PANIC);

        switch(dwPref)
        {
                case SCARD_PROTOCOL_T0:
                        pioSendPci = *SCARD_PCI_T0;
                        break;
                case SCARD_PROTOCOL_T1:
                        pioSendPci = *SCARD_PCI_T1;
                        break;
                default:
                        printf("Unknown protocol\n");
                        return -1;
        }

        /* APDU select file */
        printf("Select file:");
        send_length = 7;
        memcpy(bSendBuffer, "\x00\xA4\x00\x00\x02\x3F\x00", send_length);
        for (i=0; i<send_length; i++)
                printf(" %02X", bSendBuffer[i]);
        printf("\n");
        length = sizeof(bRecvBuffer);

        printf("Testing SCardTransmit\t\t: ");
        rv = SCardTransmit(hCard, &pioSendPci, bSendBuffer, send_length,
                &pioRecvPci, bRecvBuffer, &length);
        printf("%s\n", pcsc_stringify_error(rv));
        printf(" card response:");
        for (i=0; i<length; i++)
                printf(" %02X", bRecvBuffer[i]);
        printf("\n");

        printf("Testing SCardControl\t\t: ");
#ifdef PCSC_PRE_120
        {
                char buffer[1024] = "Foobar";
                DWORD cbRecvLength = sizeof(buffer);

                rv = SCardControl(hCard, buffer, 7, buffer, &cbRecvLength);
        }
#else
        {
                char buffer[1024] = { 0x02 };
                DWORD cbRecvLength = sizeof(buffer);

                rv = SCardControl(hCard, SCARD_CTL_CODE(1), buffer, 1, buffer,
                        sizeof(buffer), &cbRecvLength);
                if (cbRecvLength && (SCARD_S_SUCCESS == rv))
                {
                        for (i=0; i<cbRecvLength; i++)
                                printf("%c", buffer[i]);
                        printf(" ");
                }
        }
#endif
        test_rv(rv, hContext, DONT_PANIC);

        printf("Testing SCardGetAttrib\t\t: ");
        rv = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING, NULL, &dwAtrLen);
        test_rv(rv, hContext, DONT_PANIC);
        if (rv == SCARD_S_SUCCESS)
                printf("ATR length: %ld\n", dwAtrLen);

        printf("Testing SCardGetAttrib\t\t: ");
        dwAtrLen = sizeof(pbAtr);
        rv = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING, pbAtr, &dwAtrLen);
        test_rv(rv, hContext, DONT_PANIC);
        if (rv == SCARD_S_SUCCESS)
        {
                for (i = 0; i < dwAtrLen; i++)
                        printf("%02X ", pbAtr[i]);
                printf("\n");
        }

        printf("Testing SCardGetAttrib\t\t: ");
        dwAtrLen = sizeof(pbAtr);
        rv = SCardGetAttrib(hCard, SCARD_ATTR_VENDOR_IFD_VERSION, pbAtr, 
&dwAtrLen);
        test_rv(rv, hContext, DONT_PANIC);
        if (rv == SCARD_S_SUCCESS)
                printf("Vendor IFD version\t\t: 0x%08lX\n", ((DWORD 
*)pbAtr)[0]);

        printf("Testing SCardGetAttrib\t\t: ");
        dwAtrLen = sizeof(pbAtr);
        rv = SCardGetAttrib(hCard, SCARD_ATTR_MAXINPUT, pbAtr, &dwAtrLen);
        test_rv(rv, hContext, DONT_PANIC);
        if (rv == SCARD_S_SUCCESS)
        {
                if (dwAtrLen == sizeof(uint32_t))
                        printf("Max message length\t\t: %d\n", *(uint32_t 
*)pbAtr);
                else
                        printf(RED_PRINTF_FORMAT, "Wrong size");
        }

        printf("Testing SCardGetAttrib\t\t: ");
        dwAtrLen = sizeof(pbAtr);
        rv = SCardGetAttrib(hCard, SCARD_ATTR_VENDOR_NAME, pbAtr, &dwAtrLen);
        test_rv(rv, hContext, DONT_PANIC);
        if (rv == SCARD_S_SUCCESS)
                printf("Vendor name\t\t\t: %s\n", pbAtr);

        printf("Testing SCardSetAttrib\t\t: ");
        rv = SCardSetAttrib(hCard, SCARD_ATTR_ATR_STRING, (LPCBYTE)"", 1);
        test_rv(rv, hContext, DONT_PANIC);

        printf("Testing SCardStatus\t\t: ");

        dwReaderLen = 100;
        pcReaders   = malloc(sizeof(char) * 100);
        dwAtrLen    = MAX_ATR_SIZE;

        rv = SCardStatus(hCard, pcReaders, &dwReaderLen, &dwState, &dwProt,
                pbAtr, &dwAtrLen);
        test_rv(rv, hContext, PANIC);

        printf("Current Reader Name\t\t: %s\n", pcReaders);
        printf("Current Reader State\t\t: 0x%.4lx\n", dwState);
        printf("Current Reader Protocol\t\t: T=%ld\n", dwProt - 1);
        printf("Current Reader ATR Size\t\t: %ld bytes\n", dwAtrLen);
        printf("Current Reader ATR Value\t: ");

        for (i = 0; i < dwAtrLen; i++)
        {
                printf("%02X ", pbAtr[i]);
        }
        printf("\n");

        if (rv != SCARD_S_SUCCESS)
        {
                SCardDisconnect(hCard, SCARD_RESET_CARD);
                SCardReleaseContext(hContext);
        }

        //printf("Press enter: ");
        //getchar();
        printf("Testing SCardReconnect\t\t: ");
        rv = SCardReconnect(hCard, SCARD_SHARE_SHARED,
                SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, SCARD_UNPOWER_CARD, 
&dwPref);
        test_rv(rv, hContext, PANIC);

        printf("Testing SCardDisconnect\t\t: ");
        rv = SCardDisconnect(hCard, SCARD_UNPOWER_CARD);
        test_rv(rv, hContext, PANIC);

        printf("Testing SCardReleaseContext\t: ");
        rv = SCardReleaseContext(hContext);
        test_rv(rv, hContext, PANIC);

        printf("\n");
        printf("PC/SC Test Completed Successfully !\n");
      
      } 
        return 0;
}
_______________________________________________
Muscle mailing list
[email protected]
http://lists.drizzle.com/mailman/listinfo/muscle

Reply via email to