⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 http.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 5 页
字号:
/***************************************************************************** * 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 + -