From: Tilman Sauerbeck Date: Fri, 18 Aug 2006 18:10:41 +0000 (+0200) Subject: Keep the original file mode when writing files. X-Git-Tag: ruby-vorbistagger-0.0.1~7 X-Git-Url: http://git.code-monkey.de/?p=ruby-vorbistagger.git;a=commitdiff_plain;h=e04f6c2b90c9501fc613a130ee90863cc84f4a98 Keep the original file mode when writing files. --- diff --git a/ext/vcedit.c b/ext/vcedit.c index 7976a06..414d6d0 100644 --- a/ext/vcedit.c +++ b/ext/vcedit.c @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include #include #include @@ -41,6 +43,8 @@ struct vcedit_state_St { vorbis_info vi; FILE *in; + mode_t file_mode; + 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; + struct stat st; 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; + s->file_mode = stat (s->filename, &st) ? 0664 : st.st_mode; + ogg_sync_init (&s->oy); do { @@ -560,6 +567,7 @@ cleanup: fclose (out); unlink (s->filename); rename (tmpfile, s->filename); + chmod (s->filename, s->file_mode); } ogg_stream_clear (&streamout); diff --git a/test/test_main.rb b/test/test_main.rb index 6355e7e..a4a1450 100644 --- a/test/test_main.rb +++ b/test/test_main.rb @@ -77,6 +77,16 @@ class MainTest < Test::Unit::TestCase 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"