DVB: small simplification
[vlc.git] / modules / access / dtv / en50221.c
index c80c1f9..82ed742 100644 (file)
@@ -2,23 +2,23 @@
  * en50221.c : implementation of the transport, session and applications
  * layers of EN 50 221
  *****************************************************************************
  * en50221.c : implementation of the transport, session and applications
  * layers of EN 50 221
  *****************************************************************************
- * Copyright (C) 2004-2005 the VideoLAN team
+ * Copyright (C) 2004-2005 VLC authors and VideoLAN
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  * Based on code from libdvbci Copyright (C) 2000 Klaus Schmidinger
  *
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  * Based on code from libdvbci Copyright (C) 2000 Klaus Schmidinger
  *
- * 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
- * the Free Software Foundation; either version 2 of the License, or
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
  * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.    See the
  * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.    See the
- * GNU General Public License for more details.
+ * GNU Lesser General Public License for more details.
  *
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA    02111, USA.
  *****************************************************************************/
 
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA    02111, USA.
  *****************************************************************************/
 
@@ -58,6 +58,8 @@
 #include "../demux/dvb-text.h"
 #include "dtv/en50221.h"
 
 #include "../demux/dvb-text.h"
 #include "dtv/en50221.h"
 
+#include "../mux/mpeg/dvbpsi_compat.h"
+
 typedef struct en50221_session_t
 {
     unsigned i_slot;
 typedef struct en50221_session_t
 {
     unsigned i_slot;
@@ -283,9 +285,9 @@ static int TPDUSend( cam_t * p_cam, uint8_t i_slot, uint8_t i_tag,
 
         if ( i_length )
             memcpy( p, p_content, i_length );
 
         if ( i_length )
             memcpy( p, p_content, i_length );
-            i_size = i_length + (p - p_data);
-        }
+        i_size = i_length + (p - p_data);
         break;
         break;
+    }
 
     default:
         break;
 
     default:
         break;
@@ -294,7 +296,8 @@ static int TPDUSend( cam_t * p_cam, uint8_t i_slot, uint8_t i_tag,
 
     if ( write( p_cam->fd, p_data, i_size ) != i_size )
     {
 
     if ( write( p_cam->fd, p_data, i_size ) != i_size )
     {
-        msg_Err( p_cam->obj, "cannot write to CAM device (%m)" );
+        msg_Err( p_cam->obj, "cannot write to CAM device: %s",
+                 vlc_strerror_c(errno) );
         return VLC_EGENERIC;
     }
 
         return VLC_EGENERIC;
     }
 
@@ -320,7 +323,7 @@ static int TPDURecv( cam_t *p_cam, uint8_t i_slot, uint8_t *pi_tag,
     while( poll(pfd, 1, CAM_READ_TIMEOUT ) == -1 )
         if( errno != EINTR )
         {
     while( poll(pfd, 1, CAM_READ_TIMEOUT ) == -1 )
         if( errno != EINTR )
         {
-            msg_Err( p_cam->obj, "poll error: %m" );
+            msg_Err( p_cam->obj, "poll error: %s", vlc_strerror_c(errno) );
             return VLC_EGENERIC;
         }
 
             return VLC_EGENERIC;
         }
 
@@ -345,7 +348,8 @@ static int TPDURecv( cam_t *p_cam, uint8_t i_slot, uint8_t *pi_tag,
 
     if ( i_size < 5 )
     {
 
     if ( i_size < 5 )
     {
-        msg_Err( p_cam->obj, "cannot read from CAM device (%d:%m)", i_size );
+        msg_Err( p_cam->obj, "cannot read from CAM device (%d): %s", i_size,
+                 vlc_strerror_c(errno) );
         if( pi_size == NULL )
             free( p_data );
         return VLC_EGENERIC;
         if( pi_size == NULL )
             free( p_data );
         return VLC_EGENERIC;
@@ -879,7 +883,8 @@ static int APDUSend( cam_t * p_cam, int i_session_id, int i_tag,
             i_ret = ioctl( p_cam->fd, CA_SEND_MSG, &ca_msg );
             if ( i_ret < 0 )
             {
             i_ret = ioctl( p_cam->fd, CA_SEND_MSG, &ca_msg );
             if ( i_ret < 0 )
             {
-                msg_Err( p_cam->obj, "Error sending to CAM: %m" );
+                msg_Err( p_cam->obj, "Error sending to CAM: %s",
+                         vlc_strerror_c(errno) );
                 i_ret = VLC_EGENERIC;
             }
         }
                 i_ret = VLC_EGENERIC;
             }
         }
@@ -940,6 +945,68 @@ static void ResourceManagerOpen( cam_t * p_cam, unsigned i_session_id )
  */
 
 #ifdef ENABLE_HTTPD
  */
 
 #ifdef ENABLE_HTTPD
+
+/****************************************************************************
+ * HTTPExtractValue: Extract a GET variable from psz_request
+ ****************************************************************************/
+static const char *HTTPExtractValue( const char *psz_uri, const char *psz_name,
+                        char *psz_value, int i_value_max )
+{
+    const char *p = psz_uri;
+
+    while( (p = strstr( p, psz_name )) )
+    {
+        /* Verify that we are dealing with a post/get argument */
+        if( (p == psz_uri || *(p - 1) == '&' || *(p - 1) == '\n')
+              && p[strlen(psz_name)] == '=' )
+            break;
+        p++;
+    }
+
+    if( p )
+    {
+        int i_len;
+
+        p += strlen( psz_name );
+        if( *p == '=' ) p++;
+
+        if( strchr( p, '&' ) )
+        {
+            i_len = strchr( p, '&' ) - p;
+        }
+        else
+        {
+            /* for POST method */
+            if( strchr( p, '\n' ) )
+            {
+                i_len = strchr( p, '\n' ) - p;
+                if( i_len && *(p+i_len-1) == '\r' ) i_len--;
+            }
+            else
+            {
+                i_len = strlen( p );
+            }
+        }
+        i_len = __MIN( i_value_max - 1, i_len );
+        if( i_len > 0 )
+        {
+            strncpy( psz_value, p, i_len );
+            psz_value[i_len] = '\0';
+        }
+        else
+        {
+            strncpy( psz_value, "", i_value_max );
+        }
+        p += i_len;
+    }
+    else
+    {
+        strncpy( psz_value, "", i_value_max );
+    }
+
+    return p;
+}
+
 /*****************************************************************************
  * ApplicationInformationEnterMenu
  *****************************************************************************/
 /*****************************************************************************
  * ApplicationInformationEnterMenu
  *****************************************************************************/
@@ -1189,7 +1256,7 @@ static uint8_t *CAPMTES( system_ids_t *p_ids, uint8_t *p_capmt,
 
 static uint8_t *CAPMTBuild( cam_t * p_cam, int i_session_id,
                             dvbpsi_pmt_t *p_pmt, uint8_t i_list_mgt,
 
 static uint8_t *CAPMTBuild( cam_t * p_cam, int i_session_id,
                             dvbpsi_pmt_t *p_pmt, uint8_t i_list_mgt,
-                            uint8_t i_cmd, int *pi_capmt_size )
+                            uint8_t i_cmd, int *restrict pi_capmt_size )
 {
     system_ids_t *p_ids =
         (system_ids_t *)p_cam->p_sessions[i_session_id - 1].p_sys;
 {
     system_ids_t *p_ids =
         (system_ids_t *)p_cam->p_sessions[i_session_id - 1].p_sys;
@@ -1209,7 +1276,6 @@ static uint8_t *CAPMTBuild( cam_t * p_cam, int i_session_id,
         msg_Warn( p_cam->obj,
                   "no compatible scrambling system for SID %d on session %d",
                   p_pmt->i_program_number, i_session_id );
         msg_Warn( p_cam->obj,
                   "no compatible scrambling system for SID %d on session %d",
                   p_pmt->i_program_number, i_session_id );
-        *pi_capmt_size = 0;
         return NULL;
     }
 
         return NULL;
     }
 
@@ -1256,8 +1322,7 @@ static void CAPMTFirst( cam_t * p_cam, int i_session_id,
     p_capmt = CAPMTBuild( p_cam, i_session_id, p_pmt,
                           0x3 /* only */, 0x1 /* ok_descrambling */,
                           &i_capmt_size );
     p_capmt = CAPMTBuild( p_cam, i_session_id, p_pmt,
                           0x3 /* only */, 0x1 /* ok_descrambling */,
                           &i_capmt_size );
-
-    if( i_capmt_size )
+    if( p_capmt != NULL )
     {
         APDUSend( p_cam, i_session_id, AOT_CA_PMT, p_capmt, i_capmt_size );
         free( p_capmt );
     {
         APDUSend( p_cam, i_session_id, AOT_CA_PMT, p_capmt, i_capmt_size );
         free( p_capmt );
@@ -1296,8 +1361,7 @@ static void CAPMTAdd( cam_t * p_cam, int i_session_id,
     p_capmt = CAPMTBuild( p_cam, i_session_id, p_pmt,
                           0x4 /* add */, 0x1 /* ok_descrambling */,
                           &i_capmt_size );
     p_capmt = CAPMTBuild( p_cam, i_session_id, p_pmt,
                           0x4 /* add */, 0x1 /* ok_descrambling */,
                           &i_capmt_size );
-
-    if( i_capmt_size )
+    if( p_capmt != NULL )
     {
         APDUSend( p_cam, i_session_id, AOT_CA_PMT, p_capmt, i_capmt_size );
         free( p_capmt );
     {
         APDUSend( p_cam, i_session_id, AOT_CA_PMT, p_capmt, i_capmt_size );
         free( p_capmt );
@@ -1319,8 +1383,7 @@ static void CAPMTUpdate( cam_t * p_cam, int i_session_id,
     p_capmt = CAPMTBuild( p_cam, i_session_id, p_pmt,
                           0x5 /* update */, 0x1 /* ok_descrambling */,
                           &i_capmt_size );
     p_capmt = CAPMTBuild( p_cam, i_session_id, p_pmt,
                           0x5 /* update */, 0x1 /* ok_descrambling */,
                           &i_capmt_size );
-
-    if( i_capmt_size )
+    if( p_capmt != NULL )
     {
         APDUSend( p_cam, i_session_id, AOT_CA_PMT, p_capmt, i_capmt_size );
         free( p_capmt );
     {
         APDUSend( p_cam, i_session_id, AOT_CA_PMT, p_capmt, i_capmt_size );
         free( p_capmt );
@@ -1343,8 +1406,7 @@ static void CAPMTDelete( cam_t * p_cam, int i_session_id,
     p_capmt = CAPMTBuild( p_cam, i_session_id, p_pmt,
                           0x5 /* update */, 0x4 /* not selected */,
                           &i_capmt_size );
     p_capmt = CAPMTBuild( p_cam, i_session_id, p_pmt,
                           0x5 /* update */, 0x4 /* not selected */,
                           &i_capmt_size );
-
-    if( i_capmt_size )
+    if( p_capmt != NULL )
     {
         APDUSend( p_cam, i_session_id, AOT_CA_PMT, p_capmt, i_capmt_size );
         free( p_capmt );
     {
         APDUSend( p_cam, i_session_id, AOT_CA_PMT, p_capmt, i_capmt_size );
         free( p_capmt );
@@ -1996,7 +2058,7 @@ cam_t *en50221_Init( vlc_object_t *obj, int fd )
          * ASIC. */
         if ( ioctl( fd, CA_GET_SLOT_INFO, &info ) < 0 )
         {
          * ASIC. */
         if ( ioctl( fd, CA_GET_SLOT_INFO, &info ) < 0 )
         {
-            msg_Err( obj, "cannot get slot info: %m" );
+            msg_Err( obj, "cannot get slot info: %s", vlc_strerror_c(errno) );
             goto error;
         }
         if( info.flags == 0 )
             goto error;
         }
         if( info.flags == 0 )
@@ -2514,7 +2576,7 @@ char *en50221_Status( cam_t *p_cam, char *psz_request )
 
     if( ioctl( p_cam->fd, CA_GET_CAP, &caps ) < 0 )
     {
 
     if( ioctl( p_cam->fd, CA_GET_CAP, &caps ) < 0 )
     {
-        fprintf( p, "ioctl CA_GET_CAP failed (%m)\n" );
+        fprintf( p, "ioctl(CA_GET_CAP) failed: %s\n", vlc_strerror_c(errno) );
         goto out;
     }
 
         goto out;
     }
 
@@ -2555,7 +2617,8 @@ char *en50221_Status( cam_t *p_cam, char *psz_request )
         sinfo.num = i_slot;
         if ( ioctl( p_cam->fd, CA_GET_SLOT_INFO, &sinfo ) < 0 )
         {
         sinfo.num = i_slot;
         if ( ioctl( p_cam->fd, CA_GET_SLOT_INFO, &sinfo ) < 0 )
         {
-            fprintf( p, "ioctl CA_GET_SLOT_INFO failed (%m)<br>\n" );
+            fprintf( p, "ioctl(CA_GET_SLOT_INFO) failed: %s<br>\n",
+                     vlc_strerror_c(errno) );
             continue;
         }
 
             continue;
         }