fix bugs for optlen setting in layer2_Getopt of iso14443a (Uwe Hermann)
[librfid] / src / rfid_layer2_iso14443a.c
index 66914db..528c5fb 100644 (file)
@@ -43,7 +43,7 @@ iso14443a_transceive_sf(struct rfid_layer2_handle *handle,
                         unsigned char cmd,
                         struct iso14443a_atqa *atqa)
 {
-       struct rfid_reader *rdr = handle->rh->reader;
+       const struct rfid_reader *rdr = handle->rh->reader;
 
        return rdr->iso14443a.transceive_sf(handle->rh, cmd, atqa);
 }
@@ -54,7 +54,7 @@ iso14443a_transceive_acf(struct rfid_layer2_handle *handle,
                         struct iso14443a_anticol_cmd *acf,
                         unsigned int *bit_of_col)
 {
-       struct rfid_reader *rdr = handle->rh->reader;
+       const struct rfid_reader *rdr = handle->rh->reader;
 
        return rdr->iso14443a.transceive_acf(handle->rh, acf, bit_of_col);
 }
@@ -85,35 +85,34 @@ iso14443a_code_nvb_bits(unsigned char *nvb, unsigned int bits)
        return 0;
 }
 
-int random_bit(void)
+static int random_bit(void)
 {
-    unsigned long e;
+       unsigned long e;
 
-    e = randctx[0];    
-    randctx[0]=randctx[1];
-    randctx[1]=(randctx[2]<<19) + (randctx[2]>>13) + randctx[3];
-    randctx[2]=randctx[3] ^ randctx[0];
-    randctx[3]=e+randctx[1];
+       e = randctx[0];    
+       randctx[0] = randctx[1];
+       randctx[1] = (randctx[2]<<19) + (randctx[2]>>13) + randctx[3];
+       randctx[2] = randctx[3] ^ randctx[0];
+       randctx[3] = e+randctx[1];
     
-    return randctx[1]&1;
+       return randctx[1]&1;
 }
 
 /* first bit is '1', second bit '2' */
 static void
 rnd_toggle_bit_in_field(unsigned char *bitfield, unsigned int size, unsigned int bit)
 {
-    unsigned int byte,rnd;
+       unsigned int byte,rnd;
 
-    if(bit && (bit <= (size*8)) )
-    {
-       rnd=random_bit();
+       if (bit && (bit <= (size*8))) {
+               rnd = random_bit();
        
-        DEBUGP("xor'ing bit %u with %u\n",bit,rnd);
-        bit--;
-        byte=bit/8;
-        bit=rnd<<(bit%8);
-        bitfield[byte] ^= bit;
-    }
+               DEBUGP("xor'ing bit %u with %u\n",bit,rnd);
+               bit--;
+               byte = bit/8;
+               bit = rnd << (bit % 8);
+               bitfield[byte] ^= bit;
+       }
 }
 
 
@@ -238,13 +237,10 @@ cascade:
                }
        }
 
-       h->level = ISO14443A_LEVEL_NONE;
-       h->state = ISO14443A_STATE_SELECTED;
-
        {
-               if (uid_size == 1)
+               if (h->level == ISO14443A_LEVEL_CL1)
                        handle->uid_len = 4;
-               else if (uid_size == 2)
+               else if (h->level == ISO14443A_LEVEL_CL2)
                        handle->uid_len = 7;
                else 
                        handle->uid_len = 10;
@@ -252,6 +248,10 @@ cascade:
                DEBUGP("UID %s\n", rfid_hexdump(handle->uid, handle->uid_len));
        }
 
+       h->level = ISO14443A_LEVEL_NONE;
+       h->state = ISO14443A_STATE_SELECTED;
+       h->sak = sak[0];
+
        if (sak[0] & 0x20) {
                DEBUGP("we have a T=CL compliant PICC\n");
                handle->proto_supported = 1 << RFID_PROTOCOL_TCL;
@@ -289,7 +289,7 @@ iso14443a_setopt(struct rfid_layer2_handle *handle, int optname,
                 const void *optval, unsigned int optlen)
 {
        int ret = -EINVAL;
-       struct rfid_reader *rdr = handle->rh->reader;
+       const struct rfid_reader *rdr = handle->rh->reader;
        unsigned int speed;
 
        switch (optname) {
@@ -324,15 +324,22 @@ iso14443a_getopt(struct rfid_layer2_handle *handle, int optname,
        int ret = -EINVAL;
        struct iso14443a_handle *h = &handle->priv.iso14443a;
        struct iso14443a_atqa *atqa = optval;
+       u_int8_t *opt_u8 = optval;
        int *wupa = optval;
 
        switch (optname) {
+       case RFID_OPT_14443A_SAK:
+               *opt_u8 = h->sak;
+               *optlen = sizeof(*opt_u8);
+               break;
        case RFID_OPT_14443A_ATQA:
                *atqa = h->atqa;
+               *optlen = sizeof(*atqa)
                ret = 0;
                break;
        case RFID_OPT_14443A_WUPA:
                *wupa = ((handle->flags & RFID_OPT_LAYER2_WUP) != 0);
+               *optlen = sizeof(*wupa);
                ret = 0;
                break;
        };
@@ -362,7 +369,7 @@ iso14443a_init(struct rfid_reader_handle *rh)
        h->priv.iso14443a.state = ISO14443A_STATE_NONE;
        h->priv.iso14443a.level = ISO14443A_LEVEL_NONE;
 
-       ret = h->rh->reader->iso14443a.init(h->rh);
+       ret = h->rh->reader->init(h->rh, RFID_LAYER2_ISO14443A);
        if (ret < 0) {
                free_layer2_handle(h);
                return NULL;