libpurple/protocols/gg/lib/common.c

changeset 35630
8e5d0d726b09
parent 35620
fb20cfee648a
parent 35627
fd11790cc4d6
child 35686
cae91a875b23
equal deleted inserted replaced
35629:5aecb81f23ab 35630:8e5d0d726b09
207 if (!buf || length < 0) 207 if (!buf || length < 0)
208 return NULL; 208 return NULL;
209 209
210 for (; length > 1; buf++, length--) { 210 for (; length > 1; buf++, length--) {
211 do { 211 do {
212 if ((ret = recv(sock, buf, 1, 0)) == -1 && errno != EINTR && errno != EAGAIN) { 212 if ((ret = recv(sock, buf, 1, 0)) == -1 &&
213 gg_debug(GG_DEBUG_MISC, "// gg_read_line() error on read (errno=%d, %s)\n", errno, strerror(errno)); 213 errno != EINTR && errno != EAGAIN)
214 {
215 gg_debug(GG_DEBUG_MISC, "// gg_read_line() "
216 "error on read (errno=%d, %s)\n",
217 errno, strerror(errno));
214 *buf = 0; 218 *buf = 0;
215 return NULL; 219 return NULL;
216 } else if (ret == 0) { 220 } else if (ret == 0) {
217 gg_debug(GG_DEBUG_MISC, "// gg_read_line() eof reached\n"); 221 gg_debug(GG_DEBUG_MISC, "// gg_read_line() "
222 "eof reached\n");
218 *buf = 0; 223 *buf = 0;
219 return NULL; 224 return NULL;
220 } 225 }
221 } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); 226 } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
222 227
267 errno = errno2; 272 errno = errno2;
268 return -1; 273 return -1;
269 } 274 }
270 275
271 if (async) { 276 if (async) {
272 #ifdef FIONBIO 277 if (!gg_fd_set_nonblocking(sock)) {
273 int one = 1; 278 gg_debug(GG_DEBUG_MISC, "// gg_connect() can't set "
274 279 "nonblocking (errno=%d, %s)\n",
275 if (ioctl(sock, FIONBIO, &one) == -1) { 280 errno, strerror(errno));
276 #else
277 if (fcntl(sock, F_SETFL, O_NONBLOCK) == -1) {
278 #endif
279 gg_debug(GG_DEBUG_MISC, "// gg_connect() can't set nonblocking (errno=%d, %s)\n", errno, strerror(errno));
280 errno2 = errno; 281 errno2 = errno;
281 close(sock); 282 close(sock);
282 errno = errno2; 283 errno = errno2;
283 return -1; 284 return -1;
284 } 285 }
289 sin.sin_family = AF_INET; 290 sin.sin_family = AF_INET;
290 sin.sin_addr.s_addr = a->s_addr; 291 sin.sin_addr.s_addr = a->s_addr;
291 292
292 if (connect(sock, (struct sockaddr*) &sin, sizeof(sin)) == -1) { 293 if (connect(sock, (struct sockaddr*) &sin, sizeof(sin)) == -1) {
293 if (errno && (!async || errno != EINPROGRESS)) { 294 if (errno && (!async || errno != EINPROGRESS)) {
294 gg_debug(GG_DEBUG_MISC, "// gg_connect() connect() failed (errno=%d, %s)\n", errno, strerror(errno)); 295 gg_debug(GG_DEBUG_MISC, "// gg_connect() connect() "
296 "failed (errno=%d, %s)\n",
297 errno, strerror(errno));
295 errno2 = errno; 298 errno2 = errno;
296 close(sock); 299 close(sock);
297 errno = errno2; 300 errno = errno2;
298 return -1; 301 return -1;
299 } 302 }
331 * \internal Koduje ciąg znaków do postacji adresu HTTP. 334 * \internal Koduje ciąg znaków do postacji adresu HTTP.
332 * 335 *
333 * Zamienia znaki niedrukowalne, spoza ASCII i mające specjalne znaczenie 336 * Zamienia znaki niedrukowalne, spoza ASCII i mające specjalne znaczenie
334 * dla protokołu HTTP na encje postaci \c %XX, gdzie \c XX jest szesnastkową 337 * dla protokołu HTTP na encje postaci \c %XX, gdzie \c XX jest szesnastkową
335 * wartością znaku. 338 * wartością znaku.
336 * 339 *
337 * \param str Ciąg znaków do zakodowania 340 * \param str Ciąg znaków do zakodowania
338 * 341 *
339 * \return Zaalokowany bufor lub \c NULL w przypadku błędu. 342 * \return Zaalokowany bufor lub \c NULL w przypadku błędu.
340 * 343 *
341 * \ingroup helper 344 * \ingroup helper
349 352
350 if (!str) 353 if (!str)
351 str = ""; 354 str = "";
352 355
353 for (p = str; *p; p++, size++) { 356 for (p = str; *p; p++, size++) {
354 if (!((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z') || (*p >= '0' && *p <= '9') || *p == ' ') || (*p == '@') || (*p == '.') || (*p == '-')) 357 if (!((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z') ||
358 (*p >= '0' && *p <= '9') || *p == ' ') || (*p == '@') ||
359 (*p == '.') || (*p == '-'))
360 {
355 size += 2; 361 size += 2;
362 }
356 } 363 }
357 364
358 if (!(buf = malloc(size + 1))) 365 if (!(buf = malloc(size + 1)))
359 return NULL; 366 return NULL;
360 367
361 for (p = str, q = buf; *p; p++, q++) { 368 for (p = str, q = buf; *p; p++, q++) {
362 if ((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z') || (*p >= '0' && *p <= '9') || (*p == '@') || (*p == '.') || (*p == '-')) 369 if ((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z') ||
370 (*p >= '0' && *p <= '9') || (*p == '@') ||
371 (*p == '.') || (*p == '-'))
372 {
363 *q = *p; 373 *q = *p;
364 else { 374 } else {
365 if (*p == ' ') 375 if (*p == ' ')
366 *q = '+'; 376 *q = '+';
367 else { 377 else {
368 *q++ = '%'; 378 *q++ = '%';
369 *q++ = hex[*p >> 4 & 15]; 379 *q++ = hex[*p >> 4 & 15];
592 /** 602 /**
593 * \internal Tablica pomocnicza do wyznaczania sumy kontrolnej. 603 * \internal Tablica pomocnicza do wyznaczania sumy kontrolnej.
594 */ 604 */
595 static const uint32_t gg_crc32_table[256] = 605 static const uint32_t gg_crc32_table[256] =
596 { 606 {
597 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 607 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
598 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 608 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
599 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 609 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
600 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 610 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
601 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 611 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
602 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 612 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
603 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 613 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
604 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 614 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
605 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 615 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
606 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 616 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
607 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 617 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
608 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 618 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
609 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 619 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
610 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 620 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
611 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 621 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
612 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 622 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
613 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 623 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
614 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 624 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
615 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 625 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
616 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 626 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
617 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 627 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
618 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 628 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
619 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 629 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
620 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 630 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
621 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 631 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
622 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 632 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
623 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 633 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
624 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 634 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
625 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 635 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
626 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 636 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
627 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 637 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
628 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 638 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
629 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 639 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
630 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 640 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
631 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 641 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
632 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 642 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
633 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 643 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
634 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 644 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
635 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 645 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
636 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 646 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
637 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 647 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
638 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 648 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
639 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 649 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
640 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 650 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
641 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 651 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
642 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 652 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
643 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 653 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
644 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 654 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
645 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 655 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
646 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 656 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
647 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 657 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
648 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 658 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
649 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 659 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
650 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 660 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
651 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 661 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
652 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 662 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
653 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 663 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
654 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 664 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
655 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 665 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
656 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 666 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
657 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 667 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
658 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 668 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
659 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 669 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
660 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d 670 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
661 }; 671 };
662 672
663 /** 673 /**
664 * Wyznacza sumę kontrolną CRC32. 674 * Wyznacza sumę kontrolną CRC32.
694 uin_t gg_str_to_uin(const char *str, int len) 704 uin_t gg_str_to_uin(const char *str, int len)
695 { 705 {
696 char buff[11]; 706 char buff[11];
697 char *endptr; 707 char *endptr;
698 uin_t uin; 708 uin_t uin;
699 709
700 if (len < 0) 710 if (len < 0)
701 len = strlen(str); 711 len = strlen(str);
702 if (len > 10) 712 if (len > 10)
703 return 0; 713 return 0;
704 memcpy(buff, str, len); 714 memcpy(buff, str, len);
705 buff[len] = '\0'; 715 buff[len] = '\0';
706 716
707 errno = 0; 717 errno = 0;
708 uin = strtoul(buff, &endptr, 10); 718 uin = strtoul(buff, &endptr, 10);
709 if (errno == ERANGE || endptr[0] != '\0') 719 if (errno == ERANGE || endptr[0] != '\0')
710 return 0; 720 return 0;
711 721
712 return uin; 722 return uin;
713 } 723 }
714 724
715 /** 725 /**
716 * Szuka informacji o konferencji o podanym identyfikatorze. 726 * Szuka informacji o konferencji o podanym identyfikatorze.
722 */ 732 */
723 gg_chat_list_t *gg_chat_find(struct gg_session *sess, uint64_t id) 733 gg_chat_list_t *gg_chat_find(struct gg_session *sess, uint64_t id)
724 { 734 {
725 gg_chat_list_t *chat_list = sess->private_data->chat_list; 735 gg_chat_list_t *chat_list = sess->private_data->chat_list;
726 736
727 while (chat_list != NULL) 737 while (chat_list != NULL) {
728 {
729 if (chat_list->id == id) 738 if (chat_list->id == id)
730 return chat_list; 739 return chat_list;
731 chat_list = chat_list->next; 740 chat_list = chat_list->next;
732 } 741 }
733 742

mercurial