Projekt

Allgemein

Profil

Herunterladen (4,53 KB) Statistiken
| Zweig: | Markierung: | Revision:
cf2fd3ce martin

int readVD(LC_CARD *card, GWEN_DB_NODE *dbArgs) {
int rv;
LC_CLIENT_RESULT res;
int v;
int dobeep;

v=GWEN_DB_GetIntValue(dbArgs, "verbosity", 0, 0);
dobeep=GWEN_DB_GetIntValue(dbArgs, "beep", 0, 0);

/* try to open as EGK */
rv=LC_EgkCard_ExtendCard(card);
if (rv) {
if (dobeep)
errorBeep();
return rv;
}

if (v>0)
fprintf(stderr, "Opening card as EGK card.\n");
res=LC_Card_Open(card);
if (res==LC_Client_ResultOk) {
GWEN_BUFFER *tbuf;

if (v>0)
fprintf(stderr, "Card is a EGK card, handling it.\n");
tbuf=GWEN_Buffer_new(0, 256, 0, 1);
res=LC_EgkCard_ReadVd(card, tbuf);
if (res!=LC_Client_ResultOk) {
showError(card, res, "LC_EgkCard_ReadVd");
GWEN_Buffer_free(tbuf);
return RETURNVALUE_WORK;
}

/* close card */
if (v>0)
fprintf(stderr, "Closing card.\n");
res=LC_Card_Close(card);
if (res!=LC_Client_ResultOk) {
showError(card, res, "CardClose");
GWEN_Buffer_free(tbuf);
return RETURNVALUE_WORK;
}

if (v>1)
fprintf(stderr, "Card closed.\n");

if (v>1)
fprintf(stderr, "Writing data.\n");
writeFile(stdout,
GWEN_Buffer_GetStart(tbuf),
GWEN_Buffer_GetUsedBytes(tbuf));

GWEN_Buffer_free(tbuf);

return rv;
}
else {
if (v>0)
fprintf(stderr, "Card is not a EGK card.\n");
showError(card, res, "CardOpen");
}

/* not supported */
if (dobeep)
errorBeep();
return RETURNVALUE_CARD_NOT_SUPP;
}



int rdvd(LC_CLIENT *cl, GWEN_DB_NODE *dbArgs){
LC_CARD *card=0;
LC_CLIENT_RESULT res;
int v;
int i;
uint32_t cardId;
int dobeep;
int rv=0;

v=GWEN_DB_GetIntValue(dbArgs, "verbosity", 0, 0);
cardId=GWEN_DB_GetIntValue(dbArgs, "cardId", 0, 0);
dobeep=GWEN_DB_GetIntValue(dbArgs, "beep", 0, 0);

if (v>1)
fprintf(stderr, "Connecting to server.\n");
res=LC_Client_Start(cl);
if (res!=LC_Client_ResultOk) {
showError(card, res, "StartWait");
if (dobeep)
errorBeep();
return RETURNVALUE_WORK;
}
if (v>1)
fprintf(stderr, "Connected.\n");

if (cardId==0) {
for (i=0;;i++) {
if (v>0)
fprintf(stderr, "Waiting for card...\n");
res=LC_Client_GetNextCard(cl, &card, 20);
if (res!=LC_Client_ResultOk) {
showError(card, res, "GetNextCard");
if (dobeep)
errorBeep();
return RETURNVALUE_WORK;
}
if (v>0)
fprintf(stderr, "Found a card.\n");

rv=readVD(card, dbArgs);

if (v>0)
fprintf(stderr, "Releasing card.\n");
res=LC_Client_ReleaseCard(cl, card);
if (res!=LC_Client_ResultOk) {
showError(card, res, "ReleaseCard");
if (dobeep)
errorBeep();
LC_Card_free(card);
return RETURNVALUE_WORK;
}
LC_Card_free(card);

#if 1
break;
#else
if (rv!=RETURNVALUE_CARD_NOT_SUPP)
break;

if (i>15) {
fprintf(stderr, "ERROR: No card found.\n");
if (dobeep)
errorBeep();
return RETURNVALUE_WORK;
}
#endif
} /* for */
}
else {
for (i=0;;i++) {
if (v>0)
fprintf(stderr, "Waiting for card...\n");
res=LC_Client_GetNextCard(cl, &card, 2);
if (res!=LC_Client_ResultOk) {
showError(card, res, "GetNextCard");
if (dobeep)
errorBeep();
LC_Client_Stop(cl);
return RETURNVALUE_WORK;
}
if (v>0)
fprintf(stderr, "Found a card.\n");

if (LC_Card_GetCardId(card)!=cardId) {
if (v>0)
fprintf(stderr, "Not the wanted card (%08x), releasing.\n",
cardId);
if (v>0)
fprintf(stderr, "Releasing card.\n");
res=LC_Client_ReleaseCard(cl, card);
if (res!=LC_Client_ResultOk) {
showError(card, res, "ReleaseCard");
if (dobeep)
errorBeep();
LC_Card_free(card);
LC_Client_Stop(cl);
return RETURNVALUE_WORK;
}
LC_Card_free(card);
}
else {
rv=handleCard(card, dbArgs);

if (v>0)
fprintf(stderr, "Releasing card.\n");
res=LC_Client_ReleaseCard(cl, card);
if (res!=LC_Client_ResultOk) {
showError(card, res, "ReleaseCard");
if (dobeep)
errorBeep();
LC_Card_free(card);
LC_Client_Stop(cl);
return RETURNVALUE_WORK;
}
LC_Card_free(card);
break;
}
if (i>15) {
fprintf(stderr, "ERROR: No card found.\n");
if (dobeep)
errorBeep();
LC_Client_Stop(cl);
return RETURNVALUE_WORK;
}
} /* for */
}

/* stop waiting */
if (v>1)
fprintf(stderr, "Telling the server that we need no more cards.\n");
res=LC_Client_Stop(cl);
if (res!=LC_Client_ResultOk) {
showError(card, res, "Stop");
if (dobeep)
errorBeep();
return RETURNVALUE_WORK;
}

/* finished */
if (v>1)
fprintf(stderr, "Finished.\n");
return rv;
}