summaryrefslogtreecommitdiffstats
path: root/libmpdvdkit2
diff options
context:
space:
mode:
authordiego <diego@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-03-01 06:58:15 +0000
committerdiego <diego@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-03-01 06:58:15 +0000
commit40521978b8fac987c4fc8897a1f2155df20a4249 (patch)
tree058731681b379d11ea978757c2ffffe4bdba6984 /libmpdvdkit2
parent7f2f536a1766eefc3582126ddc8845586d0f40cf (diff)
downloadmpv-40521978b8fac987c4fc8897a1f2155df20a4249.tar.bz2
mpv-40521978b8fac987c4fc8897a1f2155df20a4249.tar.xz
MPlayer-specific changes to libdvdcss
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@14862 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdvdkit2')
-rw-r--r--libmpdvdkit2/libdvdcss_changes.diff596
1 files changed, 596 insertions, 0 deletions
diff --git a/libmpdvdkit2/libdvdcss_changes.diff b/libmpdvdkit2/libdvdcss_changes.diff
new file mode 100644
index 0000000000..2d87f819d1
--- /dev/null
+++ b/libmpdvdkit2/libdvdcss_changes.diff
@@ -0,0 +1,596 @@
+--- bsdi_ioctl.c 2003-03-10 00:34:10.000000000 +0100
++++ bsdi_ioctl.c 2005-03-01 07:41:41.000000000 +0100
+@@ -4,6 +4,10 @@
+ * Hacked version of the linux cdrom.c kernel module - everything except the
+ * DVD handling ripped out and the rest rewritten to use raw SCSI commands
+ * on BSD/OS 4.2 (but should work with earlier versions as well).
++ *
++ * Modified for use with MPlayer, changes contained in libdvdcss_changes.diff.
++ * detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/
++ * $Id$
+ */
+
+ #include <sys/types.h>
+@@ -694,7 +698,7 @@
+ struct cdrom_tocentry entry;
+ int ret, i;
+
+- bzero(tracks, sizeof (*tracks));
++ memset(tracks, 0, sizeof (*tracks));
+ ret = cdrom_ioctl(fd, CDROMREADTOCHDR, &header);
+ /*
+ * This whole business is a crock anyhow so we don't bother distinguishing
+--- common.h 2003-06-13 19:33:35.000000000 +0200
++++ common.h 2005-03-01 07:41:41.000000000 +0100
+@@ -3,7 +3,10 @@
+ * Collection of useful common types and macros definitions
+ *****************************************************************************
+ * Copyright (C) 1998, 1999, 2000 VideoLAN
+- * $Id$
++ *
++ * Modified for use with MPlayer, changes contained in libdvdcss_changes.diff.
++ * detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/
++ * $Id$
+ *
+ * Authors: Samuel Hocevar <sam@via.ecp.fr>
+ * Vincent Seguin <seguin@via.ecp.fr>
+@@ -27,21 +30,10 @@
+ /*****************************************************************************
+ * Basic types definitions
+ *****************************************************************************/
+-#if defined( HAVE_STDINT_H )
+-# include <stdint.h>
+-#elif defined( HAVE_INTTYPES_H )
+-# include <inttypes.h>
+-#elif defined( SYS_CYGWIN )
+-# include <sys/types.h>
+- /* Cygwin only defines half of these... */
+- typedef u_int8_t uint8_t;
+- typedef u_int32_t uint32_t;
+-#else
+- /* Fallback types (very x86-centric, sorry) */
+- typedef unsigned char uint8_t;
+- typedef signed char int8_t;
+- typedef unsigned int uint32_t;
+- typedef signed int int32_t;
++#include <inttypes.h>
++
++#ifdef __CYGWIN__
++#define SYS_CYGWIN
+ #endif
+
+ #if defined( WIN32 )
+--- css.c 2003-07-29 01:37:06.000000000 +0200
++++ css.c 2005-03-01 07:41:41.000000000 +0100
+@@ -2,7 +2,10 @@
+ * css.c: Functions for DVD authentication and descrambling
+ *****************************************************************************
+ * Copyright (C) 1999-2001 VideoLAN
+- * $Id$
++ *
++ * Modified for use with MPlayer, changes contained in libdvdcss_changes.diff.
++ * detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/
++ * $Id$
+ *
+ * Author: Stéphane Borel <stef@via.ecp.fr>
+ * Håkan Hjort <d95hjort@dtek.chalmers.se>
+@@ -40,19 +43,11 @@
+ #include <string.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
+-#ifdef HAVE_SYS_PARAM_H
+-# include <sys/param.h>
+-#endif
+-#ifdef HAVE_UNISTD_H
+-# include <unistd.h>
+-#endif
+ #include <fcntl.h>
++#include <unistd.h>
++#include <limits.h>
+
+-#ifdef HAVE_LIMITS_H
+-# include <limits.h>
+-#endif
+-
+-#include "dvdcss/dvdcss.h"
++#include "dvdcss.h"
+
+ #include "common.h"
+ #include "css.h"
+--- device.c 2003-07-29 01:37:06.000000000 +0200
++++ device.c 2005-03-01 07:41:41.000000000 +0100
+@@ -2,7 +2,10 @@
+ * device.h: DVD device access
+ *****************************************************************************
+ * Copyright (C) 1998-2002 VideoLAN
+- * $Id$
++ *
++ * Modified for use with MPlayer, changes contained in libdvdcss_changes.diff.
++ * detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/
++ * $Id$
+ *
+ * Authors: Stéphane Borel <stef@via.ecp.fr>
+ * Samuel Hocevar <sam@zoy.org>
+@@ -33,18 +36,9 @@
+ #include <string.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
+-#ifdef HAVE_SYS_PARAM_H
+-# include <sys/param.h>
+-#endif
+ #include <fcntl.h>
+-
+-#ifdef HAVE_UNISTD_H
+-# include <unistd.h>
+-#endif
+-
+-#ifdef HAVE_LIMITS_H
+-# include <limits.h>
+-#endif
++#include <unistd.h>
++#include <limits.h>
+
+ #if defined( WIN32 ) && !defined( SYS_CYGWIN )
+ # include <io.h> /* read() */
+@@ -52,7 +46,7 @@
+ # include <sys/uio.h> /* struct iovec */
+ #endif
+
+-#include "dvdcss/dvdcss.h"
++#include "dvdcss.h"
+
+ #include "common.h"
+ #include "css.h"
+@@ -143,8 +137,11 @@
+ _dvdcss_debug( dvdcss, psz_debug );
+
+ #if defined( WIN32 )
+- /* If device is not "X:", we are actually opening a file. */
+- dvdcss->b_file = !psz_device[0] || psz_device[1] != ':' || psz_device[2];
++ dvdcss->b_file = 1;
++ /* 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])))
++ dvdcss->b_file = 0;
+
+ /* Initialize readv temporary buffer */
+ dvdcss->p_readv_buffer = NULL;
+--- error.c 2003-03-10 01:15:31.000000000 +0100
++++ error.c 2005-03-01 07:41:41.000000000 +0100
+@@ -2,7 +2,10 @@
+ * error.c: error management functions
+ *****************************************************************************
+ * Copyright (C) 1998-2002 VideoLAN
+- * $Id$
++ *
++ * Modified for use with MPlayer, changes contained in libdvdcss_changes.diff.
++ * detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/
++ * $Id$
+ *
+ * Author: Samuel Hocevar <sam@zoy.org>
+ *
+@@ -25,16 +28,9 @@
+
+ #include <stdio.h>
+ #include <stdlib.h>
++#include <limits.h>
+
+-#ifdef HAVE_SYS_PARAM_H
+-# include <sys/param.h>
+-#endif
+-
+-#ifdef HAVE_LIMITS_H
+-# include <limits.h>
+-#endif
+-
+-#include "dvdcss/dvdcss.h"
++#include "dvdcss.h"
+
+ #include "common.h"
+ #include "css.h"
+--- ioctl.c 2003-03-10 00:34:10.000000000 +0100
++++ ioctl.c 2005-03-01 07:41:41.000000000 +0100
+@@ -2,7 +2,10 @@
+ * ioctl.c: DVD ioctl replacement function
+ *****************************************************************************
+ * Copyright (C) 1999-2001 VideoLAN
+- * $Id$
++ *
++ * Modified for use with MPlayer, changes contained in libdvdcss_changes.diff.
++ * detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/
++ * $Id$
+ *
+ * Authors: Markus Kuespert <ltlBeBoy@beosmail.com>
+ * Samuel Hocevar <sam@zoy.org>
+@@ -76,6 +79,7 @@
+ # include <sys/scsi.h>
+ #endif
+ #ifdef SOLARIS_USCSI
++# include <dlfcn.h>
+ # include <unistd.h>
+ # include <stropts.h>
+ # include <sys/scsi/scsi_types.h>
+@@ -112,6 +116,7 @@
+ *****************************************************************************/
+ #if defined( SOLARIS_USCSI )
+ static void SolarisInitUSCSI( struct uscsi_cmd *p_sc, int i_type );
++static int SolarisSendUSCSI( int fd, struct uscsi_cmd *p_sc );
+ #endif
+
+ /*****************************************************************************
+@@ -192,7 +197,7 @@
+ rs_cdb.cdb_opaque[ 6 ] = i_layer;
+ rs_cdb.cdb_opaque[ 7 ] = DVD_STRUCT_COPYRIGHT;
+
+- i_ret = ioctl(i_fd, USCSICMD, &sc);
++ i_ret = SolarisSendUSCSI(i_fd, &sc);
+
+ if( i_ret < 0 || sc.uscsi_status ) {
+ i_ret = -1;
+@@ -351,7 +356,7 @@
+ rs_cdb.cdb_opaque[ 7 ] = DVD_STRUCT_DISCKEY;
+ rs_cdb.cdb_opaque[ 10 ] = *pi_agid << 6;
+
+- i_ret = ioctl( i_fd, USCSICMD, &sc );
++ i_ret = SolarisSendUSCSI( i_fd, &sc );
+
+ if( i_ret < 0 || sc.uscsi_status )
+ {
+@@ -513,7 +518,7 @@
+ rs_cdb.cdb_opaque[ 5 ] = ( i_pos ) & 0xff;
+ rs_cdb.cdb_opaque[ 10 ] = DVD_REPORT_TITLE_KEY | (*pi_agid << 6);
+
+- i_ret = ioctl( i_fd, USCSICMD, &sc );
++ i_ret = SolarisSendUSCSI( i_fd, &sc );
+
+ if( i_ret < 0 || sc.uscsi_status )
+ {
+@@ -665,7 +670,7 @@
+
+ rs_cdb.cdb_opaque[ 10 ] = DVD_REPORT_AGID | (*pi_agid << 6);
+
+- i_ret = ioctl( i_fd, USCSICMD, &sc );
++ i_ret = SolarisSendUSCSI( i_fd, &sc );
+
+ if( i_ret < 0 || sc.uscsi_status )
+ {
+@@ -787,7 +792,7 @@
+
+ rs_cdb.cdb_opaque[ 10 ] = DVD_REPORT_CHALLENGE | (*pi_agid << 6);
+
+- i_ret = ioctl( i_fd, USCSICMD, &sc );
++ i_ret = SolarisSendUSCSI( i_fd, &sc );
+
+ if( i_ret < 0 || sc.uscsi_status )
+ {
+@@ -921,7 +926,7 @@
+
+ rs_cdb.cdb_opaque[ 10 ] = DVD_REPORT_ASF;
+
+- i_ret = ioctl( i_fd, USCSICMD, &sc );
++ i_ret = SolarisSendUSCSI( i_fd, &sc );
+
+ if( i_ret < 0 || sc.uscsi_status )
+ {
+@@ -1054,7 +1059,7 @@
+
+ rs_cdb.cdb_opaque[ 10 ] = DVD_REPORT_KEY1 | (*pi_agid << 6);
+
+- i_ret = ioctl( i_fd, USCSICMD, &sc );
++ i_ret = SolarisSendUSCSI( i_fd, &sc );
+
+ if( i_ret < 0 || sc.uscsi_status )
+ {
+@@ -1175,7 +1180,7 @@
+
+ rs_cdb.cdb_opaque[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6);
+
+- i_ret = ioctl( i_fd, USCSICMD, &sc );
++ i_ret = SolarisSendUSCSI( i_fd, &sc );
+
+ if( i_ret < 0 || sc.uscsi_status )
+ {
+@@ -1299,7 +1304,7 @@
+ p_buffer[ 1 ] = 0xe;
+ memcpy( p_buffer + 4, p_challenge, DVD_CHALLENGE_SIZE );
+
+- if( ioctl( i_fd, USCSICMD, &sc ) < 0 || sc.uscsi_status )
++ if( SolarisSendUSCSI( i_fd, &sc ) < 0 || sc.uscsi_status )
+ {
+ return -1;
+ }
+@@ -1436,7 +1441,7 @@
+ p_buffer[ 1 ] = 0xa;
+ memcpy( p_buffer + 4, p_key, DVD_KEY_SIZE );
+
+- if( ioctl( i_fd, USCSICMD, &sc ) < 0 || sc.uscsi_status )
++ if( SolarisSendUSCSI( i_fd, &sc ) < 0 || sc.uscsi_status )
+ {
+ return -1;
+ }
+@@ -1578,7 +1583,7 @@
+
+ rs_cdb.cdb_opaque[ 10 ] = DVD_REPORT_RPC;
+
+- i_ret = ioctl( i_fd, USCSICMD, &sc );
++ i_ret = SolarisSendUSCSI( i_fd, &sc );
+
+ if( i_ret < 0 || sc.uscsi_status )
+ {
+@@ -1728,7 +1733,7 @@
+ p_buffer[ 1 ] = 6;
+ p_buffer[ 4 ] = i_pdrc;
+
+- i_ret = ioctl( i_fd, USCSICMD, &sc );
++ i_ret = SolarisSendUSCSI( i_fd, &sc );
+
+ if( i_ret < 0 || sc.uscsi_status )
+ {
+@@ -1901,6 +1906,54 @@
+
+ USCSI_TIMEOUT( p_sc, 15 );
+ }
++
++/*****************************************************************************
++ * SolarisSendUSCSI: send a USCSICMD structure to the Solaris kernel
++ * for execution
++ *****************************************************************************
++ * When available, this function uses the function smedia_uscsi_cmd()
++ * from solaris' libsmedia library (solaris 9 or newer) to execute the
++ * USCSI command. smedia_uscsi_cmd() allows USCSI commands for
++ * non-root users on removable media devices on solaris 9; sending the
++ * USCSI command directly to the device using the USCSICMD ioctl fails
++ * with an EPERM error on solaris 9.
++ *
++ * The code will fall back to the USCSICMD ioctl method, when
++ * libsmedia.so is not available or does not export the
++ * smedia_uscsi_cmd() function (on solaris releases upto and including
++ * solaris 8). Fortunatelly, on these old releases non-root users are
++ * allowed to perform USCSICMD ioctls on removable media devices.
++ *****************************************************************************/
++static int SolarisSendUSCSI( int i_fd, struct uscsi_cmd *p_sc ) {
++ void *sm_hdl;
++ static int initialized;
++ static void* (*sm_get_handle)(int32_t);
++ static int (*sm_release_handle)(void*);
++ static int (*sm_uscsi_cmd)(void*, struct uscsi_cmd *);
++
++ if (!initialized)
++ {
++ void *smedia_lib;
++
++ smedia_lib = dlopen("libsmedia.so", RTLD_NOW);
++ if (smedia_lib) {
++ sm_get_handle = dlsym(smedia_lib, "smedia_get_handle");
++ sm_release_handle = dlsym(smedia_lib, "smedia_release_handle");
++ sm_uscsi_cmd = dlsym(smedia_lib, "smedia_uscsi_cmd");
++ }
++ initialized = 1;
++ }
++
++ if (sm_get_handle && sm_uscsi_cmd && sm_release_handle
++ && (sm_hdl = sm_get_handle(i_fd)))
++ {
++ int i_ret = sm_uscsi_cmd(sm_hdl, p_sc);
++ sm_release_handle(sm_hdl);
++ return i_ret;
++ }
++
++ return ioctl( i_fd, USCSICMD, p_sc );
++}
+ #endif
+
+ #if defined( WIN32 )
+--- libdvdcss.c 2003-06-22 16:08:53.000000000 +0200
++++ libdvdcss.c 2005-03-01 07:41:41.000000000 +0100
+@@ -5,7 +5,10 @@
+ * Håkan Hjort <d95hjort@dtek.chalmers.se>
+ *
+ * Copyright (C) 1998-2002 VideoLAN
+- * $Id$
++ *
++ * Modified for use with MPlayer, changes contained in libdvdcss_changes.diff.
++ * detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/
++ * $Id$
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+@@ -22,7 +25,7 @@
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
+ */
+
+-/**
++/*
+ * \mainpage libdvdcss developer documentation
+ *
+ * \section intro Introduction
+@@ -87,10 +90,7 @@
+ * values. This will speed up descrambling of DVDs which are in the
+ * cache. The DVDCSS_CACHE directory is created if it does not exist,
+ * and a subdirectory is created named after the DVD's title or
+- * manufacturing date. If DVDCSS_CACHE is not set or is empty, \e libdvdcss
+- * will use the default value which is "${HOME}/.dvdcss/" under Unix and
+- * "C:\Documents and Settings\$USER\Application Data\dvdcss\" under Win32.
+- * The special value "off" disables caching.
++ * manufacturing date.
+ */
+
+ /*
+@@ -103,28 +103,12 @@
+ #include <string.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
+-#ifdef HAVE_SYS_PARAM_H
+-# include <sys/param.h>
+-#endif
+-#ifdef HAVE_PWD_H
+-# include <pwd.h>
+-#endif
+ #include <fcntl.h>
+ #include <errno.h>
++#include <unistd.h>
++#include <limits.h>
+
+-#ifdef HAVE_UNISTD_H
+-# include <unistd.h>
+-#endif
+-
+-#ifdef HAVE_LIMITS_H
+-# include <limits.h>
+-#endif
+-
+-#ifdef HAVE_DIRECT_H
+-# include <direct.h>
+-#endif
+-
+-#include "dvdcss/dvdcss.h"
++#include "dvdcss.h"
+
+ #include "common.h"
+ #include "css.h"
+@@ -132,6 +116,12 @@
+ #include "ioctl.h"
+ #include "device.h"
+
++#ifndef HAVE_MPLAYER
++ #include "get_path.c"
++#else
++ extern char * get_path( char * filename );
++#endif
++
+ /**
+ * \brief Symbol for version checks.
+ *
+@@ -234,87 +224,11 @@
+ }
+
+ /*
+- * If DVDCSS_CACHE was not set, try to guess a default value
+- */
+- if( psz_cache == NULL || psz_cache[0] == '\0' )
+- {
+-#ifdef HAVE_DIRECT_H
+- typedef HRESULT( WINAPI *SHGETFOLDERPATH )
+- ( HWND, int, HANDLE, DWORD, LPTSTR );
+-
+-# define CSIDL_FLAG_CREATE 0x8000
+-# define CSIDL_APPDATA 0x1A
+-# define SHGFP_TYPE_CURRENT 0
+-
+- char psz_home[MAX_PATH];
+- HINSTANCE p_dll;
+- SHGETFOLDERPATH p_getpath;
+-
+- *psz_home = '\0';
+-
+- /* Load the shfolder dll to retrieve SHGetFolderPath */
+- p_dll = LoadLibrary( "shfolder.dll" );
+- if( p_dll )
+- {
+- p_getpath = (void*)GetProcAddress( p_dll, "SHGetFolderPathA" );
+- if( p_getpath )
+- {
+- /* Get the "Application Data" folder for the current user */
+- if( p_getpath( NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE,
+- NULL, SHGFP_TYPE_CURRENT, psz_home ) == S_OK )
+- {
+- FreeLibrary( p_dll );
+- }
+- else
+- {
+- *psz_home = '\0';
+- }
+- }
+- FreeLibrary( p_dll );
+- }
+-
+- /* Cache our keys in
+- * C:\Documents and Settings\$USER\Application Data\dvdcss\ */
+- if( *psz_home )
+- {
+- snprintf( psz_buffer, PATH_MAX, "%s/dvdcss", psz_home );
+- psz_buffer[PATH_MAX-1] = '\0';
+- psz_cache = psz_buffer;
+- }
+-#else
+- char *psz_home = NULL;
+-# ifdef HAVE_PWD_H
+- struct passwd *p_pwd;
+-
+- /* Try looking in password file for home dir. */
+- p_pwd = getpwuid(getuid());
+- if( p_pwd )
+- {
+- psz_home = p_pwd->pw_dir;
+- }
+-# endif
+-
+- if( psz_home == NULL )
+- {
+- psz_home = getenv( "HOME" );
+- }
+-
+- /* Cache our keys in ${HOME}/.dvdcss/ */
+- if( psz_home )
+- {
+- snprintf( psz_buffer, PATH_MAX, "%s/.dvdcss", psz_home );
+- psz_buffer[PATH_MAX-1] = '\0';
+- psz_cache = psz_buffer;
+- }
+-#endif
+- }
+-
+- /*
+ * Find cache dir from the DVDCSS_CACHE environment variable
+ */
+ if( psz_cache != NULL )
+ {
+- if( psz_cache[0] == '\0' || !strcmp( psz_cache, "off" ) )
++ if( psz_cache[0] == '\0' )
+ {
+ psz_cache = NULL;
+ }
+@@ -325,6 +239,7 @@
+ psz_cache = NULL;
+ }
+ }
++ else psz_cache = get_path( "DVDKeys" );
+
+ /*
+ * Open device
+@@ -465,9 +380,10 @@
+ dvdcss->psz_cachefile[0] = '\0';
+ goto nocache;
+ }
++ i += sprintf( dvdcss->psz_cachefile + i, "/");
+
+- i += sprintf( dvdcss->psz_cachefile + i, "/%s#%s", psz_title,
+- psz_serial );
++// i += sprintf( dvdcss->psz_cachefile + i, "/%s", psz_data );
++ i += sprintf( dvdcss->psz_cachefile + i, "/%s#%s", psz_title, psz_serial );
+ #if !defined( WIN32 ) || defined( SYS_CYGWIN )
+ i_ret = mkdir( dvdcss->psz_cachefile, 0755 );
+ #else
+--- dvdcss/dvdcss.h 2003-04-18 20:05:36.000000000 +0200
++++ dvdcss.h 2005-03-01 07:41:41.000000000 +0100
+@@ -10,7 +10,10 @@
+
+ /*
+ * Copyright (C) 1998-2002 VideoLAN
+- * $Id$
++ *
++ * Modified for use with MPlayer, changes contained in libdvdcss_changes.diff.
++ * detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/
++ * $Id$
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+@@ -67,6 +70,8 @@
+ */
+ extern dvdcss_t dvdcss_open ( char *psz_target );
+ extern int dvdcss_close ( dvdcss_t );
++extern int dvdcss_title ( dvdcss_t,
++ int i_block );
+ extern int dvdcss_seek ( dvdcss_t,
+ int i_blocks,
+ int i_flags );