7 #include <glib-2.0/glib.h>
10 #define BUFFER_SIZE BLOCK_SIZE*32
11 #define ASCII_NR(NR) (NR + 0x30)
13 typedef struct _TarHeader
36 typedef enum _RecordType
39 ARCHLINK = ASCII_NR (1),
40 SYMLINK = ASCII_NR (2),
41 CHARDEV = ASCII_NR (3),
42 BLOCKDEV = ASCII_NR (4),
45 RESERVED = ASCII_NR (7)
48 static gint unpack_file_contents(BZFILE *bz2_file,
53 static gint unpack_file_contents(BZFILE *bz2_file,
64 file_out = fopen(out_name, "w");
66 if (file_out == NULL) return -1;
68 sscanf(header->size, "%12lo", &length);
69 printf ("File size: %ld\n", length);
71 for (i=0; i < (length / BLOCK_SIZE); ++i)
73 buffer = (gchar*) g_try_malloc (BLOCK_SIZE * sizeof(gchar));
75 result = BZ2_bzRead ( &bzerror, bz2_file, buffer, BLOCK_SIZE *
78 fwrite (buffer, BLOCK_SIZE * sizeof(gchar), 1, file_out);
82 i = length % BLOCK_SIZE;
86 buffer = (gchar*) g_try_malloc (BLOCK_SIZE * sizeof(gchar));
90 printf ("Memory not allocated");
94 result = BZ2_bzRead(&bzerror, bz2_file, buffer,
95 BLOCK_SIZE * sizeof(gchar));
99 fwrite (buffer, i * sizeof(gchar), 1, file_out);
104 printf ("bzerror = %d", bzerror);
117 gint decompress_file (gchar *in_file, gchar *out_path)
125 header = (TarHeader*) g_try_malloc (BLOCK_SIZE * sizeof(gchar));
127 if (header == NULL) printf ("\nCould not allocate memory\n");
129 file = fopen (in_file, "rb");
134 bz2_file = BZ2_bzReadOpen (&bzerror, file, 0, 0, NULL, 0);
136 if ( bzerror != BZ_OK )
138 BZ2_bzReadClose ( &bzerror, bz2_file );
139 printf ("There was an error while reading the compressed file\n");
146 result = BZ2_bzRead ( &bzerror, bz2_file, header,
147 BLOCK_SIZE * sizeof (char));
149 // printf ("Jestem\n");
151 if ( bzerror == BZ_OK )
153 if (strlen (header->name) == 0)
155 printf ("\nFilename length is 0, exitting\n");
159 printf ("Name: %s\n", header->name);
160 printf ("Prefix: %s\n", header->prefix);
163 gchar *temp = g_strconcat (out_path,
166 switch (header->typeflag)
170 unpack_file_contents (bz2_file,
176 printf ("Dir %s\n", temp);
177 if (mkdir (temp, S_IRUSR|
178 S_IWUSR|S_IXUSR) != 0)
180 printf ("Couldn't create directory %s",
188 printf ("Only files and dirs can be unpacked");
195 else if ( bzerror != BZ_STREAM_END )
197 printf ("\nBZ2 READ_CLOSE(stream end) %d\n", bzerror);
198 BZ2_bzReadClose ( &bzerror, bz2_file );
204 printf ("\nExitting, error nr %d\n", bzerror);
205 BZ2_bzReadClose ( &bzerror, bz2_file );
214 printf ("There was an error while trying to read the archive file");