static void backupcopy_document_save_cb(GObject *obj, GeanyDocument *doc, gpointer user_data) { FILE *src, *dst; gchar *locale_filename_src; gchar *locale_filename_dst; gchar *basename_src; gchar *dir_parts_src; gchar *stamp; gchar buf[512]; if (! enable_backupcopy) return; locale_filename_src = utils_get_locale_from_utf8(doc->file_name); if ((src = g_fopen(locale_filename_src, "r")) == NULL) { /* it's unlikely that this happens */ ui_set_statusbar(FALSE, _("Backup Copy: File could not be read (%s)."), g_strerror(errno)); g_free(locale_filename_src); return; } stamp = utils_get_date_time(backupcopy_time_fmt, NULL); basename_src = g_path_get_basename(locale_filename_src); dir_parts_src = backupcopy_create_dir_parts(locale_filename_src); locale_filename_dst = g_strconcat( backupcopy_backup_dir, G_DIR_SEPARATOR_S, dir_parts_src, G_DIR_SEPARATOR_S, basename_src, ".", stamp, NULL); g_free(basename_src); g_free(dir_parts_src); if ((dst = g_fopen(locale_filename_dst, "wb")) == NULL) { ui_set_statusbar(FALSE, _("Backup Copy: File could not be saved (%s)."), g_strerror(errno)); g_free(locale_filename_src); g_free(locale_filename_dst); g_free(stamp); fclose(src); return; } while (fgets(buf, sizeof(buf), src) != NULL) { fputs(buf, dst); } fclose(src); fclose(dst); g_free(locale_filename_src); g_free(locale_filename_dst); g_free(stamp); }
static void backupcopy_document_save_cb(GObject *obj, GeanyDocument *doc, gpointer user_data) { FILE *src, *dst; gchar *locale_filename_src; gchar *locale_filename_dst; gchar *basename_src; gchar *dir_parts_src; gchar *stamp; gchar buf[512]; gint fd_dst = -1; if (! enable_backupcopy) return; locale_filename_src = utils_get_locale_from_utf8(doc->file_name); if ((src = g_fopen(locale_filename_src, "r")) == NULL) { /* it's unlikely that this happens */ ui_set_statusbar(FALSE, _("Backup Copy: File could not be read (%s)."), g_strerror(errno)); g_free(locale_filename_src); return; } stamp = utils_get_date_time(backupcopy_time_fmt, NULL); basename_src = g_path_get_basename(locale_filename_src); dir_parts_src = backupcopy_create_dir_parts(locale_filename_src); locale_filename_dst = g_strconcat( backupcopy_backup_dir, G_DIR_SEPARATOR_S, dir_parts_src, G_DIR_SEPARATOR_S, basename_src, ".", stamp, NULL); g_free(basename_src); g_free(dir_parts_src); #ifdef G_OS_WIN32 if ((dst = g_fopen(locale_filename_dst, "wb")) == NULL) #else /* Use g_open() on non-Windows to set file permissions to 600 atomically. * On Windows, seting file permissions would require specific Windows API. */ fd_dst = g_open(locale_filename_dst, O_CREAT | O_WRONLY, S_IWUSR | S_IRUSR); if (fd_dst == -1 || (dst = fdopen(fd_dst, "w")) == NULL) #endif { ui_set_statusbar(FALSE, _("Backup Copy: File could not be saved (%s)."), g_strerror(errno)); g_free(locale_filename_src); g_free(locale_filename_dst); g_free(stamp); fclose(src); if (fd_dst != -1) close(fd_dst); return; } while (fgets(buf, sizeof(buf), src) != NULL) { fputs(buf, dst); } fclose(src); fclose(dst); if (fd_dst != -1) close(fd_dst); g_free(locale_filename_src); g_free(locale_filename_dst); g_free(stamp); }