Hex Artifact Content
Not logged in

Artifact 5d1a29073bab42f4a3bf533ccfb72e478902d308:


0000: 23 69 6e 63 6c 75 64 65 20 22 45 58 54 45 52 4e  #include "EXTERN
0010: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 65  .h".#include "pe
0020: 72 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  rl.h".#include "
0030: 58 53 55 42 2e 68 22 0a 0a 23 69 6e 63 6c 75 64  XSUB.h"..#includ
0040: 65 20 3c 72 68 61 73 68 2e 68 3e 0a 0a 74 79 70  e <rhash.h>..typ
0050: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 6c 6f  edef unsigned lo
0060: 6e 67 20 6c 6f 6e 67 20 75 6c 6f 6e 67 6c 6f 6e  ng long ulonglon
0070: 67 3b 0a 0a 2f 2a 20 68 65 6c 70 65 72 20 6d 61  g;../* helper ma
0080: 63 72 6f 73 20 61 6e 64 20 66 75 6e 63 74 69 6f  cros and functio
0090: 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42 41  ns */.#define BA
00a0: 53 45 33 32 5f 4c 45 4e 47 54 48 28 73 69 7a 65  SE32_LENGTH(size
00b0: 29 20 28 28 28 73 69 7a 65 29 20 2a 20 38 20 2b  ) (((size) * 8 +
00c0: 20 34 29 20 2f 20 35 29 0a 23 64 65 66 69 6e 65   4) / 5).#define
00d0: 20 42 41 53 45 36 34 5f 4c 45 4e 47 54 48 28 73   BASE64_LENGTH(s
00e0: 69 7a 65 29 20 28 28 28 28 73 69 7a 65 29 20 2b  ize) ((((size) +
00f0: 20 32 29 20 2f 20 33 29 20 2a 20 34 29 0a 0a 76   2) / 3) * 4)..v
0100: 6f 69 64 20 76 65 72 69 66 79 5f 73 69 6e 67 6c  oid verify_singl
0110: 65 5f 62 69 74 5f 68 61 73 68 5f 69 64 28 75 6e  e_bit_hash_id(un
0120: 73 69 67 6e 65 64 20 68 61 73 68 5f 69 64 2c 20  signed hash_id, 
0130: 43 56 2a 20 63 76 29 0a 7b 0a 09 63 6f 6e 73 74  CV* cv).{..const
0140: 20 63 68 61 72 2a 20 65 72 72 6f 72 3b 0a 09 63   char* error;..c
0150: 6f 6e 73 74 20 47 56 20 2a 67 76 3b 0a 09 63 6f  onst GV *gv;..co
0160: 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63 5f 6e  nst char *func_n
0170: 61 6d 65 3b 0a 0a 09 69 66 28 30 20 3d 3d 20 28  ame;...if(0 == (
0180: 68 61 73 68 5f 69 64 20 26 20 52 48 41 53 48 5f  hash_id & RHASH_
0190: 41 4c 4c 5f 48 41 53 48 45 53 29 29 20 7b 0a 09  ALL_HASHES)) {..
01a0: 09 65 72 72 6f 72 20 3d 20 22 25 73 3a 20 75 6e  .error = "%s: un
01b0: 6b 6e 6f 77 6e 20 68 61 73 68 20 68 61 73 68 5f  known hash hash_
01c0: 69 64 20 3d 20 25 64 22 3b 0a 09 7d 20 65 6c 73  id = %d";..} els
01d0: 65 20 69 66 28 30 20 21 3d 20 28 68 61 73 68 5f  e if(0 != (hash_
01e0: 69 64 20 26 20 28 68 61 73 68 5f 69 64 20 2d 20  id & (hash_id - 
01f0: 31 29 29 29 20 7b 0a 09 09 65 72 72 6f 72 20 3d  1))) {...error =
0200: 20 22 25 73 3a 20 68 61 73 68 5f 69 64 20 69 73   "%s: hash_id is
0210: 20 6e 6f 74 20 61 20 73 69 6e 67 6c 65 20 62 69   not a single bi
0220: 74 3a 20 25 64 22 3b 0a 09 7d 20 65 6c 73 65 20  t: %d";..} else 
0230: 7b 0a 09 09 72 65 74 75 72 6e 3b 20 2f 2a 20 73  {...return; /* s
0240: 75 63 63 65 73 73 20 2a 2f 0a 09 7d 0a 0a 09 67  uccess */..}...g
0250: 76 20 3d 20 43 76 47 56 28 63 76 29 3b 0a 09 66  v = CvGV(cv);..f
0260: 75 6e 63 5f 6e 61 6d 65 20 3d 20 28 67 76 20 3f  unc_name = (gv ?
0270: 20 47 76 4e 41 4d 45 28 67 76 29 20 3a 20 22 52   GvNAME(gv) : "R
0280: 68 61 73 68 22 29 3b 0a 09 63 72 6f 61 6b 28 65  hash");..croak(e
0290: 72 72 6f 72 2c 20 66 75 6e 63 5f 6e 61 6d 65 2c  rror, func_name,
02a0: 20 68 61 73 68 5f 69 64 29 3b 0a 7d 0a 0a 2f 2a   hash_id);.}../*
02b0: 20 61 6c 6c 6f 63 61 74 65 20 61 20 70 65 72 6c   allocate a perl
02c0: 20 73 74 72 69 6e 67 20 73 63 61 6c 61 72 20 76   string scalar v
02d0: 61 72 69 61 62 6c 65 2c 20 63 6f 6e 74 61 69 6e  ariable, contain
02e0: 69 6e 67 20 73 74 72 5f 6c 65 6e 20 2b 20 31 20  ing str_len + 1 
02f0: 62 79 74 65 73 20 2a 2f 0a 53 56 20 2a 20 61 6c  bytes */.SV * al
0300: 6c 6f 63 61 74 65 5f 73 74 72 69 6e 67 5f 62 75  locate_string_bu
0310: 66 66 65 72 28 53 54 52 4c 45 4e 20 73 74 72 5f  ffer(STRLEN str_
0320: 6c 65 6e 29 0a 7b 0a 09 53 56 20 2a 20 73 76 20  len).{..SV * sv 
0330: 3d 20 6e 65 77 53 56 28 73 74 72 5f 6c 65 6e 29  = newSV(str_len)
0340: 3b 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 73 20 28  ; /* allocates (
0350: 73 74 72 5f 6c 65 6e 20 2b 20 31 29 20 62 79 74  str_len + 1) byt
0360: 65 73 20 2a 2f 0a 09 53 76 50 4f 4b 5f 6f 6e 6c  es */..SvPOK_onl
0370: 79 28 73 76 29 3b 0a 09 53 76 43 55 52 5f 73 65  y(sv);..SvCUR_se
0380: 74 28 73 76 2c 20 73 74 72 5f 6c 65 6e 29 3b 0a  t(sv, str_len);.
0390: 09 72 65 74 75 72 6e 20 73 76 3b 0a 7d 0a 0a 4d  .return sv;.}..M
03a0: 4f 44 55 4c 45 20 3d 20 43 72 79 70 74 3a 3a 52  ODULE = Crypt::R
03b0: 68 61 73 68 20 20 20 20 20 20 50 41 43 4b 41 47  hash      PACKAG
03c0: 45 20 3d 20 43 72 79 70 74 3a 3a 52 68 61 73 68  E = Crypt::Rhash
03d0: 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ..##############
03e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
03f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0400: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0410: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0420: 0a 23 20 49 6e 69 74 69 61 6c 69 7a 65 20 4c 69  .# Initialize Li
0430: 62 52 48 61 73 68 20 69 6e 20 74 68 65 20 6d 6f  bRHash in the mo
0440: 64 75 6c 65 20 62 6f 6f 74 73 74 72 61 70 20 66  dule bootstrap f
0450: 75 6e 63 74 69 6f 6e 0a 0a 42 4f 4f 54 3a 0a 09  unction..BOOT:..
0460: 72 68 61 73 68 5f 6c 69 62 72 61 72 79 5f 69 6e  rhash_library_in
0470: 69 74 28 29 3b 0a 0a 23 23 23 23 23 23 23 23 23  it();..#########
0480: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0490: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04c0: 23 23 23 23 23 0a 23 20 70 65 72 6c 20 62 69 6e  #####.# perl bin
04d0: 64 69 6e 67 73 20 66 6f 72 20 48 69 2d 6c 65 76  dings for Hi-lev
04e0: 65 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 0a 53 56  el functions..SV
04f0: 20 2a 0a 72 68 61 73 68 5f 6d 73 67 5f 72 61 77   *.rhash_msg_raw
0500: 28 68 61 73 68 5f 69 64 2c 20 6d 65 73 73 61 67  (hash_id, messag
0510: 65 29 0a 09 09 75 6e 73 69 67 6e 65 64 09 68 61  e)...unsigned.ha
0520: 73 68 5f 69 64 0a 09 50 52 4f 54 4f 54 59 50 45  sh_id..PROTOTYPE
0530: 3a 20 24 24 0a 09 50 52 45 49 4e 49 54 3a 0a 09  : $$..PREINIT:..
0540: 09 53 54 52 4c 45 4e 20 6c 65 6e 67 74 68 3b 0a  .STRLEN length;.
0550: 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
0560: 6f 75 74 5b 32 36 34 5d 3b 0a 09 09 69 6e 74 20  out[264];...int 
0570: 72 65 73 3b 0a 09 49 4e 50 55 54 3a 0a 09 09 63  res;..INPUT:...c
0580: 68 61 72 2a 20 6d 65 73 73 61 67 65 20 3d 20 53  har* message = S
0590: 76 50 56 28 53 54 28 31 29 2c 20 6c 65 6e 67 74  vPV(ST(1), lengt
05a0: 68 29 3b 0a 09 43 4f 44 45 3a 0a 09 09 76 65 72  h);..CODE:...ver
05b0: 69 66 79 5f 73 69 6e 67 6c 65 5f 62 69 74 5f 68  ify_single_bit_h
05c0: 61 73 68 5f 69 64 28 68 61 73 68 5f 69 64 2c 20  ash_id(hash_id, 
05d0: 63 76 29 3b 0a 09 09 72 65 73 20 3d 20 72 68 61  cv);...res = rha
05e0: 73 68 5f 6d 73 67 28 68 61 73 68 5f 69 64 2c 20  sh_msg(hash_id, 
05f0: 6d 65 73 73 61 67 65 2c 20 6c 65 6e 67 74 68 2c  message, length,
0600: 20 6f 75 74 29 3b 0a 09 09 69 66 28 72 65 73 20   out);...if(res 
0610: 3c 20 30 29 20 7b 0a 09 09 09 63 72 6f 61 6b 28  < 0) {....croak(
0620: 22 25 73 3a 20 25 73 22 2c 20 22 72 68 61 73 68  "%s: %s", "rhash
0630: 5f 6d 73 67 5f 72 61 77 22 2c 20 73 74 72 65 72  _msg_raw", strer
0640: 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 09 09 7d  ror(errno));...}
0650: 0a 09 09 52 45 54 56 41 4c 20 3d 20 6e 65 77 53  ...RETVAL = newS
0660: 56 70 76 28 28 63 68 61 72 2a 29 6f 75 74 2c 20  Vpv((char*)out, 
0670: 72 68 61 73 68 5f 67 65 74 5f 64 69 67 65 73 74  rhash_get_digest
0680: 5f 73 69 7a 65 28 68 61 73 68 5f 69 64 29 29 3b  _size(hash_id));
0690: 0a 09 4f 55 54 50 55 54 3a 0a 09 09 52 45 54 56  ..OUTPUT:...RETV
06a0: 41 4c 0a 0a 53 56 20 2a 0a 72 68 61 73 68 5f 66  AL..SV *.rhash_f
06b0: 69 6c 65 5f 72 61 77 28 68 61 73 68 5f 69 64 2c  ile_raw(hash_id,
06c0: 20 66 69 6c 65 70 61 74 68 29 0a 09 09 75 6e 73   filepath)...uns
06d0: 69 67 6e 65 64 20 68 61 73 68 5f 69 64 0a 09 09  igned hash_id...
06e0: 63 68 61 72 20 2a 20 66 69 6c 65 70 61 74 68 0a  char * filepath.
06f0: 09 50 52 4f 54 4f 54 59 50 45 3a 20 24 24 0a 09  .PROTOTYPE: $$..
0700: 50 52 45 49 4e 49 54 3a 0a 09 09 69 6e 74 20 72  PREINIT:...int r
0710: 65 73 3b 0a 09 09 75 6e 73 69 67 6e 65 64 20 63  es;...unsigned c
0720: 68 61 72 20 6f 75 74 5b 32 36 34 5d 3b 0a 09 43  har out[264];..C
0730: 4f 44 45 3a 0a 09 09 76 65 72 69 66 79 5f 73 69  ODE:...verify_si
0740: 6e 67 6c 65 5f 62 69 74 5f 68 61 73 68 5f 69 64  ngle_bit_hash_id
0750: 28 68 61 73 68 5f 69 64 2c 20 63 76 29 3b 0a 09  (hash_id, cv);..
0760: 09 72 65 73 20 3d 20 72 68 61 73 68 5f 66 69 6c  .res = rhash_fil
0770: 65 28 68 61 73 68 5f 69 64 2c 20 66 69 6c 65 70  e(hash_id, filep
0780: 61 74 68 2c 20 6f 75 74 29 3b 0a 09 09 69 66 28  ath, out);...if(
0790: 72 65 73 20 3c 20 30 29 20 7b 0a 09 09 09 63 72  res < 0) {....cr
07a0: 6f 61 6b 28 22 25 73 3a 20 25 73 3a 20 25 73 22  oak("%s: %s: %s"
07b0: 2c 20 22 72 68 61 73 68 5f 66 69 6c 65 22 2c 20  , "rhash_file", 
07c0: 66 69 6c 65 70 61 74 68 2c 20 73 74 72 65 72 72  filepath, strerr
07d0: 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 09 09 7d 0a  or(errno));...}.
07e0: 09 09 52 45 54 56 41 4c 20 3d 20 6e 65 77 53 56  ..RETVAL = newSV
07f0: 70 76 28 28 63 68 61 72 2a 29 6f 75 74 2c 20 72  pv((char*)out, r
0800: 68 61 73 68 5f 67 65 74 5f 64 69 67 65 73 74 5f  hash_get_digest_
0810: 73 69 7a 65 28 68 61 73 68 5f 69 64 29 29 3b 0a  size(hash_id));.
0820: 09 4f 55 54 50 55 54 3a 0a 09 09 52 45 54 56 41  .OUTPUT:...RETVA
0830: 4c 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  L..#############
0840: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0850: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0860: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0870: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0880: 23 0a 23 20 70 65 72 6c 20 62 69 6e 64 69 6e 67  #.# perl binding
0890: 73 20 66 6f 72 20 4c 6f 77 2d 6c 65 76 65 6c 20  s for Low-level 
08a0: 66 75 6e 63 74 69 6f 6e 73 0a 0a 72 68 61 73 68  functions..rhash
08b0: 5f 63 6f 6e 74 65 78 74 20 2a 0a 72 68 61 73 68  _context *.rhash
08c0: 5f 69 6e 69 74 28 68 61 73 68 5f 69 64 29 0a 09  _init(hash_id)..
08d0: 09 75 6e 73 69 67 6e 65 64 20 68 61 73 68 5f 69  .unsigned hash_i
08e0: 64 0a 09 50 52 4f 54 4f 54 59 50 45 3a 20 24 0a  d..PROTOTYPE: $.
08f0: 0a 69 6e 74 0a 72 68 61 73 68 5f 75 70 64 61 74  .int.rhash_updat
0900: 65 28 63 74 78 2c 20 6d 65 73 73 61 67 65 29 0a  e(ctx, message).
0910: 09 09 72 68 61 73 68 5f 63 6f 6e 74 65 78 74 20  ..rhash_context 
0920: 2a 20 63 74 78 0a 09 50 52 4f 54 4f 54 59 50 45  * ctx..PROTOTYPE
0930: 3a 20 24 24 0a 09 50 52 45 49 4e 49 54 3a 0a 09  : $$..PREINIT:..
0940: 09 53 54 52 4c 45 4e 20 6c 65 6e 67 74 68 3b 0a  .STRLEN length;.
0950: 09 49 4e 50 55 54 3a 0a 09 09 63 68 61 72 2a 20  .INPUT:...char* 
0960: 6d 65 73 73 61 67 65 20 3d 20 53 76 50 56 28 53  message = SvPV(S
0970: 54 28 31 29 2c 20 6c 65 6e 67 74 68 29 3b 0a 09  T(1), length);..
0980: 43 4f 44 45 3a 0a 09 09 52 45 54 56 41 4c 20 3d  CODE:...RETVAL =
0990: 20 72 68 61 73 68 5f 75 70 64 61 74 65 28 63 74   rhash_update(ct
09a0: 78 2c 20 6d 65 73 73 61 67 65 2c 20 6c 65 6e 67  x, message, leng
09b0: 74 68 29 3b 0a 09 4f 55 54 50 55 54 3a 0a 09 09  th);..OUTPUT:...
09c0: 52 45 54 56 41 4c 0a 0a 69 6e 74 0a 72 68 61 73  RETVAL..int.rhas
09d0: 68 5f 66 69 6e 61 6c 28 63 74 78 29 0a 09 09 72  h_final(ctx)...r
09e0: 68 61 73 68 5f 63 6f 6e 74 65 78 74 20 2a 20 63  hash_context * c
09f0: 74 78 0a 09 50 52 4f 54 4f 54 59 50 45 3a 20 24  tx..PROTOTYPE: $
0a00: 0a 09 43 4f 44 45 3a 0a 09 09 52 45 54 56 41 4c  ..CODE:...RETVAL
0a10: 20 3d 20 72 68 61 73 68 5f 66 69 6e 61 6c 28 63   = rhash_final(c
0a20: 74 78 2c 20 30 29 3b 0a 09 4f 55 54 50 55 54 3a  tx, 0);..OUTPUT:
0a30: 0a 09 09 52 45 54 56 41 4c 0a 0a 76 6f 69 64 0a  ...RETVAL..void.
0a40: 72 68 61 73 68 5f 72 65 73 65 74 28 63 74 78 29  rhash_reset(ctx)
0a50: 0a 09 09 72 68 61 73 68 5f 63 6f 6e 74 65 78 74  ...rhash_context
0a60: 20 2a 20 63 74 78 0a 09 50 52 4f 54 4f 54 59 50   * ctx..PROTOTYP
0a70: 45 3a 20 24 0a 0a 76 6f 69 64 0a 72 68 61 73 68  E: $..void.rhash
0a80: 5f 66 72 65 65 28 63 74 78 29 0a 09 09 72 68 61  _free(ctx)...rha
0a90: 73 68 5f 63 6f 6e 74 65 78 74 20 2a 20 63 74 78  sh_context * ctx
0aa0: 0a 09 50 52 4f 54 4f 54 59 50 45 3a 20 24 0a 0a  ..PROTOTYPE: $..
0ab0: 53 56 20 2a 0a 72 68 61 73 68 5f 70 72 69 6e 74  SV *.rhash_print
0ac0: 28 63 74 78 2c 20 68 61 73 68 5f 69 64 2c 20 66  (ctx, hash_id, f
0ad0: 6c 61 67 73 20 3d 20 30 29 0a 09 09 72 68 61 73  lags = 0)...rhas
0ae0: 68 5f 63 6f 6e 74 65 78 74 20 2a 20 63 74 78 0a  h_context * ctx.
0af0: 09 09 75 6e 73 69 67 6e 65 64 20 68 61 73 68 5f  ..unsigned hash_
0b00: 69 64 0a 09 09 69 6e 74 20 66 6c 61 67 73 0a 09  id...int flags..
0b10: 50 52 4f 54 4f 54 59 50 45 3a 20 24 24 3b 24 0a  PROTOTYPE: $$;$.
0b20: 09 50 52 45 49 4e 49 54 3a 0a 09 09 69 6e 74 20  .PREINIT:...int 
0b30: 6c 65 6e 3b 0a 09 09 63 68 61 72 20 6f 75 74 5b  len;...char out[
0b40: 32 36 34 5d 3b 0a 09 43 4f 44 45 3a 0a 09 09 69  264];..CODE:...i
0b50: 66 28 68 61 73 68 5f 69 64 20 21 3d 20 30 29 20  f(hash_id != 0) 
0b60: 76 65 72 69 66 79 5f 73 69 6e 67 6c 65 5f 62 69  verify_single_bi
0b70: 74 5f 68 61 73 68 5f 69 64 28 68 61 73 68 5f 69  t_hash_id(hash_i
0b80: 64 2c 20 63 76 29 3b 0a 0a 09 09 6c 65 6e 20 3d  d, cv);....len =
0b90: 20 72 68 61 73 68 5f 70 72 69 6e 74 28 6f 75 74   rhash_print(out
0ba0: 2c 20 63 74 78 2c 20 68 61 73 68 5f 69 64 2c 20  , ctx, hash_id, 
0bb0: 66 6c 61 67 73 29 3b 0a 0a 09 09 2f 2a 20 73 65  flags);..../* se
0bc0: 74 20 65 78 61 63 74 20 6c 65 6e 67 74 68 20 74  t exact length t
0bd0: 6f 20 73 75 70 70 6f 72 74 20 72 61 77 20 6f 75  o support raw ou
0be0: 74 70 75 74 20 28 52 48 50 52 5f 52 41 57 29 20  tput (RHPR_RAW) 
0bf0: 2a 2f 0a 09 09 52 45 54 56 41 4c 20 3d 20 6e 65  */...RETVAL = ne
0c00: 77 53 56 70 76 28 6f 75 74 2c 20 6c 65 6e 29 3b  wSVpv(out, len);
0c10: 0a 09 4f 55 54 50 55 54 3a 0a 09 09 52 45 54 56  ..OUTPUT:...RETV
0c20: 41 4c 0a 0a 53 56 20 2a 0a 72 68 61 73 68 5f 70  AL..SV *.rhash_p
0c30: 72 69 6e 74 5f 6d 61 67 6e 65 74 28 63 74 78 2c  rint_magnet(ctx,
0c40: 20 66 69 6c 65 6e 61 6d 65 2c 20 68 61 73 68 5f   filename, hash_
0c50: 6d 61 73 6b 29 0a 09 09 72 68 61 73 68 5f 63 6f  mask)...rhash_co
0c60: 6e 74 65 78 74 20 2a 20 63 74 78 0a 09 09 53 56  ntext * ctx...SV
0c70: 20 2a 20 66 69 6c 65 6e 61 6d 65 0a 09 09 53 56   * filename...SV
0c80: 20 2a 20 68 61 73 68 5f 6d 61 73 6b 0a 09 50 52   * hash_mask..PR
0c90: 4f 54 4f 54 59 50 45 3a 20 24 3b 24 24 0a 09 50  OTOTYPE: $;$$..P
0ca0: 52 45 49 4e 49 54 3a 0a 09 09 2f 2a 20 70 72 6f  REINIT:.../* pro
0cb0: 63 65 73 73 20 75 6e 64 65 66 69 6e 65 64 20 76  cess undefined v
0cc0: 61 6c 75 65 73 20 2a 2f 0a 09 09 63 68 61 72 20  alues */...char 
0cd0: 2a 20 6e 61 6d 65 20 3d 20 28 53 76 4f 4b 28 66  * name = (SvOK(f
0ce0: 69 6c 65 6e 61 6d 65 29 20 3f 20 53 76 50 56 5f  ilename) ? SvPV_
0cf0: 6e 6f 6c 65 6e 28 66 69 6c 65 6e 61 6d 65 29 20  nolen(filename) 
0d00: 3a 20 30 29 3b 0a 09 09 75 6e 73 69 67 6e 65 64  : 0);...unsigned
0d10: 20 6d 61 73 6b 20 3d 20 28 53 76 4f 4b 28 68 61   mask = (SvOK(ha
0d20: 73 68 5f 6d 61 73 6b 29 20 3f 20 28 75 6e 73 69  sh_mask) ? (unsi
0d30: 67 6e 65 64 29 53 76 55 56 28 68 61 73 68 5f 6d  gned)SvUV(hash_m
0d40: 61 73 6b 29 20 3a 20 52 48 41 53 48 5f 41 4c 4c  ask) : RHASH_ALL
0d50: 5f 48 41 53 48 45 53 29 3b 0a 09 09 73 69 7a 65  _HASHES);...size
0d60: 5f 74 20 62 75 66 5f 73 69 7a 65 3b 0a 09 43 4f  _t buf_size;..CO
0d70: 44 45 3a 0a 09 09 2f 2a 20 61 6c 6c 6f 63 61 74  DE:.../* allocat
0d80: 65 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  e a string buffe
0d90: 72 20 61 6e 64 20 70 72 69 6e 74 20 6d 61 67 6e  r and print magn
0da0: 65 74 20 6c 69 6e 6b 20 69 6e 74 6f 20 69 74 20  et link into it 
0db0: 2a 2f 0a 09 09 62 75 66 5f 73 69 7a 65 20 3d 20  */...buf_size = 
0dc0: 72 68 61 73 68 5f 70 72 69 6e 74 5f 6d 61 67 6e  rhash_print_magn
0dd0: 65 74 28 30 2c 20 6e 61 6d 65 2c 20 63 74 78 2c  et(0, name, ctx,
0de0: 20 6d 61 73 6b 2c 20 52 48 50 52 5f 46 49 4c 45   mask, RHPR_FILE
0df0: 53 49 5a 45 29 3b 0a 09 09 52 45 54 56 41 4c 20  SIZE);...RETVAL 
0e00: 3d 20 61 6c 6c 6f 63 61 74 65 5f 73 74 72 69 6e  = allocate_strin
0e10: 67 5f 62 75 66 66 65 72 28 62 75 66 5f 73 69 7a  g_buffer(buf_siz
0e20: 65 20 2d 20 31 29 3b 0a 09 09 72 68 61 73 68 5f  e - 1);...rhash_
0e30: 70 72 69 6e 74 5f 6d 61 67 6e 65 74 28 53 76 50  print_magnet(SvP
0e40: 56 58 28 52 45 54 56 41 4c 29 2c 20 6e 61 6d 65  VX(RETVAL), name
0e50: 2c 20 63 74 78 2c 20 6d 61 73 6b 2c 20 52 48 50  , ctx, mask, RHP
0e60: 52 5f 46 49 4c 45 53 49 5a 45 29 3b 0a 0a 09 09  R_FILESIZE);....
0e70: 2f 2a 20 6e 6f 74 65 3a 20 6c 65 6e 67 74 68 28  /* note: length(
0e80: 52 45 54 56 41 4c 29 20 3d 20 28 62 75 66 5f 73  RETVAL) = (buf_s
0e90: 69 7a 65 20 2d 20 31 29 2c 0a 09 09 20 2a 20 73  ize - 1),... * s
0ea0: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
0eb0: 63 61 6c 6c 20 69 73 20 6e 6f 74 20 72 65 71 75  call is not requ
0ec0: 69 72 65 64 3a 0a 09 09 20 2a 20 53 76 43 55 52  ired:... * SvCUR
0ed0: 5f 73 65 74 28 52 45 54 56 41 4c 2c 20 73 74 72  _set(RETVAL, str
0ee0: 6c 65 6e 28 53 76 50 56 58 28 52 45 54 56 41 4c  len(SvPVX(RETVAL
0ef0: 29 29 29 3b 20 2a 2f 0a 09 4f 55 54 50 55 54 3a  ))); */..OUTPUT:
0f00: 0a 09 09 52 45 54 56 41 4c 0a 0a 75 6e 73 69 67  ...RETVAL..unsig
0f10: 6e 65 64 0a 72 68 61 73 68 5f 67 65 74 5f 68 61  ned.rhash_get_ha
0f20: 73 68 5f 69 64 28 63 74 78 29 0a 09 09 72 68 61  sh_id(ctx)...rha
0f30: 73 68 5f 63 6f 6e 74 65 78 74 20 2a 20 63 74 78  sh_context * ctx
0f40: 0a 09 50 52 4f 54 4f 54 59 50 45 3a 20 24 0a 09  ..PROTOTYPE: $..
0f50: 43 4f 44 45 3a 0a 09 09 52 45 54 56 41 4c 20 3d  CODE:...RETVAL =
0f60: 20 63 74 78 2d 3e 68 61 73 68 5f 69 64 3b 0a 09   ctx->hash_id;..
0f70: 4f 55 54 50 55 54 3a 0a 09 09 52 45 54 56 41 4c  OUTPUT:...RETVAL
0f80: 0a 0a 75 6c 6f 6e 67 6c 6f 6e 67 0a 72 68 61 73  ..ulonglong.rhas
0f90: 68 5f 67 65 74 5f 68 61 73 68 65 64 5f 6c 65 6e  h_get_hashed_len
0fa0: 67 74 68 28 63 74 78 29 0a 09 09 72 68 61 73 68  gth(ctx)...rhash
0fb0: 5f 63 6f 6e 74 65 78 74 20 2a 20 63 74 78 0a 09  _context * ctx..
0fc0: 50 52 4f 54 4f 54 59 50 45 3a 20 24 0a 09 43 4f  PROTOTYPE: $..CO
0fd0: 44 45 3a 0a 09 09 52 45 54 56 41 4c 20 3d 20 63  DE:...RETVAL = c
0fe0: 74 78 2d 3e 6d 73 67 5f 73 69 7a 65 3b 0a 09 4f  tx->msg_size;..O
0ff0: 55 54 50 55 54 3a 0a 09 09 52 45 54 56 41 4c 0a  UTPUT:...RETVAL.
1000: 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  .###############
1010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
1050: 23 20 48 61 73 68 20 69 6e 66 6f 72 6d 61 74 69  # Hash informati
1060: 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 0a 0a 69 6e  on functions..in
1070: 74 0a 63 6f 75 6e 74 28 29 0a 09 43 4f 44 45 3a  t.count()..CODE:
1080: 0a 09 09 52 45 54 56 41 4c 20 3d 20 72 68 61 73  ...RETVAL = rhas
1090: 68 5f 63 6f 75 6e 74 28 29 3b 0a 09 4f 55 54 50  h_count();..OUTP
10a0: 55 54 3a 0a 09 09 52 45 54 56 41 4c 0a 0a 69 6e  UT:...RETVAL..in
10b0: 74 0a 69 73 5f 62 61 73 65 33 32 28 68 61 73 68  t.is_base32(hash
10c0: 5f 69 64 29 0a 09 09 75 6e 73 69 67 6e 65 64 20  _id)...unsigned 
10d0: 68 61 73 68 5f 69 64 0a 09 50 52 4f 54 4f 54 59  hash_id..PROTOTY
10e0: 50 45 3a 20 24 0a 09 43 4f 44 45 3a 0a 09 09 52  PE: $..CODE:...R
10f0: 45 54 56 41 4c 20 3d 20 72 68 61 73 68 5f 69 73  ETVAL = rhash_is
1100: 5f 62 61 73 65 33 32 28 68 61 73 68 5f 69 64 29  _base32(hash_id)
1110: 3b 0a 09 4f 55 54 50 55 54 3a 0a 09 09 52 45 54  ;..OUTPUT:...RET
1120: 56 41 4c 0a 0a 69 6e 74 0a 67 65 74 5f 64 69 67  VAL..int.get_dig
1130: 65 73 74 5f 73 69 7a 65 28 68 61 73 68 5f 69 64  est_size(hash_id
1140: 29 0a 09 09 75 6e 73 69 67 6e 65 64 20 68 61 73  )...unsigned has
1150: 68 5f 69 64 0a 09 50 52 4f 54 4f 54 59 50 45 3a  h_id..PROTOTYPE:
1160: 20 24 0a 09 43 4f 44 45 3a 0a 09 09 52 45 54 56   $..CODE:...RETV
1170: 41 4c 20 3d 20 72 68 61 73 68 5f 67 65 74 5f 64  AL = rhash_get_d
1180: 69 67 65 73 74 5f 73 69 7a 65 28 68 61 73 68 5f  igest_size(hash_
1190: 69 64 29 3b 0a 09 4f 55 54 50 55 54 3a 0a 09 09  id);..OUTPUT:...
11a0: 52 45 54 56 41 4c 0a 0a 69 6e 74 0a 67 65 74 5f  RETVAL..int.get_
11b0: 68 61 73 68 5f 6c 65 6e 67 74 68 28 68 61 73 68  hash_length(hash
11c0: 5f 69 64 29 0a 09 09 75 6e 73 69 67 6e 65 64 20  _id)...unsigned 
11d0: 68 61 73 68 5f 69 64 0a 09 50 52 4f 54 4f 54 59  hash_id..PROTOTY
11e0: 50 45 3a 20 24 0a 09 43 4f 44 45 3a 0a 09 09 52  PE: $..CODE:...R
11f0: 45 54 56 41 4c 20 3d 20 72 68 61 73 68 5f 67 65  ETVAL = rhash_ge
1200: 74 5f 68 61 73 68 5f 6c 65 6e 67 74 68 28 68 61  t_hash_length(ha
1210: 73 68 5f 69 64 29 3b 0a 09 4f 55 54 50 55 54 3a  sh_id);..OUTPUT:
1220: 0a 09 09 52 45 54 56 41 4c 0a 0a 63 6f 6e 73 74  ...RETVAL..const
1230: 20 63 68 61 72 20 2a 0a 67 65 74 5f 6e 61 6d 65   char *.get_name
1240: 28 68 61 73 68 5f 69 64 29 0a 09 09 75 6e 73 69  (hash_id)...unsi
1250: 67 6e 65 64 20 68 61 73 68 5f 69 64 0a 09 50 52  gned hash_id..PR
1260: 4f 54 4f 54 59 50 45 3a 20 24 0a 09 43 4f 44 45  OTOTYPE: $..CODE
1270: 3a 0a 09 09 52 45 54 56 41 4c 20 3d 20 72 68 61  :...RETVAL = rha
1280: 73 68 5f 67 65 74 5f 6e 61 6d 65 28 68 61 73 68  sh_get_name(hash
1290: 5f 69 64 29 3b 0a 09 4f 55 54 50 55 54 3a 0a 09  _id);..OUTPUT:..
12a0: 09 52 45 54 56 41 4c 0a 0a 23 23 23 23 23 23 23  .RETVAL..#######
12b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12f0: 23 23 23 23 23 23 23 0a 23 20 48 61 73 68 20 70  #######.# Hash p
1300: 72 69 6e 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  rinting function
1310: 73 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  s..#############
1320: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1330: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1340: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1350: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1360: 23 0a 23 20 48 61 73 68 20 63 6f 6e 76 65 72 73  #.# Hash convers
1370: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 0a 0a 53  ion functions..S
1380: 56 20 2a 0a 72 61 77 32 68 65 78 28 62 79 74 65  V *.raw2hex(byte
1390: 73 29 0a 09 50 52 4f 54 4f 54 59 50 45 3a 20 24  s)..PROTOTYPE: $
13a0: 0a 09 50 52 45 49 4e 49 54 3a 0a 09 09 53 54 52  ..PREINIT:...STR
13b0: 4c 45 4e 20 73 69 7a 65 3b 0a 09 49 4e 50 55 54  LEN size;..INPUT
13c0: 3a 0a 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61  :...unsigned cha
13d0: 72 20 2a 20 62 79 74 65 73 20 3d 20 28 75 6e 73  r * bytes = (uns
13e0: 69 67 6e 65 64 20 63 68 61 72 2a 29 53 76 50 56  igned char*)SvPV
13f0: 28 53 54 28 30 29 2c 20 73 69 7a 65 29 3b 0a 09  (ST(0), size);..
1400: 43 4f 44 45 3a 0a 09 09 52 45 54 56 41 4c 20 3d  CODE:...RETVAL =
1410: 20 61 6c 6c 6f 63 61 74 65 5f 73 74 72 69 6e 67   allocate_string
1420: 5f 62 75 66 66 65 72 28 73 69 7a 65 20 2a 20 32  _buffer(size * 2
1430: 29 3b 0a 09 09 72 68 61 73 68 5f 70 72 69 6e 74  );...rhash_print
1440: 5f 62 79 74 65 73 28 53 76 50 56 58 28 52 45 54  _bytes(SvPVX(RET
1450: 56 41 4c 29 2c 20 62 79 74 65 73 2c 20 73 69 7a  VAL), bytes, siz
1460: 65 2c 20 52 48 50 52 5f 48 45 58 29 3b 0a 09 4f  e, RHPR_HEX);..O
1470: 55 54 50 55 54 3a 0a 09 09 52 45 54 56 41 4c 0a  UTPUT:...RETVAL.
1480: 0a 53 56 20 2a 0a 72 61 77 32 62 61 73 65 33 32  .SV *.raw2base32
1490: 28 62 79 74 65 73 29 0a 09 50 52 4f 54 4f 54 59  (bytes)..PROTOTY
14a0: 50 45 3a 20 24 0a 09 50 52 45 49 4e 49 54 3a 0a  PE: $..PREINIT:.
14b0: 09 09 53 54 52 4c 45 4e 20 73 69 7a 65 3b 0a 09  ..STRLEN size;..
14c0: 49 4e 50 55 54 3a 0a 09 09 75 6e 73 69 67 6e 65  INPUT:...unsigne
14d0: 64 20 63 68 61 72 20 2a 20 62 79 74 65 73 20 3d  d char * bytes =
14e0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
14f0: 29 53 76 50 56 28 53 54 28 30 29 2c 20 73 69 7a  )SvPV(ST(0), siz
1500: 65 29 3b 0a 09 43 4f 44 45 3a 0a 09 09 52 45 54  e);..CODE:...RET
1510: 56 41 4c 20 3d 20 61 6c 6c 6f 63 61 74 65 5f 73  VAL = allocate_s
1520: 74 72 69 6e 67 5f 62 75 66 66 65 72 28 42 41 53  tring_buffer(BAS
1530: 45 33 32 5f 4c 45 4e 47 54 48 28 73 69 7a 65 29  E32_LENGTH(size)
1540: 29 3b 0a 09 09 72 68 61 73 68 5f 70 72 69 6e 74  );...rhash_print
1550: 5f 62 79 74 65 73 28 53 76 50 56 58 28 52 45 54  _bytes(SvPVX(RET
1560: 56 41 4c 29 2c 20 62 79 74 65 73 2c 20 73 69 7a  VAL), bytes, siz
1570: 65 2c 20 52 48 50 52 5f 42 41 53 45 33 32 29 3b  e, RHPR_BASE32);
1580: 0a 09 4f 55 54 50 55 54 3a 0a 09 09 52 45 54 56  ..OUTPUT:...RETV
1590: 41 4c 0a 0a 53 56 20 2a 0a 72 61 77 32 62 61 73  AL..SV *.raw2bas
15a0: 65 36 34 28 62 79 74 65 73 29 0a 09 50 52 4f 54  e64(bytes)..PROT
15b0: 4f 54 59 50 45 3a 20 24 0a 09 50 52 45 49 4e 49  OTYPE: $..PREINI
15c0: 54 3a 0a 09 09 53 54 52 4c 45 4e 20 73 69 7a 65  T:...STRLEN size
15d0: 3b 0a 09 49 4e 50 55 54 3a 0a 09 09 75 6e 73 69  ;..INPUT:...unsi
15e0: 67 6e 65 64 20 63 68 61 72 20 2a 20 62 79 74 65  gned char * byte
15f0: 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  s = (unsigned ch
1600: 61 72 2a 29 53 76 50 56 28 53 54 28 30 29 2c 20  ar*)SvPV(ST(0), 
1610: 73 69 7a 65 29 3b 0a 09 43 4f 44 45 3a 0a 09 09  size);..CODE:...
1620: 52 45 54 56 41 4c 20 3d 20 61 6c 6c 6f 63 61 74  RETVAL = allocat
1630: 65 5f 73 74 72 69 6e 67 5f 62 75 66 66 65 72 28  e_string_buffer(
1640: 42 41 53 45 36 34 5f 4c 45 4e 47 54 48 28 73 69  BASE64_LENGTH(si
1650: 7a 65 29 29 3b 0a 09 09 72 68 61 73 68 5f 70 72  ze));...rhash_pr
1660: 69 6e 74 5f 62 79 74 65 73 28 53 76 50 56 58 28  int_bytes(SvPVX(
1670: 52 45 54 56 41 4c 29 2c 20 62 79 74 65 73 2c 20  RETVAL), bytes, 
1680: 73 69 7a 65 2c 20 52 48 50 52 5f 42 41 53 45 36  size, RHPR_BASE6
1690: 34 29 3b 0a 09 4f 55 54 50 55 54 3a 0a 09 09 52  4);..OUTPUT:...R
16a0: 45 54 56 41 4c 0a 0a 23 20 72 68 61 73 68 5f 70  ETVAL..# rhash_p
16b0: 72 69 6e 74 5f 62 79 74 65 73 20 73 68 6f 75 6c  rint_bytes shoul
16c0: 64 20 6e 6f 74 20 62 65 20 75 73 65 64 20 64 69  d not be used di
16d0: 72 65 63 74 6c 79 0a 23 53 56 20 2a 0a 23 72 68  rectly.#SV *.#rh
16e0: 61 73 68 5f 70 72 69 6e 74 5f 62 79 74 65 73 28  ash_print_bytes(
16f0: 62 79 74 65 73 2c 20 66 6c 61 67 73 29 0a 23 09  bytes, flags).#.
1700: 50 52 4f 54 4f 54 59 50 45 3a 20 24 3b 24 0a 23  PROTOTYPE: $;$.#
1710: 09 50 52 45 49 4e 49 54 3a 0a 23 09 09 53 54 52  .PREINIT:.#..STR
1720: 4c 45 4e 20 73 69 7a 65 3b 0a 23 09 49 4e 50 55  LEN size;.#.INPU
1730: 54 3a 0a 23 09 09 75 6e 73 69 67 6e 65 64 20 63  T:.#..unsigned c
1740: 68 61 72 20 2a 20 62 79 74 65 73 20 3d 20 53 76  har * bytes = Sv
1750: 50 56 28 53 54 28 30 29 2c 20 73 69 7a 65 29 3b  PV(ST(0), size);
1760: 0a 23 09 09 69 6e 74 20 66 6c 61 67 73 0a 23 09  .#..int flags.#.
1770: 43 4f 44 45 3a 0a 23 09 09 52 45 54 56 41 4c 20  CODE:.#..RETVAL 
1780: 3d 20 61 6c 6c 6f 63 61 74 65 5f 73 74 72 69 6e  = allocate_strin
1790: 67 5f 62 75 66 66 65 72 28 73 69 7a 65 20 2a 20  g_buffer(size * 
17a0: 32 29 3b 0a 23 09 09 72 68 61 73 68 5f 70 72 69  2);.#..rhash_pri
17b0: 6e 74 5f 62 79 74 65 73 28 53 76 50 56 58 28 52  nt_bytes(SvPVX(R
17c0: 45 54 56 41 4c 29 2c 20 62 79 74 65 73 2c 20 73  ETVAL), bytes, s
17d0: 69 7a 65 2c 20 66 6c 61 67 73 29 3b 0a 23 09 4f  ize, flags);.#.O
17e0: 55 54 50 55 54 3a 0a 23 09 09 52 45 54 56 41 4c  UTPUT:.#..RETVAL
17f0: 0a 0a 23 72 68 61 73 68 5f 75 70 74 72 5f 74 0a  ..#rhash_uptr_t.
1800: 23 72 68 61 73 68 5f 74 72 61 6e 73 6d 69 74 28  #rhash_transmit(
1810: 6d 73 67 5f 69 64 2c 20 64 73 74 2c 20 6c 64 61  msg_id, dst, lda
1820: 74 61 2c 20 72 64 61 74 61 29 0a 23 09 75 6e 73  ta, rdata).#.uns
1830: 69 67 6e 65 64 20 6d 73 67 5f 69 64 0a 23 09 76  igned msg_id.#.v
1840: 6f 69 64 20 2a 20 64 73 74 0a 23 09 72 68 61 73  oid * dst.#.rhas
1850: 68 5f 75 70 74 72 5f 74 20 6c 64 61 74 61 0a 23  h_uptr_t ldata.#
1860: 09 72 68 61 73 68 5f 75 70 74 72 5f 74 20 72 64  .rhash_uptr_t rd
1870: 61 74 61 0a 0a 23 23 23 23 23 23 23 23 23 23 23  ata..###########
1880: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1890: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18c0: 23 23 23 0a 23 20 42 54 49 48 20 2f 20 42 69 74  ###.# BTIH / Bit
18d0: 54 6f 72 72 65 6e 74 20 73 75 70 70 6f 72 74 20  Torrent support 
18e0: 66 75 6e 63 74 69 6f 6e 73 0a 0a 76 6f 69 64 0a  functions..void.
18f0: 72 68 61 73 68 5f 62 74 5f 61 64 64 5f 66 69 6c  rhash_bt_add_fil
1900: 65 6e 61 6d 65 28 63 74 78 2c 20 66 69 6c 65 6e  ename(ctx, filen
1910: 61 6d 65 2c 20 66 69 6c 65 73 69 7a 65 29 0a 09  ame, filesize)..
1920: 09 72 68 61 73 68 5f 63 6f 6e 74 65 78 74 20 2a  .rhash_context *
1930: 20 63 74 78 0a 09 09 63 68 61 72 20 2a 20 66 69   ctx...char * fi
1940: 6c 65 6e 61 6d 65 0a 09 09 75 6c 6f 6e 67 6c 6f  lename...ulonglo
1950: 6e 67 20 66 69 6c 65 73 69 7a 65 0a 09 50 52 4f  ng filesize..PRO
1960: 54 4f 54 59 50 45 3a 20 24 24 24 0a 09 43 4f 44  TOTYPE: $$$..COD
1970: 45 3a 0a 09 09 72 68 61 73 68 5f 74 72 61 6e 73  E:...rhash_trans
1980: 6d 69 74 28 52 4d 53 47 5f 42 54 5f 41 44 44 5f  mit(RMSG_BT_ADD_
1990: 46 49 4c 45 2c 20 63 74 78 2c 20 52 48 41 53 48  FILE, ctx, RHASH
19a0: 5f 53 54 52 32 55 50 54 52 28 66 69 6c 65 6e 61  _STR2UPTR(filena
19b0: 6d 65 29 2c 20 28 72 68 61 73 68 5f 75 70 74 72  me), (rhash_uptr
19c0: 5f 74 29 26 66 69 6c 65 73 69 7a 65 29 3b 0a 0a  _t)&filesize);..
19d0: 76 6f 69 64 0a 72 68 61 73 68 5f 62 74 5f 73 65  void.rhash_bt_se
19e0: 74 5f 70 69 65 63 65 5f 6c 65 6e 67 74 68 28 63  t_piece_length(c
19f0: 74 78 2c 20 70 69 65 63 65 5f 6c 65 6e 67 74 68  tx, piece_length
1a00: 29 0a 09 09 72 68 61 73 68 5f 63 6f 6e 74 65 78  )...rhash_contex
1a10: 74 20 2a 20 63 74 78 0a 09 09 75 6e 73 69 67 6e  t * ctx...unsign
1a20: 65 64 20 70 69 65 63 65 5f 6c 65 6e 67 74 68 0a  ed piece_length.
1a30: 09 50 52 4f 54 4f 54 59 50 45 3a 20 24 24 0a 09  .PROTOTYPE: $$..
1a40: 43 4f 44 45 3a 0a 09 09 72 68 61 73 68 5f 74 72  CODE:...rhash_tr
1a50: 61 6e 73 6d 69 74 28 52 4d 53 47 5f 42 54 5f 53  ansmit(RMSG_BT_S
1a60: 45 54 5f 50 49 45 43 45 5f 4c 45 4e 47 54 48 2c  ET_PIECE_LENGTH,
1a70: 20 63 74 78 2c 20 52 48 41 53 48 5f 53 54 52 32   ctx, RHASH_STR2
1a80: 55 50 54 52 28 70 69 65 63 65 5f 6c 65 6e 67 74  UPTR(piece_lengt
1a90: 68 29 2c 20 30 29 3b 0a 0a 76 6f 69 64 0a 72 68  h), 0);..void.rh
1aa0: 61 73 68 5f 62 74 5f 73 65 74 5f 70 72 69 76 61  ash_bt_set_priva
1ab0: 74 65 28 63 74 78 29 0a 09 09 72 68 61 73 68 5f  te(ctx)...rhash_
1ac0: 63 6f 6e 74 65 78 74 20 2a 20 63 74 78 0a 09 50  context * ctx..P
1ad0: 52 4f 54 4f 54 59 50 45 3a 20 24 0a 09 43 4f 44  ROTOTYPE: $..COD
1ae0: 45 3a 0a 09 09 72 68 61 73 68 5f 74 72 61 6e 73  E:...rhash_trans
1af0: 6d 69 74 28 52 4d 53 47 5f 42 54 5f 53 45 54 5f  mit(RMSG_BT_SET_
1b00: 4f 50 54 49 4f 4e 53 2c 20 63 74 78 2c 20 52 48  OPTIONS, ctx, RH
1b10: 41 53 48 5f 42 54 5f 4f 50 54 5f 50 52 49 56 41  ASH_BT_OPT_PRIVA
1b20: 54 45 2c 20 30 29 3b 0a 0a 53 56 20 2a 0a 72 68  TE, 0);..SV *.rh
1b30: 61 73 68 5f 62 74 5f 67 65 74 5f 74 6f 72 72 65  ash_bt_get_torre
1b40: 6e 74 5f 74 65 78 74 28 63 74 78 29 0a 09 09 72  nt_text(ctx)...r
1b50: 68 61 73 68 5f 63 6f 6e 74 65 78 74 20 2a 20 63  hash_context * c
1b60: 74 78 0a 09 50 52 4f 54 4f 54 59 50 45 3a 20 24  tx..PROTOTYPE: $
1b70: 0a 09 50 52 45 49 4e 49 54 3a 0a 09 09 73 69 7a  ..PREINIT:...siz
1b80: 65 5f 74 20 6c 65 6e 3b 0a 09 09 63 68 61 72 20  e_t len;...char 
1b90: 2a 74 65 78 74 3b 0a 09 43 4f 44 45 3a 0a 09 09  *text;..CODE:...
1ba0: 6c 65 6e 20 3d 20 72 68 61 73 68 5f 74 72 61 6e  len = rhash_tran
1bb0: 73 6d 69 74 28 52 4d 53 47 5f 42 54 5f 47 45 54  smit(RMSG_BT_GET
1bc0: 5f 54 45 58 54 2c 20 63 74 78 2c 20 52 48 41 53  _TEXT, ctx, RHAS
1bd0: 48 5f 53 54 52 32 55 50 54 52 28 26 74 65 78 74  H_STR2UPTR(&text
1be0: 29 2c 20 30 29 3b 0a 09 09 69 66 28 6c 65 6e 20  ), 0);...if(len 
1bf0: 3d 3d 20 52 48 41 53 48 5f 45 52 52 4f 52 29 20  == RHASH_ERROR) 
1c00: 7b 0a 09 09 09 58 53 52 45 54 55 52 4e 5f 55 4e  {....XSRETURN_UN
1c10: 44 45 46 3b 0a 09 09 7d 0a 09 09 52 45 54 56 41  DEF;...}...RETVA
1c20: 4c 20 3d 20 6e 65 77 53 56 70 76 28 74 65 78 74  L = newSVpv(text
1c30: 2c 20 6c 65 6e 29 3b 0a 09 4f 55 54 50 55 54 3a  , len);..OUTPUT:
1c40: 0a 09 09 52 45 54 56 41 4c 0a                    ...RETVAL.