diff -buNr configure.ac.org configure.ac --- configure.ac.org 2008-08-29 11:59:00.000000000 +0900 +++ configure.ac 2008-09-29 23:39:56.000000000 +0900 @@ -38,6 +38,10 @@ xbeos*) AC_DEFINE(SYS_BEOS, 1, Have a BeOS system.) ;; + xos2*) + LDFLAGS="-Zbin-files" + AC_DEFINE(SYS_OS2, 1, Have a OS/2 system.) + ;; x*msvc*) SYS_MSVC=1 ;; diff -buNr src/device.c.org src/device.c --- src/device.c.org 2008-07-13 05:25:34.000000000 +0900 +++ src/device.c 2009-02-01 22:53:58.000000000 +0900 @@ -65,6 +65,12 @@ # include #endif +#ifdef SYS_OS2 +# define INCL_DOS +# define INCL_DOSDEVIOCTL +# include +#endif + #include "dvdcss/dvdcss.h" #include "common.h" @@ -91,6 +97,12 @@ static int win_readv ( dvdcss_t, struct iovec *, int ); static int aspi_read_internal ( int, void *, int ); +#elif defined( SYS_OS2 ) +static int os2_open ( dvdcss_t, char const * ); +/* just use macros for libc */ +# define os2_seek libc_seek +# define os2_read libc_read +# define os2_readv libc_readv #endif int _dvdcss_use_ioctls( dvdcss_t dvdcss ) @@ -110,6 +122,16 @@ { return 1; } +#elif defined( SYS_OS2 ) + ULONG ulMode; + + if( DosQueryFHState( dvdcss->i_fd, &ulMode ) != 0 ) + return 1; /* What to do? Be conservative and try to use the ioctls */ + + if( ulMode & OPEN_FLAGS_DASD ) + return 1; + + return 0; #else struct stat fileinfo; int ret; @@ -157,6 +179,28 @@ kern_return_t kern_result; io_iterator_t media_iterator; CFMutableDictionaryRef classes_to_match; +#elif defined( SYS_OS2 ) +#pragma pack( 1 ) + struct + { + BYTE bCmdInfo; + BYTE bDrive; + } param; + + struct + { + BYTE abEBPB[31]; + USHORT usCylinders; + BYTE bDevType; + USHORT usDevAttr; + } data; +#pragma pack() + + ULONG ulParamLen; + ULONG ulDataLen; + ULONG rc; + + int i; #else char *ppsz_devices[] = { "/dev/dvd", "/dev/cdrom", "/dev/hdc", NULL }; int i, i_fd; @@ -270,6 +314,32 @@ } IOObjectRelease( media_iterator ); +#elif defined( SYS_OS2 ) + for( i = 0; i < 26; i++ ) + { + param.bCmdInfo = 0; + param.bDrive = i; + + rc = DosDevIOCtl( ( HFILE )-1, IOCTL_DISK, DSK_GETDEVICEPARAMS, + ¶m, sizeof( param ), &ulParamLen, + &data, sizeof( data ), &ulDataLen ); + + if( rc == 0 ) + { + /* Check for removable and for cylinders */ + if( ( data.usDevAttr & 1 ) == 0 && data.usCylinders == 0xFFFF ) + { + char psz_dvd[] = "A:"; + + psz_dvd[0] += i; + + print_debug( dvdcss, "defaulting to drive `%s'", psz_dvd ); + free( dvdcss->psz_device ); + dvdcss->psz_device = strdup( psz_dvd ); + return; + } + } + } #else for( i = 0; ppsz_devices[i]; i++ ) { @@ -322,6 +392,18 @@ return aspi_open( dvdcss, psz_device ); } else +#elif defined( SYS_OS2 ) + /* If device is "X:" or "X:\", we are not actually opening a file. */ + if( psz_device[0] && psz_device[1] == ':' && + ( !psz_device[2] || ( psz_device[2] == '\\' && !psz_device[3] ) ) ) + { + print_debug( dvdcss, "using OS2 API for access" ); + dvdcss->pf_seek = os2_seek; + dvdcss->pf_read = os2_read; + dvdcss->pf_readv = os2_readv; + return os2_open( dvdcss, psz_device ); + } + else #endif { print_debug( dvdcss, "using libc for access" ); @@ -332,7 +414,7 @@ } } -#ifndef WIN32 +#if !defined(WIN32) && !defined(SYS_OS2) int _dvdcss_raw_open ( dvdcss_t dvdcss, char const *psz_device ) { dvdcss->i_raw_fd = open( psz_device, 0 ); @@ -385,11 +467,13 @@ #else close( dvdcss->i_fd ); +#ifndef SYS_OS2 if( dvdcss->i_raw_fd >= 0 ) { close( dvdcss->i_raw_fd ); dvdcss->i_raw_fd = -1; } +#endif return 0; #endif @@ -402,7 +486,7 @@ *****************************************************************************/ static int libc_open ( dvdcss_t dvdcss, char const *psz_device ) { -#if !defined( WIN32 ) +#if !defined( WIN32 ) && !defined( SYS_OS2 ) dvdcss->i_fd = dvdcss->i_read_fd = open( psz_device, 0 ); #else dvdcss->i_fd = dvdcss->i_read_fd = open( psz_device, O_BINARY ); @@ -578,6 +662,35 @@ } #endif +#ifdef SYS_OS2 +static int os2_open ( dvdcss_t dvdcss, char const *psz_device ) +{ + char psz_dvd[] = "X:"; + HFILE hfile; + ULONG ulAction; + ULONG rc; + + psz_dvd[0] = psz_device[0]; + + rc = DosOpen( ( PSZ )psz_dvd, &hfile, &ulAction, 0, FILE_NORMAL, + OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW, + OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE | OPEN_FLAGS_DASD, + NULL ); + + if( rc ) + { + print_error( dvdcss, "failed to open device" ); + return -1; + } + + dvdcss->i_fd = dvdcss->i_read_fd = hfile; + + dvdcss->i_pos = 0; + + return 0; +} +#endif + /***************************************************************************** * Seek commands. *****************************************************************************/ diff -buNr src/device.h.org src/device.h --- src/device.h.org 2008-08-29 11:39:24.000000000 +0900 +++ src/device.h 2008-09-29 23:39:56.000000000 +0900 @@ -52,7 +52,7 @@ /***************************************************************************** * Device reading prototypes, raw-device specific *****************************************************************************/ -#ifndef WIN32 +#if !defined(WIN32) && !defined(SYS_OS2) int _dvdcss_raw_open ( dvdcss_t, char const * ); #endif diff -buNr src/libdvdcss.c.org src/libdvdcss.c --- src/libdvdcss.c.org 2008-08-29 11:41:38.000000000 +0900 +++ src/libdvdcss.c 2009-02-01 22:50:26.000000000 +0900 @@ -166,7 +166,7 @@ char *psz_method = getenv( "DVDCSS_METHOD" ); char *psz_verbose = getenv( "DVDCSS_VERBOSE" ); char *psz_cache = getenv( "DVDCSS_CACHE" ); -#ifndef WIN32 +#if !defined(WIN32) && !defined(SYS_OS2) char *psz_raw_device = getenv( "DVDCSS_RAW_DEVICE" ); #endif @@ -184,7 +184,7 @@ /* * Initialize structure with default values */ -#ifndef WIN32 +#if !defined(WIN32) && !defined(SYS_OS2) dvdcss->i_raw_fd = -1; #endif dvdcss->p_titles = NULL; @@ -306,7 +306,25 @@ /* Cache our keys in ${HOME}/.dvdcss/ */ if( psz_home ) { - snprintf( psz_buffer, PATH_MAX, "%s/.dvdcss", psz_home ); + int home_pos = 0; + +#ifdef SYS_OS2 + if( *psz_home == '/' || *psz_home == '\\') + { + char *psz_unixroot = getenv("UNIXROOT"); + + if( psz_unixroot && + psz_unixroot[0] && + psz_unixroot[1] == ':' && + psz_unixroot[2] == '\0') + { + strcpy( psz_buffer, psz_unixroot ); + home_pos = 2; + } + } +#endif + snprintf( psz_buffer + home_pos, PATH_MAX - home_pos, + "%s/.dvdcss", psz_home ); psz_buffer[PATH_MAX-1] = '\0'; psz_cache = psz_buffer; } @@ -536,7 +554,7 @@ } nocache: -#ifndef WIN32 +#if !defined(WIN32) && !defined(SYS_OS2) if( psz_raw_device != NULL ) { _dvdcss_raw_open( dvdcss, psz_raw_device ); diff -buNr src/libdvdcss.h.org src/libdvdcss.h --- src/libdvdcss.h.org 2008-08-29 11:39:48.000000000 +0900 +++ src/libdvdcss.h 2008-09-29 23:39:56.000000000 +0900 @@ -62,7 +62,7 @@ int i_readv_buf_size; #endif -#ifndef WIN32 +#if !defined(WIN32) && !defined(SYS_OS2) int i_raw_fd; #endif };