---------------------------------------------- DLL作成にあたって。。。 #ほとんど単なるメモ帳です。 #読まなくてもいいよ(^^; ---------------------------------------------- ここにはDLL版作成にあたってわかったことや,考えたことなどをかきます。 ひょっとしたら役にたつかもしれないので,, 文面は結構いいかげんです(^^; DLL作成にあたってとりあえずは,tar関数さえ用意すればいいので,簡単ではないか?と思っていました。また,FindFirst系関数をサポートしたい,というのと,gzip単独圧縮/解凍もしたいと思いました。 まず,DOS版のtarですが,僕はkmtar Power upKitをもともとを使っていました。これは,tar.gz/tar.zなどのファイルを圧縮/解凍できるというなかなか便利なものでした。 とりあえず,これをVC++ Ver4.0でコンパイルしてみました。 つまり,全部の.C/.Hファイルをプロジェクトにほうりこんでみました。 が,できない。。 なぜか見てみると,open,write関数がVCでは_open,_write関数になっています。 そこで,このへんの定義をまとめるため,defconf.hというファイルを作成しました。 それで,すべてのファイルはこのdefconf.hをincludeするようにしました。 また,defconf.hの先頭にVC4/GZIP(gzip解凍のサポート)/DLL/WIN/LONG_FILE_NAME/P_up_V(=3)を定義しました。この定義をはずせば,元にもどる(はず)です。 あと,結構迷ったのがBINARYmodeでの書き出しです。main.cに_fmode=O_BINARYというのがあったので,この部分を有効にしました。 紆余曲折でとりあえずコンパイル完了です。 次に,PowerUpのバージョン4を作り(#define P_up_V 4),gzip/compress単独で圧縮/解凍できるようにし,これをGコマンドとしました。 あとは,分析して,tar32.cppにAPI部分を書きました。 また,staticな変数が最初は「0」というのに依存しているものがあったので, tarなどのAPIを起動するときには,変数を初期化すべく,static_init_all関数(main.c)を呼ぶようにしました。 あと,標準出力にエラーを表示しているのを,APIに返すようにしました。 これは,ioctrl.cがその役割をしています。 ioctrl.hを見ればわかるかもしれませんが,printfなどをioctrl_printfと定義し, 出力を奪うようにしました。元のprintfはorig_printfとして保存しています。#defineではうまくいかないので,inlineを使っています。このioctrl.hはすべてのファイルで参照されるように,defconf.hでincludeしています。 また,exit(1)などで終了しているので,これをlongjmpに変えて,終了しないようにしました。 ファイル構成を適当に書いてみました。 archio.c:open_arch関数で圧縮ファイルを開く模様。。 Archives[0]にファイル名を入れて,Archives[1]にNULLを入れるみたい。 引数は"r","w"などのモード(たぶん) write_z関数などがあり,ここでgzipファイル/普通ファイルへの書き出しの差を吸収している。 compapi.c/compress.c:compress関係のソース chkfname.c:ファイル名が正しいかのチェックをnormalize_fname関数で行っている。 defs.h:いろいろな定義を集めたもの,DLLではdefconf.hにも定義をした。 fildfile.c:dos_findfirst系の関数がVC++ではなかったのでここで作成した。 int86bp.s:アセンブラは使ってないので関係ありません。 ioctrl.c:printfをorig_printfにうつし,ioctrl_printfをprintfにうつした。 IO_TESTを定義すると,標準出力にも表示します。 main.c:その名のとうり,mainです。もともとのmainはtar_mainとしました。 Archives配列には圧縮ファイル名が入る。最後にはNULLを入れる。 Vflagなどは,「v」オプションが指定されたときにTRUEになります。 global変数になっていて,他のarchio.cなどからも参照されています。 これらの変数はmain_static_init関数で初期化しています。 makefile.*:makefileは使っていません。定義はすべてdefconf.hでしてしまっています。misc.c:fatal関数などの共通の関数が定義されています。 tailor.h:結構いろいろ定義されています。 tapeio.c:フロッピーデバイス直接書き出しなどがあります。このへんはダミー関数 に入れ替えました。(fdcs関数など) tar32.cpp:dllのAPIが入っています。 version.c:バージョン番号などが入ってます。 setarg.c:間接引数展開ルーチン 疲れたのでこの変でとりあえず終わります。 -----1997/09/06---------- ○属性について。 TARはUNIXで使われているため、主にUNIXの属性を使用しています。 属性は次のように表されます。 drwxrwxrwx ここで一番左のdはディレクトリであることを表します。 readは読み込み可であり、writeは書き込み可、xは実行可能であることを表します。 rwxが3つありますが、これはowner,group,otherに対するの属性です。 しかし、MSDOSやwindowsはシングルユーザOSなので、これらの区別はありません。 じゃあどおなっているか、というと、 owner,group,otherがすべて同じになっているようです。 また、実行属性はMSDOSにはないため ディレクトリでは実行属性あり、ファイルでは実行属性なし。となっているようです。 unixにはアトリビュート属性、システム属性は存在しないため、それらは 記録されません。 ----------FAQ----------------- ============ >TAR32.DLL とかはどうなんでしょう。あれも unix からの属性のままだと >問題があるでしょうし・・・って、そもそもTAR には属性がなかったのかな? ありますよ(^^; しかも所有者、グループ、他人それぞれが読み込み書き込み実行パーミッション をもっているので、普通に表すと drwxrwxrwx となってすでに8文字をあふれてます(^^; unixの所有者の読み込みがない->DOSの隠し属性設定 unixの所有者の書き込みがない->DOSの読み込み専用属性設定 としてUNLHA32.DLLに合わせていますが、 アーカイブ、システム、なんてものはもとより存在しないので 「?」として表しています。 他にもユーザ名や最終アクセスタイムなんかがあるけどすべて無視(^^; それぞれのフォーマット独自のヘッダを返すAPIがいるかもしれませんね。 あと、CABの属性も順序が違うみたいですね。 それでは。 ----------GPL関係--------------------------------- >現在、この製品で TAR32.DLL をサポートしたいと考えております。 >つきましては TAR32.DLL をバンドルしたいと思うのですがいかがでしょうか? 付属文書にあるように、TAR32.DLLはGZIPのルーチンを使っているためGPLに従う必要があります。 それで、このGPLがよくわからないライセンスなので問題なのですが、簡単には ・GPLプログラムはGPLに制限を加えないで再配布する。 ・GPLプログラムはソースプログラムが自由に入手できることが必要でそれを明示する。 ・GPLプログラムにはGPL文書を付属させる。 ・GPLプログラムには制限を追加してはいけない。 ・GPLプログラムの「プログラム生成物(work based on the Program)」はGPLに従って配布する。 がライセンスの主な部分です。製品全体がGPLになってしまって困ると思うので、 (NetScapeのようにソースプログラムを配布できるなら別ですが・・・) 問題は最後の部分なのですが、これについては以下のようにかかれています。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーー これらの要件は変更された作成物にも全て適用されます。その変更版の或る部分 が「プログラム」の派生物ではなく,しかもそれ自体独立で異なる作成物だと合 理的に考えられる場合,あなたがそれらを別の作成物として頒布した時は,本使 用許諾とその条項はそれらの部分には適用されません。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーー ということで、TAR32.DLLと製品を異なるもの。とすれば問題ないと思います。 より具体的にはCD-ROMの中で別のファイルとしていれておき、TAR32.DLLはGPLに従っている、 と明治すれば問題ないと思います。 私は専門家でもないし、間違っているところもあるかもしれませんが、以上が私の理解しているところです。 ----------作り直し、著作権問題------------------------- あと、今のTAR32はDOS専用の kmtar PowerUpKit(gzip+compress+kmtar) をベースにしているのですが、GZIPの作者が出しているGZIP圧縮解凍ライブラリ ZLIBを用いて、 ZLIB+GNU TAR+Compress としたら汎用的になると思います。 また、ZLIBはGPLにしばられずほぼ自由に配布でき、compressはPDS、kmtarもPDS なので、 ZLIB+COMPESS+KMTAR とすればGPLにしばられずに使えます。ただ、COMPRESS部分はライブラリになっ ていないので少し面倒かもしれない。 あと、COMPRESSやGIFの圧縮・解凍アルゴリズムLZWはUNISYSがパテントをとっており、 自由につかえない可能性がある(らしい)。という問題があります。COMPRESSの作者は UNISYSがパテントを取得する前にすでにそのアルゴリズムは使われていた、などを 主張しています。不安な方はCOMPRESS(Z/Tar.Z)の解凍機能はつけないほうがいいかも しれません。 #あまり詳しいことはわかりません。(^^ ということでよろしく(^^; (何が??) [参考文献] [1]Unisysホームページ (http://www.unisys.co.jp/LZW/index.html) LZWの特許について書いてあります。 [2]ncompress-4.2.4 (ftp://ftp.tohoku.ac.jp/pub/unix/ncompress/ncompress-4.2.4.tar.gz に付属のLZW.INFO) LZWはUNISYSより先に考えられていて、COMPERSSがフリーであることを 主張してます。 [3]kmtar (ftp://ftp.vector.co.jp/pack/dos/util/arc/kmtar2.lzh ftp://ftp.vector.co.jp/pack/dos/util/arc/kmt201df.lzh) PowerUpする前のkmtarです。GZIP/COMPRESSは扱えません(PDS) [4]ZLIB (http://www.cdrom.com/pub/infozip/zlib/) ZLIBに関する情報 97/12/13(土) 吉岡 恒夫(QWF00133,INET:QWF00133@niftyserve.or.jp) --------------------------------------------------------