2012年5月18日金曜日

uhttpd: index_pageの指定は一つしかできない

昨日uhttpdでindex_pageの指定で複数のファイル名を設定できたと勘違いして記事を書いてみたのですが後から見直すとどうもやはり一つしか対応できないようで、本格的にソースを見てみました。

まずソースは/package/uhttpd/srcの中にあり適当に見てみます。
$ grep "index.html" *
uhttpd-utils.c: "index.html",
コンスタントで定義されているのはuhttpd-utils.cの中ということがわかります。
static char *uh_index_files[] = {
    "index.html",
    "index.htm",
    "default.html",
    "default.htm"
};
と定義されています。確かに4つデフォルト値が配列として定義されているようです。
次にuh_index_filesはどこで使われているかというと、
 $ grep "uh_index_files" *
uhttpd-utils.c:static char *uh_index_files[] = {
uhttpd-utils.c:                         for( i = 0; i < array_size(uh_index_files); i++ )
uhttpd-utils.c:                                 strncat(buffer, uh_index_files[i], sizeof(buffer));
同ファイルの中で使用されているというのはわかります。
その部分を実際に見てみると
            else if( cl->server->conf->index_file )
            {
                strncat(buffer, cl->server->conf->index_file, sizeof(buffer));

                if( !stat(buffer, &s) && (s.st_mode & S_IFREG) )
                {
                    memcpy(path_phys, buffer, sizeof(path_phys));
                    memcpy(&p.stat, &s, sizeof(p.stat));
                }
            }
            else
            {
                for( i = 0; i < array_size(uh_index_files); i++ )
                {
                    strncat(buffer, uh_index_files[i], sizeof(buffer));

                    if( !stat(buffer, &s) && (s.st_mode & S_IFREG) )
                    {
                        memcpy(path_phys, buffer, sizeof(path_phys));
                        memcpy(&p.stat, &s, sizeof(p.stat));
                        break;
                    }

                    *pathptr = 0;
                }
            }
ここで残念なことが発覚します。
定義されているものは配列でcl->server->conf->index_fileが定義されている場合はどうやら一つしか対応できないようです。

必死に複数の指定をしていたのですが残念な結果となりました。
蛇足ですがこの index_fileは2箇所で設定されていてコマンドラインの引数と/etc/httpd.confなどの設定ファイルから取得するようになっているようでした。(細かくは見ていませんが)

やはりソースを見るのが一番早いですね。

0 件のコメント:

コメントを投稿