Keep the original file mode when writing files.
authorTilman Sauerbeck <tilman@code-monkey.de>
Fri, 18 Aug 2006 18:10:41 +0000 (20:10 +0200)
committerTilman Sauerbeck <tilman@code-monkey.de>
Wed, 23 Aug 2006 17:39:15 +0000 (19:39 +0200)
ext/vcedit.c
test/test_main.rb

index 7976a066f4e5409fd5945617d6ec386fa4439cd2..414d6d060f31c0d98f6b3a4a12dfa18748e79904 100644 (file)
@@ -23,6 +23,8 @@
 #include <errno.h>
 #include <limits.h>
 #include <unistd.h>
 #include <errno.h>
 #include <limits.h>
 #include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 #include <ogg/ogg.h>
 #include <vorbis/codec.h>
 #include <assert.h>
 #include <ogg/ogg.h>
 #include <vorbis/codec.h>
 #include <assert.h>
@@ -41,6 +43,8 @@ struct vcedit_state_St {
        vorbis_info vi;
 
        FILE *in;
        vorbis_info vi;
 
        FILE *in;
+       mode_t file_mode;
+
        bool opened;
        long serial;
        unsigned char *mainbuf;
        bool opened;
        long serial;
        unsigned char *mainbuf;
@@ -265,6 +269,7 @@ vcedit_open (vcedit_state *s)
        ogg_packet *header;
        ogg_packet header_main, header_comments, header_codebooks;
        ogg_page og;
        ogg_packet *header;
        ogg_packet header_main, header_comments, header_codebooks;
        ogg_page og;
+       struct stat st;
        char *buffer;
        size_t bytes, total = 0;
        int i = 0;
        char *buffer;
        size_t bytes, total = 0;
        int i = 0;
@@ -273,6 +278,8 @@ vcedit_open (vcedit_state *s)
        if (!s->in)
                return VCEDIT_ERR_OPEN;
 
        if (!s->in)
                return VCEDIT_ERR_OPEN;
 
+       s->file_mode = stat (s->filename, &st) ? 0664 : st.st_mode;
+
        ogg_sync_init (&s->oy);
 
        do {
        ogg_sync_init (&s->oy);
 
        do {
@@ -560,6 +567,7 @@ cleanup:
                fclose (out);
                unlink (s->filename);
                rename (tmpfile, s->filename);
                fclose (out);
                unlink (s->filename);
                rename (tmpfile, s->filename);
+               chmod (s->filename, s->file_mode);
        }
 
        ogg_stream_clear (&streamout);
        }
 
        ogg_stream_clear (&streamout);
index 6355e7e9d23fca663d55283d059b51f427a71804..a4a14504d463f1bf3f91786fd7b28445b1f4c97b 100644 (file)
@@ -77,6 +77,16 @@ class MainTest < Test::Unit::TestCase
                end
        end
 
                end
        end
 
+       def test_write_keeps_file_mode
+               mode = File.stat(OGG_FILE).mode
+
+               Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
+                       t.write
+               end
+
+               assert_equal(mode, File.stat(OGG_FILE).mode)
+       end
+
        def test_append
                Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
                        t.comments["genre"] = "Death Metal"
        def test_append
                Ogg::Vorbis::Tagger.open(OGG_FILE) do |t|
                        t.comments["genre"] = "Death Metal"