Linux support, woo

pull/2/head
Dave Vasilevsky 15 years ago
parent 32c959ccd1
commit 67541dc95d

@ -1,6 +1,13 @@
#LDFLAGS = -Llibs -search_paths_first -g -Wall
LDFLAGS = -L/Library/Fink/sl64/lib -search_paths_first -g -Wall
CFLAGS = -I/Library/Fink/sl64/include -g -O0 -std=c99 -Wall
ifneq ($(shell gcc -v 2>&1 | grep 'Apple Inc'),)
APPLE=1
endif
LIBPREFIX = /Library/Fink/sl64
LDFLAGS = -L$(LIBPREFIX)/lib -g -Wall
ifdef APPLE
LDFLAGS += -search_paths_first
endif
CFLAGS = -I$(LIBPREFIX)/include -g -O0 -std=c99 -Wall -Wno-unknown-pragmas
CC = gcc $(CFLAGS) -c -o
LD = gcc $(LDFLAGS) -o
@ -12,13 +19,13 @@ all: $(PROGS)
%.o: %.c pixz.h
$(CC) $@ $<
list: list.o common.o
list: list.o common.o endian.o
$(LD) $@ $^ -llzma
write: write.o common.o
write: write.o common.o endian.o
$(LD) $@ $^ -larchive -llzma
read: read.o common.o
read: read.o common.o endian.o
$(LD) $@ $^ -llzma
clean:

