| 359 #ifndef _WIN32 |
359 #ifndef _WIN32 |
| 360 char *old_name; |
360 char *old_name; |
| 361 #endif |
361 #endif |
| 362 if (g_rename(path, new_name)) |
362 if (g_rename(path, new_name)) |
| 363 { |
363 { |
| 364 purple_debug_error("core", "Error renaming %s to %s: %s. Please report this at http://developer.pidgin.im\n", |
364 purple_debug_error("core", "Error renaming %s to %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", |
| 365 path, new_name, g_strerror(errno)); |
365 path, new_name, g_strerror(errno)); |
| 366 g_free(new_name); |
366 g_free(new_name); |
| 367 return FALSE; |
367 return FALSE; |
| 368 } |
368 } |
| 369 g_free(new_name); |
369 g_free(new_name); |
| 372 /* NOTE: This new_name is relative. */ |
372 /* NOTE: This new_name is relative. */ |
| 373 new_name = g_build_filename(relative, basename, NULL); |
373 new_name = g_build_filename(relative, basename, NULL); |
| 374 old_name = g_build_filename(old_base, basename, NULL); |
374 old_name = g_build_filename(old_base, basename, NULL); |
| 375 if (symlink(new_name, old_name)) |
375 if (symlink(new_name, old_name)) |
| 376 { |
376 { |
| 377 purple_debug_warning("core", "Error symlinking %s to %s: %s. Please report this at http://developer.pidgin.im\n", |
377 purple_debug_warning("core", "Error symlinking %s to %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", |
| 378 old_name, new_name, g_strerror(errno)); |
378 old_name, new_name, g_strerror(errno)); |
| 379 } |
379 } |
| 380 g_free(old_name); |
380 g_free(old_name); |
| 381 g_free(new_name); |
381 g_free(new_name); |
| 382 #endif |
382 #endif |
| 428 /* Ensure the user directory exists */ |
428 /* Ensure the user directory exists */ |
| 429 if (!g_file_test(user_dir, G_FILE_TEST_IS_DIR)) |
429 if (!g_file_test(user_dir, G_FILE_TEST_IS_DIR)) |
| 430 { |
430 { |
| 431 if (g_mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR) == -1) |
431 if (g_mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR) == -1) |
| 432 { |
432 { |
| 433 purple_debug_error("core", "Error creating directory %s: %s. Please report this at http://developer.pidgin.im\n", |
433 purple_debug_error("core", "Error creating directory %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", |
| 434 user_dir, g_strerror(errno)); |
434 user_dir, g_strerror(errno)); |
| 435 g_free(status_file); |
435 g_free(status_file); |
| 436 g_free(old_user_dir); |
436 g_free(old_user_dir); |
| 437 return FALSE; |
437 return FALSE; |
| 438 } |
438 } |
| 440 |
440 |
| 441 /* This writes ~/.purple/migrating, which allows us to detect |
441 /* This writes ~/.purple/migrating, which allows us to detect |
| 442 * incomplete migrations and properly retry. */ |
442 * incomplete migrations and properly retry. */ |
| 443 if (!(fp = g_fopen(status_file, "w"))) |
443 if (!(fp = g_fopen(status_file, "w"))) |
| 444 { |
444 { |
| 445 purple_debug_error("core", "Error opening file %s for writing: %s. Please report this at http://developer.pidgin.im\n", |
445 purple_debug_error("core", "Error opening file %s for writing: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", |
| 446 status_file, g_strerror(errno)); |
446 status_file, g_strerror(errno)); |
| 447 g_free(status_file); |
447 g_free(status_file); |
| 448 g_free(old_user_dir); |
448 g_free(old_user_dir); |
| 449 return FALSE; |
449 return FALSE; |
| 450 } |
450 } |
| 452 |
452 |
| 453 /* Open ~/.gaim so we can loop over its contents. */ |
453 /* Open ~/.gaim so we can loop over its contents. */ |
| 454 err = NULL; |
454 err = NULL; |
| 455 if (!(dir = g_dir_open(old_user_dir, 0, &err))) |
455 if (!(dir = g_dir_open(old_user_dir, 0, &err))) |
| 456 { |
456 { |
| 457 purple_debug_error("core", "Error opening directory %s: %s. Please report this at http://developer.pidgin.im\n", |
457 purple_debug_error("core", "Error opening directory %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", |
| 458 status_file, |
458 status_file, |
| 459 (err ? err->message : "Unknown error")); |
459 (err ? err->message : "Unknown error")); |
| 460 if (err) |
460 if (err) |
| 461 g_error_free(err); |
461 g_error_free(err); |
| 462 g_free(status_file); |
462 g_free(status_file); |
| 481 GError *err = NULL; |
481 GError *err = NULL; |
| 482 |
482 |
| 483 if ((link = g_file_read_link(name, &err)) == NULL) |
483 if ((link = g_file_read_link(name, &err)) == NULL) |
| 484 { |
484 { |
| 485 char *name_utf8 = g_filename_to_utf8(name, -1, NULL, NULL, NULL); |
485 char *name_utf8 = g_filename_to_utf8(name, -1, NULL, NULL, NULL); |
| 486 purple_debug_error("core", "Error reading symlink %s: %s. Please report this at http://developer.pidgin.im\n", |
486 purple_debug_error("core", "Error reading symlink %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", |
| 487 name_utf8 ? name_utf8 : name, err->message); |
487 name_utf8 ? name_utf8 : name, err->message); |
| 488 g_free(name_utf8); |
488 g_free(name_utf8); |
| 489 g_error_free(err); |
489 g_error_free(err); |
| 490 g_free(name); |
490 g_free(name); |
| 491 g_dir_close(dir); |
491 g_dir_close(dir); |
| 498 size_t linklen; |
498 size_t linklen; |
| 499 |
499 |
| 500 if ((linklen = readlink(name, buf, sizeof(buf) - 1) == -1)) |
500 if ((linklen = readlink(name, buf, sizeof(buf) - 1) == -1)) |
| 501 { |
501 { |
| 502 char *name_utf8 = g_filename_to_utf8(name, -1, NULL, NULL, NULL); |
502 char *name_utf8 = g_filename_to_utf8(name, -1, NULL, NULL, NULL); |
| 503 purple_debug_error("core", "Error reading symlink %s: %s. Please report this at http://developer.pidgin.im\n", |
503 purple_debug_error("core", "Error reading symlink %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", |
| 504 name_utf8, g_strerror(errno)); |
504 name_utf8, g_strerror(errno)); |
| 505 g_free(name_utf8); |
505 g_free(name_utf8); |
| 506 g_free(name); |
506 g_free(name); |
| 507 g_dir_close(dir); |
507 g_dir_close(dir); |
| 508 g_free(status_file); |
508 g_free(status_file); |
| 536 /* Relative links will most likely still be |
536 /* Relative links will most likely still be |
| 537 * valid from ~/.purple, though it's not |
537 * valid from ~/.purple, though it's not |
| 538 * guaranteed. Oh well. */ |
538 * guaranteed. Oh well. */ |
| 539 if (symlink(link, logs_dir)) |
539 if (symlink(link, logs_dir)) |
| 540 { |
540 { |
| 541 purple_debug_error("core", "Error symlinking %s to %s: %s. Please report this at http://developer.pidgin.im\n", |
541 purple_debug_error("core", "Error symlinking %s to %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", |
| 542 logs_dir, link, g_strerror(errno)); |
542 logs_dir, link, g_strerror(errno)); |
| 543 g_free(link); |
543 g_free(link); |
| 544 g_free(name); |
544 g_free(name); |
| 545 g_free(logs_dir); |
545 g_free(logs_dir); |
| 546 g_dir_close(dir); |
546 g_dir_close(dir); |
| 575 const char *icons_entry; |
575 const char *icons_entry; |
| 576 |
576 |
| 577 err = NULL; |
577 err = NULL; |
| 578 if (!(icons_dir = g_dir_open(name, 0, &err))) |
578 if (!(icons_dir = g_dir_open(name, 0, &err))) |
| 579 { |
579 { |
| 580 purple_debug_error("core", "Error opening directory %s: %s. Please report this at http://developer.pidgin.im\n", |
580 purple_debug_error("core", "Error opening directory %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", |
| 581 name, |
581 name, |
| 582 (err ? err->message : "Unknown error")); |
582 (err ? err->message : "Unknown error")); |
| 583 if (err) |
583 if (err) |
| 584 g_error_free(err); |
584 g_error_free(err); |
| 585 g_free(name); |
585 g_free(name); |
| 593 /* Ensure the new icon directory exists */ |
593 /* Ensure the new icon directory exists */ |
| 594 if (!g_file_test(new_icons_dir, G_FILE_TEST_IS_DIR)) |
594 if (!g_file_test(new_icons_dir, G_FILE_TEST_IS_DIR)) |
| 595 { |
595 { |
| 596 if (g_mkdir(new_icons_dir, S_IRUSR | S_IWUSR | S_IXUSR) == -1) |
596 if (g_mkdir(new_icons_dir, S_IRUSR | S_IWUSR | S_IXUSR) == -1) |
| 597 { |
597 { |
| 598 purple_debug_error("core", "Error creating directory %s: %s. Please report this at http://developer.pidgin.im\n", |
598 purple_debug_error("core", "Error creating directory %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", |
| 599 new_icons_dir, g_strerror(errno)); |
599 new_icons_dir, g_strerror(errno)); |
| 600 g_free(new_icons_dir); |
600 g_free(new_icons_dir); |
| 601 g_dir_close(icons_dir); |
601 g_dir_close(icons_dir); |
| 602 g_free(name); |
602 g_free(name); |
| 603 g_dir_close(dir); |
603 g_dir_close(dir); |
| 656 char *new_name; |
656 char *new_name; |
| 657 FILE *new_file; |
657 FILE *new_file; |
| 658 |
658 |
| 659 if (!(fp = g_fopen(name, "rb"))) |
659 if (!(fp = g_fopen(name, "rb"))) |
| 660 { |
660 { |
| 661 purple_debug_error("core", "Error opening file %s for reading: %s. Please report this at http://developer.pidgin.im\n", |
661 purple_debug_error("core", "Error opening file %s for reading: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", |
| 662 name, g_strerror(errno)); |
662 name, g_strerror(errno)); |
| 663 g_free(name); |
663 g_free(name); |
| 664 g_dir_close(dir); |
664 g_dir_close(dir); |
| 665 g_free(status_file); |
665 g_free(status_file); |
| 666 g_free(old_user_dir); |
666 g_free(old_user_dir); |
| 668 } |
668 } |
| 669 |
669 |
| 670 new_name = g_build_filename(user_dir, entry, NULL); |
670 new_name = g_build_filename(user_dir, entry, NULL); |
| 671 if (!(new_file = g_fopen(new_name, "wb"))) |
671 if (!(new_file = g_fopen(new_name, "wb"))) |
| 672 { |
672 { |
| 673 purple_debug_error("core", "Error opening file %s for writing: %s. Please report this at http://developer.pidgin.im\n", |
673 purple_debug_error("core", "Error opening file %s for writing: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", |
| 674 new_name, g_strerror(errno)); |
674 new_name, g_strerror(errno)); |
| 675 fclose(fp); |
675 fclose(fp); |
| 676 g_free(new_name); |
676 g_free(new_name); |
| 677 g_free(name); |
677 g_free(name); |
| 678 g_dir_close(dir); |
678 g_dir_close(dir); |
| 687 size_t size; |
687 size_t size; |
| 688 |
688 |
| 689 size = fread(buf, 1, sizeof(buf), fp); |
689 size = fread(buf, 1, sizeof(buf), fp); |
| 690 if (size != sizeof(buf) && !feof(fp)) |
690 if (size != sizeof(buf) && !feof(fp)) |
| 691 { |
691 { |
| 692 purple_debug_error("core", "Error reading %s: %s. Please report this at http://developer.pidgin.im\n", |
692 purple_debug_error("core", "Error reading %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", |
| 693 name, g_strerror(errno)); |
693 name, g_strerror(errno)); |
| 694 fclose(new_file); |
694 fclose(new_file); |
| 695 fclose(fp); |
695 fclose(fp); |
| 696 g_free(new_name); |
696 g_free(new_name); |
| 697 g_free(name); |
697 g_free(name); |
| 701 return FALSE; |
701 return FALSE; |
| 702 } |
702 } |
| 703 |
703 |
| 704 if (!fwrite(buf, size, 1, new_file) && ferror(new_file) != 0) |
704 if (!fwrite(buf, size, 1, new_file) && ferror(new_file) != 0) |
| 705 { |
705 { |
| 706 purple_debug_error("core", "Error writing %s: %s. Please report this at http://developer.pidgin.im\n", |
706 purple_debug_error("core", "Error writing %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", |
| 707 new_name, g_strerror(errno)); |
707 new_name, g_strerror(errno)); |
| 708 fclose(new_file); |
708 fclose(new_file); |
| 709 fclose(fp); |
709 fclose(fp); |
| 710 g_free(new_name); |
710 g_free(new_name); |
| 711 g_free(name); |
711 g_free(name); |
| 716 } |
716 } |
| 717 } |
717 } |
| 718 |
718 |
| 719 if (fclose(new_file)) |
719 if (fclose(new_file)) |
| 720 { |
720 { |
| 721 purple_debug_error("core", "Error writing: %s: %s. Please report this at http://developer.pidgin.im\n", |
721 purple_debug_error("core", "Error writing: %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", |
| 722 new_name, g_strerror(errno)); |
722 new_name, g_strerror(errno)); |
| 723 } |
723 } |
| 724 if (fclose(fp)) |
724 if (fclose(fp)) |
| 725 { |
725 { |
| 726 purple_debug_warning("core", "Error closing %s: %s\n", |
726 purple_debug_warning("core", "Error closing %s: %s\n", |
| 735 } |
735 } |
| 736 |
736 |
| 737 /* The migration was successful, so delete the status file. */ |
737 /* The migration was successful, so delete the status file. */ |
| 738 if (g_unlink(status_file)) |
738 if (g_unlink(status_file)) |
| 739 { |
739 { |
| 740 purple_debug_error("core", "Error unlinking file %s: %s. Please report this at http://developer.pidgin.im\n", |
740 purple_debug_error("core", "Error unlinking file %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n", |
| 741 status_file, g_strerror(errno)); |
741 status_file, g_strerror(errno)); |
| 742 g_free(status_file); |
742 g_free(status_file); |
| 743 return FALSE; |
743 return FALSE; |
| 744 } |
744 } |
| 745 |
745 |