かってにインパクトファクター

子育てサラリーマンが日々の雑多なことをつらつらと綴ってます。時々政治ネタ経済ネタコンピュータネタなどをはさみます。

polipoのソース探訪

私は、Operaブラウザとpolipoを組み合わせてつかっているわけですが、モバイルPCをルータ代わりにして、普段使うPCからも、モバイルPCからもpolipoが正常に動作するように設定していたつもりなんです。

ところがですね。前からなんか変なエラーが出ていたわけです。

ということで、polipo-1.0.4を導入したついでに、原因を探ってみました。

今回問題にしているのは、


allowedClients


オプションです。


サンプルでは

allowedClients = "127.0.0.1, 134.157.168.0/24"

と書いていますが、これではうまく読み込めないよーと怒られます。

私は前回

allowedClients = "127.0.0.1,
134.157.168.0/24"

と改行を入れるとうまく行くかもねと書きましたが、実はこれはネットで他の方がされていたのを参考にしただけですすいません。



ということで、今回はpolipoのソースを探訪することにしました。



まず、configファイルを読み込む部分ですが、

[config.c l.815]

int
parseConfigFile(AtomPtr filename)
{

    <略>
    lineno = 1;
    while(1) {
        char *s;
        s = fgets(buf, 512, f);
        if(s == NULL) {
            fclose(f);
            return 1;
        }
        rc = parseConfigLine(buf, filename->string, lineno, 0);
        lineno++;
    }
}

とあります。1行ずつしか解析しないので、私の前回のサンプルは、少なくとも1.0.4では間違いです。


次に、読み込んだあとになにをしているのかを調べてみました。


いや、私、人のソース読むことをほとんどしてこなかったんで比較できないですけど、結構おもしろいですね。

はずかしながら、

#define A(name) declare(#name,&name)
void declare(const char *string,void *value);

と書くと、int型などで宣言した変数の名前をそのままstringに突っ込んだりできるとか知りませんでした。C++ならスマートにかけるんですけど、Cでも出来るんだなーと。


それはいいとして、どうやらソースのparseConfigLineで読み込んでいるところに解があるのではないかと辺りをつけたわけです(そもそもこのソースを呼んだのは、ファイル名がconfigだったのでそうかなと思っただけです)。



ちょっとソースを載せますと、

[config.c l.622]

int
parseConfigLine(char *line, char *filename, int lineno, int set)
{
    <略>
    case CONFIG_ATOM_LIST: case CONFIG_ATOM_LIST_LOWER:
        alv = makeAtomList(NULL, 0);
        <略>
        while(1) {
            i = parseAtom(line, i, &value, 
                          (var->type == CONFIG_ATOM_LIST_LOWER));
            <略>
            atomListCons(value, alv);
            i = skipWhitespace(line, i);
            if(line[i] == '\n' || line[i] == '\0' || line[i] == '#')
                break;
            if(line[i] != ',') {    ←ここで区切りを見つけている
                destroyAtomList(alv);
                goto syntax;
            }
            i = skipWhitespace(line, i + 1);
        }
        if(set)
            var->setter(var, &alv);
        else {
            if(*var->value.al) destroyAtomList(*var->value.al);
            *var->value.al = alv;
        }
        break;
        <略>
}

ということで、この辺りでsyntaxエラーを吐いているみたいです。

ちなみに、parseAtom関数は、"と"で区切られた文字を取り出すみたいです。ざっくり言いすぎですけど。


ということで、結論ですが、

allowedClients = "127.0.0.1", "134.157.168.0/24"

が解じゃないかなと思います。


これで走らせると、エラーはかなくなりますしね。



いや、ふだんしないことをして疲れました。