+
+static int vlc_sd_probe_Open( vlc_object_t *obj )
+{
+ vlc_probe_t *probe = (vlc_probe_t *)obj;
+ char **ppsz_filelist = NULL;
+ char **ppsz_fileend = NULL;
+ char **ppsz_file;
+ char *psz_name;
+ char *ppsz_dir_list[] = { NULL, NULL, NULL, NULL };
+ char **ppsz_dir;
+ vlclua_dir_list( obj, "sd", ppsz_dir_list );
+ for( ppsz_dir = ppsz_dir_list; *ppsz_dir; ppsz_dir++ )
+ {
+ int i_files;
+ if( ppsz_filelist )
+ {
+ for( ppsz_file = ppsz_filelist; ppsz_file < ppsz_fileend;
+ ppsz_file++ )
+ free( *ppsz_file );
+ free( ppsz_filelist );
+ ppsz_filelist = NULL;
+ }
+ i_files = vlc_scandir( *ppsz_dir, &ppsz_filelist, file_select,
+ file_compare );
+ if( i_files < 1 ) continue;
+ ppsz_fileend = ppsz_filelist + i_files;
+ for( ppsz_file = ppsz_filelist; ppsz_file < ppsz_fileend; ppsz_file++ )
+ {
+ char *psz_filename;
+ if( asprintf( &psz_filename,
+ "%s" DIR_SEP "%s", *ppsz_dir, *ppsz_file ) < 0 )
+ {
+ goto error;
+ }
+ FILE *fd = vlc_fopen( psz_filename, "r" );
+ if( fd )
+ {
+ char description[256];
+ if( fgets( description, 256, fd ) != NULL )
+ {
+ char *temp = strchr( description, '\n' );
+ if( temp )
+ *temp = '\0';
+ temp = strchr( *ppsz_file, '.' );
+ if( temp )
+ *temp = '\0';
+ char *psz_longname;
+ if( !strncmp( description, "--SD_Description=", 17 ) )
+ {
+ if( !( psz_longname = strdup( description + 17 ) ) )
+ {
+ fclose( fd );
+ free( psz_filename );
+ goto error;
+ }
+ }
+ else
+ {
+ if( !( psz_longname = strdup( *ppsz_file ) ) )
+ {
+ fclose( fd );
+ free( psz_filename );
+ goto error;
+ }
+ }
+ if( asprintf( &psz_name, "lua{sd=%s,longname=%s}",
+ *ppsz_file, psz_longname ) < 0 )
+ {
+ fclose( fd );
+ free( psz_filename );
+ free( psz_longname );
+ goto error;
+ }
+ vlc_sd_probe_Add( probe, psz_name, psz_longname, SD_CAT_INTERNET );
+ free( psz_name );
+ free( psz_longname );
+ }
+ fclose( fd );
+ }
+ free( psz_filename );
+ }
+ }
+ if( ppsz_filelist )
+ {
+ for( ppsz_file = ppsz_filelist; ppsz_file < ppsz_fileend;
+ ppsz_file++ )
+ free( *ppsz_file );
+ free( ppsz_filelist );
+ }
+ vlclua_dir_list_free( ppsz_dir_list );
+ return VLC_PROBE_CONTINUE;
+error:
+ if( ppsz_filelist )
+ {
+ for( ppsz_file = ppsz_filelist; ppsz_file < ppsz_fileend;
+ ppsz_file++ )
+ free( *ppsz_file );
+ free( ppsz_filelist );
+ }
+ vlclua_dir_list_free( ppsz_dir_list );
+ return VLC_ENOMEM;
+}