# HG changeset patch # User jcdutton # Date 1075658119 0 # Node ID 59b5753b09d7e55836cf6cdb169a74328a1333c3 # Parent b50d37567f61b0bc654e6ece9e493708b1610ac5 Add support for building under MINGW. diff -r b50d37567f61 -r 59b5753b09d7 dvdread/Makefile.am --- a/dvdread/Makefile.am Sun Feb 01 00:44:43 2004 +0000 +++ b/dvdread/Makefile.am Sun Feb 01 17:55:19 2004 +0000 @@ -7,7 +7,7 @@ noinst_LTLIBRARIES = libdvdread.la libdvdread_la_SOURCES = dvd_reader.c nav_read.c ifo_read.c \ - dvd_input.c dvd_udf.c md5.c nav_print.c ifo_print.c + dvd_input.c dvd_udf.c md5.c nav_print.c ifo_print.c libdvdread_la_LIBADD = $(DYNAMIC_LD_LIBS) diff -r b50d37567f61 -r 59b5753b09d7 dvdread/dlfcn.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dvdread/dlfcn.c Sun Feb 01 17:55:19 2004 +0000 @@ -0,0 +1,96 @@ +/* + * $Id$ + * $Name$ + * + * Adopted from Apache DSO code. + * Portions copyright Apache Software Foundation + * + * Structures and types used to implement dlopen, dlsym, etc. + * on Windows 95/NT. + */ +#include +#include +#include + +#include "dlfcn.h" + +void *dlopen(const char *module_name, int mode) +{ + UINT em; + HINSTANCE dsoh; + char path[MAX_PATH], *p; + /* Load the module... + * per PR2555, the LoadLibraryEx function is very picky about slashes. + * Debugging on NT 4 SP 6a reveals First Chance Exception within NTDLL. + * LoadLibrary in the MS PSDK also reveals that it -explicitly- states + * that backslashes must be used. + * + * Transpose '\' for '/' in the filename. + */ + (void)strncpy(path, module_name, MAX_PATH); + p = path; + while (p = strchr(p, '/')) + *p = '\\'; + + /* First assume the dso/dll's required by -this- dso are sitting in the + * same path or can be found in the usual places. Failing that, let's + * let that dso look in the apache root. + */ + em = SetErrorMode(SEM_FAILCRITICALERRORS); + dsoh = LoadLibraryEx(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); + if (!dsoh) + { + SetLastError(0); // clear the last error + dsoh = LoadLibraryEx(path, NULL, 0); + } + SetErrorMode(em); + SetLastError(0); // clear the last error + return (void *)dsoh; +} + +char *dlerror(void) +{ + int len, nErrorCode; + static char errstr[120]; + /* This is -not- threadsafe code, but it's about the best we can do. + * mostly a potential problem for isapi modules, since LoadModule + * errors are handled within a single config thread. + */ + + if((nErrorCode = GetLastError()) == 0) + return((char *)0); + + SetLastError(0); // clear the last error + len = snprintf(errstr, sizeof(errstr), "(%d) ", nErrorCode); + + len += FormatMessage( + FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + nErrorCode, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */ + (LPTSTR) errstr + len, + sizeof(errstr) - len, + NULL + ); + /* FormatMessage may have appended a newline (\r\n). So remove it + * and use ": " instead like the Unix errors. The error may also + * end with a . before the return - if so, trash it. + */ + if (len > 1 && errstr[len-2] == '\r' && errstr[len-1] == '\n') { + if (len > 2 && errstr[len-3] == '.') + len--; + errstr[len-2] = ':'; + errstr[len-1] = ' '; + } + return errstr; +} + +int dlclose(void *handle) +{ + return FreeLibrary(handle); +} + +void *dlsym(void *handle, const char *name) +{ + return GetProcAddress(handle, name); +} diff -r b50d37567f61 -r 59b5753b09d7 dvdread/dlfcn.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dvdread/dlfcn.h Sun Feb 01 17:55:19 2004 +0000 @@ -0,0 +1,23 @@ +#ifndef __DLFCN_H__ +# define __DLFCN_H__ +/* + * $Id$ + * $Name$ + * + * + */ +extern void *dlopen (const char *file, int mode); +extern int dlclose (void *handle); +extern void *dlsym (void * handle, const char * name); +extern char *dlerror (void); + +/* These don't mean anything on windows */ +#define RTLD_NEXT ((void *) -1l) +#define RTLD_DEFAULT ((void *) 0) +#define RTLD_LAZY -1 +#define RTLD_NOW -1 +#define RTLD_BINDING_MASK -1 +#define RTLD_NOLOAD -1 +#define RTLD_GLOBAL -1 + +#endif /* __DLFCN_H__ */ diff -r b50d37567f61 -r 59b5753b09d7 dvdread/dvd_input.c --- a/dvdread/dvd_input.c Sun Feb 01 00:44:43 2004 +0000 +++ b/dvdread/dvd_input.c Sun Feb 01 17:55:19 2004 +0000 @@ -24,13 +24,18 @@ #include #include +#ifdef HAVE_DLFCN_H #include +#else +/* Only needed on MINGW at the moment */ +#include "dlfcn.c" +#endif #include "dvd_reader.h" #include "dvd_input.h" -#ifndef _MSC_VER +#ifndef WIN32 #define LIBDVDCSS_NAME = "libdvdcss.so.2" #else #define LIBDVDCSS_NAME = "libdvdcss.dll" @@ -172,7 +177,7 @@ } /* Open the device */ -#ifndef _MSC_VER +#ifndef WIN32 dev->fd = open(target, O_RDONLY | O_EXCL); #else dev->fd = open(target, O_RDONLY | O_BINARY); @@ -290,7 +295,7 @@ #else /* dlopening libdvdcss */ -#ifndef _MSC_VER +#ifndef WIN32 dvdcss_library = dlopen("libdvdcss.so.2", RTLD_LAZY); #else dvdcss_library = dlopen("libdvdcss.dll", RTLD_LAZY); diff -r b50d37567f61 -r 59b5753b09d7 dvdread/dvd_reader.c --- a/dvdread/dvd_reader.c Sun Feb 01 00:44:43 2004 +0000 +++ b/dvdread/dvd_reader.c Sun Feb 01 17:55:19 2004 +0000 @@ -31,6 +31,22 @@ #include #include #include + +/* misc win32 helpers */ +#ifdef WIN32 +/* replacement gettimeofday implementation */ +#include +static inline int gettimeofday( struct timeval *tv, void *tz ) +{ + struct timeb t; + ftime( &t ); + tv->tv_sec = t.time; + tv->tv_usec = t.millitm * 1000; + return 0; +} +#include /* read() */ +#define lseek64 _lseeki64 +#endif #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__bsdi__)|| defined(__DARWIN__) #define SYS_BSD 1 @@ -51,10 +67,6 @@ #define DEFAULT_UDF_CACHE_LEVEL 1 -#ifdef _MSC_VER -#define fchdir chdir -#endif - struct dvd_reader_s { /* Basic information. */ int isImageFile; @@ -386,6 +398,9 @@ return 0; } +#ifndef WIN32 /* don't have fchdir, and getcwd( NULL, ... ) is strange */ + /* Also WIN32 does not have symlinks, so we don't need this bit of code. */ + /* Resolve any symlinks and get the absolut dir name. */ { char *new_path; @@ -402,7 +417,7 @@ } } } - +#endif /** * If we're being asked to open a directory, check if that directory * is the mountpoint for a DVD-ROM which we can use instead. diff -r b50d37567f61 -r 59b5753b09d7 dvdread/dvd_reader.h --- a/dvdread/dvd_reader.h Sun Feb 01 00:44:43 2004 +0000 +++ b/dvdread/dvd_reader.h Sun Feb 01 17:55:19 2004 +0000 @@ -29,6 +29,7 @@ #endif #include +#include /** * The DVD access interface. diff -r b50d37567f61 -r 59b5753b09d7 dvdread/dvd_udf.c --- a/dvdread/dvd_udf.c Sun Feb 01 00:44:43 2004 +0000 +++ b/dvdread/dvd_udf.c Sun Feb 01 17:55:19 2004 +0000 @@ -34,10 +34,6 @@ #include #include -#ifndef _MSC_VER -#include -#endif /* _MSC_VER */ - #include #include #include