次のサンプル プログラムに基づいて、RHEL 4 Linux で C 言語で SMTP クライアント プログラムを作成しています。
http://curl.haxx.se/libcurl/c/simplesmtp.html
stdin を介してメッセージ本文テキストをプログラムに渡すたびに、プログラムは正しく動作します。ただし、file ポインターを curl_easy_setopt() 関数に渡そうとすると、segfault が発生します。コメント (サンプル プログラム simplesmtp.c から) には、stdin の代わりにファイル ポインターを curl_easy_setopt 関数に渡すことができると記載されています。
simplesmtp.c の関連するコメント セクション
/* You provide the payload (headers and the body of the message) as the
* "data" element. There are two choices, either:
* - provide a callback function and specify the function name using the
* CURLOPT_READFUNCTION option; or
* - just provide a FILE pointer that can be used to read the data from.
* The easiest case is just to read from standard input, (which is available
* as a FILE pointer) as shown here.
*/
curl_easy_setopt(curl, CURLOPT_READDATA, stdin);
これらは、CURLOPT_VERBOSE オプションが設定されたコンソールからのエラー行です。
< 250 2.1.5 <myname@mydomain.com>... Recipient ok
> DATA
< 354 Enter mail, end with "." on a line by itself
./r: line 5: 21282 Segmentation fault ./mysmtpcli -r rcp.txt -m msg.txt
ところで: ./rは ./mysmtpcli -r rcp.txt -m msg.txt を呼び出している私のシェル スクリプトです。
コードのスニペット
FILE *f_msg;
f_msg = fopen(msg_file, "r");
if(!f_msg){
fprintf(stderr, "Could not load message file: %s\n", msg_file);
return 1;
}
curl_easy_setopt(curl, CURLOPT_READDATA, f_msg);
fclose(f_msg);
注: msg_file 変数は、コマンド ライン パラメーターから入力され、以下を含む有効なテキスト ファイルです。
件名: テスト メッセージ
これはテスト メッセージです。
「cat msg.txt | ./mysmtpcli -r rcp.txt」を使用して stdin を介してこの同じファイルをプログラムに渡すと、プログラムは正しく実行されます。ただし、これには f_msg を stdin に置き換える必要があります。
curl_easy_setopt(curl, CURLOPT_READDATA, f_msg);
FILE ポインタを正しく渡していますか?