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 7f8cf35fc99b
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