Namazu-devel-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: 2003/11/07 -> 2003/11/08 update gets no Warning



寺西です。

Tadamasa Teranishi wrote:
> 
> パス指定なしで起動した際に、きちんと namazu.cgi のあるディレクトリを
> 取り出せるようにデバッグすることも必要かと。

ということで、作ってみました。

static int get_program_pathname(char *dest, const char *program);

#define PATH_SEPARATOR ":"

static int
get_program_pathname(char *dest, const char *program)
{
    int i;
    char *path, *p;
    int win32 = 0;
#if  defined(_WIN32) || defined(__EMX__)
    win32 = 1;
#endif

    dest[0] = '\0';

    for (i = strlen(program) - 1; i >= 0; i--) {
        if (program[i] == '/' || (win32 && program[i] == '\\')) {
            return -1;
        }
    }

    path = getenv("PATH");

    p = strtok(path, PATH_SEPARATOR);
    while(p) {
        if (strlen(p) + strlen(program) + 1 < BUFSIZE) {
            strncpy(dest, p, BUFSIZE - 1);
            strncat(dest, "/", BUFSIZE - strlen(dest) - 1);
            strncat(dest, program, BUFSIZE - strlen(dest) - 1);
            dest[BUFSIZE - 1] = '\0';

            if (nmz_is_file_exists(dest)) {
                int i;

                for (i = strlen(dest) - 1; i >= 0; i--) {
                    if (dest[i] == '/' || (win32 && dest[i] == '\\')) {
                        dest[i + 1] = '\0';
                        return 0;
                    }
                }
                return -1;
            }
        }
        else {
            return -1;
        }

        p = strtok(NULL, PATH_SEPARATOR);
    }

    return -1;
}

src/namazu-cgi.c の combine_pathname() 呼び出し部分を以下のように
変えれば良いものと思います。

    if (get_program_pathname(fname, argv[0]) == 0) {
        strncat(fname, ".namazurc", BUFSIZE - strlen(fname) - 1);
        fname[BUFSIZE - 1] = '\0';
    }
    else {
        combine_pathname(fname, argv[0], ".namazurc");
    }
    if (nmz_is_file_exists(fname)) {
        set_namazurc(fname);
    }

なお、このままでは

> 2. src/namazu-cgi.cmd を修正して combine_pathname によって生成されたファ
>    イル名がなければ current directory にアクセスを試みるようにする
> 3. namazu-cgi-xxx で生成する .namazurc を src/.libs/ の下にも作る

のどちらかをしないと、make check は libtools が 1.4 でも 1.5 でも
FAIL します。

なので、2 の対策を行うのなら、以下のようにすれば良いものと思います。
(未確認)

    if (get_program_pathname(fname, argv[0]) == 0) {
        strncat(fname, ".namazurc", BUFSIZE - strlen(fname) - 1);
        fname[BUFSIZE - 1] = '\0';
    }
    else {
        combine_pathname(fname, argv[0], ".namazurc");
    }
    if (nmz_is_file_exists(fname)) {
        set_namazurc(fname);
    }
    else if (nmz_is_file_exists(".namazurc")) {
        set_namazurc(".namazurc");
    }

これにより、.namazurc の読み込み処理が
1. namazu.cgi のあるディレクトリの .namazurc
2. もしなければカレントディレクトリの .namazurc 
ということになりますので、
http://www.namazu.org/doc/manual.html.ja#namazurc の内容を
修正するなら

1. $(sysconfdir)/$(PACKAGE)/namazurc
   通常は /usr/local/etc/namazu/namazurc 
2. ~/.namazurc 
3. -f, --config=FILE オプションで指定した namazurc
   (CGIの場合は namazu.cgi を設置したディレクトリ の .namazurc
  もしなければカレントディレクトリの .namazurc) 

ということになります。

これで解決と思ったのですが、困ったことに Win32 環境(VC++)では 
PATH のセパレータが ':' ではなく ';' であることに気づきました。
Cygwin は ':' なので、以下のようにでもセパレータを定義すれば
よいのかな?
OS/2 も ';' のようですが、他の環境で ':' 以外のセパレータを使って
いるものはありますか?

#if (defined (_WIN32) && !defined (__CYGWIN__)) || defined(__EMX__)
#  define PATH_SEPARATOR ";"
#else
#  define PATH_SEPARATOR ":"
#endif
-- 
=====================================================================
寺西 忠勝(TADAMASA TERANISHI)  yw3t-trns@xxxxxxxxxxxxxxx
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint =  474E 4D93 8E97 11F6 662D  8A42 17F5 52F4 10E7 D14E