#include <ctapi.h>

int main(void)
{
  unsigned char  sad, dad;     /* Sender- und Empfänger-Adresse */
  unsigned short ctn,          /* Terminal Nummer */
                 lenc,         /* Länge Kommand-APDU */
                 lenr,         /* Länge Antwort-APDU */
                 pn;           /* Port Nummer */
  char           ret;          /* Rückgabewert */
  unsigned char  response[90]; /* Puffer für Antwort-APDU */
  unsigned short int trailer;  /* Antwort Trailer */

                               /* CLA   INS   P1    P2    Lc */
  unsigned char  REQUEST_ICC[] = {0x20, 0x12, 0x01, 0x00, 0};

  /* Initialisierung des Terminals */
  ctn = 0;                /* Verbindungs Nummer */
  pn  = 1;                /* /dev/ttyS1 */
  ret = CT_init(ctn,pn);

  if (ret!=OK)
  {
       printf("Terminal konnte nicht initialisiert werden\n");
       exit(1);
  }

  /* Transaktion vorbereiten */
  sad = HOST;                 /* Sender */
  dad = CT;                   /* Empfänger: Terminal */
  lenc = sizeof(REQUEST_ICC); /* Puffergröße für Kommando-APDU ermitteln */
  lenr = sizeof(response);    /* Puffergröße für Antwort-APDU ermitteln */

  /* Transaktion ausführen um Kartentyp ermitteln */
  ret = CT_data(ctn, &dad, &sad, lenc, REQUEST_ICC, &lenr, response);

  if (ret!=OK)
  {
     printf("Transaktion fehlgeschlagen!\n");
     exit(1);
  }

  trailer = (response[0]<<8) + response[1]; /* Trailer aus SW1 und SW2 zusammensetzen */

  switch(trailer)
  {
       case 0x9000 : printf("[synchrone ICC] Speicherkarte eingelegt\n");
                     break;

       case 0x9001 : printf("[asynchrone ICC] Prozessorkarte eingelegt\n");
                     break;

       case 0x6200 : printf("keine Karte eingelegt\n");
                     break;

       case 0x6201 : printf("Karte anderweitig in Benutzung\n");
                     break;

       case 0x6400 : printf("Reset der Karte ohne Erfolg\n");
                     break;

       case 0x6900 : printf("Timer-Kommando wird nicht unterstützt\n");
                     break;

       default     : printf("Unbekannter Fehler\n");
                     break;
  }

  ret = CT_close(ctn);  /* Verbindung auflösen */
}