vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Mon Mar 21 21:23:08 2011 +0200| [313c7ee3c3073c4d18d546a704b5d75510dfee1b] | committer: Rémi Denis-Courmont
DVB: CAM: clean up HTML output memory management > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=313c7ee3c3073c4d18d546a704b5d75510dfee1b --- modules/access/dvb/en50221.c | 108 ++++++++++++++++++++++------------------- 1 files changed, 58 insertions(+), 50 deletions(-) diff --git a/modules/access/dvb/en50221.c b/modules/access/dvb/en50221.c index 862e81f..95e4c61 100644 --- a/modules/access/dvb/en50221.c +++ b/modules/access/dvb/en50221.c @@ -2500,22 +2500,26 @@ char *en50221_Status( cam_t *p_cam, char *psz_request ) return NULL; } - char *buf = xmalloc( 10000 ), *p = buf; + char *buf; + size_t len; + FILE *p = open_memstream( &buf, &len ); + if( unlikely(p == NULL) ) + return NULL; ca_caps_t caps; if( ioctl( p_cam->fd, CA_GET_CAP, &caps ) < 0 ) { - p += sprintf( p, "ioctl CA_GET_CAP failed (%m)\n" ); - return buf; + fprintf( p, "ioctl CA_GET_CAP failed (%m)\n" ); + goto out; } /* Output CA capabilities */ - p += sprintf( p, "CA interface with %d %s, type:\n<table>", caps.slot_num, - caps.slot_num == 1 ? "slot" : "slots" ); + fprintf( p, "CA interface with %d %s, type:\n<table>", caps.slot_num, + caps.slot_num == 1 ? "slot" : "slots" ); #define CHECK_CAPS( x, s ) \ if ( caps.slot_type & (CA_##x) ) \ - p += sprintf( p, "<tr><td>" s "</td></tr>\n" ); + fprintf( p, "<tr><td>%s</td></tr>\n", s ) CHECK_CAPS( CI, "CI high level interface" ); CHECK_CAPS( CI_LINK, "CI link layer level interface" ); @@ -2524,36 +2528,36 @@ char *en50221_Status( cam_t *p_cam, char *psz_request ) CHECK_CAPS( SC, "simple smartcard interface" ); #undef CHECK_CAPS - p += sprintf( p, "</table>%d available %s\n<table>", caps.descr_num, - caps.descr_num == 1 ? "descrambler (key)" : "descramblers (keys)" ); + fprintf( p, "</table>%d available %s\n<table>", caps.descr_num, + caps.descr_num == 1 ? "descrambler (key)" : "descramblers (keys)" ); #define CHECK_DESC( x ) \ if ( caps.descr_type & (CA_##x) ) \ - p += sprintf( p, "<tr><td>" STRINGIFY(x) "</td></tr>\n" ); + fprintf( p, "<tr><td>%s</td></tr>", STRINGIFY(x) ) CHECK_DESC( ECD ); CHECK_DESC( NDS ); CHECK_DESC( DSS ); #undef CHECK_DESC - p += sprintf( p, "</table>" ); + fputs( "</table>", p ); for( unsigned i_slot = 0; i_slot < p_cam->i_nb_slots; i_slot++ ) { ca_slot_info_t sinfo; p_cam->pb_slot_mmi_undisplayed[i_slot] = false; - p += sprintf( p, "<p>CA slot #%d: ", i_slot ); + fprintf( p, "<p>CA slot #%d: ", i_slot ); sinfo.num = i_slot; if ( ioctl( p_cam->fd, CA_GET_SLOT_INFO, &sinfo ) < 0 ) { - p += sprintf( p, "ioctl CA_GET_SLOT_INFO failed (%m)<br>\n" ); + fprintf( p, "ioctl CA_GET_SLOT_INFO failed (%m)<br>\n" ); continue; } #define CHECK_TYPE( x, s ) \ if ( sinfo.type & (CA_##x) ) \ - p += sprintf( p, "%s", s ); + fputs( s, p ) CHECK_TYPE( CI, "high level, " ); CHECK_TYPE( CI_LINK, "link layer level, " ); @@ -2564,70 +2568,74 @@ char *en50221_Status( cam_t *p_cam, char *psz_request ) { mmi_t *p_object = en50221_GetMMIObject( p_cam, i_slot ); - p += sprintf( p, "module present and ready<p>\n" ); - p += sprintf( p, "<form action=index.html method=get>\n" ); - p += sprintf( p, "<input type=hidden name=slot value=\"%d\">\n", - i_slot ); + fputs( "module present and ready<p>\n", p ); + fputs( "<form action=index.html method=get>\n", p ); + fprintf( p, "<input type=hidden name=slot value=\"%d\">\n", + i_slot ); if ( p_object == NULL ) { - p += sprintf( p, "<input type=submit name=open value=\"Open session\">\n" ); + fputs( "<input type=submit name=open" + " value=\"Open session\">\n", p ); } else { switch ( p_object->i_object_type ) { case EN50221_MMI_ENQ: - p += sprintf( p, "<input type=hidden name=type value=enq>\n" ); - p += sprintf( p, "<table border=1><tr><th>%s</th></tr>\n", - p_object->u.enq.psz_text ); - if ( p_object->u.enq.b_blind == false ) - p += sprintf( p, "<tr><td><input type=text name=answ></td></tr>\n" ); - else - p += sprintf( p, "<tr><td><input type=password name=answ></td></tr>\n" ); + fputs( "<input type=hidden name=type value=enq>\n", p ); + fprintf( p, "<table border=1><tr><th>%s</th></tr>\n", + p_object->u.enq.psz_text ); + fprintf( p, "<tr><td><input type=%s name=answ>" + "</td></tr>\n", + p_object->u.enq.b_blind ? "password" : "text" ); break; case EN50221_MMI_MENU: - p += sprintf( p, "<input type=hidden name=type value=menu>\n" ); - p += sprintf( p, "<table border=1><tr><th>%s</th></tr>\n", - p_object->u.menu.psz_title ); - p += sprintf( p, "<tr><td>%s</td></tr><tr><td>\n", - p_object->u.menu.psz_subtitle ); + fputs( "<input type=hidden name=type value=menu>\n", p ); + fprintf( p, "<table border=1><tr><th>%s</th></tr>\n", + p_object->u.menu.psz_title ); + fprintf( p, "<tr><td>%s</td></tr><tr><td>\n", + p_object->u.menu.psz_subtitle ); for ( int i = 0; i < p_object->u.menu.i_choices; i++ ) - p += sprintf( p, "<input type=radio name=choice value=\"%d\">%s<br>\n", i + 1, p_object->u.menu.ppsz_choices[i] ); - p += sprintf( p, "</td></tr><tr><td>%s</td></tr>\n", - p_object->u.menu.psz_bottom ); + fprintf( p, "<input type=radio name=choice" + " value=\"%d\">%s<br>\n", i + 1, + p_object->u.menu.ppsz_choices[i] ); + fprintf( p, "</td></tr><tr><td>%s</td></tr>\n", + p_object->u.menu.psz_bottom ); break; case EN50221_MMI_LIST: - p += sprintf( p, "<input type=hidden name=type value=menu>\n" ); - p += sprintf( p, "<input type=hidden name=choice value=0>\n" ); - p += sprintf( p, "<table border=1><tr><th>%s</th></tr>\n", - p_object->u.menu.psz_title ); - p += sprintf( p, "<tr><td>%s</td></tr><tr><td>\n", - p_object->u.menu.psz_subtitle ); + fputs( "<input type=hidden name=type value=menu>\n", p ); + fputs( "<input type=hidden name=choice value=0>\n", p ); + fprintf( p, "<table border=1><tr><th>%s</th></tr>\n", + p_object->u.menu.psz_title ); + fprintf( p, "<tr><td>%s</td></tr><tr><td>\n", + p_object->u.menu.psz_subtitle ); for ( int i = 0; i < p_object->u.menu.i_choices; i++ ) - p += sprintf( p, "%s<br>\n", - p_object->u.menu.ppsz_choices[i] ); - p += sprintf( p, "</td></tr><tr><td>%s</td></tr>\n", - p_object->u.menu.psz_bottom ); + fprintf( p, "%s<br>\n", + p_object->u.menu.ppsz_choices[i] ); + fprintf( p, "</td></tr><tr><td>%s</td></tr>\n", + p_object->u.menu.psz_bottom ); break; default: - p += sprintf( p, "<table><tr><th>Unknown MMI object type</th></tr>\n" ); + fputs( "<table><tr><th>Unknown MMI object type</th></tr>\n", p ); } - p += sprintf( p, "</table><p><input type=submit name=ok value=\"OK\">\n" ); - p += sprintf( p, "<input type=submit name=cancel value=\"Cancel\">\n" ); - p += sprintf( p, "<input type=submit name=close value=\"Close Session\">\n" ); + fputs( "</table><p><input type=submit name=ok value=\"OK\">\n", p ); + fputs( "<input type=submit name=cancel value=\"Cancel\">\n", p ); + fputs( "<input type=submit name=close value=\"Close Session\">\n", p ); } - p += sprintf( p, "</form>\n" ); + fputs( "</form>\n", p ); } else if ( sinfo.flags & CA_CI_MODULE_PRESENT ) - p += sprintf( p, "module present, not ready<br>\n" ); + fputs( "module present, not ready<br>\n", p ); else - p += sprintf( p, "module not present<br>\n" ); + fputs( "module not present<br>\n", p ); } +out: + fclose( p ); return buf; } #endif _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
