+ if (error) + *error = err; + Forse devi usare g_propagate_error, ma dal contesto non si capisce bene return ret; } @@ -513,6 +517,16 @@ save_existing_local_file (GeditDocumentS /* prepare the backup name */ backup_filename = get_backup_filename (saver); + if (backup_filename == NULL) + { + /* bad bad luck... */ + g_set_error (&saver->priv->error, + GEDIT_DOCUMENT_ERROR, + GNOME_VFS_ERROR_GENERIC, + gnome_vfs_result_to_string (GNOME_VFS_ERROR_GENERIC)); + + goto out; + } In quali casi backup_filename potrebbe essere NULL? Magari metti un warning con g_warning /* We now use two backup strategies. * The first one (which is faster) consist in saving to a @@ -636,58 +650,72 @@ save_existing_local_file (GeditDocumentS fallback_strategy: - /* move away old backups */ - if (!remove_file (backup_filename)) + /* try to copy the old contents in a backup for safety + * unless we are explicetely told not to. + */ + if ((saver->priv->flags & GEDIT_DOCUMENT_SAVE_IGNORE_BACKUP) == 0) { - GnomeVFSResult result = gnome_vfs_result_from_errno (); + /* move away old backups */ + if (!remove_file (backup_filename)) + { + /* we don't care about which was the problem, just + * that a backup was not possible. + */ + g_set_error (&saver->priv->error, + GEDIT_DOCUMENT_ERROR, + GEDIT_DOCUMENT_ERROR_CANT_CREATE_BACKUP, + "No backup created"); potrebbe essere interessante sapere il perchè non si è potuto creare il backup. Magari _abusa_ del campo testo per mettere il codice dell'errore. - g_set_error (&saver->priv->error, - GEDIT_DOCUMENT_ERROR, - result, - gnome_vfs_result_to_string (result)); + goto out; + } - goto out; - } + bfd = open (backup_filename, + O_WRONLY | O_CREAT | O_EXCL, + statbuf.st_mode & 0777); Sono sempre confuso da umask & C. In pratica con quali permessi è creato il file di backup (e dove?) Io direi che dovrebbe essere sola lettura per l'utente e niente per gli altri. - bfd = open (backup_filename, - O_WRONLY | O_CREAT | O_EXCL, - statbuf.st_mode & 0777); + if (bfd == -1) + { + g_set_error (&saver->priv->error, + GEDIT_DOCUMENT_ERROR, + GEDIT_DOCUMENT_ERROR_CANT_CREATE_BACKUP, + "No backup created"); Vedi sopra per codice errore. - if (bfd == -1) - { - GnomeVFSResult result = gnome_vfs_result_from_errno (); + goto out; + } - g_set_error (&saver->priv->error, - GEDIT_DOCUMENT_ERROR, - result, - gnome_vfs_result_to_string (result)); + /* Try to set the group of the backup same as the + * original file. If this fails, set the protection + * bits for the group same as the protection bits for + * others. */ Sei sicuro che sia "sicuro"? + if (fchown (bfd, (uid_t) -1, statbuf.st_gid) != 0) + { + if (fchmod (bfd, + (statbuf.st_mode& 0707) | + ((statbuf.st_mode & 07) << 3)) != 0) + { + g_set_error (&saver->priv->error, + GEDIT_DOCUMENT_ERROR, + GEDIT_DOCUMENT_ERROR_CANT_CREATE_BACKUP, + "No backup created"); Vedi sopra per codice errore. + if (!copy_file_data (saver->priv->fd, bfd, NULL)) { - GnomeVFSResult result = gnome_vfs_result_from_errno (); + g_set_error (&saver->priv->error, + GEDIT_DOCUMENT_ERROR, + GEDIT_DOCUMENT_ERROR_CANT_CREATE_BACKUP, + "No backup created"); Vedi sopra per codice errore. typedef enum { - GEDIT_DOCUMENT_SAVE_IGNORE_MTIME = 1 << 0, - GEDIT_DOCUMENT_SAVE_IGNORE_NOBACKUP = 1 << 1 + /* save file despite external modifications */ + GEDIT_DOCUMENT_SAVE_IGNORE_MTIME = 1 << 0, + + /* try to save anyway even if a prior backup was not possible */ You mean: Save without backup in any case. + GEDIT_DOCUMENT_SAVE_IGNORE_BACKUP = 1 << 1 } GeditDocumentSaveFlags; @@ -122,6 +125,7 @@ enum * for the error codes */ GEDIT_DOCUMENT_ERROR_EXTERNALLY_MODIFIED = GNOME_VFS_NUM_ERRORS, GEDIT_DOCUMENT_ERROR_NOT_REGULAR_FILE, + GEDIT_DOCUMENT_ERROR_CANT_CREATE_BACKUP, GEDIT_DOCUMENT_NUM_ERRORS };