40 struct xmms_bindata_St {
53 typedef struct md5_state_s {
64 static gchar *xmms_bindata_build_path (
xmms_bindata_t *bindata,
const gchar *hash);
72 #include "bindata_ipc.c" 83 xmms_bindata_register_ipc_commands (
XMMS_OBJECT (obj));
91 if (!g_file_test (obj->bindir, G_FILE_TEST_IS_DIR)) {
92 if (g_mkdir_with_parents (obj->bindir, 0755) == -1) {
105 xmms_bindata_unregister_ipc_commands ();
114 static gchar hex[] = {
115 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
116 '8',
'9',
'a',
'b',
'c',
'd',
'e',
'f' 120 md5_append (&state, (
const md5_byte_t *)data, size);
121 md5_finish (&state, digest);
123 for (di = 0; di < 16; ++di) {
124 ret[di * 2] = hex[digest[di] >> 4];
125 ret[di * 2 + 1] = hex[digest[di] & 0x0f];
132 xmms_bindata_build_path (
xmms_bindata_t *bindata,
const gchar *hash)
134 return g_build_path (G_DIR_SEPARATOR_S, bindata->bindir, hash, NULL);
142 return _xmms_bindata_add (global_bindata, data, size, hash, &err);
155 path = xmms_bindata_build_path (bindata, hash);
157 if (g_file_test (path, G_FILE_TEST_IS_REGULAR)) {
158 XMMS_DBG (
"file %s is already in bindata dir", hash);
164 fp = fopen (path,
"wb");
179 w = fwrite (ptr, 1, left, fp);
180 if (!w && ferror (fp)) {
186 "Couldn't write data!");
205 if (_xmms_bindata_add (bindata, (guchar *)data->str, data->len, hash, err))
206 return g_strdup (hash);
211 xmms_bindata_client_retrieve (
xmms_bindata_t *bindata,
const gchar *hash,
219 path = xmms_bindata_build_path (bindata, hash);
221 fp = fopen (path,
"rb");
223 xmms_log_error (
"Requesting '%s' which is not on the server", hash);
231 str = g_string_new (NULL);
236 l = fread (buf, 1, 1024, fp);
238 g_string_free (str, TRUE);
244 g_string_append_len (str, buf, l);
251 g_string_free (str, TRUE);
257 xmms_bindata_client_remove (
xmms_bindata_t *bindata,
const gchar *hash,
261 path = xmms_bindata_build_path (bindata, hash);
262 if (unlink (path) == -1) {
272 GList *entries = NULL;
277 path = xmms_bindata_build_path (bindata, NULL);
278 dir = g_dir_open (path, 0, NULL);
283 "Couldn't open bindata directory");
287 while ((file = g_dir_read_name (dir))) {
360 #ifdef ARCH_IS_BIG_ENDIAN 361 # define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1) 363 # define BYTE_ORDER 0 366 #define T_MASK ((md5_word_t)~0) 367 #define T1 (T_MASK ^ 0x28955b87) 368 #define T2 (T_MASK ^ 0x173848a9) 369 #define T3 0x242070db 370 #define T4 (T_MASK ^ 0x3e423111) 371 #define T5 (T_MASK ^ 0x0a83f050) 372 #define T6 0x4787c62a 373 #define T7 (T_MASK ^ 0x57cfb9ec) 374 #define T8 (T_MASK ^ 0x02b96afe) 375 #define T9 0x698098d8 376 #define T10 (T_MASK ^ 0x74bb0850) 377 #define T11 (T_MASK ^ 0x0000a44e) 378 #define T12 (T_MASK ^ 0x76a32841) 379 #define T13 0x6b901122 380 #define T14 (T_MASK ^ 0x02678e6c) 381 #define T15 (T_MASK ^ 0x5986bc71) 382 #define T16 0x49b40821 383 #define T17 (T_MASK ^ 0x09e1da9d) 384 #define T18 (T_MASK ^ 0x3fbf4cbf) 385 #define T19 0x265e5a51 386 #define T20 (T_MASK ^ 0x16493855) 387 #define T21 (T_MASK ^ 0x29d0efa2) 388 #define T22 0x02441453 389 #define T23 (T_MASK ^ 0x275e197e) 390 #define T24 (T_MASK ^ 0x182c0437) 391 #define T25 0x21e1cde6 392 #define T26 (T_MASK ^ 0x3cc8f829) 393 #define T27 (T_MASK ^ 0x0b2af278) 394 #define T28 0x455a14ed 395 #define T29 (T_MASK ^ 0x561c16fa) 396 #define T30 (T_MASK ^ 0x03105c07) 397 #define T31 0x676f02d9 398 #define T32 (T_MASK ^ 0x72d5b375) 399 #define T33 (T_MASK ^ 0x0005c6bd) 400 #define T34 (T_MASK ^ 0x788e097e) 401 #define T35 0x6d9d6122 402 #define T36 (T_MASK ^ 0x021ac7f3) 403 #define T37 (T_MASK ^ 0x5b4115bb) 404 #define T38 0x4bdecfa9 405 #define T39 (T_MASK ^ 0x0944b49f) 406 #define T40 (T_MASK ^ 0x4140438f) 407 #define T41 0x289b7ec6 408 #define T42 (T_MASK ^ 0x155ed805) 409 #define T43 (T_MASK ^ 0x2b10cf7a) 410 #define T44 0x04881d05 411 #define T45 (T_MASK ^ 0x262b2fc6) 412 #define T46 (T_MASK ^ 0x1924661a) 413 #define T47 0x1fa27cf8 414 #define T48 (T_MASK ^ 0x3b53a99a) 415 #define T49 (T_MASK ^ 0x0bd6ddbb) 416 #define T50 0x432aff97 417 #define T51 (T_MASK ^ 0x546bdc58) 418 #define T52 (T_MASK ^ 0x036c5fc6) 419 #define T53 0x655b59c3 420 #define T54 (T_MASK ^ 0x70f3336d) 421 #define T55 (T_MASK ^ 0x00100b82) 422 #define T56 (T_MASK ^ 0x7a7ba22e) 423 #define T57 0x6fa87e4f 424 #define T58 (T_MASK ^ 0x01d3191f) 425 #define T59 (T_MASK ^ 0x5cfebceb) 426 #define T60 0x4e0811a1 427 #define T61 (T_MASK ^ 0x08ac817d) 428 #define T62 (T_MASK ^ 0x42c50dca) 429 #define T63 0x2ad7d2bb 430 #define T64 (T_MASK ^ 0x14792c6e) 437 a = pms->abcd[0], b = pms->abcd[1],
438 c = pms->abcd[2], d = pms->abcd[3];
456 static const int w = 1;
471 memcpy (xbuf, data, 64);
493 for (i = 0; i < 16; ++i, xp += 4)
494 xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
499 #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) 504 #define F(x, y, z) (((x) & (y)) | (~(x) & (z))) 505 #define SET(a, b, c, d, k, s, Ti)\ 506 t = a + F (b,c,d) + X[k] + Ti;\ 507 a = ROTATE_LEFT (t, s) + b 509 SET (a, b, c, d, 0, 7,
T1);
510 SET (d, a, b, c, 1, 12,
T2);
511 SET (c, d, a, b, 2, 17,
T3);
512 SET (b, c, d, a, 3, 22,
T4);
513 SET (a, b, c, d, 4, 7,
T5);
514 SET (d, a, b, c, 5, 12,
T6);
515 SET (c, d, a, b, 6, 17,
T7);
516 SET (b, c, d, a, 7, 22,
T8);
517 SET (a, b, c, d, 8, 7,
T9);
518 SET (d, a, b, c, 9, 12,
T10);
519 SET (c, d, a, b, 10, 17,
T11);
520 SET (b, c, d, a, 11, 22,
T12);
521 SET (a, b, c, d, 12, 7,
T13);
522 SET (d, a, b, c, 13, 12,
T14);
523 SET (c, d, a, b, 14, 17,
T15);
524 SET (b, c, d, a, 15, 22,
T16);
530 #define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) 531 #define SET(a, b, c, d, k, s, Ti)\ 532 t = a + G (b,c,d) + X[k] + Ti;\ 533 a = ROTATE_LEFT (t, s) + b 535 SET (a, b, c, d, 1, 5,
T17);
536 SET (d, a, b, c, 6, 9,
T18);
537 SET (c, d, a, b, 11, 14,
T19);
538 SET (b, c, d, a, 0, 20,
T20);
539 SET (a, b, c, d, 5, 5,
T21);
540 SET (d, a, b, c, 10, 9,
T22);
541 SET (c, d, a, b, 15, 14,
T23);
542 SET (b, c, d, a, 4, 20,
T24);
543 SET (a, b, c, d, 9, 5,
T25);
544 SET (d, a, b, c, 14, 9,
T26);
545 SET (c, d, a, b, 3, 14,
T27);
546 SET (b, c, d, a, 8, 20,
T28);
547 SET (a, b, c, d, 13, 5,
T29);
548 SET (d, a, b, c, 2, 9,
T30);
549 SET (c, d, a, b, 7, 14,
T31);
550 SET (b, c, d, a, 12, 20,
T32);
556 #define H(x, y, z) ((x) ^ (y) ^ (z)) 557 #define SET(a, b, c, d, k, s, Ti)\ 558 t = a + H (b,c,d) + X[k] + Ti;\ 559 a = ROTATE_LEFT (t, s) + b 561 SET (a, b, c, d, 5, 4,
T33);
562 SET (d, a, b, c, 8, 11,
T34);
563 SET (c, d, a, b, 11, 16,
T35);
564 SET (b, c, d, a, 14, 23,
T36);
565 SET (a, b, c, d, 1, 4,
T37);
566 SET (d, a, b, c, 4, 11,
T38);
567 SET (c, d, a, b, 7, 16,
T39);
568 SET (b, c, d, a, 10, 23,
T40);
569 SET (a, b, c, d, 13, 4,
T41);
570 SET (d, a, b, c, 0, 11,
T42);
571 SET (c, d, a, b, 3, 16,
T43);
572 SET (b, c, d, a, 6, 23,
T44);
573 SET (a, b, c, d, 9, 4,
T45);
574 SET (d, a, b, c, 12, 11,
T46);
575 SET (c, d, a, b, 15, 16,
T47);
576 SET (b, c, d, a, 2, 23,
T48);
582 #define I(x, y, z) ((y) ^ ((x) | ~(z))) 583 #define SET(a, b, c, d, k, s, Ti)\ 584 t = a + I (b,c,d) + X[k] + Ti;\ 585 a = ROTATE_LEFT (t, s) + b 587 SET (a, b, c, d, 0, 6,
T49);
588 SET (d, a, b, c, 7, 10,
T50);
589 SET (c, d, a, b, 14, 15,
T51);
590 SET (b, c, d, a, 5, 21,
T52);
591 SET (a, b, c, d, 12, 6,
T53);
592 SET (d, a, b, c, 3, 10,
T54);
593 SET (c, d, a, b, 10, 15,
T55);
594 SET (b, c, d, a, 1, 21,
T56);
595 SET (a, b, c, d, 8, 6,
T57);
596 SET (d, a, b, c, 15, 10,
T58);
597 SET (c, d, a, b, 6, 15,
T59);
598 SET (b, c, d, a, 13, 21,
T60);
599 SET (a, b, c, d, 4, 6,
T61);
600 SET (d, a, b, c, 11, 10,
T62);
601 SET (c, d, a, b, 2, 15,
T63);
602 SET (b, c, d, a, 9, 21,
T64);
617 pms->count[0] = pms->count[1] = 0;
618 pms->abcd[0] = 0x67452301;
619 pms->abcd[1] =
T_MASK ^ 0x10325476;
620 pms->abcd[2] =
T_MASK ^ 0x67452301;
621 pms->abcd[3] = 0x10325476;
629 int offset = (pms->count[0] >> 3) & 63;
636 pms->count[1] += nbytes >> 29;
637 pms->count[0] += nbits;
638 if (pms->count[0] < nbits)
643 int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
645 memcpy (pms->buf + offset, p, copy);
646 if (offset + copy < 64)
650 md5_process (pms, pms->buf);
654 for (; left >= 64; p += 64, left -= 64)
655 md5_process (pms, p);
659 memcpy (pms->buf, p, left);
666 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
667 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
668 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
669 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
675 for (i = 0; i < 8; ++i)
676 data[i] = (
md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));
678 md5_append (pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
680 md5_append (pms, data, 8);
681 for (i = 0; i < 16; ++i)
682 digest[i] = (
md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
xmmsv_t * xmmsv_new_string(const char *s)
Allocates a new string xmmsv_t.
#define xmms_log_error(fmt,...)
const gchar * xmms_config_property_get_string(const xmms_config_property_t *prop)
Return the value of a config property as a string.
gboolean xmms_bindata_plugin_add(const guchar *data, gsize size, gchar hash[33])
Add binary data from a plugin.
gchar * xmms_bindata_calculate_md5(const guchar *data, gsize size, gchar ret[33])
#define XMMS_DBG(fmt,...)
struct md5_state_s md5_state_t
#define xmms_object_new(objtype, destroyfunc)
G_BEGIN_DECLS struct xmms_error_St xmms_error_t
xmms_config_property_t * xmms_config_property_register(const gchar *path, const gchar *default_value, xmms_object_handler_t cb, gpointer userdata)
Register a new config property.
xmms_bindata_t * xmms_bindata_init()
struct xmms_config_property_St xmms_config_property_t
xmmsv_t * xmmsv_new_bin(const unsigned char *data, unsigned int len)
Allocates a new binary data xmmsv_t.
#define XMMS_BUILD_PATH(...)
#define SET(a, b, c, d, k, s, Ti)
struct xmms_bindata_St xmms_bindata_t