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.