臥薪嘗胆

インフラエンジニアのあれこれ

Cやってみよう #4

先日の続き

おそろしい、C言語は恐ろしい。
たった10数行にも関わらず、頭に入ってこない。
俺の目と頭が連動しない...
慣れるしか無いのか!

112 static int check_extension(char *filename, apr_array_header_t *exts)
113 {
114   int i;
115   for (i = 0; i < exts->nelts; i++) {
116     const char *extension = ((char **)exts->elts)[i];
117     ssize_t name_len = strlen(filename) - strlen(extension);
118     if (name_len >= 0 && strcmp(&filename[name_len], extension) == 0)
119       return 1;
120   }
121   return 0;
122 }
  • 112行目で引数を2つもらう関数を定義してる。返り値はint
  • 115行目のexts->neltsは数値なのであろう。これは配列の要素数なんだろう。
  • 116行目のconst charは読み取り専用の文字列に配列の内容を入れているのだろう!
  • 116行目の(char **)これはなんだ?
    • Dereferencingとな
      • 変数のアドレスから値を取得する
  • 117行目のssize_tは、書き込まれたバイト数,エラー時は-1
  • 117行目はファイル名の文字数から配列の要素の文字数を引いて、name_lenにいれとる。
  • 118行目のstrcmpは文字列比較
  • 結果、この関数は0 or 1を返す

次々

124 static char *build_vhostport_name(request_rec *r)
125 {
126 #ifdef __APACHE24__
127   ssize_t vhostport_len;
128   char *vhostport;
129
130   vhostport_len = strlen(r->hostname) + sizeof(":65536");
131   vhostport = apr_pcalloc(r->pool, vhostport_len);
132   apr_snprintf(vhostport, vhostport_len, "%s:%d", r->hostname, r->connection->local_addr->port);
133
134   return vhostport;
135 #else
136   return (char *)r->hostname;
137 #endif
138 }
  • 124行目で引数を1つもらう関数を定義してる。返り値はchar
  • 124行目のrequest_recapacheの持ってる構造体をrというアドレスに定義?してる
  • #コメントアウトなの?
  • 130行目でvhostport_lenにこの場合はvirtualhostの長さと65536のメモリサイズを足した値を返してる
    • よくわからん
  • 131行目はapr_pcallocで初期化してる
  • 132行目はapr_snprintfぐぐってもわからん。
  • 結局この関数はhoge.com:80みたいなものを返してるのではないだろうか。

ちょっと憶測が多くなってきて、ぐぐっても分からないので有識者に聞こう。。。
聞いたら更新しますからね!