summaryrefslogtreecommitdiff
path: root/sysutils/deltup/files/patch-deltup.cpp
blob: 60a2d159558308a2ef45ff7b2a2080c18c52cd03 (plain) (blame)
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
--- deltup.cpp.orig	2007-07-13 07:22:20.000000000 +0400
+++ deltup.cpp	2013-10-06 17:15:15.000000000 +0400
@@ -16,7 +16,7 @@
 //#include <sys/wait.h>
 //#include <unistd.h> 
 //#include <sys/signal.h>
-//#include <stdlib.h>
+#include <stdlib.h>
 //#include <string.h>
 //#include <stdio.h>
 //#include <stdarg.h>
@@ -32,6 +32,7 @@
 #include "filetypes.h"
 #include "system.h"
 #include "bzip2.h"
+#include "gzip.h"
 
 bool force_overwrite = false, remove_intermediate = false,
      info_mode = false, ensure_md5sum = false, use_bdelta = false;
@@ -150,28 +151,33 @@
 
 void gzip_without_header(string in, string out, char compression) {
   string tempfile = getTmpFilename();
-  
-  deflate("gzip", in, tempfile, compression, false);
+  find_gzip_compressor();
+  if (gzip_name != NULL) {
+    deflate(gzip_name, in, tempfile, compression, false);
 //  printf("here2 %s %s %c\n", in.c_str(), tempfile.c_str(), compression);
-  unsigned filesize = getLenOfFile(tempfile);
-  char inbuf[12];
-  IFStream *f = new IFStream(tempfile);
-  f->read(inbuf, 10);
-  char flags = inbuf[3];
-  
-  if (flags & 2) f->read(inbuf, 2);
-  if (flags & 4) {
-    unsigned extrafieldsize = read_word(*f);
-    while (extrafieldsize) 
-      extrafieldsize -= f->read(inbuf, extrafieldsize<10?extrafieldsize:10);
-  }
-  if (flags & 8) do f->read(inbuf, 1); while (*inbuf);
-  if (flags & 16) do f->read(inbuf, 1); while (*inbuf);
-  if (flags & 32) f->read(inbuf, 2);
-  
-  OFStream o(out);
-  copy_bytes_to_file(*f, o, filesize-f->loc());
-  delete f;
+    unsigned filesize = getLenOfFile(tempfile);
+    char inbuf[12];
+    IFStream *f = new IFStream(tempfile);
+    f->read(inbuf, 10);
+    char flags = inbuf[3];
+  
+    if (flags & 2) f->read(inbuf, 2);
+    if (flags & 4) {
+       unsigned extrafieldsize = read_word(*f);
+       while (extrafieldsize) 
+         extrafieldsize -= f->read(inbuf, extrafieldsize<10?extrafieldsize:10);
+    }
+    if (flags & 8) do f->read(inbuf, 1); while (*inbuf);
+    if (flags & 16) do f->read(inbuf, 1); while (*inbuf);
+    if (flags & 32) f->read(inbuf, 2);
+  
+    OFStream o(out);
+    copy_bytes_to_file(*f, o, filesize-f->loc());
+    delete f;
+    gzip_found = 1;
+  } else {
+    gzip_found = 0;
+  }
   doneTmpFile(tempfile);
 
 }
@@ -245,12 +251,16 @@
     string gzip_temp = getTmpFilename();
     const char *lev = "968712534";
     do {
-      printf("here %c\n", *lev);
       gzip_without_header(file2.uname, gzip_temp, *lev);
+      if (gzip_found == 0) { break; 
+//      } else {
+//         printf("here %c\n", *lev);
+      }
       makeDelta(use_bdelta, gzip_temp, file2.fullname(), pristineName);
       ++lev;
     } while (*lev && getLenOfFile(pristineName)>1024);
-    if (!*lev) error("Unknown gzip compression format");
+    if (gzip_found == 0) { error("Can't find GNU gzip");
+    } else if (!*lev) { error("Unknown gzip compression format"); }
     compression_level=*(lev-1)-'0';
     doneTmpFile(gzip_temp);
   } else if (file2.type==BZIP2) {
@@ -365,7 +375,10 @@
 	                    bzip2_name[i]);
       } else fprintf(stderr, "Error: Deltup cannot find the proper bzip2 to rebuild the package\n");
       break;
-    case GZIP: gzip_without_header(f.uname, finalName, c); break;
+    case GZIP: 
+      gzip_without_header(f.uname, finalName, c); 
+      if (gzip_found == 0) error("Can't find GNU gzip");
+      break;
     case UNKNOWN_FMT: cat(f.uname, finalName, false);
     
   };
@@ -520,14 +533,14 @@
   IStream *f = new IFStream(fname);
   Injectable_IStream f2(*f);
   if (((IFStream*)f)->bad()) {
-    fprintf(stderr, "file is missing: %s\n", fname.c_str()); return;}
+    fprintf(stderr, "file is missing: %s\n", fname.c_str()); exit(1);}
   unsigned type = determine_filetype(f2);
   delete f;
   switch (type) {
     case GZIP: f = new GZ_IFStream(fname); break;
     case BZIP2: f = new BZ_IFStream(fname); break;
     case DTU: f = new IFStream(fname); break;
-    case UNKNOWN_FMT: fprintf(stderr, "cannot read file %s\n", fname.c_str()); return;
+    case UNKNOWN_FMT: fprintf(stderr, "cannot read file %s\n", fname.c_str()); exit(1);
     case TARBALL :
       f = new IFStream(fname);
       unsigned zero_count;