get rid of hard libbz2 dependency
authornotaz <notasas@gmail.com>
Fri, 23 Sep 2011 17:51:07 +0000 (20:51 +0300)
committernotaz <notasas@gmail.com>
Fri, 23 Sep 2011 17:51:07 +0000 (20:51 +0300)
it just keeps getting in my way when trying to run this elsewhere.

Makefile
plugins/cdrcimg/cdrcimg.c

index 5a7b278..fa1f673 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -16,7 +16,7 @@ TARGET = pcsx
 ARCH = $(shell $(CC) -v 2>&1 | grep -i 'target:' | awk '{print $$2}' | awk -F '-' '{print $$1}')
 
 CFLAGS += -Wall -ggdb -Ifrontend -ffast-math
-LDFLAGS += -lz -lpthread -ldl -lpng -lbz2
+LDFLAGS += -lz -lpthread -ldl -lpng
 ifndef DEBUG
 CFLAGS += -O2 -DNDEBUG
 endif
index 32786f2..dd1cf57 100644 (file)
@@ -13,6 +13,7 @@
 #include <stdlib.h>
 #include <zlib.h>
 #include <bzlib.h>
+#include <dlfcn.h>
 
 #include "cdrcimg.h"
 
@@ -34,6 +35,9 @@ static unsigned int  cd_sectors_per_blk;
 static int cd_compression;
 static FILE *cd_file;
 
+static int (*pBZ2_bzBuffToBuffDecompress)(char *dest, unsigned int *destLen, char *source,
+               unsigned int sourceLen, int small, int verbosity);
+
 static struct {
        unsigned char raw[16][CD_FRAMESIZE_RAW];
        unsigned char compressed[CD_FRAMESIZE_RAW * 16 + 100];
@@ -193,7 +197,7 @@ static long CDRreadTrack(unsigned char *time)
                ret = uncompress2(cdbuffer->raw[0], &cdbuffer_size, cdbuffer->compressed, size);
                break;
        case CDRC_BZ:
-               ret = BZ2_bzBuffToBuffDecompress((char *)cdbuffer->raw, (unsigned int *)&cdbuffer_size,
+               ret = pBZ2_bzBuffToBuffDecompress((char *)cdbuffer->raw, (unsigned int *)&cdbuffer_size,
                        (char *)cdbuffer->compressed, size, 0, 0);
                break;
        default:
@@ -276,6 +280,18 @@ static long CDRinit(void)
                        return -1;
                }
        }
+       if (pBZ2_bzBuffToBuffDecompress == NULL) {
+               void *h = dlopen("/usr/lib/libbz2.so.1", RTLD_LAZY);
+               if (h == NULL)
+                       h = dlopen("./lib/libbz2.so.1", RTLD_LAZY);
+               if (h != NULL) {
+                       pBZ2_bzBuffToBuffDecompress = dlsym(h, "BZ2_bzBuffToBuffDecompress");
+                       if (pBZ2_bzBuffToBuffDecompress == NULL) {
+                               err("dlsym bz2: %s", dlerror());
+                               dlclose(h);
+                       }
+               }
+       }
        return 0;
 }
 
@@ -422,6 +438,10 @@ static long CDRopen(void)
                snprintf(table_fname, sizeof(table_fname), "%s.table", cd_fname);
        }
        else if (strcasecmp(ext, ".bz") == 0) {
+               if (pBZ2_bzBuffToBuffDecompress == NULL) {
+                       err("libbz2 unavailable for .bz2 handling\n");
+                       return -1;
+               }
                cd_compression = CDRC_BZ;
                tabentry_size = sizeof(u.bztab_entry);
                snprintf(table_fname, sizeof(table_fname), "%s.index", cd_fname);