@ -2,8 +2,6 @@
#include <stdarg.h>
#include <libkern/OSByteOrder.h>
#pragma mark TYPES
@ -50,9 +48,19 @@ void die(const char *fmt, ...) {
exit(1);
}
char *xstrdup(const char *s) {
if (!s)
return NULL;
size_t len = strlen(s);
char *r = malloc(len + 1);
if (!r)
return NULL;
return memcpy(r, s, len + 1);
}
void dump_file_index(void) {
for (file_index_t *f = gFileIndex; f != NULL; f = f->next) {
fprintf(stderr, "%10llx %s\n", f->offset, f->name ? f->name : "");
fprintf(stderr, "%10"PRIuMAX" %s\n", (uintmax_t)f->offset, f->name ? f->name : "");
}
}
@ -83,8 +91,8 @@ void read_file_index(void) {
break;
file_index_t *f = malloc(sizeof(file_index_t));
f->name = strlen(name) ? strdup(name) : NULL;
f->offset = OSReadLittleInt64(gFileIndexBuf, gFIBPos);
f->name = strlen(name) ? xstrdup(name) : NULL;
f->offset = xle64dec(gFileIndexBuf + gFIBPos);
gFIBPos += sizeof(uint64_t);
if (gLastFile) {

@ -0,0 +1,29 @@
#ifdef __APPLE__
#include <libkern/OSByteOrder.h>
uint64_t xle64dec(const uint8_t *d) {
return OSReadLittleInt64(d, 0);
}
void xle64enc(uint8_t *d, uint64_t n) {
OSWriteLittleInt64(d, 0, n);
}
#elif defined(__linux__)
#define _BSD_SOURCE
#include <stdint.h>
#include <endian.h>
uint64_t xle64dec(const uint8_t *d) {
return le64toh(*(uint64_t*)d);
}
void xle64enc(uint8_t *d, uint64_t n) {
*(uint64_t*)d = htole64(n);
}
#endif

@ -1,6 +1,6 @@
#include "pixz.h"
#include <unistd.h>
#include <getopt.h>
#pragma mark FUNCTION DEFINITIONS
@ -29,8 +29,8 @@ int main(int argc, char **argv) {
decode_index();
lzma_index_record rec;
while (!lzma_index_read(gIndex, &rec)) {
fprintf(stderr, "%9llu / %9llu\n", rec.unpadded_size,
rec.uncompressed_size);
fprintf(stderr, "%9"PRIuMAX" / %9"PRIuMAX"\n", (uintmax_t)rec.unpadded_size,
(uintmax_t)rec.uncompressed_size);
}
if (tar) {

@ -1,9 +1,12 @@
#include <lzma.h>
#define __USE_LARGEFILE 1
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <pthread.h>
@ -54,6 +57,10 @@ extern file_index_t *gFileIndex, *gLastFile;
#pragma mark FUNCTION DECLARATIONS
void die(const char *fmt, ...);
char *xstrdup(const char *s);
uint64_t xle64dec(const uint8_t *d);
void xle64enc(uint8_t *d, uint64_t n);
void decode_index(void);
void *decode_block_start(off_t block_seek);

97
tar.c

@ -1,97 +0,0 @@
#include "pixz.h"
#include <archive.h>
#include <archive_entry.h>
#include <sys/errno.h>
#define CHUNKSIZE 4096
#define INDEXFILE "index.xz"
typedef struct {
FILE *file;
uint8_t buf[CHUNKSIZE];
} pixz_tar;
static int pixz_tar_open(struct archive *a, void *refp);
static int pixz_tar_close(struct archive *a, void *refp);
static ssize_t pixz_tar_read(struct archive *a, void *refp, const void **buf);
#include <string.h>
int main(void) {
pixz_index *index = pixz_index_new();
struct archive *a = archive_read_new();
archive_read_support_compression_none(a);
archive_read_support_format_tar(a);
FILE *infile = stdin;
pixz_tar input = { .file = infile };
if (archive_read_open(a, &input, pixz_tar_open, pixz_tar_read,
pixz_tar_close) != ARCHIVE_OK)
pixz_die("Can't open archive\n");
while (1) {
struct archive_entry *entry;
int aerr = archive_read_next_header(a, &entry);
if (aerr == ARCHIVE_EOF) {
pixz_index_finish(index, ftello(stdin));
break;
} else if (aerr != ARCHIVE_OK && aerr != ARCHIVE_WARN) {
// libarchive warns for silly things like failure to convert
// names into multibyte strings
pixz_die("Error reading header: %s\n", archive_error_string(a));
}
const char *name = archive_entry_pathname(entry);
size_t offset = archive_read_header_position(a);
pixz_index_add(index, offset, name);
if (archive_read_data_skip(a) != ARCHIVE_OK)
pixz_die("Error skipping data\n");
}
if (archive_read_finish(a) != ARCHIVE_OK)
pixz_die("Error finishing read\n");
FILE *ifile = fopen(INDEXFILE, "w+");
if (!ifile)
pixz_die("Can't open index file\n");
pixz_encode_options *opts = pixz_encode_options_new();
pixz_encode_options_default(opts);
pixz_index_write(index, ifile, opts);
pixz_index_free(index);
lzma_check check = opts->check;
pixz_encode_options_free(opts);
fseek(ifile, 0, SEEK_SET);
pixz_index *i2;
pixz_index_read_in_place(&i2, ifile, check);
fclose(ifile);
pixz_index_dump(i2, stdout);
pixz_index_free(i2);
return 0;
}
static int pixz_tar_open(struct archive *a, void *refp) {
return ARCHIVE_OK;
}
static int pixz_tar_close(struct archive *a, void *refp) {
fclose(((pixz_tar*)refp)->file);
return ARCHIVE_OK;
}
static ssize_t pixz_tar_read(struct archive *a, void *refp, const void **buf) {
pixz_tar *input = (pixz_tar*)refp;
size_t rd = fread(input->buf, 1, CHUNKSIZE, input->file);
if (ferror(input->file)) {
archive_set_error(a, errno, "Read error");
return -1;
}
*buf = input->buf;
return rd;
}

@ -3,8 +3,6 @@
#include <archive.h>
#include <archive_entry.h>
#include <libkern/OSByteOrder.h>
#pragma mark DEFINES
@ -243,7 +241,7 @@ static void add_file(off_t offset, const char *name) {
file_index_t *f = malloc(sizeof(file_index_t));
f->offset = gMultiHeader ? gMultiHeaderStart : offset;
gMultiHeader = false;
f->name = name ? strdup(name) : NULL;
f->name = name ? xstrdup(name) : NULL;
f->next = NULL;
if (gLastFile) {
@ -377,7 +375,7 @@ static void write_file_index(void) {
char *name = f->name ? f->name : "";
size_t len = strlen(name);
write_file_index_bytes(len + 1, (uint8_t*)name);
OSWriteLittleInt64(offbuf, 0, f->offset);
xle64enc(offbuf, f->offset);
write_file_index_bytes(sizeof(offbuf), offbuf);
}
write_file_index_buf(LZMA_FINISH);

Loading…
Cancel
Save