📄 http.c
字号:
/***************************************************************************** * Run: http interface thread *****************************************************************************/static void Run( intf_thread_t *p_intf ){ intf_sys_t *p_sys = p_intf->p_sys; while( !p_intf->b_die ) { /* get the playlist */ if( p_sys->p_playlist == NULL ) { p_sys->p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); } /* Manage the input part */ if( p_sys->p_input == NULL ) { if( p_sys->p_playlist ) { p_sys->p_input = vlc_object_find( p_sys->p_playlist, VLC_OBJECT_INPUT, FIND_CHILD ); } } else if( p_sys->p_input->b_dead ) { vlc_object_release( p_sys->p_input ); p_sys->p_input = NULL; } /* Wait a bit */ msleep( INTF_IDLE_SLEEP ); } if( p_sys->p_input ) { vlc_object_release( p_sys->p_input ); p_sys->p_input = NULL; } if( p_sys->p_playlist ) { vlc_object_release( p_sys->p_playlist ); p_sys->p_playlist = NULL; }}/***************************************************************************** * Local functions *****************************************************************************/#define MAX_DIR_SIZE 10240/**************************************************************************** * FileToUrl: create a good name for an url from filename ****************************************************************************/static char *FileToUrl( char *name, vlc_bool_t *pb_index ){ char *url, *p; url = p = malloc( strlen( name ) + 1 ); if( !url || !p ) { return NULL; }#ifdef WIN32 while( *name == '\\' || *name == '/' )#else while( *name == '/' )#endif { name++; } *p++ = '/'; strcpy( p, name );#ifdef WIN32 /* convert '\\' into '/' */ name = p; while( *name ) { if( *name == '\\' ) { *p++ = '/'; } name++; }#endif *pb_index = VLC_FALSE; /* index.* -> / */ if( ( p = strrchr( url, '/' ) ) != NULL ) { if( !strncmp( p, "/index.", 7 ) ) { p[1] = '\0'; *pb_index = VLC_TRUE; } } return url;}/**************************************************************************** * ParseDirectory: parse recursively a directory, adding each file ****************************************************************************/static int ParseDirectory( intf_thread_t *p_intf, char *psz_root, char *psz_dir ){ intf_sys_t *p_sys = p_intf->p_sys; char dir[MAX_DIR_SIZE];#ifdef HAVE_SYS_STAT_H struct stat stat_info;#endif DIR *p_dir; struct dirent *p_dir_content; FILE *file; char *user = NULL; char *password = NULL;#ifdef HAVE_SYS_STAT_H if( stat( psz_dir, &stat_info ) == -1 || !S_ISDIR( stat_info.st_mode ) ) { return VLC_EGENERIC; }#endif if( ( p_dir = opendir( psz_dir ) ) == NULL ) { msg_Err( p_intf, "cannot open dir (%s)", psz_dir ); return VLC_EGENERIC; } msg_Dbg( p_intf, "dir=%s", psz_dir ); sprintf( dir, "%s/.access", psz_dir ); if( ( file = fopen( dir, "r" ) ) != NULL ) { char line[1024]; int i_size; msg_Dbg( p_intf, "find .access in dir=%s", psz_dir ); i_size = fread( line, 1, 1023, file ); if( i_size > 0 ) { char *p; while( i_size > 0 && ( line[i_size-1] == '\n' || line[i_size-1] == '\r' ) ) { i_size--; } line[i_size] = '\0'; p = strchr( line, ':' ); if( p ) { *p++ = '\0'; user = strdup( line ); password = strdup( p ); } } msg_Dbg( p_intf, "using user=%s password=%s (read=%d)", user, password, i_size ); fclose( file ); } for( ;; ) { /* parse psz_src dir */ if( ( p_dir_content = readdir( p_dir ) ) == NULL ) { break; } if( p_dir_content->d_name[0] == '.' ) { continue; } sprintf( dir, "%s/%s", psz_dir, p_dir_content->d_name ); if( ParseDirectory( p_intf, psz_root, dir ) ) { httpd_file_sys_t *f = malloc( sizeof( httpd_file_sys_t ) ); vlc_bool_t b_index; f->p_intf = p_intf; f->p_file = NULL; f->p_redir = NULL; f->p_redir2 = NULL; f->file = strdup( dir ); f->name = FileToUrl( &dir[strlen( psz_root )], &b_index ); f->b_html = strstr( &dir[strlen( psz_root )], ".htm" ) ? VLC_TRUE : VLC_FALSE; if( !f->name ) { msg_Err( p_intf , "unable to parse directory" ); closedir( p_dir ); free( f ); return( VLC_ENOMEM ); } msg_Dbg( p_intf, "file=%s (url=%s)", f->file, f->name ); f->p_file = httpd_FileNew( p_sys->p_httpd_host, f->name, f->b_html ? p_sys->psz_html_type : NULL, user, password, HttpCallback, f ); if( f->p_file ) { TAB_APPEND( p_sys->i_files, p_sys->pp_files, f ); } /* for url that ends by / add * - a redirect from rep to rep/ * - in case of index.* rep/index.html to rep/ */ if( f && f->name[strlen(f->name) - 1] == '/' ) { char *psz_redir = strdup( f->name ); char *p; psz_redir[strlen( psz_redir ) - 1] = '\0'; msg_Dbg( p_intf, "redir=%s -> %s", psz_redir, f->name ); f->p_redir = httpd_RedirectNew( p_sys->p_httpd_host, f->name, psz_redir ); free( psz_redir ); if( b_index && ( p = strstr( f->file, "index." ) ) ) { asprintf( &psz_redir, "%s%s", f->name, p ); msg_Dbg( p_intf, "redir=%s -> %s", psz_redir, f->name ); f->p_redir2 = httpd_RedirectNew( p_sys->p_httpd_host, f->name, psz_redir ); free( psz_redir ); } } } } if( user ) { free( user ); } if( password ) { free( password ); } closedir( p_dir ); return VLC_SUCCESS;}/**************************************************************************** * var and set handling ****************************************************************************/static mvar_t *mvar_New( char *name, char *value ){ mvar_t *v = malloc( sizeof( mvar_t ) ); if( !v ) return NULL; v->name = strdup( name ); v->value = strdup( value ? value : "" ); v->i_field = 0; v->field = malloc( sizeof( mvar_t * ) ); v->field[0] = NULL; return v;}static void mvar_Delete( mvar_t *v ){ int i; free( v->name ); free( v->value ); for( i = 0; i < v->i_field; i++ ) { mvar_Delete( v->field[i] ); } free( v->field ); free( v );}static void mvar_AppendVar( mvar_t *v, mvar_t *f ){ v->field = realloc( v->field, sizeof( mvar_t * ) * ( v->i_field + 2 ) ); v->field[v->i_field] = f; v->i_field++;}static mvar_t *mvar_Duplicate( mvar_t *v ){ int i; mvar_t *n; n = mvar_New( v->name, v->value ); for( i = 0; i < v->i_field; i++ ) { mvar_AppendVar( n, mvar_Duplicate( v->field[i] ) ); } return n;}static void mvar_PushVar( mvar_t *v, mvar_t *f ){ v->field = realloc( v->field, sizeof( mvar_t * ) * ( v->i_field + 2 ) ); if( v->i_field > 0 ) { memmove( &v->field[1], &v->field[0], sizeof( mvar_t * ) * v->i_field ); } v->field[0] = f; v->i_field++;}static void mvar_RemoveVar( mvar_t *v, mvar_t *f ){ int i; for( i = 0; i < v->i_field; i++ ) { if( v->field[i] == f ) { break; } } if( i >= v->i_field ) { return; } if( i + 1 < v->i_field ) { memmove( &v->field[i], &v->field[i+1], sizeof( mvar_t * ) * ( v->i_field - i - 1 ) ); } v->i_field--; /* FIXME should do a realloc */}static mvar_t *mvar_GetVar( mvar_t *s, char *name ){ int i; char base[512], *field, *p; int i_index; /* format: name[index].field */ field = strchr( name, '.' ); if( field ) { int i = field - name; strncpy( base, name, i ); base[i] = '\0'; field++; } else { strcpy( base, name ); } if( ( p = strchr( base, '[' ) ) ) { *p++ = '\0'; sscanf( p, "%d]", &i_index ); if( i_index < 0 ) { return NULL; } } else { i_index = 0; } for( i = 0; i < s->i_field; i++ ) { if( !strcmp( s->field[i]->name, base ) ) { if( i_index > 0 ) { i_index--; } else { if( field ) { return mvar_GetVar( s->field[i], field ); } else { return s->field[i]; } } } } return NULL;}static char *mvar_GetValue( mvar_t *v, char *field ){ if( *field == '\0' ) { return v->value; } else { mvar_t *f = mvar_GetVar( v, field ); if( f ) { return f->value; } else { return field; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -