XML-RPC for C ライブラリを使って weblogUpdates.ping を実装

先日入手した、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;
}

このプログラムは, とりあえずのサンプルとして作成したものである。
実際に運用する為にはこれだけでは不十分だ。 参考にされるのは問題無いが、このままの状態で使うようなことはご遠慮いただきたい。

新しいコメントの投稿

このフィールドの内容は非公開にされ、公表されることはありません。
  • HTMLタグは使用できません
  • 行と段落は自動的に折り返されます。

書式オプションに関するより詳しい情報...

CAPTCHA
この質問はあなたが人間であるかどうかについて調べる為と、自動化したスパムを防ぐ為のものです。うまくいかない場合は電子メールでお問い合わせ下さい。
イメージ CAPTCHA
画像の中に見える文字を入力して下さい