### 4.1 Progress handler

It is often useful to retrieve some feedback while long running operations are performed.

Data type: gcry_handler_progress_t

  Progress handler functions have to be of the type `gcry_handler_progress_t`, which is defined as:

  `void (*gcry_handler_progress_t) (void *, const char *, int, int, int)`

The following function may be used to register a handler function for this purpose.

Function: void gcry_set_progress_handler (gcry_handler_progress_t cb, void *cb_data)

  This function installs cb as the ‘Progress handler’ function. It may be used only during initialization. cb must be defined as follows:

      void
      my_progress_handler (void *cb_data, const char *what,
                           int printchar, int current, int total)
      {
        /* Do something.  */
      }

  A description of the arguments of the progress handler function follows.

  cb_data

    The argument provided in the call to `gcry_set_progress_handler`.

  what

    A string identifying the type of the progress output. The following values for what are defined:

    `need_entropy`

      Not enough entropy is available. total holds the number of required bytes.

    `wait_dev_random`

      Waiting to re-open a random device. total gives the number of seconds until the next try.

    `primegen`

      Values for printchar:

      `\n`

        Prime generated.

      `!`

        Need to refresh the pool of prime numbers.

      `<, >`

        Number of bits adjusted.

      `^`

        Searching for a generator.

      `.`

        Fermat test on 10 candidates failed.

      `:`

        Restart with a new random value.

      `+`

        Rabin Miller test passed.