/***************************************************************************** * outputs_Close : Close all outputs and free allocated memory *****************************************************************************/ void outputs_Close( int i_num_outputs ) { int i; for ( i = 0; i < i_num_outputs; i++ ) { output_t *p_output = pp_outputs[i]; if ( p_output->config.i_config & OUTPUT_VALID ) { msg_Dbg( NULL, "removing %s", p_output->config.psz_displayname ); if ( p_output->p_packets ) output_Flush( p_output ); output_Close( p_output ); } free( p_output ); } free( pp_outputs ); }
void config_ReadFile(void) { FILE *p_file; char psz_line[2048]; int i; if ( psz_conf_file == NULL ) { msg_Err( NULL, "no config file" ); return; } if ( (p_file = fopen( psz_conf_file, "r" )) == NULL ) { msg_Err( NULL, "can't fopen config file %s", psz_conf_file ); return; } while ( fgets( psz_line, sizeof(psz_line), p_file ) != NULL ) { output_config_t config; output_t *p_output; char *psz_token, *psz_parser; psz_parser = strchr( psz_line, '#' ); if ( psz_parser != NULL ) *psz_parser-- = '\0'; while ( psz_parser >= psz_line && isblank( *psz_parser ) ) *psz_parser-- = '\0'; if ( psz_line[0] == '\0' ) continue; config_Defaults( &config ); psz_token = strtok_r( psz_line, "\t\n ", &psz_parser ); if ( psz_token == NULL || !config_ParseHost( &config, psz_token )) { config_Free( &config ); continue; } psz_token = strtok_r( NULL, "\t\n ", &psz_parser ); if ( psz_token == NULL ) { config_Free( &config ); continue; } if( atoi( psz_token ) == 1 ) config.i_config |= OUTPUT_WATCH; else config.i_config &= ~OUTPUT_WATCH; psz_token = strtok_r( NULL, "\t\n ", &psz_parser ); if ( psz_token == NULL ) { config_Free( &config ); continue; } if ( psz_token[0] == '*' ) { config.b_passthrough = true; } else { config.i_sid = strtol(psz_token, NULL, 0); psz_token = strtok_r( NULL, "\t\n ", &psz_parser ); if ( psz_token != NULL ) { psz_parser = NULL; for ( ; ; ) { psz_token = strtok_r( psz_token, ",", &psz_parser ); if ( psz_token == NULL ) break; config.pi_pids = realloc( config.pi_pids, (config.i_nb_pids + 1) * sizeof(uint16_t) ); config.pi_pids[config.i_nb_pids++] = strtol(psz_token, NULL, 0); psz_token = NULL; } } } config_Print( &config ); p_output = output_Find( &config ); if ( p_output == NULL ) p_output = output_Create( &config ); if ( p_output != NULL ) { free( p_output->config.psz_displayname ); p_output->config.psz_displayname = strdup( config.psz_displayname ); config.i_config |= OUTPUT_VALID | OUTPUT_STILL_PRESENT; output_Change( p_output, &config ); demux_Change( p_output, &config ); } config_Free( &config ); } fclose( p_file ); for ( i = 0; i < i_nb_outputs; i++ ) { output_t *p_output = pp_outputs[i]; output_config_t config; config_Init( &config ); if ( (p_output->config.i_config & OUTPUT_VALID) && !(p_output->config.i_config & OUTPUT_STILL_PRESENT) ) { msg_Dbg( NULL, "closing %s", p_output->config.psz_displayname ); demux_Change( p_output, &config ); output_Close( p_output ); } p_output->config.i_config &= ~OUTPUT_STILL_PRESENT; config_Free( &config ); } }