#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>
vorbis_info vi;
FILE *in;
+ mode_t file_mode;
+
bool opened;
long serial;
unsigned char *mainbuf;
}
static int
-_commentheader_out (vorbis_comment *vc, char *vendor, ogg_packet *op)
+_commentheader_out (vcedit_state *s, ogg_packet *op)
{
- int i;
-
oggpack_buffer opb;
+ size_t len;
+ int i;
oggpack_writeinit (&opb);
_v_writestring (&opb, "vorbis", 6);
/* vendor */
- oggpack_write (&opb, strlen (vendor), 32);
- _v_writestring (&opb, vendor, strlen (vendor));
+ len = strlen (s->vendor);
+ oggpack_write (&opb, len, 32);
+ _v_writestring (&opb, s->vendor, len);
/* comments */
- oggpack_write (&opb, vc->comments, 32);
+ oggpack_write (&opb, s->vc.comments, 32);
- for (i = 0; i < vc->comments; i++) {
- if (!vc->user_comments[i])
+ for (i = 0; i < s->vc.comments; i++) {
+ if (!s->vc.user_comments[i])
oggpack_write (&opb, 0, 32);
else {
- oggpack_write (&opb, vc->comment_lengths[i], 32);
- _v_writestring (&opb, vc->user_comments[i],
- vc->comment_lengths[i]);
+ oggpack_write (&opb, s->vc.comment_lengths[i], 32);
+ _v_writestring (&opb, s->vc.user_comments[i],
+ s->vc.comment_lengths[i]);
}
}
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;
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_stream_init (&streamout, s->serial);
- _commentheader_out (&s->vc, s->vendor, &header_comments);
+ _commentheader_out (s, &header_comments);
ogg_stream_packetin (&streamout, &header_main);
ogg_stream_packetin (&streamout, &header_comments);
fclose (out);
unlink (s->filename);
rename (tmpfile, s->filename);
+ chmod (s->filename, s->file_mode);
}
ogg_stream_clear (&streamout);