ASYNC_WAIT_CTX_new.pod 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. =pod
  2. =head1 NAME
  3. ASYNC_WAIT_CTX_new, ASYNC_WAIT_CTX_free, ASYNC_WAIT_CTX_set_wait_fd,
  4. ASYNC_WAIT_CTX_get_fd, ASYNC_WAIT_CTX_get_all_fds,
  5. ASYNC_WAIT_CTX_get_changed_fds, ASYNC_WAIT_CTX_clear_fd - functions to manage
  6. waiting for asynchronous jobs to complete
  7. =head1 SYNOPSIS
  8. #include <openssl/async.h>
  9. ASYNC_WAIT_CTX *ASYNC_WAIT_CTX_new(void);
  10. void ASYNC_WAIT_CTX_free(ASYNC_WAIT_CTX *ctx);
  11. int ASYNC_WAIT_CTX_set_wait_fd(ASYNC_WAIT_CTX *ctx, const void *key,
  12. OSSL_ASYNC_FD fd,
  13. void *custom_data,
  14. void (*cleanup)(ASYNC_WAIT_CTX *, const void *,
  15. OSSL_ASYNC_FD, void *));
  16. int ASYNC_WAIT_CTX_get_fd(ASYNC_WAIT_CTX *ctx, const void *key,
  17. OSSL_ASYNC_FD *fd, void **custom_data);
  18. int ASYNC_WAIT_CTX_get_all_fds(ASYNC_WAIT_CTX *ctx, OSSL_ASYNC_FD *fd,
  19. size_t *numfds);
  20. int ASYNC_WAIT_CTX_get_changed_fds(ASYNC_WAIT_CTX *ctx, OSSL_ASYNC_FD *addfd,
  21. size_t *numaddfds, OSSL_ASYNC_FD *delfd,
  22. size_t *numdelfds);
  23. int ASYNC_WAIT_CTX_clear_fd(ASYNC_WAIT_CTX *ctx, const void *key);
  24. =head1 DESCRIPTION
  25. For an overview of how asynchronous operations are implemented in OpenSSL see
  26. L<ASYNC_start_job(3)>. An ASYNC_WAIT_CTX object represents an asynchronous
  27. "session", i.e. a related set of crypto operations. For example in SSL terms
  28. this would have a one-to-one correspondence with an SSL connection.
  29. Application code must create an ASYNC_WAIT_CTX using the ASYNC_WAIT_CTX_new()
  30. function prior to calling ASYNC_start_job() (see L<ASYNC_start_job(3)>). When
  31. the job is started it is associated with the ASYNC_WAIT_CTX for the duration of
  32. that job. An ASYNC_WAIT_CTX should only be used for one ASYNC_JOB at any one
  33. time, but can be reused after an ASYNC_JOB has finished for a subsequent
  34. ASYNC_JOB. When the session is complete (e.g. the SSL connection is closed),
  35. application code cleans up with ASYNC_WAIT_CTX_free().
  36. ASYNC_WAIT_CTXs can have "wait" file descriptors associated with them. Calling
  37. ASYNC_WAIT_CTX_get_all_fds() and passing in a pointer to an ASYNC_WAIT_CTX in
  38. the B<ctx> parameter will return the wait file descriptors associated with that
  39. job in B<*fd>. The number of file descriptors returned will be stored in
  40. B<*numfds>. It is the caller's responsibility to ensure that sufficient memory
  41. has been allocated in B<*fd> to receive all the file descriptors. Calling
  42. ASYNC_WAIT_CTX_get_all_fds() with a NULL B<fd> value will return no file
  43. descriptors but will still populate B<*numfds>. Therefore application code is
  44. typically expected to call this function twice: once to get the number of fds,
  45. and then again when sufficient memory has been allocated. If only one
  46. asynchronous engine is being used then normally this call will only ever return
  47. one fd. If multiple asynchronous engines are being used then more could be
  48. returned.
  49. The function ASYNC_WAIT_CTX_get_changed_fds() can be used to detect if any fds
  50. have changed since the last call time ASYNC_start_job() returned an ASYNC_PAUSE
  51. result (or since the ASYNC_WAIT_CTX was created if no ASYNC_PAUSE result has
  52. been received). The B<numaddfds> and B<numdelfds> parameters will be populated
  53. with the number of fds added or deleted respectively. B<*addfd> and B<*delfd>
  54. will be populated with the list of added and deleted fds respectively. Similarly
  55. to ASYNC_WAIT_CTX_get_all_fds() either of these can be NULL, but if they are not
  56. NULL then the caller is responsible for ensuring sufficient memory is allocated.
  57. Implementors of async aware code (e.g. engines) are encouraged to return a
  58. stable fd for the lifetime of the ASYNC_WAIT_CTX in order to reduce the "churn"
  59. of regularly changing fds - although no guarantees of this are provided to
  60. applications.
  61. Applications can wait for the file descriptor to be ready for "read" using a
  62. system function call such as select or poll (being ready for "read" indicates
  63. that the job should be resumed). If no file descriptor is made available then an
  64. application will have to periodically "poll" the job by attempting to restart it
  65. to see if it is ready to continue.
  66. Async aware code (e.g. engines) can get the current ASYNC_WAIT_CTX from the job
  67. via L<ASYNC_get_wait_ctx(3)> and provide a file descriptor to use for waiting
  68. on by calling ASYNC_WAIT_CTX_set_wait_fd(). Typically this would be done by an
  69. engine immediately prior to calling ASYNC_pause_job() and not by end user code.
  70. An existing association with a file descriptor can be obtained using
  71. ASYNC_WAIT_CTX_get_fd() and cleared using ASYNC_WAIT_CTX_clear_fd(). Both of
  72. these functions requires a B<key> value which is unique to the async aware
  73. code. This could be any unique value but a good candidate might be the
  74. B<ENGINE *> for the engine. The B<custom_data> parameter can be any value, and
  75. will be returned in a subsequent call to ASYNC_WAIT_CTX_get_fd(). The
  76. ASYNC_WAIT_CTX_set_wait_fd() function also expects a pointer to a "cleanup"
  77. routine. This can be NULL but if provided will automatically get called when
  78. the ASYNC_WAIT_CTX is freed, and gives the engine the opportunity to close the
  79. fd or any other resources. Note: The "cleanup" routine does not get called if
  80. the fd is cleared directly via a call to ASYNC_WAIT_CTX_clear_fd().
  81. An example of typical usage might be an async capable engine. User code would
  82. initiate cryptographic operations. The engine would initiate those operations
  83. asynchronously and then call ASYNC_WAIT_CTX_set_wait_fd() followed by
  84. ASYNC_pause_job() to return control to the user code. The user code can then
  85. perform other tasks or wait for the job to be ready by calling "select" or other
  86. similar function on the wait file descriptor. The engine can signal to the user
  87. code that the job should be resumed by making the wait file descriptor
  88. "readable". Once resumed the engine should clear the wake signal on the wait
  89. file descriptor.
  90. =head1 RETURN VALUES
  91. ASYNC_WAIT_CTX_new() returns a pointer to the newly allocated ASYNC_WAIT_CTX or
  92. NULL on error.
  93. ASYNC_WAIT_CTX_set_wait_fd, ASYNC_WAIT_CTX_get_fd, ASYNC_WAIT_CTX_get_all_fds,
  94. ASYNC_WAIT_CTX_get_changed_fds and ASYNC_WAIT_CTX_clear_fd all return 1 on
  95. success or 0 on error.
  96. =head1 NOTES
  97. On Windows platforms the openssl/async.h header is dependent on some
  98. of the types customarily made available by including windows.h. The
  99. application developer is likely to require control over when the latter
  100. is included, commonly as one of the first included headers. Therefore
  101. it is defined as an application developer's responsibility to include
  102. windows.h prior to async.h.
  103. =head1 SEE ALSO
  104. L<crypto(7)>, L<ASYNC_start_job(3)>
  105. =head1 HISTORY
  106. ASYNC_WAIT_CTX_new(), ASYNC_WAIT_CTX_free(), ASYNC_WAIT_CTX_set_wait_fd(),
  107. ASYNC_WAIT_CTX_get_fd(), ASYNC_WAIT_CTX_get_all_fds(),
  108. ASYNC_WAIT_CTX_get_changed_fds() and ASYNC_WAIT_CTX_clear_fd()
  109. were added in OpenSSL 1.1.0.
  110. =head1 COPYRIGHT
  111. Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.
  112. Licensed under the Apache License 2.0 (the "License"). You may not use
  113. this file except in compliance with the License. You can obtain a copy
  114. in the file LICENSE in the source distribution or at
  115. L<https://www.openssl.org/source/license.html>.
  116. =cut