pkcsconf currently prints all token/slot info for every slot available. This 
happens even when providing -c <slot_id>. This patch makes pkcsconf print only 
1 slot/token's info if -c is provided.

Signed-off-by: Kent Yoder <[email protected]>

 usr/sbin/pkcsconf/pkcsconf.c |  187 +++++++++++++++++++++++++-----------------
 1 files changed, 113 insertions(+), 74 deletions(-)

diff --git a/usr/sbin/pkcsconf/pkcsconf.c b/usr/sbin/pkcsconf/pkcsconf.c
index ecbf7e0..9cca23f 100755
--- a/usr/sbin/pkcsconf/pkcsconf.c
+++ b/usr/sbin/pkcsconf/pkcsconf.c
@@ -338,8 +338,8 @@ int get_pin(CK_CHAR **);
 CK_RV cleanup(void);
 CK_RV display_pkcs11_info(void);
 CK_RV get_slot_list(int, CK_CHAR_PTR);
-CK_RV display_slot_info(void);
-CK_RV display_token_info(void);
+CK_RV display_slot_info(int);
+CK_RV display_token_info(int);
 CK_RV display_mechanism_info(void);
 void display_shared_memory(void);
 void *attach_shared_memory(void);
@@ -482,11 +482,11 @@ main(int argc, char *argv[]){
 
    /* If the user wants to display token info call the function to do so */
    if (flags & CFG_TOKEN_INFO)
-      display_token_info();
+      display_token_info((flags & CFG_SLOT) ? in_slot : -1);
 
    /* If the user wants to display slot info call the function to do so */
    if (flags & CFG_SLOT_INFO)
-      display_slot_info();
+      display_slot_info((flags & CFG_SLOT) ? in_slot : -1);
 
    /* If the user wants to display slot info call the function to do so */
    if (flags & CFG_LIST_SLOT)
@@ -944,12 +944,50 @@ display_mechanism_info(void){
    return CKR_OK;
 }
 
+void
+print_slot_info(int slot_id, CK_SLOT_INFO *SlotInfo)
+{
+      /* Display the slot information */
+      printf(PKCSINIT_MSG(SLOTINFO, "Slot #%d Info\n"), slot_id);
+      printf(PKCSINIT_MSG(SLOTDESC, "\tDescription: %.64s\n"), 
SlotInfo->slotDescription);
+      printf(PKCSINIT_MSG(MANUFACT, "\tManufacturer: %.32s\n"), 
SlotInfo->manufacturerID);
+      printf(PKCSINIT_MSG(FLAGS, "\tFlags: 0x%X ("), SlotInfo->flags);
+
+      if (SlotInfo->flags & CKF_TOKEN_PRESENT)
+             printf(PKCSINIT_MSG(FLAGS, "TOKEN_PRESENT|"));
+      if (SlotInfo->flags & CKF_REMOVABLE_DEVICE)
+             printf(PKCSINIT_MSG(FLAGS, "REMOVABLE_DEVICE|"));
+      if (SlotInfo->flags & CKF_HW_SLOT)
+             printf(PKCSINIT_MSG(FLAGS, "HW_SLOT|"));
+      printf(")\n");
+
+      printf(PKCSINIT_MSG(HWVERSION, "\tHardware Version: %d.%d\n"),
+            SlotInfo->hardwareVersion.major,
+            SlotInfo->hardwareVersion.minor);
+      printf(PKCSINIT_MSG(FWVERSION, "\tFirmware Version: %d.%d\n"),
+            SlotInfo->firmwareVersion.major,
+            SlotInfo->firmwareVersion.minor);
+}
+
 CK_RV
-display_slot_info(void){
+display_slot_info(int slot_id)
+{
    CK_RV          rc;        // Return Code
    CK_SLOT_INFO   SlotInfo;  // Structure to hold slot information
    unsigned int   lcv;       // Loop control Variable
 
+   if (slot_id != -1) {
+      rc = FunctionPtr->C_GetSlotInfo(slot_id, &SlotInfo);
+      if (rc != CKR_OK) {
+         printf(PKCSINIT_MSG(SLOTERROR2, "Error getting slot info: 0x%X (%s) 
\n"), rc,
+               p11_get_ckr(rc));
+         return rc;
+      }
+
+      print_slot_info(slot_id, &SlotInfo);
+      return CKR_OK;
+   }
+
    for (lcv = 0; lcv < SlotCount; lcv++){
       /* Get the info for the slot we are examining and store in SlotInfo*/
       rc = FunctionPtr->C_GetSlotInfo(SlotList[lcv], &SlotInfo);
@@ -958,26 +996,8 @@ display_slot_info(void){
          return rc;
       }
 
-      /* Display the slot information */
-      printf(PKCSINIT_MSG(SLOTINFO, "Slot #%d Info\n"), SlotList[lcv]);
-      printf(PKCSINIT_MSG(SLOTDESC, "\tDescription: %.64s\n"), 
SlotInfo.slotDescription);
-      printf(PKCSINIT_MSG(MANUFACT, "\tManufacturer: %.32s\n"), 
SlotInfo.manufacturerID);
-      printf(PKCSINIT_MSG(FLAGS, "\tFlags: 0x%X ("), SlotInfo.flags);
+      print_slot_info(SlotList[lcv], &SlotInfo);
 
-      if (SlotInfo.flags & CKF_TOKEN_PRESENT)
-             printf(PKCSINIT_MSG(FLAGS, "TOKEN_PRESENT|"));
-      if (SlotInfo.flags & CKF_REMOVABLE_DEVICE)
-             printf(PKCSINIT_MSG(FLAGS, "REMOVABLE_DEVICE|"));
-      if (SlotInfo.flags & CKF_HW_SLOT)
-             printf(PKCSINIT_MSG(FLAGS, "HW_SLOT|"));
-      printf(")\n");
-
-      printf(PKCSINIT_MSG(HWVERSION, "\tHardware Version: %d.%d\n"),
-            SlotInfo.hardwareVersion.major,
-            SlotInfo.hardwareVersion.minor);
-      printf(PKCSINIT_MSG(FWVERSION, "\tFirmware Version: %d.%d\n"),
-            SlotInfo.firmwareVersion.major,
-            SlotInfo.firmwareVersion.minor);
    }
    return CKR_OK;
 }
@@ -1003,83 +1023,102 @@ list_slot(void){
    return CKR_OK;
 }
 
-CK_RV
-display_token_info(void){
-   CK_RV          rc;         // Return Code
-   CK_TOKEN_INFO  TokenInfo;  // Variable to hold Token Information
-   unsigned int   lcv;        // Loop control variable
-
-   for (lcv = 0; lcv < SlotCount; lcv++){
-      /* Get the Token info for each slot in the system */
-      rc = FunctionPtr->C_GetTokenInfo(SlotList[lcv], &TokenInfo);
-      if (rc != CKR_OK) {
-         printf(PKCSINIT_MSG(TOKERROR, "Error getting token info: 0x%X 
(%s)\n"), rc, p11_get_ckr(rc));
-         return rc;
-      }
-
+void
+print_token_info(int slot_id, CK_TOKEN_INFO *TokenInfo)
+{
       /* Display the token information */
-      printf(PKCSINIT_MSG(TOKINFO, "Token #%d Info:\n"), SlotList[lcv]);
-      printf(PKCSINIT_MSG(TOKLABEL, "\tLabel: %.32s\n"), TokenInfo.label);
-      printf(PKCSINIT_MSG(MANUFACT, "\tManufacturer: %.32s\n"), 
TokenInfo.manufacturerID);
-      printf(PKCSINIT_MSG(MODEL, "\tModel: %.16s\n"), TokenInfo.model);
-      printf(PKCSINIT_MSG(SERIAL, "\tSerial Number: %.16s\n"), 
TokenInfo.serialNumber);
-      printf(PKCSINIT_MSG(FLAGS, "\tFlags: 0x%X ("), TokenInfo.flags);
+      printf(PKCSINIT_MSG(TOKINFO, "Token #%d Info:\n"), slot_id);
+      printf(PKCSINIT_MSG(TOKLABEL, "\tLabel: %.32s\n"), TokenInfo->label);
+      printf(PKCSINIT_MSG(MANUFACT, "\tManufacturer: %.32s\n"), 
TokenInfo->manufacturerID);
+      printf(PKCSINIT_MSG(MODEL, "\tModel: %.16s\n"), TokenInfo->model);
+      printf(PKCSINIT_MSG(SERIAL, "\tSerial Number: %.16s\n"), 
TokenInfo->serialNumber);
+      printf(PKCSINIT_MSG(FLAGS, "\tFlags: 0x%X ("), TokenInfo->flags);
 
       /* print more informative flag message */
-      if (TokenInfo.flags & CKF_RNG)
+      if (TokenInfo->flags & CKF_RNG)
              printf(PKCSINIT_MSG(FLAGS, "RNG|"));
-      if (TokenInfo.flags & CKF_WRITE_PROTECTED)
+      if (TokenInfo->flags & CKF_WRITE_PROTECTED)
              printf(PKCSINIT_MSG(FLAGS, "WRITE_PROTECTED|"));
-      if (TokenInfo.flags & CKF_LOGIN_REQUIRED)
+      if (TokenInfo->flags & CKF_LOGIN_REQUIRED)
              printf(PKCSINIT_MSG(FLAGS, "LOGIN_REQUIRED|"));
-      if (TokenInfo.flags & CKF_USER_PIN_INITIALIZED)
+      if (TokenInfo->flags & CKF_USER_PIN_INITIALIZED)
              printf(PKCSINIT_MSG(FLAGS, "USER_PIN_INITIALIZED|"));
-      if (TokenInfo.flags & CKF_RESTORE_KEY_NOT_NEEDED)
+      if (TokenInfo->flags & CKF_RESTORE_KEY_NOT_NEEDED)
              printf(PKCSINIT_MSG(FLAGS, "RESTORE_KEY_NOT_NEEDED|"));
-      if (TokenInfo.flags & CKF_CLOCK_ON_TOKEN)
+      if (TokenInfo->flags & CKF_CLOCK_ON_TOKEN)
              printf(PKCSINIT_MSG(FLAGS, "CLOCK_ON_TOKEN|"));
-      if (TokenInfo.flags & CKF_PROTECTED_AUTHENTICATION_PATH)
+      if (TokenInfo->flags & CKF_PROTECTED_AUTHENTICATION_PATH)
              printf(PKCSINIT_MSG(FLAGS, "PROTECTED_AUTHENTICATION_PATH|"));
-      if (TokenInfo.flags & CKF_DUAL_CRYPTO_OPERATIONS)
+      if (TokenInfo->flags & CKF_DUAL_CRYPTO_OPERATIONS)
              printf(PKCSINIT_MSG(FLAGS, "DUAL_CRYPTO_OPERATIONS|"));
-      if (TokenInfo.flags & CKF_TOKEN_INITIALIZED)
+      if (TokenInfo->flags & CKF_TOKEN_INITIALIZED)
              printf(PKCSINIT_MSG(FLAGS, "TOKEN_INITIALIZED|"));
-      if (TokenInfo.flags & CKF_SECONDARY_AUTHENTICATION)
+      if (TokenInfo->flags & CKF_SECONDARY_AUTHENTICATION)
              printf(PKCSINIT_MSG(FLAGS, "SECONDARY_AUTHENTICATION|"));
-      if (TokenInfo.flags & CKF_USER_PIN_COUNT_LOW)
+      if (TokenInfo->flags & CKF_USER_PIN_COUNT_LOW)
              printf(PKCSINIT_MSG(FLAGS, "USER_PIN_COUNT_LOW|"));
-      if (TokenInfo.flags & CKF_USER_PIN_FINAL_TRY)
+      if (TokenInfo->flags & CKF_USER_PIN_FINAL_TRY)
              printf(PKCSINIT_MSG(FLAGS, "USER_PIN_FINAL_TRY|"));
-      if (TokenInfo.flags & CKF_USER_PIN_LOCKED)
+      if (TokenInfo->flags & CKF_USER_PIN_LOCKED)
              printf(PKCSINIT_MSG(FLAGS, "USER_PIN_LOCKED|"));
-      if (TokenInfo.flags & CKF_USER_PIN_TO_BE_CHANGED)
+      if (TokenInfo->flags & CKF_USER_PIN_TO_BE_CHANGED)
              printf(PKCSINIT_MSG(FLAGS, "USER_PIN_TO_BE_CHANGED|"));
-      if (TokenInfo.flags & CKF_SO_PIN_COUNT_LOW)
+      if (TokenInfo->flags & CKF_SO_PIN_COUNT_LOW)
              printf(PKCSINIT_MSG(FLAGS, "SO_PIN_COUNT_LOW|"));
-      if (TokenInfo.flags & CKF_SO_PIN_FINAL_TRY)
+      if (TokenInfo->flags & CKF_SO_PIN_FINAL_TRY)
              printf(PKCSINIT_MSG(FLAGS, "SO_PIN_FINAL_TRY|"));
-      if (TokenInfo.flags & CKF_SO_PIN_LOCKED)
+      if (TokenInfo->flags & CKF_SO_PIN_LOCKED)
              printf(PKCSINIT_MSG(FLAGS, "SO_PIN_LOCKED|"));
-      if (TokenInfo.flags & CKF_SO_PIN_TO_BE_CHANGED)
+      if (TokenInfo->flags & CKF_SO_PIN_TO_BE_CHANGED)
              printf(PKCSINIT_MSG(FLAGS, "SO_PIN_TO_BE_CHANGED|"));
       printf(")\n");
 
-      printf(PKCSINIT_MSG(SESSIONS, "\tSessions: %d/%d\n"), 
TokenInfo.ulSessionCount,
-            TokenInfo.ulMaxSessionCount);
+      printf(PKCSINIT_MSG(SESSIONS, "\tSessions: %d/%d\n"), 
TokenInfo->ulSessionCount,
+            TokenInfo->ulMaxSessionCount);
       printf(PKCSINIT_MSG(RWSESSIONS, "\tR/W Sessions: %d/%d\n"),
-            TokenInfo.ulRwSessionCount, TokenInfo.ulMaxRwSessionCount);
-      printf(PKCSINIT_MSG(PINLEN, "\tPIN Length: %d-%d\n"), 
TokenInfo.ulMinPinLen,
-            TokenInfo.ulMaxPinLen);
+            TokenInfo->ulRwSessionCount, TokenInfo->ulMaxRwSessionCount);
+      printf(PKCSINIT_MSG(PINLEN, "\tPIN Length: %d-%d\n"), 
TokenInfo->ulMinPinLen,
+            TokenInfo->ulMaxPinLen);
       printf(PKCSINIT_MSG(PUBMEM, "\tPublic Memory: 0x%X/0x%X\n"),
-            TokenInfo.ulFreePublicMemory, TokenInfo.ulTotalPublicMemory);
+            TokenInfo->ulFreePublicMemory, TokenInfo->ulTotalPublicMemory);
       printf(PKCSINIT_MSG(PRIVMEM, "\tPrivate Memory: 0x%X/0x%X\n"),
-            TokenInfo.ulFreePrivateMemory, TokenInfo.ulTotalPrivateMemory);
-      printf(PKCSINIT_MSG(HWVERSION, "\tHardware Version: %d.%d\n"), 
TokenInfo.hardwareVersion.major,
-            TokenInfo.hardwareVersion.minor);
+            TokenInfo->ulFreePrivateMemory, TokenInfo->ulTotalPrivateMemory);
+      printf(PKCSINIT_MSG(HWVERSION, "\tHardware Version: %d.%d\n"), 
TokenInfo->hardwareVersion.major,
+            TokenInfo->hardwareVersion.minor);
       printf(PKCSINIT_MSG(FWVERSION, "\tFirmware Version: %d.%d\n"),
-            TokenInfo.firmwareVersion.major,
-            TokenInfo.firmwareVersion.minor);
-      printf(PKCSINIT_MSG(TIME, "\tTime: %.16s\n"), TokenInfo.utcTime);
+            TokenInfo->firmwareVersion.major,
+            TokenInfo->firmwareVersion.minor);
+      printf(PKCSINIT_MSG(TIME, "\tTime: %.16s\n"), TokenInfo->utcTime);
+}
+
+CK_RV
+display_token_info(int slot_id)
+{
+   CK_RV          rc;         // Return Code
+   CK_TOKEN_INFO  TokenInfo;  // Variable to hold Token Information
+   unsigned int   lcv;        // Loop control variable
+
+   if (slot_id != -1) {
+      rc = FunctionPtr->C_GetTokenInfo(slot_id, &TokenInfo);
+      if (rc != CKR_OK) {
+         printf(PKCSINIT_MSG(TOKERROR, "Error getting token info: 0x%X 
(%s)\n"), rc,
+               p11_get_ckr(rc));
+         return rc;
+      }
+
+      print_token_info(slot_id, &TokenInfo);
+      return CKR_OK;
+   }
+
+   for (lcv = 0; lcv < SlotCount; lcv++){
+      /* Get the Token info for each slot in the system */
+      rc = FunctionPtr->C_GetTokenInfo(SlotList[lcv], &TokenInfo);
+      if (rc != CKR_OK) {
+         printf(PKCSINIT_MSG(TOKERROR, "Error getting token info: 0x%X 
(%s)\n"), rc, p11_get_ckr(rc));
+         return rc;
+      }
+
+      print_token_info(SlotList[lcv], &TokenInfo);
    }
    return CKR_OK;
 }

------------------------------------------------------------------------------
Sell apps to millions through the Intel(R) Atom(Tm) Developer Program
Be part of this innovative community and reach millions of netbook users 
worldwide. Take advantage of special opportunities to increase revenue and 
speed time-to-market. Join now, and jumpstart your future.
http://p.sf.net/sfu/intel-atom-d2d
_______________________________________________
Opencryptoki-tech mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opencryptoki-tech

Reply via email to