コードの説明
Sambaのクライアントプログラムsmbclientは、コマンドラインインターフェイスのプログラムです。ftpコマンドと同様なもの、と言えば大体想像のつく方も多いのではないでしょうか。サービス名を引数に指定して起動するとそのサービスを提供するサーバーに接続し、プロンプトが出てきます。それに対してコマンドを入力していくことで、ファイルのアップロードやダウンロード、ディレクトリ操作などを行うものです。
各コマンドに対応してその処理を行う関数が定義されており、getコマンドに対応する関数がcmd_get()です。ユーザーがプロンプトに対して「get filename」と入力すると、サーバー上の「filename」というファイルをダウンロードしますが、実際の処理はこのcmd_get()関数のなかで行われています。
cmd_get()の処理を上から順番に見ていきましょう。
- talloc_strdup()でサーバ側のカレントディレクトリを取得
- next_token_talloc()でgetコマンドの引数に指定されたファイル名を取り出す
- talloc_asprintf_append()を使ってディレクトリ名とファイル名を連結したパスを表す文字列を生成
- clean_name()で、パス名のなかに".."などが含まれているときはそれを含まない形に直す
- next_token_talloc()でダウンロードしてきたファイルを保存するときに使うローカル側のファイル名を取り出す(指定されていなければリモート側でのファイル名をそのまま使う)
- 最後にdo_get()で、ファイルをダウンロードして保存して終了
「talloc」という文字列を含む関数がいくつか出てきますが、これはSambaで使われている動的メモリ管理ライブラリtallocのなかの関数です。Sambaではパス名やサービス名などの文字列の操作が頻繁に行われますが、それらを動的メモリ領域に置いて管理しています。malloc()やfree()などのC標準ライブラリ関数を直接使うとメモリ管理が繁雑になるため、不要になったメモリ領域をある程度自動的に解放できる仕組みをtallocライブラリ(trivial alloc)として実装して使っているのです。今ではこのtallocライブラリはSambaとは独立に公開されていますので、興味のある方はどのように実装されているか調べてみてください。
今回のコードでは、tallocライブラリの詳細まで知っている必要はありません。使われている関数の働きとその型情報を知っていれば、アヤシイ部分に気付くことができます。いかがでしょうか。どこに問題があるか見つけられましたか?