libnitrokey icon indicating copy to clipboard operation
libnitrokey copied to clipboard

LongOperationInProgressException cannot be detected using the C API

Open robinkrahl opened this issue 4 years ago • 2 comments

The C API translates the C++ exceptions to integer values (see NK_C_API.cc:get_with_status). For instances of CommandFailedException, the last_command_status field is used for the conversion. This field is typically set to a value of the stick10::command_status enum. But LongOperationInProgressException, which is a subclass of CommandFailedException, uses stick10::device_status::busy (= 1) instead. This overlaps with the wrong_CRC variant of the command_status enum, making it impossible to distinguish the two errors as a user of the C API.

Possible solutions:

  1. Add a new value to the stick10::command_status enum and use it for LongOperationInProgressException.
  2. Add a special case for the LongOperationInProgressException to the get_with_status function and return a unique ID for it. (I don’t really like this option because it makes the error handling code more complicated.)
  3. Let LongOperationInProgressException inherit from DeviceCommunicationException instead of CommandFailedException and define a new ID.

robinkrahl avatar Jan 14 '20 15:01 robinkrahl

If you let me know which option you prefer I can create a pull request with an implementation. I’d personally prefer option 3.

robinkrahl avatar Apr 02 '20 13:04 robinkrahl

Yes, option 3 makes sense. Thank you!

szszszsz avatar Apr 02 '20 14:04 szszszsz