X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcontrol%2Fhttp%2Futil.c;h=f3ee86579e3d611a2ac86e02ac68b19f3bf87cf1;hb=37a4d52044737bfaac6140a8e0a65d8f4e22987d;hp=869b88a14173d58feb8a569807ed492db4972343;hpb=6357ef21dad440a183e54e942828cd18d8505b19;p=vlc diff --git a/modules/control/http/util.c b/modules/control/http/util.c index 869b88a141..f3ee86579e 100644 --- a/modules/control/http/util.c +++ b/modules/control/http/util.c @@ -29,7 +29,11 @@ #include #include "http.h" -#include "vlc_strings.h" +#include +#include +#include +#include +#include /**************************************************************************** * File and directory functions @@ -90,11 +94,12 @@ int FileLoad( FILE *f, char **pp_data, int *pi_data ) /* just load the file */ *pi_data = 0; - *pp_data = malloc( 1025 ); /* +1 for \0 */ + *pp_data = xmalloc( 1025 ); /* +1 for \0 */ + while( ( i_read = fread( &(*pp_data)[*pi_data], 1, 1024, f ) ) == 1024 ) { *pi_data += 1024; - *pp_data = realloc( *pp_data, *pi_data + 1025 ); + *pp_data = xrealloc( *pp_data, *pi_data + 1025 ); } if( i_read > 0 ) { @@ -120,15 +125,7 @@ int ParseDirectory( intf_thread_t *p_intf, char *psz_root, int i_dirlen; - char sep; - -#if defined( WIN32 ) - sep = '\\'; -#else - sep = '/'; -#endif - - if( ( p_dir = utf8_opendir( psz_dir ) ) == NULL ) + if( ( p_dir = vlc_opendir( psz_dir ) ) == NULL ) { if( errno != ENOENT && errno != ENOTDIR ) msg_Err( p_intf, "cannot open directory (%s)", psz_dir ); @@ -145,8 +142,8 @@ int ParseDirectory( intf_thread_t *p_intf, char *psz_root, msg_Dbg( p_intf, "dir=%s", psz_dir ); - snprintf( dir, sizeof( dir ), "%s%c.access", psz_dir, sep ); - if( ( file = utf8_fopen( dir, "r" ) ) != NULL ) + snprintf( dir, sizeof( dir ), "%s"DIR_SEP".access", psz_dir ); + if( ( file = vlc_fopen( dir, "r" ) ) != NULL ) { char line[1024]; int i_size; @@ -173,21 +170,22 @@ int ParseDirectory( intf_thread_t *p_intf, char *psz_root, password = strdup( p ); } } - msg_Dbg( p_intf, "using user=%s password=%s (read=%d)", - user, password, i_size ); + msg_Dbg( p_intf, "using user=%s (read=%d)", user, i_size ); fclose( file ); } - snprintf( dir, sizeof( dir ), "%s%c.hosts", psz_dir, sep ); + snprintf( dir, sizeof( dir ), "%s"DIR_SEP".hosts", psz_dir ); p_acl = ACL_Create( p_intf, false ); if( ACL_LoadFile( p_acl, dir ) ) { ACL_Destroy( p_acl ); struct stat st; - if( stat( dir, &st ) == 0 ) + if( vlc_stat( dir, &st ) == 0 ) { + free( user ); + free( password ); closedir( p_dir ); return VLC_EGENERIC; } @@ -198,7 +196,7 @@ int ParseDirectory( intf_thread_t *p_intf, char *psz_root, { char *psz_filename; /* parse psz_src dir */ - if( ( psz_filename = utf8_readdir( p_dir ) ) == NULL ) + if( ( psz_filename = vlc_readdir( p_dir ) ) == NULL ) { break; } @@ -210,7 +208,7 @@ int ParseDirectory( intf_thread_t *p_intf, char *psz_root, continue; } - snprintf( dir, sizeof( dir ), "%s%c%s", psz_dir, sep, psz_filename ); + snprintf( dir, sizeof( dir ), "%s"DIR_SEP"%s", psz_dir, psz_filename ); free( psz_filename ); if( ParseDirectory( p_intf, psz_root, dir ) ) @@ -239,7 +237,7 @@ int ParseDirectory( intf_thread_t *p_intf, char *psz_root, } if( f == NULL ) { - f = malloc( sizeof( httpd_file_sys_t ) ); + f = xmalloc( sizeof( httpd_file_sys_t ) ); f->b_handler = false; } @@ -352,11 +350,12 @@ void PlaylistListNode( intf_thread_t *p_intf, playlist_t *p_pl, { char value[512]; char *psz; - mvar_t *itm = mvar_New( name, "set" ); playlist_item_t * p_item = playlist_CurrentPlayingItem( p_pl ); if( !p_item || !p_item->p_input ) return; - if( p_item->p_input->i_id == p_node->p_input->i_id ) + + mvar_t *itm = mvar_New( name, "set" ); + if( p_item->p_input == p_node->p_input ) mvar_AppendNewVar( itm, "current", "1" ); else mvar_AppendNewVar( itm, "current", "0" ); @@ -372,8 +371,7 @@ void PlaylistListNode( intf_thread_t *p_intf, playlist_t *p_pl, mvar_AppendNewVar( itm, "uri", psz ); free( psz ); - sprintf( value, "Item"); - mvar_AppendNewVar( itm, "type", value ); + mvar_AppendNewVar( itm, "type", "Item" ); sprintf( value, "%d", i_depth ); mvar_AppendNewVar( itm, "depth", value ); @@ -383,10 +381,75 @@ void PlaylistListNode( intf_thread_t *p_intf, playlist_t *p_pl, else mvar_AppendNewVar( itm, "ro", "rw" ); - sprintf( value, "%ld", - (long) input_item_GetDuration( p_node->p_input ) ); + sprintf( value, "%"PRId64, input_item_GetDuration( p_node->p_input ) ); mvar_AppendNewVar( itm, "duration", value ); + //Adding extra meta-information to each playlist item + + psz = input_item_GetTitle( p_node->p_input ); + mvar_AppendNewVar( itm, "title", psz ); + free( psz ); + + psz = input_item_GetArtist( p_node->p_input ); + mvar_AppendNewVar( itm, "artist", psz ); + free( psz ); + + psz = input_item_GetGenre( p_node->p_input ); + mvar_AppendNewVar( itm, "genre", psz ); + free( psz ); + + psz = input_item_GetCopyright( p_node->p_input ); + mvar_AppendNewVar( itm, "copyright", psz ); + free( psz ); + + psz = input_item_GetAlbum( p_node->p_input ); + mvar_AppendNewVar( itm, "album", psz ); + free( psz ); + + psz = input_item_GetTrackNum( p_node->p_input ); + mvar_AppendNewVar( itm, "track", psz ); + free( psz ); + + psz = input_item_GetDescription( p_node->p_input ); + mvar_AppendNewVar( itm, "description", psz ); + free( psz ); + + psz = input_item_GetRating( p_node->p_input ); + mvar_AppendNewVar( itm, "rating", psz ); + free( psz ); + + psz = input_item_GetDate( p_node->p_input ); + mvar_AppendNewVar( itm, "date", psz ); + free( psz ); + + psz = input_item_GetURL( p_node->p_input ); + mvar_AppendNewVar( itm, "url", psz ); + free( psz ); + + psz = input_item_GetLanguage( p_node->p_input ); + mvar_AppendNewVar( itm, "language", psz ); + free( psz ); + + psz = input_item_GetNowPlaying( p_node->p_input ); + mvar_AppendNewVar( itm, "now_playing", psz ); + free( psz ); + + psz = input_item_GetPublisher( p_node->p_input ); + mvar_AppendNewVar( itm, "publisher", psz ); + free( psz ); + + psz = input_item_GetEncodedBy( p_node->p_input ); + mvar_AppendNewVar( itm, "encoded_by", psz ); + free( psz ); + + psz = input_item_GetArtURL( p_node->p_input ); + mvar_AppendNewVar( itm, "art_url", psz ); + free( psz ); + + psz = input_item_GetTrackID( p_node->p_input ); + mvar_AppendNewVar( itm, "track_id", psz ); + free( psz ); + mvar_AppendVar( s, itm ); } else @@ -398,8 +461,7 @@ void PlaylistListNode( intf_thread_t *p_intf, playlist_t *p_pl, mvar_AppendNewVar( itm, "name", p_node->p_input->psz_name ); mvar_AppendNewVar( itm, "uri", p_node->p_input->psz_name ); - sprintf( value, "Node" ); - mvar_AppendNewVar( itm, "type", value ); + mvar_AppendNewVar( itm, "type", "Node" ); sprintf( value, "%d", p_node->i_id ); mvar_AppendNewVar( itm, "index", value ); @@ -819,14 +881,12 @@ static char *FirstOption( char *psz, char *new ) return NULL; } -input_item_t *MRLParse( intf_thread_t *p_intf, char *_psz, +input_item_t *MRLParse( intf_thread_t *p_intf, const char *mrl, char *psz_name ) { - char *psz = strdup( _psz ); - char *s_mrl = psz; - char *s_temp; - input_item_t * p_input = NULL; - + char *psz = strdup( mrl ), *s_mrl = psz, *s_temp; + if( psz == NULL ) + return NULL; /* extract the mrl */ s_temp = FirstOption( s_mrl, s_mrl ); if( s_temp == NULL ) @@ -834,7 +894,9 @@ input_item_t *MRLParse( intf_thread_t *p_intf, char *_psz, s_temp = s_mrl + strlen( s_mrl ); } - p_input = input_item_New( p_intf, s_mrl, psz_name ); + input_item_t *p_input = input_item_New( p_intf, s_mrl, psz_name ); + if( p_input == NULL ) + return NULL; s_mrl = s_temp; /* now we can take care of the options */ @@ -847,11 +909,10 @@ input_item_t *MRLParse( intf_thread_t *p_intf, char *_psz, { s_temp = s_mrl + strlen( s_mrl ); } - input_item_AddOption( p_input, s_mrl ); + input_item_AddOption( p_input, s_mrl, VLC_INPUT_OPTION_TRUSTED ); s_mrl = s_temp; } - free( psz ); return p_input; } @@ -863,13 +924,12 @@ char *RealPath( const char *psz_src ) char *psz_dir; char *p; int i_len = strlen(psz_src); - const char sep = DIR_SEP_CHAR; - psz_dir = malloc( i_len + 2 ); + psz_dir = xmalloc( i_len + 2 ); strcpy( psz_dir, psz_src ); /* Add a trailing sep to ease the .. step */ - psz_dir[i_len] = sep; + psz_dir[i_len] = DIR_SEP_CHAR; psz_dir[i_len + 1] = '\0'; #if (DIR_SEP_CHAR != '/') @@ -877,18 +937,18 @@ char *RealPath( const char *psz_src ) p = psz_dir; while( (p = strchr( p, '/' )) != NULL ) { - *p = sep; + *p = DIR_SEP_CHAR; } #endif /* FIXME: this could be O(N) rather than O(N²)... */ /* Remove multiple separators and /./ */ p = psz_dir; - while( (p = strchr( p, sep )) != NULL ) + while( (p = strchr( p, DIR_SEP_CHAR )) != NULL ) { - if( p[1] == sep ) + if( p[1] == DIR_SEP_CHAR ) memmove( &p[1], &p[2], strlen(&p[2]) + 1 ); - else if( p[1] == '.' && p[2] == sep ) + else if( p[1] == '.' && p[2] == DIR_SEP_CHAR ) memmove( &p[1], &p[3], strlen(&p[3]) + 1 ); else p++; @@ -896,23 +956,26 @@ char *RealPath( const char *psz_src ) if( psz_dir[0] == '~' ) { - char *dir; - asprintf( &dir, "%s%s", config_GetHomeDir(), psz_dir + 1 ); - free( psz_dir ); - psz_dir = dir; + char *home = config_GetUserDir( VLC_HOME_DIR ), *dir; + if( asprintf( &dir, "%s%s", home, psz_dir + 1 ) != -1 ) + { + free( psz_dir ); + psz_dir = dir; + } + free( home ); } if( strlen(psz_dir) > 2 ) { /* Fix all .. dir */ p = psz_dir + 3; - while( (p = strchr( p, sep )) != NULL ) + while( (p = strchr( p, DIR_SEP_CHAR )) != NULL ) { - if( p[-1] == '.' && p[-2] == '.' && p[-3] == sep ) + if( p[-1] == '.' && p[-2] == '.' && p[-3] == DIR_SEP_CHAR ) { char *q; p[-3] = '\0'; - if( (q = strrchr( psz_dir, sep )) != NULL ) + if( (q = strrchr( psz_dir, DIR_SEP_CHAR )) != NULL ) { memmove( q + 1, p + 1, strlen(p + 1) + 1 ); p = q + 1; @@ -930,8 +993,8 @@ char *RealPath( const char *psz_src ) /* Remove trailing sep if there are at least 2 sep in the string * (handles the C:\ stuff) */ - p = strrchr( psz_dir, sep ); - if( p != NULL && p[1] == '\0' && p != strchr( psz_dir, sep ) ) + p = strrchr( psz_dir, DIR_SEP_CHAR ); + if( p != NULL && p[1] == '\0' && p != strchr( psz_dir, DIR_SEP_CHAR ) ) *p = '\0'; return psz_dir;