ソースコードを調べる
FreeBSDでなにか問題が発生したり解決したいことがでてきた場合には、
しかし、
FreeBSDでソースコードを調べる方法はいくつかあります。ここでは3つの方法を採り上げて、
Subversionでソースコードをチェック
FreeBSDのソースコードはSubversionで管理されています。基本的にはSubversionを使って調査したい対象となるバージョンのFreeBSDのソースコードをダウンロードしてきて、
まず、
# FreeBSD 10.2系のソースコードを取得 svn checkout https://svn.FreeBSD.org/base/releng/10.2 ./ # FreeBSD 9.3系のソースコードを取得 svn checkout https://svn.FreeBSD.org/base/releng/9.3 ./ # FreeBSD 10.2-RELEASEのソースコードを取得 svn checkout https://svn.FreeBSD.org/base/release/10.2.0 ./ # FreeBSD 9.3-RELEASEのソースコードを取得 svn checkout https://svn.FreeBSD.org/base/release/9.3.0 ./ # 開発版のソースコードを取得 svn checkout https://svn.FreeBSD.org/base/head ./ # 10系安定版のソースコードを取得 svn checkout https://svn.FreeBSD.org/base/stable/10 ./ # 9系安定版のソースコードを取得 svn checkout https://svn.FreeBSD.org/base/stable/9 ./
あとは何も考えずにキーワードでgrep(1)検索を行います。次のようにlpr(1)コマンドのソースコードの1つである
# cd /usr/src/ # grep -r 'unable to get official' * usr.sbin/lpr/common_source/net.c: asprintf(&error, "unable to get official name " #
該当する部分をみると、
# cat -n usr.sbin/lpr/common_source/net.c
…略…
171 /*
172 * Figure out whether the local machine is the same
173 * as the remote machine (RM) entry (if it exists).
174 * We do this by counting the intersection of our
175 * address list and theirs. This is better than the
176 * old method (comparing the canonical names), as it
177 * allows load-sharing between multiple print servers.
178 * The return value is an error message which must be
179 * free()d.
180 */
181 char *
182 checkremote(struct printer *pp)
183 {
184 char lclhost[MAXHOSTNAMELEN];
185 struct addrinfo hints, *local_res, *remote_res, *lr, *rr;
186 char *error;
187 int ncommonaddrs, errno;
188 char h1[NI_MAXHOST], h2[NI_MAXHOST];
189
190 if (!pp->rp_matches_local) { /* Remote printer doesn't match local */
191 pp->remote = 1;
192 return NULL;
193 }
194
195 pp->remote = 0; /* assume printer is local */
196 if (pp->remote_host == NULL)
197 return NULL;
198
199 /* get the addresses of the local host */
200 gethostname(lclhost, sizeof(lclhost));
201 lclhost[sizeof(lclhost) - 1] = '\0';
202
203 memset(&hints, 0, sizeof(hints));
204 hints.ai_family = family;
205 hints.ai_socktype = SOCK_STREAM;
206 hints.ai_flags = AI_PASSIVE;
207 if ((errno = getaddrinfo(lclhost, NULL, &hints, &local_res)) != 0) {
208 asprintf(&error, "unable to get official name " ← ここにヒットしてる
209 "for local machine %s: %s",
210 lclhost, gai_strerror(errno));
211 return error;
212 }
ようするに名前解決に失敗している、
# cd /usr/src/ # grep -r MAXNS * | grep define include/resolv.h:#define MAXNS 3 /*%< max # name servers we'll track */ #
実はこれは実際にあった問題で、
svnwebでソースコードをチェック
すでにどこのソースコードを読めばよいか検討がついているという場合には、
![図 http://svnweb.freebsd.org/ 図 http://svnweb.freebsd.org/](/assets/images/admin/serial/01/bsd-yomoyama/0031/thumb/TH800_001.jpg)
Subversionを利用するのが面倒な環境を使っているとか、
GitHubでソースコードをチェック
FreeBSDのソースコード自体はSubversionで管理されていますが、
![図 FreeBSDソースコード on GitHub 図 FreeBSDソースコード on GitHub](/assets/images/admin/serial/01/bsd-yomoyama/0031/thumb/TH800_002.jpg)
GitHubはソースコードの検索サービスを提供していますので、
![図 GitHubで検索 図 GitHubで検索](/assets/images/admin/serial/01/bsd-yomoyama/0031/thumb/TH800_003.jpg)
![図 もちろんソースコードを読める。ブラウザの機能で検索もできる 図 もちろんソースコードを読める。ブラウザの機能で検索もできる](/assets/images/admin/serial/01/bsd-yomoyama/0031/thumb/TH800_004.jpg)
最近、
ソースコードは情報のかたまり
何も知らない状態ですとFreeBSDハンドブックのようにある程度のクオリティでまとめられた文章が有益ですし、
ソースコードの大半はC言語で記述されていますので、