--- /dev/null
+/*
+ * add a file/files to an sqlite db
+ * in the 'files' table.
+ */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include <sys/mman.h>
+
+#include "lzma.h"
+
+#include "sha256.h"
+
+void *compresslzma(void *buf, size_t bufsize, size_t *len) {
+ /* xz compress it */
+ size_t outsize;
+ void *outbuf;
+ size_t outlen = 0;
+
+ outsize = lzma_stream_buffer_bound(bufsize);
+ outbuf = malloc(outsize);
+ /* TODO adjust encoding level for size */
+ lzma_easy_buffer_encode(6, LZMA_CHECK_CRC64, NULL,
+ buf, bufsize,
+ outbuf, &outlen, outsize
+ );
+ *len = outlen;
+ return outbuf;
+}
+
+int main(int ac, char **av){
+ int i, j;
+
+ /* insert each file */
+ for (i = 1; i < ac; i++) {
+ int fd;
+ void *content;
+ struct stat sbuf;
+ unsigned char tmp[32];
+ char hash[65]; /* hash in hex */
+ hash_state md;
+
+ fd = open(av[i], O_RDONLY);
+ if (fd == -1) {
+ exit(1);
+ }
+ if (fstat(fd, &sbuf) == -1) {
+ exit(1);
+ }
+ /* not a regular file? */
+ if (!S_ISREG(sbuf.st_mode)) {
+ exit(1);
+ }
+
+ content = mmap(0, sbuf.st_size, PROT_READ,MAP_PRIVATE, fd, 0);
+ if (!content) {
+ exit(2);
+ }
+
+ sha256_init(&md);
+ sha256_process(&md, content, sbuf.st_size);
+ sha256_done(&md, tmp);
+ for (j=0;j<32;j++) {
+ sprintf(hash+j*2, "%02x", (unsigned)tmp[j]);
+ }
+ hash[64] = 0;
+ fprintf(stderr, "file %s: %s\n", av[i], hash);
+
+ /* xz compress it */
+ size_t outlen = 0;
+ FILE *save;
+ void *outbuf;
+
+ outbuf = compresslzma(content, sbuf.st_size, &outlen);
+ save = fopen("foo.xz", "w");
+ fwrite(outbuf, outlen, 1, save);
+ fclose(save);
+ free(outbuf);
+
+ //Find out the maximum size of the compressed output for single-call compression:
+// zlib: compressBound()
+// liblzma: lzma_stream_buffer_bound()
+
+// Compressing:
+//zlib: compress() or compress2()
+ // liblzma: lzma_easy_buffer_encode() or lzma_stream_buffer_encode()
+
+ // Decompressing:
+//zlib: uncompress()
+ // liblzma: lzma_stream_buffer_decode()
+
+ // See container.h (src/liblzma/api/lzma/container.h in the source tree) for details how to use these functions.
+
+ /* either way we're done with this now */
+ munmap(content, sbuf.st_size);
+ }
+ return 0;
+}