ラベル uhttpd の投稿を表示しています。 すべての投稿を表示
ラベル uhttpd の投稿を表示しています。 すべての投稿を表示

2012年5月21日月曜日

strncat

http://www9.plala.or.jp/sgwr-t/lib/strncat.html

ライブラリ関数の細かいところで何があるのか忘れてるのでリファレンス的な何かが無いかと検索したところなにやらstrncatの使い方が気になりました。

strncat(buffer, index_file, sizeof(buffer));

となっている部分。
これってbufferのサイズを超えてセットされませんかねぇ…
検索して引っかかったページの仕様とgccのライブラリの仕様が違うのかな?

どんな解釈が一般的だったかとかもあやしいのですけど。

delphiの解説で引っかかったページでは
#include <stdio.h>
#include <string.h>

void main(void)
{
 char *buf1="Borland";
 char buf2[]=" Delphi";
 
 strncat(buf1,buf2,strlen(buf2));
 printf("連結後:%s\n",buf1);
 getchar();

}
とかサンプルコードが載ってますけど、これこんなことしちゃいかんような(笑)
思いっきりリテラル領域を壊してる気がしますけどねw

いや…やりたいことは違うことなんですが。

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などの設定ファイルから取得するようになっているようでした。(細かくは見ていませんが)

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