#ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #ifdef HAVE_INTTYPES_H #include #else #include #endif #include /* offsetof(3) */ #include #include /* chmod(2) */ #include #include #include #include #include /* strdup(3) */ #include /* basename(3) */ #include /* tolower(3) */ #include #include #include #include #include #include #include #include #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static void free_resources( void ) { if( config ) free_config(); } int main( int argc, char *argv[] ) { __mctx_init(); setlocale( LC_ALL, "" ); #if ENABLE_NLS == 1 bindtextdomain( PACKAGE, LOCALEDIR ); textdomain( PACKAGE ); #endif csvn_prepare_context(); /************************ define error handlers: */ system_fatal = fatal_html; wrapper_fatal = fatal_html; dlist_fatal = fatal_html; rlist_fatal = fatal_html; http_fatal = fatal_html; html_fatal = fatal_html; if( !(config = read_config()) ) { fatal_html( "cannot read config file: /dev/shm%s", CSVN_SHM_BCF ); free_resources(); exit( 1 ); } csvn_parse_query(); csvn_prepare_template_variables(); if( ctx.page.status == 404 ) { csvn_print_404_page(); csvn_release_template_variables(); free_resources(); return 0; } if( !strcmp( ctx.vars.page_type, ptype_repolist ) ) { if( ctx.query.search && *ctx.query.search ) { csvn_search_repo( ctx.query.search ); } csvn_print_repolist_page(); } else if( !strcmp( ctx.vars.page_type, ptype_repo ) ) { if( ctx.query.operation && *ctx.query.operation && !strcmp( ctx.query.operation, "diff" ) ) { csvn_print_diff_page(); } else if( ctx.query.operation && *ctx.query.operation && !strcmp( ctx.query.operation, "log" ) ) { csvn_print_log_page(); } else if( ctx.repo.relative_info.kind == KIND_FILE ) { if( ctx.query.operation && *ctx.query.operation && !strcmp( ctx.query.operation, "blame" ) ) { csvn_print_blame_page(); } else { csvn_print_file_page(); } } else if( ctx.repo.relative_info.kind == KIND_DIR ) { csvn_print_tree_page(); } else { csvn_print_repolist_page(); } } #if 0 { struct strbuf buf = STRBUF_INIT; strbuf_addf( &buf, "
\n" ); strbuf_addf( &buf, "
\n" ); strbuf_addf( &buf, "
\n" ); strbuf_addf( &buf, "
HTTP_HOST = %s\n", ctx.env.http_host );
    strbuf_addf( &buf, "HTTPS = %s\n", ctx.env.https );
    strbuf_addf( &buf, "NO_HTTP = %s\n", ctx.env.no_http );
    strbuf_addf( &buf, "PATH_INFO = %s\n", ctx.env.path_info );
    strbuf_addf( &buf, "QUERY_STRING = %s\n", ctx.env.query_string );
    strbuf_addf( &buf, "REQUEST_URI = %s\n", ctx.env.request_uri );
    strbuf_addf( &buf, "REQUEST_SCHEME = %s\n", ctx.env.request_scheme );
    strbuf_addf( &buf, "REQUEST_METHOD = %s\n", ctx.env.request_method );
    strbuf_addf( &buf, "SCRIPT_NAME = %s\n", ctx.env.script_name );
    strbuf_addf( &buf, "SERVER_NAME = %s\n", ctx.env.server_name );
    strbuf_addf( &buf, "SERVER_PORT = %s\n", ctx.env.server_port );
    strbuf_addf( &buf, "HTTP_COOKIE = %s\n", ctx.env.http_cookie );
    strbuf_addf( &buf, "CONTENT_LENGTH = %d\n", ctx.env.content_lenght );
    strbuf_addf( &buf, "HTTP_ROOT = %s\n", ctx.env.http_root );

    strbuf_addf( &buf, "\naddition:\n" );
    strbuf_addf( &buf, "DOCUMENT_ROOT = %s\n", getenv("DOCUMENT_ROOT") );
    strbuf_addf( &buf, "DOCUMENT_URI = %s\n", getenv("DOCUMENT_URI") );
    strbuf_addf( &buf, "PATH_TRANSLATED = %s\n", getenv("PATH_TRANSLATED") );
    strbuf_addf( &buf, "SERVER_SOFTWARE = %s\n", getenv("SERVER_SOFTWARE") );
    strbuf_addf( &buf, "SERVER_PROTOCOL = %s\n", getenv("SERVER_PROTOCOL") );
    strbuf_addf( &buf, "SERVER_ADDR = %s\n", getenv("SERVER_ADDR") );
    strbuf_addf( &buf, "REMOTE_ADDR = %s\n", getenv("REMOTE_ADDR") );
    strbuf_addf( &buf, "GATEWAY_INTERFACE = %s\n", getenv("GATEWAY_INTERFACE") );
    strbuf_addf( &buf, "SERVER_PROTOCOL = %s\n", getenv("SERVER_PROTOCOL") );

    strbuf_addf( &buf, "\nctx:\n" );
    strbuf_addf( &buf, "ctx.query.ofs = %d;\n", ctx.query.ofs );
    strbuf_addf( &buf, "ctx.query.rev = %d;\n", ctx.query.rev );
    strbuf_addf( &buf, "ctx.query.revision = '%s';\n", ctx.query.revision );
    strbuf_addf( &buf, "ctx.query.operation = '%s';\n", ctx.query.operation );
    strbuf_addf( &buf, "ctx.query.search = '%s';\n", ctx.query.search );
    strbuf_addf( &buf, "\n" );
    strbuf_addf( &buf, "ctx.repo.name = %s\n", ctx.repo.name );
    strbuf_addf( &buf, "ctx.repo.repo_root = %s\n", ctx.repo.repo_root );
    strbuf_addf( &buf, "ctx.repo.info = {\n" );
    switch( ctx.repo.info.kind )
    {
      case KIND_DIR:
        strbuf_addf( &buf, "  kind = '%s';\n", "dir" );
        break;
      case KIND_FILE:
        strbuf_addf( &buf, "  kind = '%s';\n", "file" );
        break;
      default:
        strbuf_addf( &buf, "  kind = '%s';\n", "unknown" );
        break;
    }
    strbuf_addf( &buf, "  revision = %d;\n", ctx.repo.info.revision );
    strbuf_addf( &buf, "  author = '%s';\n", ctx.repo.info.author );
    strbuf_addf( &buf, "  date = %"PRIdMAX";\n", ctx.repo.info.date );
    strbuf_addf( &buf, "  mime = '%s';\n", ctx.repo.info.mime );
    strbuf_addf( &buf, "  lang = '%s';\n", ctx.repo.info.lang );
    strbuf_addf( &buf, "}\n" );

    strbuf_addf( &buf, "ctx.repo.relative_path = %s\n", ctx.repo.relative_path );
    strbuf_addf( &buf, "ctx.repo.relative_info = {\n" );
    switch( ctx.repo.relative_info.kind )
    {
      case KIND_DIR:
        strbuf_addf( &buf, "  kind = '%s';\n", "dir" );
        break;
      case KIND_FILE:
        strbuf_addf( &buf, "  kind = '%s';\n", "file" );
        break;
      default:
        strbuf_addf( &buf, "  kind = '%s';\n", "unknown" );
        break;
    }
    strbuf_addf( &buf, "  revision = %d;\n", ctx.repo.relative_info.revision );
    strbuf_addf( &buf, "  author = '%s';\n", ctx.repo.relative_info.author );
    strbuf_addf( &buf, "  date = %"PRIdMAX";\n", ctx.repo.relative_info.date );
    strbuf_addf( &buf, "  mime = '%s';\n", ctx.repo.relative_info.mime );
    strbuf_addf( &buf, "  lang = '%s';\n", ctx.repo.relative_info.lang );
    strbuf_addf( &buf, "}\n" );

    strbuf_addf( &buf, "ctx.repo.relative_href = %s\n", ctx.repo.relative_href );
    strbuf_addf( &buf, "ctx.repo.relative_html = %s\n", ctx.repo.relative_html );

    strbuf_addf( &buf, "ctx.repo.trunk = %s\n", ctx.repo.trunk );
    strbuf_addf( &buf, "ctx.repo.branches = %s\n", ctx.repo.branches );
    strbuf_addf( &buf, "ctx.repo.tags = %s\n", ctx.repo.tags );
    strbuf_addf( &buf, "ctx.repo.checkout_ro_prefix = %s\n", ctx.repo.checkout_ro_prefix );
    strbuf_addf( &buf, "ctx.repo.checkout_prefix = %s\n", ctx.repo.checkout_prefix );
    strbuf_addf( &buf, "ctx.repo.nbranches = %d\n", ctx.repo.nbranches );
    strbuf_addf( &buf, "ctx.repo.ntags = %d\n", ctx.repo.ntags );

    strbuf_addf( &buf, "ctx.vers.subversion = %s\n", ctx.vers.subversion );
    strbuf_addf( &buf, "ctx.vers.nginx = %s\n", ctx.vers.nginx );
    strbuf_addf( &buf, "ctx.vers.csvn = %s\n", ctx.vers.csvn );

    strbuf_addf( &buf, "
\n" ); print_config( &buf, config ); strbuf_addf( &buf, "
\n" ); strbuf_addf( &buf, "
\n" ); strbuf_addf( &buf, "
\n" ); ctx.page.size = buf.len; strbuf_write( &buf, STDOUT_FILENO ); strbuf_release( &buf ); } #endif csvn_release_template_variables(); free_resources(); return 0; }