63
68
#define PASS_TEXT N_("Password")
64
69
#define PASS_LONGTEXT N_("Password that will be " \
65
70
"requested to access the stream." )
67
/// \bug [String] missing closing parenthesis
68
71
#define MIME_TEXT N_("Mime")
69
72
#define MIME_LONGTEXT N_("MIME returned by the server (autodetected " \
73
"if not specified)." )
72
74
#define CERT_TEXT N_( "Certificate file" )
73
75
#define CERT_LONGTEXT N_( "Path to the x509 PEM certificate file that will "\
74
76
"be used for HTTPS." )
99
101
set_category( CAT_SOUT );
100
102
set_subcategory( SUBCAT_SOUT_ACO );
101
103
add_string( SOUT_CFG_PREFIX "user", "", NULL,
102
USER_TEXT, USER_LONGTEXT, VLC_TRUE );
104
USER_TEXT, USER_LONGTEXT, true );
103
105
add_string( SOUT_CFG_PREFIX "pwd", "", NULL,
104
PASS_TEXT, PASS_LONGTEXT, VLC_TRUE );
106
PASS_TEXT, PASS_LONGTEXT, true );
105
107
add_string( SOUT_CFG_PREFIX "mime", "", NULL,
106
MIME_TEXT, MIME_LONGTEXT, VLC_TRUE );
108
MIME_TEXT, MIME_LONGTEXT, true );
107
109
add_string( SOUT_CFG_PREFIX "cert", "vlc.pem", NULL,
108
CERT_TEXT, CERT_LONGTEXT, VLC_TRUE );
110
CERT_TEXT, CERT_LONGTEXT, true );
109
111
add_string( SOUT_CFG_PREFIX "key", NULL, NULL,
110
KEY_TEXT, KEY_LONGTEXT, VLC_TRUE );
112
KEY_TEXT, KEY_LONGTEXT, true );
111
113
add_string( SOUT_CFG_PREFIX "ca", NULL, NULL,
112
CA_TEXT, CA_LONGTEXT, VLC_TRUE );
114
CA_TEXT, CA_LONGTEXT, true );
113
115
add_string( SOUT_CFG_PREFIX "crl", NULL, NULL,
114
CRL_TEXT, CRL_LONGTEXT, VLC_TRUE );
115
add_bool( SOUT_CFG_PREFIX "bonjour", VLC_FALSE, NULL,
116
BONJOUR_TEXT, BONJOUR_LONGTEXT, VLC_TRUE);
116
CRL_TEXT, CRL_LONGTEXT, true );
117
add_bool( SOUT_CFG_PREFIX "bonjour", false, NULL,
118
BONJOUR_TEXT, BONJOUR_LONGTEXT, true);
117
119
set_callbacks( Open, Close );
118
120
vlc_module_end();
121
123
/*****************************************************************************
122
124
* Exported prototypes
123
125
*****************************************************************************/
124
static const char *ppsz_sout_options[] = {
126
static const char *const ppsz_sout_options[] = {
125
127
"user", "pwd", "mime", "cert", "key", "ca", "crl", NULL
128
static int Write( sout_access_out_t *, block_t * );
130
static ssize_t Write( sout_access_out_t *, block_t * );
129
131
static int Seek ( sout_access_out_t *, off_t );
131
133
struct sout_access_out_sys_t
163
165
char *psz_user = NULL;
164
166
char *psz_pwd = NULL;
165
167
char *psz_mime = NULL;
166
const char *psz_cert = NULL, *psz_key = NULL, *psz_ca = NULL,
168
char *psz_cert = NULL, *psz_key = NULL, *psz_ca = NULL,
170
172
if( !( p_sys = p_access->p_sys =
171
173
malloc( sizeof( sout_access_out_sys_t ) ) ) )
173
msg_Err( p_access, "Not enough memory" );
174
174
return VLC_ENOMEM ;
177
sout_CfgParse( p_access, SOUT_CFG_PREFIX, ppsz_sout_options, p_access->p_cfg );
179
/* p_access->psz_name = "hostname:port/filename" */
180
psz_bind_addr = psz_parser = strdup( p_access->psz_name );
176
config_ChainParse( p_access, SOUT_CFG_PREFIX, ppsz_sout_options, p_access->p_cfg );
178
/* p_access->psz_path = "hostname:port/filename" */
179
psz_bind_addr = psz_parser = strdup( p_access->psz_path );
185
while( *psz_parser && *psz_parser != ':' && *psz_parser != '/' )
189
if( *psz_parser == ':' )
193
i_bind_port = atoi( psz_parser );
195
while( *psz_parser && *psz_parser != '/' )
200
if( *psz_parser == '/' )
204
psz_file_name = psz_parser;
207
if( !*psz_file_name )
183
psz_parser = strchr( psz_bind_addr, '/' );
186
psz_file_name = strdup( psz_parser );
209
190
psz_file_name = strdup( "/" );
211
else if( *psz_file_name != '/' )
192
if( psz_bind_addr[0] == '[' )
213
char *p = psz_file_name;
215
psz_file_name = malloc( strlen( p ) + 2 );
216
strcpy( psz_file_name, "/" );
217
strcat( psz_file_name, p );
195
psz_parser = strstr( psz_bind_addr, "]:" );
199
i_bind_port = atoi( psz_parser + 2 );
201
psz_parser = psz_bind_addr - 1;
221
psz_file_name = strdup( psz_file_name );
205
psz_parser = strrchr( psz_bind_addr, ':' );
209
i_bind_port = atoi( psz_parser + 1 );
211
psz_parser = psz_bind_addr;
224
214
/* SSL support */
242
232
psz_bind_addr, i_bind_port,
243
233
psz_cert, psz_key, psz_ca,
245
240
if( p_sys->p_httpd_host == NULL )
247
msg_Err( p_access, "cannot listen on %s:%d",
242
msg_Err( p_access, "cannot listen on %s port %d",
248
243
psz_bind_addr, i_bind_port );
249
244
free( psz_file_name );
250
free( psz_bind_addr );
252
247
return VLC_EGENERIC;
254
free( psz_bind_addr );
256
251
if( p_access->psz_access && !strcmp( p_access->psz_access, "mmsh" ) )
281
276
p_sys->p_httpd_stream =
282
277
httpd_StreamNew( p_sys->p_httpd_host, psz_file_name, psz_mime,
283
278
psz_user, psz_pwd, NULL );
284
if( psz_user ) free( psz_user );
285
if( psz_pwd ) free( psz_pwd );
286
if( psz_mime ) free( psz_mime );
288
283
if( p_sys->p_httpd_stream == NULL )
298
293
#ifdef HAVE_AVAHI_CLIENT
299
294
if( config_GetInt(p_this, SOUT_CFG_PREFIX "bonjour") )
301
playlist_t *p_playlist;
302
296
char *psz_txt, *psz_name;
304
p_playlist = (playlist_t *)vlc_object_find( p_access,
307
if( p_playlist == NULL )
309
msg_Err( p_access, "unable to find playlist" );
310
httpd_StreamDelete( p_sys->p_httpd_stream );
311
httpd_HostDelete( p_sys->p_httpd_host );
312
free( (void *)p_sys );
316
psz_name = strrchr( p_playlist->status.p_item->input.psz_uri,
317
DIRECTORY_SEPARATOR );
297
playlist_t *p_playlist = pl_Yield( p_access );
299
char *psz_uri = input_item_GetURI( p_playlist->status.p_item->p_input );
300
char *psz_newuri = psz_uri;
301
psz_name = strrchr( psz_newuri, DIRECTORY_SEPARATOR );
318
302
if( psz_name != NULL ) psz_name++;
319
else psz_name = p_playlist->status.p_item->input.psz_uri;
303
else psz_name = psz_newuri;
321
asprintf( &psz_txt, "path=%s", psz_file_name );
306
asprintf( &psz_txt, "path=%s", psz_file_name ) == -1 )
308
pl_Release( p_access );
323
313
p_sys->p_bonjour = bonjour_start_service( (vlc_object_t *)p_access,
324
314
strcmp( p_access->psz_access, "https" )
325
315
? "_vlc-http._tcp" : "_vlc-https._tcp",
326
psz_name, i_bind_port, psz_txt );
327
free( (void *)psz_txt );
316
psz_name, i_bind_port, psz_txt );
329
320
if( p_sys->p_bonjour == NULL )
331
msg_Err( p_access, "Avahi stream announcing was requested, but no avahi service could be started" );
333
vlc_object_release( p_playlist );
321
msg_Err( p_access, "unable to start requested Bonjour announce" );
322
pl_Release( p_access );
336
325
p_sys->p_bonjour = NULL;