Mercurial > pidgin
comparison libpurple/util.c @ 19499:47a2d00ab060
propagate from branch 'im.pidgin.pidgin' (head 1ade185e4daf699979b517ddb70cee47cd15e7ee)
to branch 'im.pidgin.soc.2007.certmgr' (head 59d49a3a37747b811f234de6931e7c575bf885fb)
author | William Ehlhardt <williamehlhardt@gmail.com> |
---|---|
date | Tue, 28 Aug 2007 01:14:08 +0000 |
parents | cc36a5aac908 7589b218f89a |
children | 57d350900136 79d624f7c3ee 905891855710 |
comparison
equal
deleted
inserted
replaced
19481:8c00833b9959 | 19499:47a2d00ab060 |
---|---|
2540 */ | 2540 */ |
2541 gboolean | 2541 gboolean |
2542 purple_util_write_data_to_file(const char *filename, const char *data, gssize size) | 2542 purple_util_write_data_to_file(const char *filename, const char *data, gssize size) |
2543 { | 2543 { |
2544 const char *user_dir = purple_user_dir(); | 2544 const char *user_dir = purple_user_dir(); |
2545 gchar *filename_temp, *filename_full; | 2545 gchar *filename_full; |
2546 FILE *file; | 2546 gboolean ret = FALSE; |
2547 size_t real_size, byteswritten; | |
2548 struct stat st; | |
2549 | 2547 |
2550 g_return_val_if_fail(user_dir != NULL, FALSE); | 2548 g_return_val_if_fail(user_dir != NULL, FALSE); |
2551 | 2549 |
2552 purple_debug_info("util", "Writing file %s to directory %s\n", | 2550 purple_debug_info("util", "Writing file %s to directory %s\n", |
2553 filename, user_dir); | 2551 filename, user_dir); |
2562 return FALSE; | 2560 return FALSE; |
2563 } | 2561 } |
2564 } | 2562 } |
2565 | 2563 |
2566 filename_full = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", user_dir, filename); | 2564 filename_full = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", user_dir, filename); |
2565 | |
2566 ret = purple_util_write_data_to_file_absolute(filename_full, | |
2567 data,size); | |
2568 | |
2569 g_free(filename_full); | |
2570 return ret; | |
2571 } | |
2572 | |
2573 gboolean | |
2574 purple_util_write_data_to_file_absolute(const char *filename_full, const char *data, size_t size) | |
2575 { | |
2576 gchar *filename_temp; | |
2577 FILE *file; | |
2578 size_t real_size, byteswritten; | |
2579 struct stat st; | |
2580 | |
2581 purple_debug_info("util", "Writing file %s\n", | |
2582 filename_full); | |
2583 | |
2567 filename_temp = g_strdup_printf("%s.save", filename_full); | 2584 filename_temp = g_strdup_printf("%s.save", filename_full); |
2568 | 2585 |
2569 /* Remove an old temporary file, if one exists */ | 2586 /* Remove an old temporary file, if one exists */ |
2570 if (g_file_test(filename_temp, G_FILE_TEST_EXISTS)) | 2587 if (g_file_test(filename_temp, G_FILE_TEST_EXISTS)) |
2571 { | 2588 { |
2572 if (g_unlink(filename_temp) == -1) | 2589 if (g_unlink(filename_temp) == -1) |
2573 { | 2590 { |
2574 purple_debug_error("util", "Error removing old file %s: %s\n", | 2591 purple_debug_error("util", "Error removing old file " |
2575 filename_temp, strerror(errno)); | 2592 "%s: %s\n", |
2593 filename_temp, strerror(errno)); | |
2576 } | 2594 } |
2577 } | 2595 } |
2578 | 2596 |
2579 /* Open file */ | 2597 /* Open file */ |
2580 file = g_fopen(filename_temp, "wb"); | 2598 file = g_fopen(filename_temp, "wb"); |
2581 if (file == NULL) | 2599 if (file == NULL) |
2582 { | 2600 { |
2583 purple_debug_error("util", "Error opening file %s for writing: %s\n", | 2601 purple_debug_error("util", "Error opening file %s for " |
2584 filename_temp, strerror(errno)); | 2602 "writing: %s\n", |
2585 g_free(filename_full); | 2603 filename_temp, strerror(errno)); |
2586 g_free(filename_temp); | 2604 g_free(filename_temp); |
2587 return FALSE; | 2605 return FALSE; |
2588 } | 2606 } |
2589 | 2607 |
2590 /* Write to file */ | 2608 /* Write to file */ |
2593 | 2611 |
2594 /* Close file */ | 2612 /* Close file */ |
2595 if (fclose(file) != 0) | 2613 if (fclose(file) != 0) |
2596 { | 2614 { |
2597 purple_debug_error("util", "Error closing file %s: %s\n", | 2615 purple_debug_error("util", "Error closing file %s: %s\n", |
2598 filename_temp, strerror(errno)); | 2616 filename_temp, strerror(errno)); |
2599 g_free(filename_full); | |
2600 g_free(filename_temp); | 2617 g_free(filename_temp); |
2601 return FALSE; | 2618 return FALSE; |
2602 } | 2619 } |
2603 | 2620 |
2604 /* Ensure the file is the correct size */ | 2621 /* Ensure the file is the correct size */ |
2605 if (byteswritten != real_size) | 2622 if (byteswritten != real_size) |
2606 { | 2623 { |
2607 purple_debug_error("util", "Error writing to file %s: Wrote %" G_GSIZE_FORMAT " bytes " | 2624 purple_debug_error("util", "Error writing to file %s: Wrote %" |
2608 "but should have written %" G_GSIZE_FORMAT "; is your disk full?\n", | 2625 G_GSIZE_FORMAT " bytes " |
2609 filename_temp, byteswritten, real_size); | 2626 "but should have written %" G_GSIZE_FORMAT |
2610 g_free(filename_full); | 2627 "; is your disk full?\n", |
2628 filename_temp, byteswritten, real_size); | |
2611 g_free(filename_temp); | 2629 g_free(filename_temp); |
2612 return FALSE; | 2630 return FALSE; |
2613 } | 2631 } |
2614 /* Use stat to be absolutely sure. */ | 2632 /* Use stat to be absolutely sure. */ |
2615 if ((g_stat(filename_temp, &st) == -1) || (st.st_size != real_size)) | 2633 if ((g_stat(filename_temp, &st) == -1) || (st.st_size != real_size)) |
2616 { | 2634 { |
2617 purple_debug_error("util", "Error writing data to file %s: " | 2635 purple_debug_error("util", "Error writing data to file %s: " |
2618 "Incomplete file written; is your disk full?\n", | 2636 "Incomplete file written; is your disk " |
2619 filename_temp); | 2637 "full?\n", |
2620 g_free(filename_full); | 2638 filename_temp); |
2621 g_free(filename_temp); | 2639 g_free(filename_temp); |
2622 return FALSE; | 2640 return FALSE; |
2623 } | 2641 } |
2624 | 2642 |
2625 #ifndef _WIN32 | 2643 #ifndef _WIN32 |
2633 | 2651 |
2634 /* Rename to the REAL name */ | 2652 /* Rename to the REAL name */ |
2635 if (g_rename(filename_temp, filename_full) == -1) | 2653 if (g_rename(filename_temp, filename_full) == -1) |
2636 { | 2654 { |
2637 purple_debug_error("util", "Error renaming %s to %s: %s\n", | 2655 purple_debug_error("util", "Error renaming %s to %s: %s\n", |
2638 filename_temp, filename_full, strerror(errno)); | 2656 filename_temp, filename_full, |
2639 } | 2657 strerror(errno)); |
2640 | 2658 } |
2641 g_free(filename_full); | 2659 |
2642 g_free(filename_temp); | 2660 g_free(filename_temp); |
2643 | 2661 |
2644 return TRUE; | 2662 return TRUE; |
2645 } | 2663 } |
2646 | 2664 |