summaryrefslogtreecommitdiffstats
path: root/media-libs/libid3tag/files/0.15.1b/libid3tag-0.15.1b-file-write.patch
blob: aa61d09f87482058b455006f8d55e9ddb4bca15d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
diff -ur -x '*.lo' -x '*.o' -x config.h -x config.log libid3tag-0.15.1b/file.c libid3tag-0.15.1b-fixed/file.c
--- libid3tag-0.15.1b/file.c	2004-01-23 12:41:32.000000000 +0300
+++ libid3tag-0.15.1b-fixed/file.c	2005-05-24 23:34:08.000000000 +0400
@@ -37,6 +37,10 @@
 #  include <assert.h>
 # endif
 
+# ifdef HAVE_SYS_STAT_H
+#  include <sys/stat.h>
+# endif
+
 # include "id3tag.h"
 # include "file.h"
 # include "tag.h"
@@ -575,6 +579,10 @@
 int v2_write(struct id3_file *file,
 	     id3_byte_t const *data, id3_length_t length)
 {
+  struct stat st;
+  char *buffer;
+  id3_length_t datalen, offset;
+  
   assert(!data || length > 0);
 
   if (data &&
@@ -592,9 +600,25 @@
   }
 
   /* hard general case: rewrite entire file */
+  if (stat(file->path, &st) == -1)
+    return -1;
 
-  /* ... */
+  offset = file->tags ? file->tags[0].length : 0;
+  datalen = st.st_size - offset;
+  if ((buffer = (char *) malloc(datalen)) == NULL)
+    return -1;
 
+  if (fseek(file->iofile, offset, SEEK_SET) == -1 ||
+      fread(buffer, datalen, 1, file->iofile) != 1 ||
+      fseek(file->iofile, 0, SEEK_SET) == -1 ||
+      fwrite(data, length, 1, file->iofile) != 1 ||
+      fwrite(buffer, datalen, 1, file->iofile) != 1 ||
+      fflush(file->iofile) == EOF) {
+    free(buffer);
+    return -1;
+  }
+  free(buffer);
+  
  done:
   return 0;
 }