[libdvdcss-devel] [Git][videolan/libdvdcss][master] 3 commits: Implement ioctl_ReadCPRMMediaId() and ioctl_ReadCPRMMKBPack() for OS/2

Jean-Baptiste Kempf (@jbk) gitlab at videolan.org
Mon Dec 22 07:12:56 UTC 2025



Jean-Baptiste Kempf pushed to branch master at VideoLAN / libdvdcss


Commits:
23870f13 by KO Myung-Hun at 2025-12-22T14:03:15+09:00
Implement ioctl_ReadCPRMMediaId() and ioctl_ReadCPRMMKBPack() for OS/2

- - - - -
41465efd by KO Myung-Hun at 2025-12-22T14:03:15+09:00
Fix build due to duplicate symbols on OS/2

- - - - -
64ff7c56 by KO Myung-Hun at 2025-12-22T14:03:15+09:00
Define api_export_flags to -DLIBDVDCSS_EXPORTS correctly on OS/2

- - - - -


3 changed files:

- src/ioctl.c
- src/ioctl.h
- src/meson.build


Changes:

=====================================
src/ioctl.c
=====================================
@@ -1002,8 +1002,8 @@ int ioctl_InvalidateAgid( int i_fd, int *pi_agid )
 /*****************************************************************************
  * ioctl_ReadCPRMMediaID: Reads the unique album identified used for CPRM decryption
  *****************************************************************************/
-int ioctl_ReadCPRMMediaId(int i_fd,int *p_agid, uint8_t *p_buffer)
-{  
+int ioctl_ReadCPRMMediaId(int i_fd,int *p_agid, uint8_t *p_data_buffer)
+{
     int i_ret;
 
 #if (defined( HAVE_LINUX_DVD_STRUCT ) && defined( HAVE_SCSI_SG_H )) || (defined( HAVE_BSD_DVD_STRUCT ) && defined( HAVE_CAM_SCSI_SCSI_SG_H ))
@@ -1040,7 +1040,7 @@ int ioctl_ReadCPRMMediaId(int i_fd,int *p_agid, uint8_t *p_buffer)
         i_ret = -1;
     }
 
-    memcpy(p_buffer, data_buf + 4, CPRM_MEDIA_ID_SIZE);
+    memcpy(p_data_buffer, data_buf + 4, CPRM_MEDIA_ID_SIZE);
     free(data_buf);
     i_ret = 0;
 
@@ -1048,7 +1048,7 @@ int ioctl_ReadCPRMMediaId(int i_fd,int *p_agid, uint8_t *p_buffer)
     DWORD tmp;
     SCSI_PASS_THROUGH_DIRECT sptd = { 0 };
     sptd.Length = sizeof( SCSI_PASS_THROUGH_DIRECT );
-    sptd.DataBuffer = p_buffer;
+    sptd.DataBuffer = p_data_buffer;
     sptd.DataTransferLength = CPRM_MEDIA_ID_SIZE + 4 ;
 
     WinInitSPTD( &sptd, GPCMD_READ_DVD_STRUCTURE );
@@ -1062,8 +1062,8 @@ int ioctl_ReadCPRMMediaId(int i_fd,int *p_agid, uint8_t *p_buffer)
                              &tmp, NULL ) ? 0 : -1;
 
     if (i_ret == 0)
-        memmove(p_buffer,
-            p_buffer + 4,
+        memmove(p_data_buffer,
+            p_data_buffer + 4,
             CPRM_MEDIA_ID_SIZE);
 
 #elif defined( DARWIN_DVD_IOCTL )
@@ -1078,7 +1078,19 @@ int ioctl_ReadCPRMMediaId(int i_fd,int *p_agid, uint8_t *p_buffer)
 
     i_ret = ioctl( h_dvd, DKIOCDVDREADSTRUCTURE, &dvd );
     if (i_ret == 0)
-        memcpy(p_buffer, dvd.buffer, sizeof(dvd.bufferLength));
+        memcpy(p_data_buffer, dvd.buffer, sizeof(dvd.bufferLength));
+
+#elif defined( __OS2__ )
+    INIT_SSC(GPCMD_READ_DVD_STRUCTURE, CPRM_MEDIA_ID_SIZE + 4);
+
+    sdc.command[7] = CPRM_STRUCT_MEDIA_ID;
+    sdc.command[10] = *p_agid << 6;
+
+    i_ret = DosDevIOCtl(i_fd, IOCTL_CDROMDISK, CDROMDISK_EXECMD,
+                        &sdc, sizeof(sdc), &ulParamLen,
+                        p_buffer, sizeof(p_buffer), &ulDataLen);
+    if (i_ret == 0)
+        memcpy(p_data_buffer, p_buffer, CPRM_MEDIA_ID_SIZE);
 
 #else
 #   error "DVD ioctls are unavailable on this system"
@@ -1182,6 +1194,25 @@ int ioctl_ReadCPRMMKBPack(int i_fd, int *p_agid, int mkb_pack, uint8_t *p_mkb_pa
     }
     return i_ret;
 
+#elif defined( __OS2__ )
+    INIT_SSC(GPCMD_READ_DVD_STRUCTURE, CPRM_MKB_PACK_SIZE + 4);
+
+    sdc.command[2] = (uint8_t)((mkb_pack >> 24) & 0xFF);
+    sdc.command[3] = (uint8_t)((mkb_pack >> 16) & 0xFF);
+    sdc.command[4] = (uint8_t)((mkb_pack >> 8)  & 0xFF);
+    sdc.command[5] = (uint8_t)(mkb_pack & 0xFF);
+    sdc.command[7]  = CPRM_STRUCT_MKB;
+    sdc.command[10] = *p_agid << 6;
+
+    i_ret = DosDevIOCtl(i_fd, IOCTL_CDROMDISK, CDROMDISK_EXECMD,
+                        &sdc, sizeof(sdc), &ulParamLen,
+                        p_buffer, sizeof(p_buffer), &ulDataLen);
+    if (i_ret == 0)
+    {
+        *p_total_packs = p_buffer[3];
+        memcpy(p_mkb_pack, p_buffer + 4, CPRM_MKB_PACK_SIZE);
+    }
+
 #else
 #   error "DVD ioctls are unavailable on this system"
 


=====================================
src/ioctl.h
=====================================
@@ -273,7 +273,7 @@ struct OS2_ExecSCSICmd
     unsigned short  flags;        // flags
     unsigned char   command[16];  // Command Buffer for SCSI command
 
-} OS2_ExecSCSICmd;
+};
 
 #pragma pack()
 


=====================================
src/meson.build
=====================================
@@ -13,7 +13,7 @@ dvdcss_src = files(
 # Library definitions
 #
 
-if host_machine.system() == 'windows' and get_option('default_library') != 'static'
+if host_machine.system() in ['windows', 'os/2'] and get_option('default_library') != 'static'
     api_export_flags = '-DLIBDVDCSS_EXPORTS'
 else
     api_export_flags = []



View it on GitLab: https://code.videolan.org/videolan/libdvdcss/-/compare/a4b649183a1767218d4e31717ed515fdd1d65294...64ff7c56f0ae4b8a87306a1e6b33ba1327a57e1d

-- 
View it on GitLab: https://code.videolan.org/videolan/libdvdcss/-/compare/a4b649183a1767218d4e31717ed515fdd1d65294...64ff7c56f0ae4b8a87306a1e6b33ba1327a57e1d
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the libdvdcss-devel mailing list