Hex Artifact Content

Artifact 8cdc000c323cdd20c634ac1c61a1834eb7c2ea17:


0000: 23 64 65 66 69 6e 65 20 5f 47 4e 55 5f 53 4f 55  #define _GNU_SOU
0010: 52 43 45 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c  RCE.#include <dl
0020: 66 63 6e 2e 68 3e 0a 0a 23 69 6e 63 6c 75 64 65  fcn.h>..#include
0030: 20 22 63 6f 6e 66 69 67 2e 68 22 0a 0a 23 69 6e   "config.h"..#in
0040: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
0050: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f  .#include <stdio
0060: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69  .h>.#include <ti
0070: 6d 65 2e 68 3e 0a 0a 23 64 65 66 69 6e 65 20 43  me.h>..#define C
0080: 4b 5f 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20  K_PTR *.#define 
0090: 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
00a0: 4f 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e  ON(returnType, n
00b0: 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20  ame) returnType 
00c0: 6e 61 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f  name.#define CK_
00d0: 44 45 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e  DECLARE_FUNCTION
00e0: 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d  (returnType, nam
00f0: 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61  e) returnType na
0100: 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45  me.#define CK_DE
0110: 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50  CLARE_FUNCTION_P
0120: 4f 49 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70  OINTER(returnTyp
0130: 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54  e, name) returnT
0140: 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65  ype (* name).#de
0150: 66 69 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b  fine CK_CALLBACK
0160: 5f 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e  _FUNCTION(return
0170: 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75  Type, name) retu
0180: 72 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a  rnType (* name).
0190: 23 69 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52  #ifndef NULL_PTR
01a0: 0a 23 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f  .#  define NULL_
01b0: 50 54 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69  PTR 0.#endif..#i
01c0: 6e 63 6c 75 64 65 20 22 2e 2f 70 6b 63 73 31 31  nclude "./pkcs11
01d0: 2f 70 6b 63 73 31 31 2e 68 22 0a 0a 23 69 66 6e  /pkcs11.h"..#ifn
01e0: 64 65 66 20 43 41 43 4b 45 59 5f 4c 49 42 52 41  def CACKEY_LIBRA
01f0: 52 59 5f 46 49 4c 45 0a 23 64 65 66 69 6e 65 20  RY_FILE.#define 
0200: 43 41 43 4b 45 59 5f 4c 49 42 52 41 52 59 5f 46  CACKEY_LIBRARY_F
0210: 49 4c 45 20 22 6c 69 62 63 61 63 6b 65 79 5f 67  ILE "libcackey_g
0220: 2e 73 6f 22 0a 23 65 6e 64 69 66 0a 0a 76 6f 69  .so".#endif..voi
0230: 64 20 61 62 6f 72 74 28 76 6f 69 64 29 3b 0a 76  d abort(void);.v
0240: 6f 69 64 20 66 72 65 65 28 76 6f 69 64 20 2a 70  oid free(void *p
0250: 74 72 29 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69  tr);..static voi
0260: 64 20 2a 6c 69 62 63 61 63 6b 65 79 5f 77 72 61  d *libcackey_wra
0270: 70 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 5f  p_handle = NULL_
0280: 50 54 52 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e  PTR;..typedef en
0290: 75 6d 20 7b 0a 09 4c 49 42 43 41 43 4b 45 59 5f  um {..LIBCACKEY_
02a0: 57 52 41 50 5f 4d 55 54 45 58 5f 55 4e 49 4e 49  WRAP_MUTEX_UNINI
02b0: 54 20 3d 20 30 2c 0a 09 4c 49 42 43 41 43 4b 45  T = 0,..LIBCACKE
02c0: 59 5f 57 52 41 50 5f 4d 55 54 45 58 5f 49 4e 49  Y_WRAP_MUTEX_INI
02d0: 54 2c 0a 09 4c 49 42 43 41 43 4b 45 59 5f 57 52  T,..LIBCACKEY_WR
02e0: 41 50 5f 4d 55 54 45 58 5f 55 4e 4c 4f 43 4b 45  AP_MUTEX_UNLOCKE
02f0: 44 2c 0a 09 4c 49 42 43 41 43 4b 45 59 5f 57 52  D,..LIBCACKEY_WR
0300: 41 50 5f 4d 55 54 45 58 5f 4c 4f 43 4b 45 44 2c  AP_MUTEX_LOCKED,
0310: 0a 7d 20 6c 69 62 63 61 63 6b 65 79 5f 77 72 61  .} libcackey_wra
0320: 70 5f 6d 75 74 65 78 65 73 5f 73 74 61 74 65 73  p_mutexes_states
0330: 5f 74 3b 0a 73 74 61 74 69 63 20 6c 69 62 63 61  _t;.static libca
0340: 63 6b 65 79 5f 77 72 61 70 5f 6d 75 74 65 78 65  ckey_wrap_mutexe
0350: 73 5f 73 74 61 74 65 73 5f 74 20 6c 69 62 63 61  s_states_t libca
0360: 63 6b 65 79 5f 77 72 61 70 5f 6d 75 74 65 78 65  ckey_wrap_mutexe
0370: 73 5b 31 36 5d 20 3d 20 7b 4c 49 42 43 41 43 4b  s[16] = {LIBCACK
0380: 45 59 5f 57 52 41 50 5f 4d 55 54 45 58 5f 55 4e  EY_WRAP_MUTEX_UN
0390: 49 4e 49 54 7d 3b 0a 0a 74 79 70 65 64 65 66 20  INIT};..typedef 
03a0: 6c 69 62 63 61 63 6b 65 79 5f 77 72 61 70 5f 6d  libcackey_wrap_m
03b0: 75 74 65 78 65 73 5f 73 74 61 74 65 73 5f 74 20  utexes_states_t 
03c0: 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  *pthread_mutex_t
03d0: 3b 0a 74 79 70 65 64 65 66 20 69 6e 74 20 70 74  ;.typedef int pt
03e0: 68 72 65 61 64 5f 6d 75 74 65 78 61 74 74 72 5f  hread_mutexattr_
03f0: 74 3b 0a 0a 69 6e 74 20 70 74 68 72 65 61 64 5f  t;..int pthread_
0400: 6d 75 74 65 78 5f 69 6e 69 74 28 70 74 68 72 65  mutex_init(pthre
0410: 61 64 5f 6d 75 74 65 78 5f 74 20 2a 72 65 73 74  ad_mutex_t *rest
0420: 72 69 63 74 20 6d 75 74 65 78 2c 20 63 6f 6e 73  rict mutex, cons
0430: 74 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 61  t pthread_mutexa
0440: 74 74 72 5f 74 20 2a 72 65 73 74 72 69 63 74 20  ttr_t *restrict 
0450: 61 74 74 72 29 20 7b 0a 09 6c 69 62 63 61 63 6b  attr) {..libcack
0460: 65 79 5f 77 72 61 70 5f 6d 75 74 65 78 65 73 5f  ey_wrap_mutexes_
0470: 73 74 61 74 65 73 5f 74 20 2a 6d 75 74 65 78 5f  states_t *mutex_
0480: 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 66 6f  ;..int idx;...fo
0490: 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
04a0: 3c 20 28 73 69 7a 65 6f 66 28 6c 69 62 63 61 63  < (sizeof(libcac
04b0: 6b 65 79 5f 77 72 61 70 5f 6d 75 74 65 78 65 73  key_wrap_mutexes
04c0: 29 20 2f 20 73 69 7a 65 6f 66 28 6c 69 62 63 61  ) / sizeof(libca
04d0: 63 6b 65 79 5f 77 72 61 70 5f 6d 75 74 65 78 65  ckey_wrap_mutexe
04e0: 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
04f0: 0a 09 09 69 66 20 28 6c 69 62 63 61 63 6b 65 79  ...if (libcackey
0500: 5f 77 72 61 70 5f 6d 75 74 65 78 65 73 5b 69 64  _wrap_mutexes[id
0510: 78 5d 20 3d 3d 20 4c 49 42 43 41 43 4b 45 59 5f  x] == LIBCACKEY_
0520: 57 52 41 50 5f 4d 55 54 45 58 5f 55 4e 49 4e 49  WRAP_MUTEX_UNINI
0530: 54 29 20 7b 0a 09 09 09 6c 69 62 63 61 63 6b 65  T) {....libcacke
0540: 79 5f 77 72 61 70 5f 6d 75 74 65 78 65 73 5b 69  y_wrap_mutexes[i
0550: 64 78 5d 20 3d 20 4c 49 42 43 41 43 4b 45 59 5f  dx] = LIBCACKEY_
0560: 57 52 41 50 5f 4d 55 54 45 58 5f 49 4e 49 54 3b  WRAP_MUTEX_INIT;
0570: 0a 09 09 09 6d 75 74 65 78 5f 20 3d 20 26 6c 69  ....mutex_ = &li
0580: 62 63 61 63 6b 65 79 5f 77 72 61 70 5f 6d 75 74  bcackey_wrap_mut
0590: 65 78 65 73 5b 69 64 78 5d 3b 0a 09 09 09 62 72  exes[idx];....br
05a0: 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  eak;...}..}...if
05b0: 20 28 21 6d 75 74 65 78 5f 29 20 7b 0a 09 09 72   (!mutex_) {...r
05c0: 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 2a  eturn(1);..}...*
05d0: 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 5f 3b 0a  mutex = mutex_;.
05e0: 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
05f0: 69 6e 74 20 70 74 68 72 65 61 64 5f 6d 75 74 65  int pthread_mute
0600: 78 5f 64 65 73 74 72 6f 79 28 70 74 68 72 65 61  x_destroy(pthrea
0610: 64 5f 6d 75 74 65 78 5f 74 20 2a 6d 75 74 65 78  d_mutex_t *mutex
0620: 29 20 7b 0a 09 2a 2a 6d 75 74 65 78 20 3d 20 4c  ) {..**mutex = L
0630: 49 42 43 41 43 4b 45 59 5f 57 52 41 50 5f 4d 55  IBCACKEY_WRAP_MU
0640: 54 45 58 5f 55 4e 49 4e 49 54 3b 0a 0a 09 72 65  TEX_UNINIT;...re
0650: 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 69 6e 74 20  turn(0);.}..int 
0660: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f  pthread_mutex_lo
0670: 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ck(pthread_mutex
0680: 5f 74 20 2a 6d 75 74 65 78 29 20 7b 0a 09 73 74  _t *mutex) {..st
0690: 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 6c  ruct timespec sl
06a0: 65 65 70 74 69 6d 65 3b 0a 0a 09 77 68 69 6c 65  eeptime;...while
06b0: 20 28 2a 2a 6d 75 74 65 78 20 3d 3d 20 4c 49 42   (**mutex == LIB
06c0: 43 41 43 4b 45 59 5f 57 52 41 50 5f 4d 55 54 45  CACKEY_WRAP_MUTE
06d0: 58 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 73 6c  X_LOCKED) {...sl
06e0: 65 65 70 74 69 6d 65 2e 74 76 5f 73 65 63 20 3d  eeptime.tv_sec =
06f0: 20 30 3b 0a 09 09 73 6c 65 65 70 74 69 6d 65 2e   0;...sleeptime.
0700: 74 76 5f 6e 73 65 63 20 3d 20 31 30 30 30 30 30  tv_nsec = 100000
0710: 30 3b 0a 09 09 6e 61 6e 6f 73 6c 65 65 70 28 26  0;...nanosleep(&
0720: 73 6c 65 65 70 74 69 6d 65 2c 20 4e 55 4c 4c 29  sleeptime, NULL)
0730: 3b 0a 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ;.fprintf(stderr
0740: 2c 20 22 6d 75 74 65 78 20 25 70 20 69 73 20 6c  , "mutex %p is l
0750: 6f 63 6b 65 64 5c 6e 22 2c 20 6d 75 74 65 78 29  ocked\n", mutex)
0760: 3b 20 66 66 6c 75 73 68 28 73 74 64 65 72 72 29  ; fflush(stderr)
0770: 3b 0a 09 09 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e  ;.../* Do nothin
0780: 67 20 2a 2f 0a 09 7d 0a 0a 66 70 72 69 6e 74 66  g */..}..fprintf
0790: 28 73 74 64 65 72 72 2c 20 22 6c 6f 63 6b 69 6e  (stderr, "lockin
07a0: 67 20 6d 75 74 65 78 20 25 70 5c 6e 22 2c 20 6d  g mutex %p\n", m
07b0: 75 74 65 78 29 3b 20 66 66 6c 75 73 68 28 73 74  utex); fflush(st
07c0: 64 65 72 72 29 3b 0a 09 2a 2a 6d 75 74 65 78 20  derr);..**mutex 
07d0: 3d 20 4c 49 42 43 41 43 4b 45 59 5f 57 52 41 50  = LIBCACKEY_WRAP
07e0: 5f 4d 55 54 45 58 5f 4c 4f 43 4b 45 44 3b 0a 66  _MUTEX_LOCKED;.f
07f0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
0800: 6c 6f 63 6b 65 64 20 6d 75 74 65 78 20 25 70 5c  locked mutex %p\
0810: 6e 22 2c 20 6d 75 74 65 78 29 3b 20 66 66 6c 75  n", mutex); fflu
0820: 73 68 28 73 74 64 65 72 72 29 3b 0a 0a 09 72 65  sh(stderr);...re
0830: 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
0840: 0a 69 6e 74 20 70 74 68 72 65 61 64 5f 6d 75 74  .int pthread_mut
0850: 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61  ex_unlock(pthrea
0860: 64 5f 6d 75 74 65 78 5f 74 20 2a 6d 75 74 65 78  d_mutex_t *mutex
0870: 29 20 7b 0a 66 70 72 69 6e 74 66 28 73 74 64 65  ) {.fprintf(stde
0880: 72 72 2c 20 22 75 6e 6c 6f 63 6b 69 6e 67 20 6d  rr, "unlocking m
0890: 75 74 65 78 20 25 70 5c 6e 22 2c 20 6d 75 74 65  utex %p\n", mute
08a0: 78 29 3b 20 66 66 6c 75 73 68 28 73 74 64 65 72  x); fflush(stder
08b0: 72 29 3b 0a 09 2a 2a 6d 75 74 65 78 20 3d 20 4c  r);..**mutex = L
08c0: 49 42 43 41 43 4b 45 59 5f 57 52 41 50 5f 4d 55  IBCACKEY_WRAP_MU
08d0: 54 45 58 5f 55 4e 4c 4f 43 4b 45 44 3b 0a 66 70  TEX_UNLOCKED;.fp
08e0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
08f0: 6e 6c 6f 63 6b 65 64 20 6d 75 74 65 78 20 25 70  nlocked mutex %p
0900: 5c 6e 22 2c 20 6d 75 74 65 78 29 3b 20 66 66 6c  \n", mutex); ffl
0910: 75 73 68 28 73 74 64 65 72 72 29 3b 0a 0a 09 72  ush(stderr);...r
0920: 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
0930: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69  ..static void li
0940: 62 63 61 63 6b 65 79 5f 77 72 61 70 5f 69 6e 69  bcackey_wrap_ini
0950: 74 28 76 6f 69 64 29 20 7b 0a 09 44 6c 5f 69 6e  t(void) {..Dl_in
0960: 66 6f 20 6c 69 62 69 6e 66 6f 3b 0a 09 69 6e 74  fo libinfo;..int
0970: 20 64 6c 61 64 64 72 5f 72 65 74 3b 0a 09 63 68   dladdr_ret;..ch
0980: 61 72 20 2a 6c 69 62 72 61 72 79 2c 20 2a 6c 69  ar *library, *li
0990: 62 72 61 72 79 44 69 72 2c 20 2a 6c 69 62 72 61  braryDir, *libra
09a0: 72 79 44 69 72 4c 61 73 74 53 6c 61 73 68 3b 0a  ryDirLastSlash;.
09b0: 0a 09 69 66 20 28 6c 69 62 63 61 63 6b 65 79 5f  ..if (libcackey_
09c0: 77 72 61 70 5f 68 61 6e 64 6c 65 29 20 7b 0a 09  wrap_handle) {..
09d0: 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 64 6c  .return;..}...dl
09e0: 61 64 64 72 5f 72 65 74 20 3d 20 64 6c 61 64 64  addr_ret = dladd
09f0: 72 28 6c 69 62 63 61 63 6b 65 79 5f 77 72 61 70  r(libcackey_wrap
0a00: 5f 69 6e 69 74 2c 20 26 6c 69 62 69 6e 66 6f 29  _init, &libinfo)
0a10: 3b 0a 09 69 66 20 28 64 6c 61 64 64 72 5f 72 65  ;..if (dladdr_re
0a20: 74 20 3d 3d 20 30 29 20 7b 0a 09 09 66 70 72 69  t == 0) {...fpri
0a30: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 61  ntf(stderr, "Una
0a40: 62 6c 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 70  ble to resolve p
0a50: 61 74 68 3a 20 25 73 5c 6e 22 2c 20 64 6c 65 72  ath: %s\n", dler
0a60: 72 6f 72 28 29 29 3b 0a 0a 09 09 61 62 6f 72 74  ror());....abort
0a70: 28 29 3b 0a 0a 09 09 72 65 74 75 72 6e 3b 0a 09  ();....return;..
0a80: 7d 0a 0a 09 69 66 20 28 21 6c 69 62 69 6e 66 6f  }...if (!libinfo
0a90: 2e 64 6c 69 5f 66 6e 61 6d 65 29 20 7b 0a 09 09  .dli_fname) {...
0aa0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
0ab0: 22 55 6e 61 62 6c 65 20 74 6f 20 6c 6f 6f 6b 75  "Unable to looku
0ac0: 70 20 66 69 6c 65 6e 61 6d 65 5c 6e 22 29 3b 0a  p filename\n");.
0ad0: 0a 09 09 61 62 6f 72 74 28 29 3b 0a 0a 09 09 72  ...abort();....r
0ae0: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 6c 69 62 72  eturn;..}...libr
0af0: 61 72 79 44 69 72 20 3d 20 73 74 72 64 75 70 28  aryDir = strdup(
0b00: 6c 69 62 69 6e 66 6f 2e 64 6c 69 5f 66 6e 61 6d  libinfo.dli_fnam
0b10: 65 29 3b 0a 09 6c 69 62 72 61 72 79 44 69 72 4c  e);..libraryDirL
0b20: 61 73 74 53 6c 61 73 68 20 3d 20 73 74 72 72 63  astSlash = strrc
0b30: 68 72 28 6c 69 62 72 61 72 79 44 69 72 2c 20 27  hr(libraryDir, '
0b40: 2f 27 29 3b 0a 09 69 66 20 28 21 6c 69 62 72 61  /');..if (!libra
0b50: 72 79 44 69 72 4c 61 73 74 53 6c 61 73 68 29 20  ryDirLastSlash) 
0b60: 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64 65  {...fprintf(stde
0b70: 72 72 2c 20 22 46 69 6c 65 20 6e 61 6d 65 20 72  rr, "File name r
0b80: 65 74 75 72 6e 65 64 20 69 73 20 6e 6f 74 20 61  eturned is not a
0b90: 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 3a  n absolute path:
0ba0: 20 25 73 5c 6e 22 2c 20 6c 69 62 72 61 72 79 44   %s\n", libraryD
0bb0: 69 72 29 3b 0a 0a 09 09 61 62 6f 72 74 28 29 3b  ir);....abort();
0bc0: 0a 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 09  ....return;..}..
0bd0: 2a 6c 69 62 72 61 72 79 44 69 72 4c 61 73 74 53  *libraryDirLastS
0be0: 6c 61 73 68 20 3d 20 27 5c 30 27 3b 0a 0a 09 61  lash = '\0';...a
0bf0: 73 70 72 69 6e 74 66 28 26 6c 69 62 72 61 72 79  sprintf(&library
0c00: 2c 20 22 25 73 2f 22 20 43 41 43 4b 45 59 5f 4c  , "%s/" CACKEY_L
0c10: 49 42 52 41 52 59 5f 46 49 4c 45 2c 20 6c 69 62  IBRARY_FILE, lib
0c20: 72 61 72 79 44 69 72 29 3b 0a 0a 09 6c 69 62 63  raryDir);...libc
0c30: 61 63 6b 65 79 5f 77 72 61 70 5f 68 61 6e 64 6c  ackey_wrap_handl
0c40: 65 20 3d 20 64 6c 6d 6f 70 65 6e 28 4c 4d 5f 49  e = dlmopen(LM_I
0c50: 44 5f 4e 45 57 4c 4d 2c 20 6c 69 62 72 61 72 79  D_NEWLM, library
0c60: 2c 20 52 54 4c 44 5f 4c 4f 43 41 4c 20 7c 20 52  , RTLD_LOCAL | R
0c70: 54 4c 44 5f 4e 4f 57 29 3b 0a 09 6c 69 62 63 61  TLD_NOW);..libca
0c80: 63 6b 65 79 5f 77 72 61 70 5f 68 61 6e 64 6c 65  ckey_wrap_handle
0c90: 20 3d 20 64 6c 6d 6f 70 65 6e 28 4c 4d 5f 49 44   = dlmopen(LM_ID
0ca0: 5f 4e 45 57 4c 4d 2c 20 2c 20 52 54 4c 44 5f 4c  _NEWLM, , RTLD_L
0cb0: 4f 43 41 4c 20 7c 20 52 54 4c 44 5f 4e 4f 57 29  OCAL | RTLD_NOW)
0cc0: 3b 0a 0a 09 69 66 20 28 21 6c 69 62 63 61 63 6b  ;...if (!libcack
0cd0: 65 79 5f 77 72 61 70 5f 68 61 6e 64 6c 65 29 20  ey_wrap_handle) 
0ce0: 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64 65  {...fprintf(stde
0cf0: 72 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20 6c  rr, "Unable to l
0d00: 6f 61 64 20 5c 22 25 73 5c 22 3a 20 25 73 5c 6e  oad \"%s\": %s\n
0d10: 22 2c 20 6c 69 62 72 61 72 79 2c 20 64 6c 65 72  ", library, dler
0d20: 72 6f 72 28 29 29 3b 0a 0a 09 09 61 62 6f 72 74  ror());....abort
0d30: 28 29 3b 0a 0a 09 09 72 65 74 75 72 6e 3b 0a 09  ();....return;..
0d40: 7d 0a 0a 09 66 72 65 65 28 6c 69 62 72 61 72 79  }...free(library
0d50: 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );...return;.}..
0d60: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69 62 63  static void libc
0d70: 61 63 6b 65 79 5f 77 72 61 70 5f 66 69 6e 69 28  ackey_wrap_fini(
0d80: 76 6f 69 64 29 20 7b 0a 09 69 66 20 28 21 6c 69  void) {..if (!li
0d90: 62 63 61 63 6b 65 79 5f 77 72 61 70 5f 68 61 6e  bcackey_wrap_han
0da0: 64 6c 65 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b  dle) {...return;
0db0: 0a 09 7d 0a 0a 09 64 6c 63 6c 6f 73 65 28 6c 69  ..}...dlclose(li
0dc0: 62 63 61 63 6b 65 79 5f 77 72 61 70 5f 68 61 6e  bcackey_wrap_han
0dd0: 64 6c 65 29 3b 0a 0a 09 6c 69 62 63 61 63 6b 65  dle);...libcacke
0de0: 79 5f 77 72 61 70 5f 68 61 6e 64 6c 65 20 3d 20  y_wrap_handle = 
0df0: 4e 55 4c 4c 5f 50 54 52 3b 0a 0a 09 72 65 74 75  NULL_PTR;...retu
0e00: 72 6e 3b 0a 7d 0a                                rn;.}.