□ Linux関連

●MiniDLNA on Windows(MinGW-w64) - 2016/10/28

MiniDLNA はソケットAPIやファイルI/O、fork()等の相違により、
そのままではWindows用にビルドできません。
過去に試みた方も居られましたが、実用的ではなさそうでしたので、
CentOS上で玄箱HG(標準OS)用をクロスコンパイルするついでに、
MinGW-w64 (MSYS無し)を使って同じくクロスコンパイルしてみました。
MiniDLNAは1.1.5を、 MinGW-w64はv4.0.4を使用しました。

変更箇所は多岐に渡り、いくつかのC拡張関数も実装する必要があったため、
パッチやライブラリのソースを書庫ファイルに纏めてあります。

差分書庫ファイル MD5SUM サイズ
minidlna-1.1.5-yas.MinGW-w64.tar.gz 3ef1b239f716bcca2ff6a640d5cf6cc8 29,477 Bytes

○主な変更内容

・Winsock2による実装とconfigure.acにWinsock2のip_mreqチェックを追加
・必要なGNU拡張等をVC拡張ライブラリとして実装、Makefile.amに追加
・パス階層やバイナリモード等のファイルI/OをWin32方式に変更
・Win32APIによるCtrl+Cハンドラの実装
・Win32APIによるUUID生成処理の実装
・IPHelperによるインターフェース列挙の実装
・fork()無効化とWin32スレッドによるファイル転送処理の簡易実装
・process.hの競合回避とprocess.cの無効化
・PIDファイル生成、MiniSSDPDサービス接続、ユーザー指定の無効化
・inotify非対応に特化した既定通知間隔の変更(15秒)
・リモートMACアドレス取得の無効化
・ハードコーディングされた設定ファイルのパスをカレントに変更
・インターフェース名指定をMACアドレス指定に変更
・rand()による擬似乱数に変更
・long long型書式指定の"%ll"や"%j"を"%I64"に変更(msvcrt.dll)
・時刻書式指定の変更
・SJIS定義によるシフトJISエンコーディングの対応(media_dirのみ)

○ビルド

・ビルドに必要なgcc、autotools、依存ライブラリ等は準備されているものとします。
・依存関係を明確にするため、PKG_CONFIGは使用していません。

$ tar xvzf minidlna-1.1.5.tar.gz && cd minidlna-1.1.5
$ tar xvzf minidlna-1.1.5-yas.MinGW-w64.tar.gz
$ patch -p0 -i minidlna-1.1.5-yas.MinGW-w64.patch
$ autoreconf
$ CFLAGS='-DSJIS' \(※Shift_JIS対応の場合)
   LIBS='-lavcodec -lswresample -lavutil -logg -lws2_32 -lm -lz -liphlpapi -lrpcrt4' \
   ./configure --prefix=/ --sbindir=/ --host=i686-w64-mingw32 \
   --with-os-name=Windows --with-os-version=Windows \
   --with-log-path=. --with-db-path=Cache --disable-nls --enable-static
$ make
$ make install-strip DESTDIR=Release
$ install minidlna.conf.win32 Release/minidlna.conf
$ zip -j -X -9 ../minidlna-1.1.5.Win32.zip Release/*

元々トランスコード未対応により、依存ライブラリの約半分も使用されていない事、
MSYS未使用により、通常のWin32コンソールアプリケーションとして使用可能な事等から、
WindowsシステムDLLやmsvcrt.dll以外は静的リンクでビルドされる事をお勧めします。
(私の環境で、依存ライブラリ23MBに対し、EXEは12.9MBでした)

inotify(ディレクトリ変更通知)非対応ですが、ネイティブ動作なので、
データベース再構築も割と快活に読み込んでくれます。

○免責事項

・このパッチやライブラリを使用した事によって生じたいかなる損害も作者は一切保証しません。
  また、ご質問/ご意見/サポート等も一切受け付けません。全て自己責任で使用して下さい。
・拡張ライブラリ(glibcのsys/queue.hを含む)の扱いについて、glibcに準ずる物とします。
  glibcコード等以外において、著作権は「やす」にあります。
  他の著作物に付随、あるいは独立したソフトウェアとして変更/追加する可能性があります。
・改変/配布は自由ですが、MiniDLNA(現GPLv2)や使用ライブラリ等のライセンスに基づいて行って下さい。
・MiniDLNA(ReadyMedia)はMiniDLNA project(Justin Maggard氏)の著作物です。

トップへ戻る

●CentOS6.0でjfbterm - 2011/08/10

CentOS6.0にjfbterm-0.4.7-matchy7.el5.nosrc.rpmをビルド(i686)して入れようとしましたが、
1.exit時セグメンテーション違反(getutid()が返すNULLポインタによるsegfault)で
  フレームバッファが固まる。
2.ビルドに必要なpage.hが規定のincludeに無い。
3.依存しているfonts-japaneseパッケージがCentOS6.0に無い。
といった理由でビルド&正常終了できませんでした。

1については、簡単な修正を加えて対処しました。
jfbterm-0.4.7-fix_utmp_bug.patch
2294Bytes,MD5: fdbd8cdc2df41f97657ef6cc39d2d8dc

※パッチは自己責任で使って下さい。
 specファイルのPatch14辺りで適用して下さい。

manのサンプルの様に、そもそもgetutid()のポインタを使う必要は無いのかもしれませんが、
それより、utmp::ut_idの値の取り方において、通常の端末名"tty*"とは違い、
"pts/*"の"/"文字検索による決め打ちが根本的な原因ですので、他のディストリでも起こり得ます。
manには擬似端末における正しい値の取り方が載っていないので、これで良いのかわかりませんが、
sshに似せたので、きっと大丈夫でしょう。

2についてはkernel-develに含まれているpage.hへリンクを張って端的に対処。
3についてはCentOS5.6のパッケージからrpm2cpioで無理矢理引っ張ってなんとか対処。

2,3の様な問題でスマートなspecファイルを作れていないので、ソースRPMは置いてません。
もしかすると、自分の環境だけで起こる問題かもしれませんが、
同様に困っている方の参考になればと思います。

それにしても、一般ユーザーで入るとutmpファイルのパーミッションで
ログイン記録が残らないのは、仕様なんですかね。
コンソールを酷使すると、exit()手前のヒープ二重開放のabortが相変わらず…
いや、5.4の時より目立ってますし。
とりあえずioctl(0, KDSETMODE, KD_TEXT)を通ってコンソールが戻るので保留です。

システムフォントを扱えて、処理も軽いfbtermの方がいいのかも。

トップへ戻る