先日入手した、XML-RPC for C and C++ ライブラリを使って、weblogUpdates.ping を実装してみた。
付属のサンプルを参考に、プログラムを作成。むちゃくちゃ簡単だった。通信の処理や、クライアントに返すXMLなんかは apacheや このライブラリがやってくれるので、作成するのは、ログファイルに保存するのみ。
以下のプログラムをコンパイルし、/cgi-bin/xmlrpc として呼び出せるようにした。
// Simple weblogUpdate.ping CGI.
#include <iostream>
#include <fstream>
#include <time.h>
#include <xmlrpc.h>
#include <xmlrpc_cgi.h>
int writeLogFile(char *name, char *url)
{
time_t now;
if ((now = time((time_t *)NULL)) == (time_t)-1) {
return 0;
}
std::ofstream logfile("/tmp/ping.log",
std::ios::out | std::ios::app); // 追加モード
// logfile に出力する
logfile << now << ","
<< url << ","
<< name << std::endl;
}
xmlrpc_value *weblogUpdates_ping(xmlrpc_env *env, xmlrpc_value *param_array,
void *user_data)
{
char *blog_name;
char *blog_url;
/* Parse our argument array. */
xmlrpc_parse_value(env, param_array, "(ss)", &blog_name, &blog_url);
if (env->fault_occurred) {
std::cerr << "fault_code:" << env->fault_code
<< ",fault_string:" << env->fault_string
<< std::endl;
return NULL;
}
if (!writeLogFile(blog_name, blog_url)) {
// ログファイル保存に失敗
return xmlrpc_build_value(env, "{s:i,s:s}",
"flerror", 1,
"message", "I'm Sorry.");
}
return xmlrpc_build_value(env, "{s:i,s:s}",
"flerror", 0,
"message", "Thanks!");
}
int main(int argc, char **argv)
{
/* Process our request. */
xmlrpc_cgi_init(XMLRPC_CGI_NO_FLAGS);
xmlrpc_cgi_add_method_w_doc("weblogUpdates.ping", &weblogUpdates_ping,
NULL, "S:ss", "Save weblog update.");
xmlrpc_cgi_process_call();
xmlrpc_cgi_cleanup();
return 0;
}
このプログラムは,
とりあえずのサンプルとして作成したものである。
実際に運用する為にはこれだけでは不十分だ。
参考にされるのは問題無いが、このままの状態で使うようなことはご遠慮いただきたい。
新しいコメントの投稿