Fork me on GitHub

2009/08/04

はてな
smegheadさんがtthttpdのpatchを書いてくれました。感謝!

その後、デフォルトページがCGIの場合に上手く動かないバグを修正しました。
お礼とは言っては何ですが(Windowsなんかイラネかもしれませんが)、smegheadさんが作っておられるC言語で書かれたBTS「starbug1」をWindowsにポーティングしてみました。
以下patch
diff -u starbug1-1.3.01.orig/hook.c starbug1-1.3.01/hook.c
--- starbug1-1.3.01.orig/hook.c 2009-07-12 20:37:55.000000000 +0900
+++ starbug1-1.3.01/hook.c  2009-08-04 10:11:19.125000000 +0900
@@ -4,7 +4,11 @@
 #include <cgic.h>
 #include <dirent.h>
 #include <sys/stat.h>
+#ifndef _WIN32
 #include <dlfcn.h>
+#else
+#include <windows.h>
+#endif
 #include "data.h"
 #include "alloc.h"
 #include "util.h"
@@ -12,6 +16,24 @@
 #include "hook_data.h"
 #include "simple_string.h"
 
+#ifdef _WIN32
+#define dlopen(x,y) (void*)LoadLibrary(x)
+#define dlsym(x,y) (void*)GetProcAddress((HMODULE)x,y)
+#define dlclose(x) FreeLibrary((HMODULE)x)
+const char* dlerror() {
+    static char szMsgBuf[256];
+    FormatMessage(
+            FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+            NULL,
+            GetLastError(),
+            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+            szMsgBuf,
+            sizeof szMsgBuf,
+            NULL);
+    return szMsgBuf;
+}
+#endif
+
 static void put_env_a(char* name, char* value, char* buf)
 {
     sprintf(buf, "%s=%s", name, value);
diff -u starbug1-1.3.01.orig/util.c starbug1-1.3.01/util.c
--- starbug1-1.3.01.orig/util.c 2009-07-25 22:38:03.000000000 +0900
+++ starbug1-1.3.01/util.c  2009-08-04 11:39:35.078125000 +0900
@@ -698,9 +698,21 @@
     char locale_utf8[DEFAULT_LENGTH];
     sprintf(locale_utf8, "%s.UTF-8", locale);
     d("locale: %s\n", locale_utf8);
+#ifndef _WIN32
     setenv("LANG", locale_utf8, 1); /* FreeBSD(さくらインターネット)でsetlocaleが動作しない場合があったため、環境変数を書き換える。 */
+#else
+    {
+        char envstr[256];
+        strcpy(envstr, "LANG=");
+        strcat(envstr, locale_utf8);
+        putenv(envstr);
+    }
+#endif
     d("setlocale: %s\n", setlocale(LC_ALL, locale_utf8));
     d("bindtextdomain: %s\n", bindtextdomain("starbug1", "locale"));
     d("textdomain: %s\n", textdomain("starbug1"));
+#ifdef _WIN32
+    bind_textdomain_codeset("starbug1", "utf-8");
+#endif
 }
 /* vim: set ts=4 sw=4 sts=4 expandtab fenc=utf-8: */
ビルドに必要なツール類はgnuwin32なんかで取得して下さい。
見事起動出来ました。
starbug1-win32
ありがとうございました。

2009/07/30

はてな
書いたといっても結構前からあったのですが、いらん所を削ぎ落として軽量Webサーバとして仕立て上げました。
軽量とは言えど、CGIを使って結構色々動きます。
例えば、ソースアーカイブを解凍したらCGIがあって、apacheから見える場所にコピーして...とか面倒くさかったりしますよね。

おれは今すぐWebサーバを起動したいんだ!そして今いるディレクトリのファイルをWebサーバからサーブしたいんだー!

って事ないですか?blogソフトウェアをダウンロードして今すぐ試したいけど、apacheインストールされてなかった...とか悲しすぎます。
今回紹介する"tinytinyhttpd"(tthttpd)はそんな、小さい様で大きな問題を解決出来るかもしれないソフトウェアです。
mattn's tinytinyhttpd at master - GitHub

tiny tiny httpd

http://github.com/mattn/tinytinyhttpd/tree/master
リンク先に、動いてる様子のキャプチャがあります。
ソースはC++で書いてます。WindowsとUNIX(Linuxでだけ動作確認)で動作します。

機能としては、マルチスレッドサーバ、カスタマイズ、ディレクトリスティング、CGI起動が可能です。
小ささをウリにしているのでインストールとか、レジストリとか、面倒くさいものは要りません。exeファイルだけあれば起動します。
一応、設定ファイルの記述も可能で
[global]
port=8080
root=c:/temp/mtos
indexpages=index.html,index.php
charset=cp932

[mime/types]
cgi=@c:/strawberry/perl/bin/perl.exe
php=@c:/progra~1/php/php-cgi.exe
という設定ファイルを"-c"オプションで指定する事も出来ます。デフォルトではポート8080番でカレントディレクトリをドキュメントルートとし、phpとperlが適当なパスでCGI起動される様になっています(パスが違う場合は設定ファイルから変更出来ますし、拡張子rbに対してrubyを追加する事も出来ます)。
私が試した限りですが、以下のソフトウェアの動作が確認出来ています。
  • MTOS(Movable Type Open Source) (perl)
  • WordPress (php)
  • blogn Plus (php)
  • tDiary (ruby)
  • PukiWiki (php)
  • NucreusCMS (php)
  • blosxom (perl)
などなど。CGIで動くならば大体動きます。

ライセンスはBSDライセンスとします。使ってみて下さい。
コードはgithubにあるので、patchウェルカムです。
今後は、コードのブラッシュアップと、拡張なんかを考えて行きたいなーと思ってます。
Posted at 00:06 in ソフトウェア::lang::c | WriteBacks (23)
Tagged as: c++, httpd
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip | add to buzzurl add to buzzurl | add to fc2bookmark add to fc2bookmark | add to Yahoo Bookmark add to Yahoo Bookmark | add to Pookmark add to Pookmark