--- lha-1.14i.orig/src/lha_macro.h
+++ lha-1.14i/src/lha_macro.h
@@ -7,7 +7,7 @@
 /*	Ver. 1.14g	modified   						2000.05.06	T.OKAMOTO		*/
 /* ------------------------------------------------------------------------ */
 
-#define LHA_VERSION "lha for unix version 1.14g"
+#define LHA_VERSION "lha for unix version 1.14i"
 
 /* Most of System V, define SYSTIME_HAS_NO_TM */
 #ifdef	SYSTIME_HAS_NO_TM
--- lha-1.14i.orig/man/lha.n
+++ lha-1.14i/man/lha.n
@@ -9,7 +9,7 @@
 ]
 .I archive_file
 [
-.I flie
+.I file
 \&.\|.\|. ]
 .br
 .B lha
--- lha-1.14i.orig/man/lha.man
+++ lha-1.14i/man/lha.man
@@ -1,324 +1,224 @@
+LHA(N)                     LHa for UNIX Users Manual                    LHA(N)
 
 
-LHA(N)              Unix Programmer's Manual               LHA(N)
 
+NNAAMMEE 名名称称
+       LHa - 高圧縮アーカイバ
 
-NNNAAAMMMEEE 名名名称称称
-     LHa - 高圧縮アーカイバ
+SSYYNNOOPPSSIISS 形形式式
+       llhhaa kkeeyy [ mmooddiiffiieerrss ] _a_r_c_h_i_v_e___f_i_l_e [ _f_i_l_e ... ]
+       llhhaa _a_r_c_h_i_v_e___f_i_l_e
 
-SSSYYYNNNOOOPPPSSSIIISSS 形形形式式式
-     lllhhhaaa kkkeeeyyy [ mmmooodddiiifffiiieeerrrsss ] _a_r_c_h_i_v_e__f_i_l_e [ _f_l_i_e ... ]
-     lllhhhaaa _a_r_c_h_i_v_e__f_i_l_e
+DDEESSCCRRIIPPTTIIOONN 解解説説
+       LLHHaa は効率の高い圧縮機能を持つファイルアーカイバです。
+       kkeeyy に機能文字を指定し、file の追加、更新、抽出、削除、一覧表示などを行
+       ないます。引数に archive_file のみを指定した場合には、機能文字に l を指
+       定したのと同等の動作を行ないます。
+       機能文字は以下の通りです。
 
-DDDEEESSSCCCRRRIIIPPPTTTIIIOOONNN 解解解説説説
-     LLLHHHaaa は効率の高い圧縮機能を持つファイルアーカイバです。
-     kkkeeeyyy  に機能文字を指定し、file   の追加、更新、抽出、削除、一
-     覧表示などを行ないます。引数に  archive_file  のみを指定した
-     場合には、機能文字に  l   を指定したのと同等の動作を行ないま
-     す。
-     機能文字は以下の通りです。
+       aa       追加。file を archive_file に追加します。 file がディレクトリで
+               あれば、そのディレクトリに含まれるファイルをすべて追加します。
 
-     aaa       追加。file を archive_file  に追加します。file  がデ
-             ィレクトリであれば、そのディレクトリに含まれるファ
-             イルをすべて追加します。
+       uu       更新。file が archive_file に格納されていないか、もしくは格納さ
+               れているものが古ければ、file を archive_file に追加します。
 
-     uuu       更新。file  が  archive_file  に格納されていないか、
-             もしくは格納されているものが古ければ、file        を
-             archive_file に追加します。
+       ll ままたたはは vv
+               一覧表示。archive_file に格納されている file の情報を一覧表示し
+               ます。file の指定がなければ archive_file 内の全てのファイルの情
+               報 を 表 示します。 v を指定すると l よりも詳しい情報を表示しま
+               す。
 
-     lll まままたたたははは vvv
-             一覧表示。archive_file  に格納されている  file  の情
-             報を一覧表示します。file            の指定がなければ
-             archive_file    内の全てのファイルの情報を表示します
-             。v を指定すると l よりも詳しい情報を表示します。
+       xx ままたたはは ee
+               抽出。archive_file から file を抽出します。file の指定がなけ れ
+               ば  archive_file 内の全てのファイルを抽出します。抽出すべきファ
+               イルがすでに存在している場合には、重ね書きしていいかの問い合 わ
+               せを行ないます。
 
-     xxx まままたたたははは eee
-             抽出。archive_file から file  を抽出します。file  の
-             指定がなければ  archive_file  内の全てのファイルを抽
-             出します。抽出すべきファイルがすでに存在している場
-             合には、重ね書きしていいかの問い合わせを行ないます
-             。
+       pp       内容表示。archive_file から file の内容を取り出し、標準出力へと
+               出力します。file の指定がなければ、全ての内容を出力します。
 
-     ppp       内容表示。archive_file  から  file  の内容を取り出し
-             、標準出力へと出力します。file    の指定がなければ、
-             全ての内容を出力します。
+       dd       削除。archive_file から file を削除します。
 
-     ddd       削除。archive_file から file を削除します。
+       mm       移動。file を archive_file に追加した後、file を削除します。 こ
+               れ は、key に a を、modifiers に d を指定した時と同じ動作を行な
+               います。
 
-     mmm       移動。file を archive_file  に追加した後、file  を削
-             除します。これは、key  に  a を、modifiers に d を指
-             定した時と同じ動作を行ないます。
+       cc       新規作成。archive_file を新たに作成し、file を追加します。
 
+       機能変更文字 modifiers を指定することによって key の動作の詳細を変更 す
+       る こ と ができます。modifiers は、以下の中から複数指定することができま
+       す。
 
-                        January 14,1997                         1
 
 
+       qq<<nnuumm>>  表示の抑制。対話的なメッセージの表示を抑制します。 <num> の値に
+               よって、INDICATOR の表示方法を変更できます。
 
-LHA(N)              Unix Programmer's Manual               LHA(N)
+                      qq00 oooo........ のの表表示示をを行行ななうう。。
 
+                      qq11 フファァイイルル名名表表示示ののみみ行行ななうう。。
 
-     ccc       新規作成。archive_file  を新たに作成し、file  を追加
-             します。
+                      qq22 何何もも表表示示ししなないい。。
 
-     機能変更文字 modifiers を指定することによって  key  の動作の
-     詳細を変更することができます。modifiers   は、以下の中から複
-     数指定することができます。
+               なお、値を入力しなかった際には、q2 と同等になります。
 
+       vv       表示の冗長化。表示するメッセージを冗長にします。
 
+       nn        実行しない。実際の更新や抽出の動作を行ないません。実行内容の確
+               認のために用意されています。
 
-     qqq<<<nnnuuummm>>>  表示の抑制。対話的なメッセージの表示を抑制します。
-             <num>  の値によって、INDICATOR  の表示方法を変更でき
-             ます。
+       ff       強制的な実行。ファイルの抽出時に、存在するファイルの削除確認 を
+               行なわず強制的に削除を行ないます。
 
-             qqq000 oooooo............ ののの表表表示示示ををを行行行なななううう。。。
+       tt       テキストモードによる格納,抽出。アーカイブファイルへのファイルの
+               格納時には、 UNIX から MS-DOS への改行コード変換を行ないま す。
+               ファイルの抽出時には逆に、MS-DOS から UNIX への改行コード変換を
+               行ないます。
 
-             qqq111 フフファァァイイイルルル名名名表表表示示示のののみみみ行行行なななううう。。。
+       oo{{nnuumm}}  LHarc 互換アーカイブの生成、または圧縮アルゴリズムを指定す る。
+               機能文字 a, u, m と共に指定し、抽出時には無視されます。
 
-             qqq222 何何何ももも表表表示示示しししななないいい。。。
+                      oo LLHHaarrcc 互互換換アアーーカカイイブブのの生生成成をを行行うう。。
 
-             なお、値を入力しなかった際には、q2    と同等になりま
-             す。
+                      古 い 形 式 の アー カイブを生成します。圧縮アルゴリズム
+                      は-lh1-を使用します。
 
-     vvv       表示の冗長化。表示するメッセージを冗長にします。
+               oo55 圧圧縮縮アアルルゴゴリリズズムムにに --llhh55-- をを使使用用すするる。。
 
-     nnn       実行しない。実際の更新や抽出の動作を行ないません。
-             実行内容の確認のために用意されています。
+               oo66 圧圧縮縮アアルルゴゴリリズズムムにに --llhh66-- をを使使用用すするる。。
 
-     fff       強制的な実行。ファイルの抽出時に、存在するファイル
-             の削除確認を行なわず強制的に削除を行ないます。
+               LHAの種類によっては、-lh6-で生成されたアーカイブは抽出できな い
+               恐 れ が あるので、アーカイブを配布する際には注意してください。
+               MSDOS版の正規配布版では -lh6- の生成は行いません。また、MSDOS版
+               LHA  version  2.5x  以降のバージョンでは -lh6- の抽出のみできま
+               す。
 
-     ttt       テキストモードによる格納,抽出。アーカイブファイル
-             へのファイルの格納時には、UNIX  から  MS-DOS  への改
-             行コード変換を行ないます。ファイルの抽出時には逆に
-             、MS-DOS  から  UNIX  への改行コード変換を行ないます
-             。
+       ww==<<//ddiirr>>
+               格納および抽出時のワーク用ディレクトリ 指 定。 デ フォ ル ト で
+               は、/tmp  ですが、/tmp の大きさ以上のファイルを格納する際には必
+               要です。
 
-     ooo{{{nnnuuummm}}}  LHarc   互換アーカイブの生成、または圧縮アルゴリズム
-             を指定する。機能文字  a,  u,  m と共に指定し、抽出時
-             には無視されます。
+       dd       ファイル格納後のファイルの削除。機能文字 a, もしくは u と共に用
+               い、 アーカイブファイルへのファイルの格納の後にファイルを削除し
+               ます。 u に付加した場合、アーカイブファイルの内容の方が新しい時
+               に ファ イ ルが格納されずに削除されることになるので注意して下さ
+               い。
 
-             ooo LLLHHHaaarrrccc 互互互換換換アアアーーーカカカイイイブブブののの生生生成成成ををを行行行ううう。。。
+       ii       抽出時のディレクトリ名の無効化。抽出時にディレクトリ名を無効 に
+               します。
 
-                  古い形式のアーカイブを生成します。圧縮アルゴ
-                  リズムは-lh1-を使用します。
+       zz        非 圧 縮格納。アーカイブへのファイルの格納時に圧縮を行ないませ
+               ん。すでに圧縮を行なっていて圧縮効率を望めない場合などに使用 し
+               ます。抽出時には無視されます。
 
+       gg       [generic]アーカイブの作成。 UNIX 用の付加情報を持たないアーカイ
+               ブファイルを生成します。抽出時には無視されます。
 
+       00//11//22   ヘッダレベル指定。アーカイブの内部表現の形式を指定し ま す。 デ
+               フォ ルトでは 1 です。0 は LHarc で用意されていた古い形式です。
+               将来は 2 の形式に統一されるようです。これはファイルの格納時のみ
+               有効です。ファイルの抽出時には自動的に形式を判断し処理します。
 
-                        January 14,1997                         2
+       _a_r_c_h_i_v_e___f_i_l_e にはアーカイブファイルを指定します。
 
+       _a_r_c_h_i_v_e___f_i_l_e  に _- と書くことによって、アーカイブファイルを標準入出力に
+       することが可能です。 ttaarr(1) のように、アーカイブの作成、更新時には標 準
+       出力に、アーカイブからのファイルの抽出時には標準入力になります。
 
+       抽 出時に _a_r_c_h_i_v_e___f_i_l_e が存在しない時にはサフィックス ..llzzhh をファイル名
+       の後ろに付加して抽出を試みます。
+       特に規定はありませんが、運用上サフィックスとして ..llzzhh を用いるのが望 ま
+       し いと思います。日本以外では ..llhhaa を使用しているケースがあるそうですの
+       で、適宜調整して下さい。:-)
+       サフィックスが ccoomm もしくは ..eexxee の場合には、MS-DOS 版で作成された _S_F_X(
+       自己展開機能付きの圧縮ファイル) 形式かどうかをチェックし、対応します。
+       サ フィックスが ..xx の場合には、日本製 SHARP X68000 の OS, Human68k 版で
+       作成された SFX 形式かどうかをチェックし対応します。
+       SFX 形式のアーカイブファイルに対して追加や削除を行った 場 合 に は、 サ
+       フィックスを ..llzzhh に変更し、SFX の情報を削除します。
 
-LHA(N)              Unix Programmer's Manual               LHA(N)
 
+FFIILLEESS フファァイイルル
+       *.lzh          - LHa/LHarc アーカイブファイル
+       *.bak          - バックアップファイル
+       /tmp/lh*       - テンポラリファイル
+       *.com *.exe    - MS-DOS SFX ファイル
+       *.x            - Human68k SFX ファイル
 
-             ooo555 圧圧圧縮縮縮アアアルルルゴゴゴリリリズズズムムムににに ---lllhhh555- ををを使使使用用用すすするるる。。。
 
-             ooo666 圧圧圧縮縮縮アアアルルルゴゴゴリリリズズズムムムににに ---lllhhh666- ををを使使使用用用すすするるる。。。
+SSEEEE AALLSSOO 関関連連項項目目
+       ttaarr(1), aarr(1), ccoommpprreessss(1)
 
-             LHAの種類によっては、-lh6-で生成されたアーカイブは
-             抽出できない恐れがあるので、アーカイブを配布する際
-             には注意してください。MSDOS版の正規配布版では  -lh6-
-             の生成は行いません。また、MSDOS版  LHA  version 2.5x
-             以降のバージョンでは -lh6- の抽出のみできます。
+DDIISSTTRRIIBBUUTTIIOONN 再再配配布布ににつついいてて
+       以下の条件で、再配布、転載、改変を許可します。
 
-     www===<<<///dddiiirrr>>>
-             格納および抽出時のワーク用ディレクトリ指定。デフォ
-             ルトでは、/tmp  ですが、/tmp  の大きさ以上のファイル
-             を格納する際には必要です。
+       1.     著作権表示を削除しないこと。
 
-     ddd       ファイル格納後のファイルの削除。機能文字  a,  もしく
-             は   u  と共に用い、アーカイブファイルへのファイルの
-             格納の後にファイルを削除します。u   に付加した場合、
-             アーカイブファイルの内容の方が新しい時にファイルが
-             格納されずに削除されることになるので注意して下さい
-             。
+       2.     配布内容については、
 
-     iii       抽出時のディレクトリ名の無効化。抽出時にディレクト
-             リ名を無効にします。
+              a.      配 布の際に存在する内容(すなわちソースコード、ドキュメン
+                     ト、プログラマーへの手引きなど)が再配布されたものの中に必
+                     ず 存 在 すること。改変されているならば、それを明示したド
+                     キュメントを用意すること。
 
-     zzz       非圧縮格納。アーカイブへのファイルの格納時に圧縮を
-             行ないません。すでに圧縮を行なっていて圧縮効率を望
-             めない場合などに使用します。抽出時には無視されます
-             。
+              b.     LHa に対する付加価値が付けられて再配布される場合にはそ れ
+                     ら もできるだけ含めるよう努力すること。また、その際には付
+                     加価値が付けられていることを明示したドキュメントを用意 す
+                     ること。
 
-     ggg       [generic]アーカイブの作成。UNIX   用の付加情報を持た
-             ないアーカイブファイルを生成します。抽出時には無視
-             されます。
+              c.     バイナリのみの配布は許されない。(付加価値のものも含む)
 
-     000///111///222   ヘッダレベル指定。アーカイブの内部表現の形式を指定
-             します。デフォルトでは 1 です。0 は  LHarc  で用意さ
-             れていた古い形式です。将来は   2  の形式に統一される
-             ようです。これはファイルの格納時のみ有効です。ファ
-             イルの抽出時には自動的に形式を判断し処理します。
+       3.     最新版の配布に務めること。(義務はない)
 
-     _a_r_c_h_i_v_e__f_i_l_e にはアーカイブファイルを指定します。
+              注.     なお、ネットでの配付は自由であるが、ネットにアクセスでき
+                     ない方(雑誌および、 CD-ROM などによる)配付は、配付前 に
+                     こ ちらに E-Mail をお願いします。配付前に出来ない際には、
+                     後日必ず E-Mail をお願いします。
 
-     _a_r_c_h_i_v_e__f_i_l_e  に-   と書くことによって、アーカイブファイルを
-     標準入出力にすることが可能です。tttaaarrr(1)    のように、アーカイ
-     ブの作成、更新時には標準出力に、アーカイブからのファイルの
+       4.     このプログラムの存在や使用したことによって生じた損害は全く保証し
+              ない。
 
+       5.     作者は、このプログラムに不備があっても、それを訂正する義務を負わ
+              ない。
 
-                        January 14,1997                         3
+       6.     このプログラムの一部、または全部を他のプログラムに組み込んで利用
+              し てもかまわない。この場合、そのプログラムは LHa ではなく、 LHa
+              と名乗ってはいけない。
 
+       7.     商利用に関しては、上記の条件に加え、下記の条件のもとにこれを認め
+              る。
 
+              a.     このプログラムをメインとする商利用は禁止する。
 
-LHA(N)              Unix Programmer's Manual               LHA(N)
+              b.      商利用の相手がこのプログラムの使用者として不適切と判断し
+                     た場合には配布しない。
 
+              c.     インストールの手段として使用する場合、このプログラムを 使
+                     う こ と を相手に強制しない。この場合、商利用者が作業を行
+                     う。また、そのときの損害は、商利用者が全責任を負う。
 
-     抽出時には標準入力になります。
+              d.     商利用を付加価値として行いこのプログラムを使用する場 合、
+                     商利用者は、そのサポートを行う。
 
-     抽出時に_a_r_c_h_i_v_e__f_i_l_e  が存在しない時にはサフィックス...lllzzzhhh  を
-     ファイル名の後ろに付加して抽出を試みます。
-     特に規定はありませんが、運用上サフィックスとして...lllzzzhhh    を用
-     いるのが望ましいと思います。日本以外では  ...lllhhhaaa  を使用してい
-     るケースがあるそうですので、適宜調整して下さい。:-)
-     サフィックスがcccooommm もしくは...eeexxxeee  の場合には、MS-DOS  版で作成
-     された_S_F_X(自己展開機能付きの圧縮ファイル)   形式かどうかをチ
-     ェックし、対応します。
-     サフィックスが...xxx  の場合には、日本製  SHARP  X68000  の  OS,
-     Human68k  版で作成された  SFX 形式かどうかをチェックし対応し
-     ます。
-     SFX   形式のアーカイブファイルに対して追加や削除を行った場合
-     には、サフィックスを...lllzzzhhh   に変更し、SFX  の情報を削除します
-     。
 
-FFFIIILLLEEESSS フフファァァイイイルルル
-     *.lzh          - LHa/LHarc アーカイブファイル
-     *.bak          - バックアップファイル
-     /tmp/lh*       - テンポラリファイル
-     *.com *.exe    - MS-DOS SFX ファイル
-     *.x            - Human68k SFX ファイル
+最最後後にに((FFrroomm YY..TTaaggaawwaa))
+       LZHUF   法の基礎となった LZARI 法を発表してくださった奥村晴彦氏、それを
+       NIFTY-Serve に紹介し、また、LArc の作者でもある三木和彦氏、また、これら
+       の 要 因 から LZHUF 法及び、MS-DOS 版 LHarc を作成した吉崎栄泰氏、LHarc
+       UNIX の開発に協力した人達、こころよくメッセージの橋渡しをしてくれた石崎
+       一明氏(MIX ID:k.ishi)、また、いろいろなレポートをくれたみなさん、それを
+       中継してくださった森公一郎氏 (MIX ID:kmori)に感謝します。
 
-SSSEEEEEE AAALLLSSSOOO 関関関連連連項項項目目目
-     tttaaarrr(1), aaarrr(1), cccooommmppprrreeessssss(1)
 
-DDDIIISSSTTTRRRIIIBBBUUUTTTIIIOOONNN 再再再配配配布布布にににつつついいいててて
+最最後後にに((FFrroomm MMaassaarruu OOkkii))
+       上記の方々はもちろん、加えて LHarc UNIX を作成した Y.Tagawa 氏、それ を
+       OSK   に移植し吉崎氏の LHx のアルゴリズムを組み込んだ H.S 氏、 JUNET の
+       LHa for UNIX MailingList にて協力してくださったみなさんに感謝致します。
 
-     以下の条件で、再配布、転載、改変を許可します。
+最最後後にに((FFrroomm NNoobbuuttaakkaa WWaattaazzaakkii))
+       このプログラムの作成にかかわった方々、さらにここまで LHa を仕上げてくだ
+       さった 沖勝氏に感謝致します。
 
-     1.      著作権表示を削除しないこと。
 
-     2.      配布内容については、
-
-     a.      配布の際に存在する内容(すなわちソースコード、ドキ
-             ュメント、プログラマーへの手引きなど)が再配布され
-             たものの中に必ず存在すること。改変されているならば
-             、それを明示したドキュメントを用意すること。
-
-     b.      LHa   に対する付加価値が付けられて再配布される場合に
-             はそれらもできるだけ含めるよう努力すること。また、
-             その際には付加価値が付けられていることを明示したド
-             キュメントを用意すること。
-
-
-
-                        January 14,1997                         4
-
-
-
-LHA(N)              Unix Programmer's Manual               LHA(N)
-
-
-     c.      バイナリのみの配布は許されない。(付加価値のものも
-             含む)
-
-     3.      最新版の配布に務めること。(義務はない)
-
-     注.     なお、ネットでの配付は自由であるが、ネットにアクセ
-             スできない方(雑誌および、CD-ROM    などによる)配付
-             は、配付前にこちらに  E-Mail  をお願いします。配付前
-             に出来ない際には、後日必ず E-Mail をお願いします。
-
-     4.      このプログラムの存在や使用したことによって生じた損
-             害は全く保証しない。
-
-     5.      作者は、このプログラムに不備があっても、それを訂正
-             する義務を負わない。
-
-     6.      このプログラムの一部、または全部を他のプログラムに
-             組み込んで利用してもかまわない。この場合、そのプロ
-             グラムは LHa ではなく、LHa と名乗ってはいけない。
-
-     7.      商利用に関しては、上記の条件に加え、下記の条件のも
-             とにこれを認める。
-
-     a.      このプログラムをメインとする商利用は禁止する。
-
-     b.      商利用の相手がこのプログラムの使用者として不適切と
-             判断した場合には配布しない。
-
-     c.      インストールの手段として使用する場合、このプログラ
-             ムを使うことを相手に強制しない。この場合、商利用者
-             が作業を行う。また、そのときの損害は、商利用者が全
-             責任を負う。
-
-     d.      商利用を付加価値として行いこのプログラムを使用する
-             場合、商利用者は、そのサポートを行う。
-
-最最最後後後ににに(((FFFrrrooommm YYY...TTTaaagggaaawwwaaa)))
-     LZHUF  法の基礎となった  LZARI  法を発表してくださった奥村晴
-     彦氏、それを  NIFTY-Serve  に紹介し、また、LArc の作者でもあ
-     る三木和彦氏、また、これらの要因から  LZHUF   法及び、MS-DOS
-     版  LHarc  を作成した吉崎栄泰氏、LHarc UNIX の開発に協力した
-     人達、こころよくメッセージの橋渡しをしてくれた石崎一明氏(MIX
-     ID:k.ishi)、また、いろいろなレポートをくれたみなさん、それ
-     を中継してくださった森公一郎氏  (MIX   ID:kmori)に感謝します
-     。
-
-
-                        January 14,1997                         5
-
-
-
-LHA(N)              Unix Programmer's Manual               LHA(N)
-
-
-最最最後後後ににに(((FFFrrrooommm MMMaaasssaaarrruuu OOOkkkiii)))
-     上記の方々はもちろん、加えて LHarc UNIX を作成した  Y.Tagawa
-     氏、それを  OSK  に移植し吉崎氏の LHx のアルゴリズムを組み込
-     んだ H.S 氏、JUNET の LHa for  UNIX  MailingList  にて協力し
-     てくださったみなさんに感謝致します。
-
-最最最後後後ににに(((FFFrrrooommm NNNooobbbuuutttaaakkkaaa WWWaaatttaaazzzaaakkkiii)))
-     このプログラムの作成にかかわった方々、さらにここまで     LHa
-     を仕上げてくださった 沖勝氏に感謝致します。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                        January 14,1997                         6
 
+                                January 14,1997                         LHA(N)
--- lha-1.14i.orig/Makefile
+++ lha-1.14i/Makefile
@@ -20,7 +20,7 @@
 
 #MACHINE     = -DSYSTIME_HAS_NO_TM -DFTIME -DEUC
 #MACHINE     = -DSYSTIME_HAS_NO_TM -DEUC -DHAVE_TM_ZONE -DSYSV_SYSTEM_DIR
-MACHINE     = -DSYSTIME_HAS_NO_TM -DEUC -DSYSV_SYSTEM_DIR -DMKTIME
+MACHINE     = -DSYSTIME_HAS_NO_TM -DEUC -DSYSV_SYSTEM_DIR -DMKTIME -DMULTIBYTE_CHAR
 
 #OPTIMIZE	= -O2 -fstrength-reduce -fomit-frame-pointer
 OPTIMIZE	= -O2 -DSUPPORT_LH7 -DMKSTEMP
--- lha-1.14i.orig/debian/patch.multibyte
+++ lha-1.14i/debian/patch.multibyte
@@ -0,0 +1,145 @@
+diff -Nuar src.old/header.c src/header.c
+--- src.old/header.c	Fri Oct  6 02:36:03 2000
++++ src/header.c	Fri Jul 19 16:46:41 2002
+@@ -82,6 +82,7 @@
+ 	register int    i;
+ 
+ #ifdef MULTIBYTE_CHAR
++	if (multibyte_mode == TRUE) {
+ 	for (i = 0; i < len; i++) {
+ 		if (MULTIBYTE_FIRST_P(name[i]) &&
+ 		    MULTIBYTE_SECOND_P(name[i + 1]))
+@@ -91,6 +92,14 @@
+ 		else if (!noconvertcase && isupper(name[i]))
+ 			name[i] = tolower(name[i]);
+ 	}
++	} else {
++	for (i = 0; i < len; i++) {
++		if (name[i] == '\\')
++			name[i] = '/';
++		else if (!noconvertcase && isupper(name[i]))
++			name[i] = tolower(name[i]);
++	}
++	}
+ #else
+ 	for (i = 0; i < len; i++) {
+ 		if (name[i] == '\\')
+@@ -111,6 +120,7 @@
+ 	boolean         lower_case_used = FALSE;
+ 
+ #ifdef MULTIBYTE_CHAR
++	if (multibyte_mode == TRUE) {
+ 	for (i = 0; i < len; i++) {
+ 		if (MULTIBYTE_FIRST_P(name[i]) &&
+ 		    MULTIBYTE_SECOND_P(name[i + 1]))
+@@ -128,6 +138,19 @@
+ 			name[i] = '/';
+ 		else if (!noconvertcase && !lower_case_used && isupper(name[i]))
+ 			name[i] = tolower(name[i]);
++	}
++	} else {
++	for (i = 0; i < len; i++)
++		if (islower(name[i])) {
++			lower_case_used = TRUE;
++			break;
++		}
++	for (i = 0; i < len; i++) {
++		if (name[i] == '\\')
++			name[i] = '/';
++		else if (!noconvertcase && !lower_case_used && isupper(name[i]))
++			name[i] = tolower(name[i]);
++	}
+ 	}
+ #else
+ 	for (i = 0; i < len; i++)
+diff -Nuar src.old/lha.h src/lha.h
+--- src.old/lha.h	Fri Jul 19 17:22:13 2002
++++ src/lha.h	Fri Jul 19 17:18:05 2002
+@@ -101,6 +101,9 @@
+ #ifdef EUC
+ EXTERN boolean	euc_mode;
+ #endif
++#ifdef MULTIBYTE_CHAR
++EXTERN boolean	multibyte_mode;
++#endif
+ 
+ /* list command flags */
+ EXTERN boolean  verbose_listing;
+diff -Nuar src.old/lharc.c src/lharc.c
+--- src.old/lharc.c	Fri Oct  6 02:33:34 2000
++++ src/lharc.c	Fri Jul 19 16:56:03 2002
+@@ -101,6 +101,10 @@
+ 	euc_mode		= FALSE;
+ #endif
+ 
++#ifdef MULTIBYTE_CHAR
++	multibyte_mode		= FALSE;
++#endif
++
+ /* view command flags */
+ 	verbose_listing = FALSE;
+ 
+@@ -177,6 +181,11 @@
+                                      e  TEXT code convert from/to EUC\n\
+ ");
+ #endif
++#ifdef MULTIBYTE_CHAR
++	fprintf(stderr, "\
++                                     y  filename multibyte convert\n\
++");
++#endif
+ 	exit(1);
+ }
+ 
+@@ -308,6 +317,11 @@
+ 		case 'e':
+ 			text_mode = TRUE;
+ 			euc_mode = TRUE;
++			break;
++#endif
++#ifdef MULTIBYTE_CHAR
++		case 'y':
++			multibyte_mode = TRUE;
+ 			break;
+ #endif
+ 		case 'n':
+diff -Nuar src.old/util.c src/util.c
+--- src.old/util.c	Wed Oct  4 23:57:38 2000
++++ src/util.c	Fri Jul 19 16:49:23 2002
+@@ -113,18 +113,29 @@
+ #endif
+ 	for (p = path; (c = *p) != 0; p++) {
+ #ifdef MULTIBYTE_CHAR
+-		if (kflg) {
+-			kflg = 0;
++		if (multibyte_mode == TRUE) {
++			if (kflg) {
++				kflg = 0;
++			} else if (MULTIBYTE_FIRST_P(c)) {
++				kflg = 1;
++			} else {
++				if (c == '\\' || c == DELIM || c == DELIM2) {
++					*p = delim;
++					path = p + 1;
++				}
++			}
++		} else {
++			if (c == '\\' || c == DELIM || c == DELIM2) {
++				*p = delim;
++				path = p + 1;
++			}
+ 		}
+-		else if (MULTIBYTE_FIRST_P(c)) {
+-			kflg = 1;
+-		}
+-		else
+-#endif
++#else
+ 		if (c == '\\' || c == DELIM || c == DELIM2) {
+ 			*p = delim;
+ 			path = p + 1;
+ 		}
++#endif
+ 	}
+ 	return path;
+ }
--- lha-1.14i.orig/debian/README.Debian
+++ lha-1.14i/debian/README.Debian
@@ -0,0 +1,6 @@
+lha for DEBIAN
+----------------------
+
+LHa for UNIX
+
+Atsushi KAMOSHIDA <kamop@post1.com>, Sun, 13 Apr 1997 17:52:59 +0900
--- lha-1.14i.orig/debian/org/lha.h
+++ lha-1.14i/debian/org/lha.h
@@ -0,0 +1,322 @@
+/* ------------------------------------------------------------------------ */
+/* LHa for UNIX    Archiver Driver											*/
+/*																			*/
+/*		Modified          		Nobutaka Watazaki							*/
+/*																			*/
+/*	Ver. 1.14 	Soruce All chagned				1995.01.14	N.Watazaki		*/
+/*	Ver. 1.14i 	Modified and bug fixed			2000.10.06	t.okamoto   	*/
+/* ------------------------------------------------------------------------ */
+/*
+	Included...
+		lharc.h		interface.h		slidehuf.h
+*/
+#include <stdio.h>
+#include <errno.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+
+#include <signal.h>
+
+#include "lha_macro.h"
+
+struct encode_option {
+#if defined(__STDC__) || defined(AIX)
+	void            (*output) ();
+	void            (*encode_start) ();
+	void            (*encode_end) ();
+#else
+	int             (*output) ();
+	int             (*encode_start) ();
+	int             (*encode_end) ();
+#endif
+};
+
+struct decode_option {
+	unsigned short  (*decode_c) ();
+	unsigned short  (*decode_p) ();
+#if defined(__STDC__) || defined(AIX)
+	void            (*decode_start) ();
+#else
+	int             (*decode_start) ();
+#endif
+};
+
+/* ------------------------------------------------------------------------ */
+/*	LHa File Type Definition												*/
+/* ------------------------------------------------------------------------ */
+struct string_pool {
+	int             used;
+	int             size;
+	int             n;
+	char           *buffer;
+};
+
+typedef struct LzHeader {
+	unsigned char   header_size;
+	char            method[METHOD_TYPE_STRAGE];
+	long            packed_size;
+	long            original_size;
+	long            last_modified_stamp;
+	unsigned char   attribute;
+	unsigned char   header_level;
+	char            name[256];
+	unsigned short  crc;
+	boolean         has_crc;
+	unsigned char   extend_type;
+	unsigned char   minor_version;
+
+	/* extend_type == EXTEND_UNIX  and convert from other type. */
+	time_t          unix_last_modified_stamp;
+	unsigned short  unix_mode;
+	unsigned short  unix_uid;
+	unsigned short  unix_gid;
+}  LzHeader;
+
+struct interfacing {
+	FILE			*infile;
+	FILE			*outfile;
+	unsigned long   original;
+	unsigned long   packed;
+	int             dicbit;
+	int             method;
+};
+
+
+/* ------------------------------------------------------------------------ */
+/*	Option switch variable													*/
+/* ------------------------------------------------------------------------ */
+/* command line options (common options) */
+EXTERN boolean  quiet;
+EXTERN boolean  text_mode;
+EXTERN boolean  verbose;
+EXTERN boolean  noexec;		/* debugging option */
+EXTERN boolean  force;
+EXTERN boolean  prof;
+EXTERN boolean  delete_after_append;
+EXTERN int		compress_method;
+EXTERN int		header_level;
+/* EXTERN int		quiet_mode; */   /* 1996.8.13 t.okamoto */
+#ifdef EUC
+EXTERN boolean	euc_mode;
+#endif
+
+/* list command flags */
+EXTERN boolean  verbose_listing;
+
+/* extract/print command flags */
+EXTERN boolean  output_to_stdout;
+
+/* add/update/delete command flags */
+EXTERN boolean  new_archive;
+EXTERN boolean  update_if_newer;
+EXTERN boolean  generic_format;
+
+EXTERN boolean	remove_temporary_at_error;
+EXTERN boolean	recover_archive_when_interrupt;
+EXTERN boolean	remove_extracting_file_when_interrupt;
+EXTERN boolean	get_filename_from_stdin;
+EXTERN boolean	ignore_directory;
+EXTERN boolean	verify_mode;
+
+/* Indicator flag */
+EXTERN int		quiet_mode;
+
+/* ------------------------------------------------------------------------ */
+/*	Globale Variable														*/
+/* ------------------------------------------------------------------------ */
+EXTERN char		**cmd_filev;
+EXTERN int      cmd_filec;
+
+EXTERN char		*archive_name;
+EXTERN char     expanded_archive_name[FILENAME_LENGTH];
+EXTERN char     temporary_name[FILENAME_LENGTH];
+EXTERN char     backup_archive_name[FILENAME_LENGTH];
+
+EXTERN char		*reading_filename, *writting_filename;
+
+/* 1996.8.13 t.okamoto */
+#if 0
+EXTERN boolean  remove_temporary_at_error;
+EXTERN boolean  recover_archive_when_interrupt;
+EXTERN boolean  remove_extracting_file_when_interrupt;
+#endif
+
+EXTERN int      archive_file_mode;
+EXTERN int      archive_file_gid;
+
+EXTERN struct	interfacing interface;
+EXTERN node		*next;
+/* EXTERN unsigned short crc; */  /* 1996.8.13 t.okamoto */
+
+EXTERN int      noconvertcase; /* 2000.10.6 */
+
+/* slide.c */
+EXTERN int      unpackable;
+EXTERN unsigned long origsize, compsize;
+EXTERN unsigned short dicbit;
+EXTERN unsigned short maxmatch;
+EXTERN unsigned long count;
+EXTERN unsigned long loc;			/* short -> long .. Changed N.Watazaki */
+EXTERN unsigned char *text;
+EXTERN int		prev_char;
+
+/* huf.c */
+#ifndef LHA_MAIN_SRC  /* t.okamoto 96/2/20 */
+EXTERN unsigned short left[], right[];
+EXTERN unsigned char c_len[], pt_len[];
+EXTERN unsigned short c_freq[], c_table[], c_code[];
+EXTERN unsigned short p_freq[], pt_table[], pt_code[], t_freq[];
+#endif
+
+/* append.c */
+#ifdef NEED_INCREMENTAL_INDICATOR
+EXTERN long		indicator_count;
+EXTERN long		indicator_threshold;
+#endif
+
+/* crcio.c */
+EXTERN FILE		*infile, *outfile;
+EXTERN unsigned short crc, bitbuf;
+EXTERN int      dispflg;
+EXTERN long		reading_size;
+
+/* from dhuf.c */
+EXTERN unsigned int n_max;
+
+/* lhadd.c */
+EXTERN FILE		*temporary_fp;
+
+/* ------------------------------------------------------------------------ */
+/*	Functions																*/
+/* ------------------------------------------------------------------------ */
+/* from lharc.c */
+extern int		patmatch();
+
+extern void		interrupt();
+
+extern void		message();
+extern void		warning();
+extern void		error();
+extern void		fatal_error();
+
+extern boolean	need_file();
+extern int		inquire();
+extern FILE		*xfopen();
+
+extern boolean	find_files();
+extern void		free_files();
+
+extern void		init_sp();
+extern void		add_sp();
+extern void		finish_sp();
+extern void		free_sp();
+extern void		cleaning_files();
+
+extern void		build_temporary_name();
+extern void		build_backup_file_name();
+extern void		build_standard_archive_name();
+
+extern FILE		*open_old_archive();
+extern void		init_header();
+extern boolean	get_header();
+extern boolean	archive_is_msdos_sfx1();
+extern boolean	skip_msdos_sfx1_code();
+extern void		write_header();
+extern void		write_archive_tail();
+extern void		copy_old_one();
+extern unsigned char *convdelim();
+extern long		copyfile();
+
+extern void		cmd_list(), cmd_extract(), cmd_add(), cmd_delete();
+
+extern boolean	ignore_directory;
+extern boolean	compress_method;
+extern boolean	verify_mode;
+
+extern char		*extract_directory;
+
+/* from slide.c */
+
+extern int		encode_alloc();
+extern void		encode();
+extern void		decode();
+
+/* from append.c */
+extern void     start_indicator();
+extern void     finish_indicator();
+extern void     finish_indicator2();
+
+/* slide.c */
+extern void     output_st1();
+extern unsigned char *alloc_buf();
+extern void     encode_start_st1();
+extern void     encode_end_st1();
+extern unsigned short decode_c_st1();
+extern unsigned short decode_p_st1();
+extern void     decode_start_st1();
+
+/* from shuf.c */
+extern void     decode_start_st0();
+extern void     encode_p_st0( /* unsigned short j */ );
+extern void     encode_start_fix();
+extern void     decode_start_fix();
+extern unsigned short decode_c_st0();
+extern unsigned short decode_p_st0();
+
+/* from dhuf.c */
+extern void     start_c_dyn();
+extern void     decode_start_dyn();
+extern unsigned short decode_c_dyn();
+extern unsigned short decode_p_dyn();
+extern void     output_dyn( /* int code, unsigned int pos */ );
+extern void     encode_end_dyn();
+
+extern int      decode_lzhuf();
+
+/* from larc.c */
+
+extern unsigned short decode_c_lzs();
+extern unsigned short decode_p_lzs();
+extern unsigned short decode_c_lz5();
+extern unsigned short decode_p_lz5();
+extern void			  decode_start_lzs();
+extern void			  decode_start_lz5();
+
+extern void	make_table(	/* int nchar, uchar bitlen[], int tablebits,
+							ushort table[] */ );
+
+/* from maketree.c */
+/*
+ * void make_code(short n, uchar len[], ushort code[]); short make_tree(short
+ * nparm, ushort freqparm[], uchar lenparm[], ushort codeparam[]);
+ */
+extern void		make_code( /* int n, uchar len[], ushort code[] */ );
+extern short	make_tree( /* int nparm, ushort freqparm[], uchar lenparm[],
+								ushort codeparam[] */ );
+
+/* from crcio.c */
+extern void				make_crctable();
+extern unsigned short	calccrc( /* uchar *p, uint n */ );
+extern void				fillbuf( /* uchar n */ );
+extern unsigned short	getbits( /* uchar n */ );
+extern void				putcode( /* uchar n, ushort x */ );
+extern void				putbits( /* uchar n, ushort x */ );
+extern int				fread_crc( /* uchar *p, int n, FILE *f */ );
+extern void				fwrite_crc( /* uchar *p, int n, FILE *f */ );
+extern void				init_getbits();
+extern void				init_putbits();
+extern void     		make_crctable();
+extern unsigned 		short calccrc();
+
+/* from lhadd.c */
+extern int		encode_lzhuf();
+extern int      encode_stored_crc();
+
+/* Local Variables: */
+/* mode:c */
+/* tab-width:4 */
+/* End: */
+
+
--- lha-1.14i.orig/debian/org/header.c
+++ lha-1.14i/debian/org/header.c
@@ -0,0 +1,875 @@
+/* ------------------------------------------------------------------------ */
+/* LHa for UNIX    															*/
+/*				header.c -- header manipulate functions						*/
+/*																			*/
+/*		Modified          		Nobutaka Watazaki							*/
+/*																			*/
+/*	Original												Y.Tagawa		*/
+/*	modified									1991.12.16	M.Oki			*/
+/*	Ver. 1.10  Symbolic Link added				1993.10.01	N.Watazaki		*/
+/*	Ver. 1.13b Symbolic Link Bug Fix			1994.08.22	N.Watazaki		*/
+/*	Ver. 1.14  Source All chagned				1995.01.14	N.Watazaki		*/
+/*  Ver. 1.14i bug fixed						2000.10.06  t.okamoto       */
+/* ------------------------------------------------------------------------ */
+#include "lha.h"
+
+/* ------------------------------------------------------------------------ */
+static char    *get_ptr;
+/* ------------------------------------------------------------------------ */
+int
+calc_sum(p, len)
+	register char  *p;
+	register int    len;
+{
+	register int    sum;
+
+	for (sum = 0; len; len--)
+		sum += *p++;
+
+	return sum & 0xff;
+}
+
+/* ------------------------------------------------------------------------ */
+static unsigned short
+get_word()
+{
+	int             b0, b1;
+
+	b0 = get_byte();
+	b1 = get_byte();
+	return (b1 << 8) + b0;
+}
+
+/* ------------------------------------------------------------------------ */
+static void
+put_word(v)
+	unsigned int    v;
+{
+	put_byte(v);
+	put_byte(v >> 8);
+}
+
+/* ------------------------------------------------------------------------ */
+static long
+get_longword()
+{
+	long            b0, b1, b2, b3;
+
+	b0 = get_byte();
+	b1 = get_byte();
+	b2 = get_byte();
+	b3 = get_byte();
+	return (b3 << 24) + (b2 << 16) + (b1 << 8) + b0;
+}
+
+/* ------------------------------------------------------------------------ */
+static void
+put_longword(v)
+	long            v;
+{
+	put_byte(v);
+	put_byte(v >> 8);
+	put_byte(v >> 16);
+	put_byte(v >> 24);
+}
+
+/* ------------------------------------------------------------------------ */
+static void
+msdos_to_unix_filename(name, len)
+	register char  *name;
+	register int    len;
+{
+	register int    i;
+
+#ifdef MULTIBYTE_CHAR
+	for (i = 0; i < len; i++) {
+		if (MULTIBYTE_FIRST_P(name[i]) &&
+		    MULTIBYTE_SECOND_P(name[i + 1]))
+			i++;
+		else if (name[i] == '\\')
+			name[i] = '/';
+		else if (!noconvertcase && isupper(name[i]))
+			name[i] = tolower(name[i]);
+	}
+#else
+	for (i = 0; i < len; i++) {
+		if (name[i] == '\\')
+			name[i] = '/';
+		else if (!noconvertcase && isupper(name[i]))
+			name[i] = tolower(name[i]);
+	}
+#endif
+}
+
+/* ------------------------------------------------------------------------ */
+static void
+generic_to_unix_filename(name, len)
+	register char  *name;
+	register int    len;
+{
+	register int    i;
+	boolean         lower_case_used = FALSE;
+
+#ifdef MULTIBYTE_CHAR
+	for (i = 0; i < len; i++) {
+		if (MULTIBYTE_FIRST_P(name[i]) &&
+		    MULTIBYTE_SECOND_P(name[i + 1]))
+			i++;
+		else if (islower(name[i])) {
+			lower_case_used = TRUE;
+			break;
+		}
+	}
+	for (i = 0; i < len; i++) {
+		if (MULTIBYTE_FIRST_P(name[i]) &&
+		    MULTIBYTE_SECOND_P(name[i + 1]))
+			i++;
+		else if (name[i] == '\\')
+			name[i] = '/';
+		else if (!noconvertcase && !lower_case_used && isupper(name[i]))
+			name[i] = tolower(name[i]);
+	}
+#else
+	for (i = 0; i < len; i++)
+		if (islower(name[i])) {
+			lower_case_used = TRUE;
+			break;
+		}
+	for (i = 0; i < len; i++) {
+		if (name[i] == '\\')
+			name[i] = '/';
+		else if (!noconvertcase && !lower_case_used && isupper(name[i]))
+			name[i] = tolower(name[i]);
+	}
+#endif
+}
+
+/* ------------------------------------------------------------------------ */
+static void
+macos_to_unix_filename(name, len)
+	register char  *name;
+	register int    len;
+{
+	register int    i;
+
+	for (i = 0; i < len; i++) {
+		if (name[i] == ':')
+			name[i] = '/';
+		else if (name[i] == '/')
+			name[i] = ':';
+	}
+}
+
+/* ------------------------------------------------------------------------ */
+static void
+unix_to_generic_filename(name, len)
+	register char  *name;
+	register int    len;
+{
+	register int    i;
+
+	for (i = 0; i < len; i++) {
+		if (name[i] == '/')
+			name[i] = '\\';
+		else if (islower(name[i]))
+			name[i] = toupper(name[i]);
+	}
+}
+
+/* ------------------------------------------------------------------------ */
+/*																			*/
+/* Generic stamp format:						 							*/
+/*																			*/
+/* 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16							*/
+/* |<-------- year ------->|<- month ->|<-- day -->|						*/
+/*																			*/
+/* 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0							*/
+/* |<--- hour --->|<---- minute --->|<- second*2 ->|						*/
+/*																			*/
+/* ------------------------------------------------------------------------ */
+
+/*
+ * NOTE : If you don't have `gettimeofday(2)', or your gettimeofday(2)
+ * returns bogus timezone information, try FTIME, MKTIME, TIMELOCAL or TZSET.
+ */
+
+/* choose one */
+#if defined(MKTIME)
+#ifdef TIMELOCAL
+#undef TIMELOCAL
+#endif
+#endif				/* defined(MKTIME) */
+
+#if defined(MKTIME) || defined(TIMELOCAL)
+#ifdef TZSET
+#undef TZSET
+#endif
+#endif				/* defined(MKTIME) || defined(TIMELOCAL) */
+
+#if defined(MKTIME) || defined(TIMELOCAL) || defined(TZSET)
+#ifdef FTIME
+#undef FTIME
+#endif
+#endif
+
+#if defined(MKTIME) || defined(TIMELOCAL) || defined(TZSET) || defined(FTIME)
+#ifdef GETTIMEOFDAY
+#undef GETTIMEOFDAY
+#endif
+#else
+#ifndef GETTIMEOFDAY
+#define GETTIMEOFDAY		/* use gettimeofday() */
+#endif
+#endif
+
+#ifdef FTIME
+#include <sys/timeb.h>
+#endif
+
+/*
+ * You may define as : #define TIMEZONE_HOOK		\ extern long
+ * timezone ;	\ extern void tzset();
+ */
+#ifdef TIMEZONE_HOOK
+TIMEZONE_HOOK
+/* Which do you like better, `TIMEZONE_HOOK' or `TIMEZONE_HOOK;' ? */
+#endif
+
+#if defined(TZSET) && defined(_MINIX)
+extern long     timezone;		/* not defined in time.h */
+#endif
+
+/* ------------------------------------------------------------------------ */
+#if defined(FTIME) || defined(GETTIMEOFDAY) || defined(TZSET)
+static long
+gettz()
+#ifdef TZSET
+{
+	tzset();
+	return timezone;
+}
+#endif
+
+/* ------------------------------------------------------------------------ */
+#if !defined(TZSET) && defined(FTIME)
+{
+	struct timeb    buf;
+
+	ftime(&buf);
+	return buf.timezone * 60L;
+}
+#endif
+
+/* ------------------------------------------------------------------------ */
+#if !defined(TZSET) && !defined(FTIME)	/* maybe defined(GETTIMEOFDAY) */
+{
+#ifdef HAVE_TM_ZONE
+	time_t tt;
+
+	time(&tt);
+	return -localtime(&tt)->tm_gmtoff;
+#else /* HAVE_TM_ZONE */
+	struct timeval  tp;
+	struct timezone tzp;
+	gettimeofday(&tp, &tzp);/* specific to 4.3BSD */
+	/*
+	 * return (tzp.tz_minuteswest * 60L + (tzp.tz_dsttime != 0 ? 60L *
+	 * 60L : 0));
+	 */
+	return (tzp.tz_minuteswest * 60L);
+#endif /* HAVE_TM_ZONE */
+}
+#endif
+#endif				/* defined(FTIME) || defined(GETTIMEOFDAY) ||
+				 * defined(TZSET) */
+
+/* ------------------------------------------------------------------------ */
+#ifdef NOT_USED
+static struct tm *
+msdos_to_unix_stamp_tm(a)
+	long            a;
+{
+	static struct tm t;
+
+	t.tm_sec = (a & 0x1f) * 2;
+	t.tm_min = (a >> 5) & 0x3f;
+	t.tm_hour = (a >> 11) & 0x1f;
+	t.tm_mday = (a >> 16) & 0x1f;
+	t.tm_mon = ((a >> 16 + 5) & 0x0f) - 1;
+	t.tm_year = ((a >> 16 + 9) & 0x7f) + 80;
+	return &t;
+}
+#endif
+
+/* ------------------------------------------------------------------------ */
+static          time_t
+generic_to_unix_stamp(t)
+	long            t;
+#if defined(MKTIME) || defined(TIMELOCAL)
+{
+	struct tm       dostm;
+
+	/*
+	 * special case:  if MSDOS format date and time were zero, then we
+	 * set time to be zero here too.
+	 */
+	if (t == 0)
+		return (time_t) 0;
+
+	dostm.tm_sec = (t & 0x1f) * 2;
+	dostm.tm_min = t >> 5 & 0x3f;
+	dostm.tm_hour = t >> 11 & 0x1f;
+	dostm.tm_mday = t >> 16 & 0x1f;
+	dostm.tm_mon = (t >> 16 + 5 & 0x0f) - 1;	/* 0..11 */
+	dostm.tm_year = (t >> 16 + 9 & 0x7f) + 80;
+#if 0
+	dostm.tm_isdst = 0;	/* correct? */
+#endif
+	dostm.tm_isdst = -1;    /* correct? */
+#ifdef MKTIME
+	return (time_t) mktime(&dostm);
+#else				/* maybe defined(TIMELOCAL) */
+	return (time_t) timelocal(&dostm);
+#endif
+}
+
+#else				/* defined(MKTIME) || defined(TIMELOCAL) */
+{
+	int             year, month, day, hour, min, sec;
+	long            longtime;
+	static unsigned int dsboy[12] = {0, 31, 59, 90, 120, 151,
+	181, 212, 243, 273, 304, 334};
+	unsigned int    days;
+
+	/*
+	 * special case:  if MSDOS format date and time were zero, then we
+	 * set time to be zero here too.
+	 */
+	if (t == 0)
+		return (time_t) 0;
+
+	year = ((int) (t >> 16 + 9) & 0x7f) + 1980;
+	month = (int) (t >> 16 + 5) & 0x0f;	/* 1..12 means Jan..Dec */
+	day = (int) (t >> 16) & 0x1f;	/* 1..31 means 1st,...31st */
+
+	hour = ((int) t >> 11) & 0x1f;
+	min = ((int) t >> 5) & 0x3f;
+	sec = ((int) t & 0x1f) * 2;
+
+	/* Calculate days since 1970.01.01 */
+	days = (365 * (year - 1970) +	/* days due to whole years */
+		(year - 1970 + 1) / 4 +	/* days due to leap years */
+		dsboy[month - 1] +	/* days since beginning of this year */
+		day - 1);	/* days since beginning of month */
+
+	if ((year % 4 == 0) &&
+		(year % 100 != 0 || year % 400 == 0) &&		/* 1999.5.24 t.oka */
+	    (month >= 3))	/* if this is a leap year and month */
+		days++;		/* is March or later, add a day */
+
+	/* Knowing the days, we can find seconds */
+	longtime = (((days * 24) + hour) * 60 + min) * 60 + sec;
+	longtime += gettz();	/* adjust for timezone */
+
+	/* LONGTIME is now the time in seconds, since 1970/01/01 00:00:00.  */
+	return (time_t) longtime;
+}
+#endif				/* defined(MKTIME) || defined(TIMELOCAL) */
+
+/* ------------------------------------------------------------------------ */
+static long
+unix_to_generic_stamp(t)
+	time_t          t;
+{
+	struct tm      *tm = localtime(&t);
+
+	return ((((long) (tm->tm_year - 80)) << 25) +
+		(((long) (tm->tm_mon + 1)) << 21) +
+		(((long) tm->tm_mday) << 16) +
+		(long) ((tm->tm_hour << 11) +
+			(tm->tm_min << 5) +
+			(tm->tm_sec / 2)));
+}
+
+/* ------------------------------------------------------------------------ */
+/* build header functions													*/
+/* ------------------------------------------------------------------------ */
+boolean
+get_header(fp, hdr)
+	FILE           *fp;
+	register LzHeader *hdr;
+{
+	int             header_size;
+	int             name_length;
+	char            data[LZHEADER_STRAGE];
+	char            dirname[FILENAME_LENGTH];
+	int             dir_length = 0;
+	int             checksum;
+	int             i;
+	char           *ptr;
+	int				extend_size;
+	int				dmy;
+
+	bzero(hdr, sizeof(LzHeader));
+
+	if (((header_size = getc(fp)) == EOF) || (header_size == 0)) {
+		return FALSE;	/* finish */
+	}
+
+	if (fread(data + I_HEADER_CHECKSUM,
+		  sizeof(char), header_size - 1, fp) < header_size - 1) {
+		fatal_error("Invalid header (LHarc file ?)");
+		return FALSE;	/* finish */
+	}
+	setup_get(data + I_HEADER_LEVEL);
+	hdr->header_level = get_byte();
+	if (hdr->header_level != 2 &&
+	    fread(data + header_size, sizeof(char), 2, fp) < 2) {
+		fatal_error("Invalid header (LHarc file ?)");
+		return FALSE;	/* finish */
+	}
+
+	if (hdr->header_level >= 3) {
+		fatal_error("Unknown level header");
+		return FALSE;
+	}
+
+	setup_get(data + I_HEADER_CHECKSUM);
+	checksum = get_byte();
+
+	if (hdr->header_level == 2) {
+		hdr->header_size = header_size + checksum*256;
+	} else {
+		hdr->header_size = header_size;
+	}
+	bcopy(data + I_METHOD, hdr->method, METHOD_TYPE_STRAGE);
+	setup_get(data + I_PACKED_SIZE);
+	hdr->packed_size = get_longword();
+	hdr->original_size = get_longword();
+	hdr->last_modified_stamp = get_longword();
+	hdr->attribute = get_byte();
+
+	if ((hdr->header_level = get_byte()) != 2) {
+		if (calc_sum(data + I_METHOD, header_size) != checksum)
+			warning("Checksum error (LHarc file?)", "");
+		name_length = get_byte();
+		for (i = 0; i < name_length; i++)
+			hdr->name[i] = (char) get_byte();
+		hdr->name[name_length] = '\0';
+	}
+	else {
+		hdr->unix_last_modified_stamp = hdr->last_modified_stamp;
+		name_length = 0;
+	}
+
+	/* defaults for other type */
+	hdr->unix_mode = UNIX_FILE_REGULAR | UNIX_RW_RW_RW;
+	hdr->unix_gid = 0;
+	hdr->unix_uid = 0;
+
+	if (hdr->header_level == 0) {
+		extend_size = header_size - name_length -22;
+		if (extend_size < 0) {
+			if (extend_size == -2) {
+				hdr->extend_type = EXTEND_GENERIC;
+				hdr->has_crc = FALSE;
+			} else {
+				fatal_error("Unkonwn header (lha file?)");
+				return FALSE;
+			}
+		} else {
+			hdr->has_crc = TRUE;
+			hdr->crc = get_word();
+		}
+
+		if (extend_size >= 1) {
+			hdr->extend_type = get_byte();
+			extend_size--;
+		}
+		if (hdr->extend_type == EXTEND_UNIX) {
+			if (extend_size >= 11) {
+				hdr->minor_version = get_byte();
+				hdr->unix_last_modified_stamp = (time_t) get_longword();
+				hdr->unix_mode = get_word();
+				hdr->unix_uid = get_word();
+				hdr->unix_gid = get_word();
+				extend_size -= 11;
+			} else {
+				hdr->extend_type = EXTEND_GENERIC;
+			}
+		}
+		while (extend_size-- > 0)
+			dmy = get_byte();
+		if (hdr->extend_type == EXTEND_UNIX)
+			return TRUE;
+	} else if (hdr->header_level == 1) {
+		hdr->has_crc = TRUE;
+		extend_size = header_size - name_length-25;
+		hdr->crc = get_word();
+		hdr->extend_type = get_byte();
+		while (extend_size-- > 0)
+			dmy = get_byte();
+	} else { /* level 2 */
+		hdr->has_crc = TRUE;
+		hdr->crc = get_word();
+		hdr->extend_type = get_byte();
+	}		
+
+	if (hdr->header_level > 0) {
+		/* Extend Header */
+		if (hdr->header_level != 2)
+			setup_get(data + hdr->header_size);
+		ptr = get_ptr;
+		while ((header_size = get_word()) != 0) {
+			if (hdr->header_level != 2 &&
+			((data + LZHEADER_STRAGE - get_ptr < header_size) ||
+			 fread(get_ptr, sizeof(char), header_size, fp) < header_size)) {
+				fatal_error("Invalid header (LHa file ?)");
+				return FALSE;
+			}
+			switch (get_byte()) {
+			case 0:
+				/*
+				 * header crc
+				 */
+				setup_get(get_ptr + header_size - 3);
+				break;
+			case 1:
+				/*
+				 * filename
+				 */
+				for (i = 0; i < header_size - 3; i++)
+					hdr->name[i] = (char) get_byte();
+				hdr->name[header_size - 3] = '\0';
+				name_length = header_size - 3;
+				break;
+			case 2:
+				/*
+				 * directory
+				 */
+				for (i = 0; i < header_size - 3; i++)
+					dirname[i] = (char) get_byte();
+				dirname[header_size - 3] = '\0';
+				convdelim(dirname, DELIM);
+				dir_length = header_size - 3;
+				break;
+			case 0x40:
+				/*
+				 * MS-DOS attribute
+				 */
+				if (hdr->extend_type == EXTEND_MSDOS ||
+				    hdr->extend_type == EXTEND_HUMAN ||
+				    hdr->extend_type == EXTEND_GENERIC)
+					hdr->attribute = get_word();
+				break;
+			case 0x50:
+				/*
+				 * UNIX permission
+				 */
+				if (hdr->extend_type == EXTEND_UNIX)
+					hdr->unix_mode = get_word();
+				break;
+			case 0x51:
+				/*
+				 * UNIX gid and uid
+				 */
+				if (hdr->extend_type == EXTEND_UNIX) {
+					hdr->unix_gid = get_word();
+					hdr->unix_uid = get_word();
+				}
+				break;
+			case 0x52:
+				/*
+				 * UNIX group name
+				 */
+				setup_get(get_ptr + header_size - 3);
+				break;
+			case 0x53:
+				/*
+				 * UNIX user name
+				 */
+				setup_get(get_ptr + header_size - 3);
+				break;
+			case 0x54:
+				/*
+				 * UNIX last modified time
+				 */
+				if (hdr->extend_type == EXTEND_UNIX)
+					hdr->unix_last_modified_stamp = (time_t) get_longword();
+				break;
+			default:
+				/*
+				 * other headers
+				 */
+				setup_get(get_ptr + header_size - 3);
+				break;
+			}
+		}
+		if (hdr->header_level != 2 && get_ptr - ptr != 2) {
+			hdr->packed_size -= get_ptr - ptr - 2;
+			hdr->header_size += get_ptr - ptr - 2;
+		}
+	}
+
+	switch (hdr->extend_type) {
+	case EXTEND_MSDOS:
+		msdos_to_unix_filename(hdr->name, name_length);
+		msdos_to_unix_filename(dirname, dir_length);
+	case EXTEND_HUMAN:
+		if (hdr->header_level == 2)
+			hdr->unix_last_modified_stamp = hdr->last_modified_stamp;
+		else
+			hdr->unix_last_modified_stamp =
+				generic_to_unix_stamp(hdr->last_modified_stamp);
+		break;
+
+#ifdef OSK
+	case EXTEND_OS68K:
+	case EXTEND_XOSK:
+#endif
+	case EXTEND_UNIX:
+		break;
+
+	case EXTEND_MACOS:
+		macos_to_unix_filename(hdr->name, name_length);
+		/* macos_to_unix_filename(dirname, dir_length); */
+		hdr->unix_last_modified_stamp =
+			generic_to_unix_stamp(hdr->last_modified_stamp);
+		break;
+
+	default:
+		generic_to_unix_filename(hdr->name, name_length);
+		generic_to_unix_filename(dirname, dir_length);
+		if (hdr->header_level == 2)
+			hdr->unix_last_modified_stamp = hdr->last_modified_stamp;
+		else
+			hdr->unix_last_modified_stamp =
+				generic_to_unix_stamp(hdr->last_modified_stamp);
+	}
+
+	if (dir_length) {
+		strcat(dirname, hdr->name);
+		strcpy(hdr->name, dirname);
+		name_length += dir_length;
+	}
+
+	return TRUE;
+}
+
+/* ------------------------------------------------------------------------ */
+void
+init_header(name, v_stat, hdr)
+	char           *name;
+	struct stat    *v_stat;
+	LzHeader       *hdr;
+{
+	int             len;
+
+	if (compress_method == LZHUFF5_METHOD_NUM)  /* Changed N.Watazaki */
+		bcopy(LZHUFF5_METHOD, hdr->method, METHOD_TYPE_STRAGE);
+	else if (compress_method)
+		bcopy(LZHUFF1_METHOD, hdr->method, METHOD_TYPE_STRAGE);
+	else
+		bcopy(LZHUFF0_METHOD, hdr->method, METHOD_TYPE_STRAGE);
+
+	hdr->packed_size = 0;
+	hdr->original_size = v_stat->st_size;
+	hdr->last_modified_stamp = unix_to_generic_stamp(v_stat->st_mtime);
+	hdr->attribute = GENERIC_ATTRIBUTE;
+	hdr->header_level = header_level;
+	strcpy(hdr->name, name);
+	len = strlen(name);
+	hdr->crc = 0x0000;
+	hdr->extend_type = EXTEND_UNIX;
+	hdr->unix_last_modified_stamp = v_stat->st_mtime;
+	/* since 00:00:00 JAN.1.1970 */
+#ifdef NOT_COMPATIBLE_MODE
+	/* Please need your modification in this space. */
+#else
+	hdr->unix_mode = v_stat->st_mode;
+#endif
+
+	hdr->unix_uid = v_stat->st_uid;
+	hdr->unix_gid = v_stat->st_gid;
+
+	if (is_directory(v_stat)) {
+		bcopy(LZHDIRS_METHOD, hdr->method, METHOD_TYPE_STRAGE);
+		hdr->attribute = GENERIC_DIRECTORY_ATTRIBUTE;
+		hdr->original_size = 0;
+		if (len > 0 && hdr->name[len - 1] != '/')
+			strcpy(&hdr->name[len++], "/");
+	}
+
+#ifdef S_IFLNK	
+	if (is_symlink(v_stat)) {
+		char	lkname[257];
+		int		len;	
+		bcopy(LZHDIRS_METHOD, hdr->method, METHOD_TYPE_STRAGE);
+		hdr->attribute = GENERIC_DIRECTORY_ATTRIBUTE;
+		hdr->original_size = 0;
+		len = readlink(name, lkname, 256);
+		lkname[len] = (char)'\0';
+		sprintf(hdr->name, "%s|%s", hdr->name, lkname);
+	}
+#endif
+	if (generic_format)
+		unix_to_generic_filename(hdr->name, len);
+}
+
+/* ------------------------------------------------------------------------ */
+/* Write unix extended header or generic header. */
+void
+write_header(nafp, hdr)
+	FILE           *nafp;
+	LzHeader       *hdr;
+{
+	int             header_size;
+	int             name_length;
+	char            data[LZHEADER_STRAGE];
+	char           *p;
+	char           *headercrc_ptr;
+
+	bzero(data, LZHEADER_STRAGE);
+	bcopy(hdr->method, data + I_METHOD, METHOD_TYPE_STRAGE);
+	setup_put(data + I_PACKED_SIZE);
+	put_longword(hdr->packed_size);
+	put_longword(hdr->original_size);
+
+	if (hdr->header_level == HEADER_LEVEL2)
+		put_longword((long) hdr->unix_last_modified_stamp);
+	else
+		put_longword(hdr->last_modified_stamp);
+
+	switch (hdr->header_level) {
+	case HEADER_LEVEL0:
+		put_byte(hdr->attribute);
+		break;
+	case HEADER_LEVEL1:
+	case HEADER_LEVEL2:
+		put_byte(0x20);
+		break;
+	}
+
+	put_byte(hdr->header_level);
+
+	convdelim(hdr->name, DELIM2);
+	if (hdr->header_level != HEADER_LEVEL2) {
+		if (p = (char *) rindex(hdr->name, DELIM2))
+			name_length = strlen(++p);
+		else
+			name_length = strlen(hdr->name);
+		put_byte(name_length);
+		bcopy(p ? p : hdr->name, data + I_NAME, name_length);
+		setup_put(data + I_NAME + name_length);
+	}
+
+	put_word(hdr->crc);
+	if (header_level == HEADER_LEVEL0) {
+		if (generic_format) {
+			header_size = I_GENERIC_HEADER_BOTTOM - 2 + name_length;
+			data[I_HEADER_SIZE] = header_size;
+			data[I_HEADER_CHECKSUM] = calc_sum(data + I_METHOD, header_size);
+		} else {
+			/* write old-style extend header */
+			put_byte(EXTEND_UNIX);
+			put_byte(CURRENT_UNIX_MINOR_VERSION);
+			put_longword((long) hdr->unix_last_modified_stamp);
+			put_word(hdr->unix_mode);
+			put_word(hdr->unix_uid);
+			put_word(hdr->unix_gid);
+			header_size = I_UNIX_EXTEND_BOTTOM - 2 + name_length;
+			data[I_HEADER_SIZE] = header_size;
+			data[I_HEADER_CHECKSUM] = calc_sum(data + I_METHOD, header_size);
+		}
+	} else {
+		/* write extend header. */
+		char           *ptr;
+
+		if (generic_format)
+			put_byte(0x00);
+		else
+			put_byte(EXTEND_UNIX);
+
+		ptr = put_ptr;
+		if (hdr->header_level == HEADER_LEVEL2) {
+			/* write common header */
+			put_word(5);
+			put_byte(0x00);
+			headercrc_ptr = put_ptr;
+			put_word(0x0000);
+		}
+
+		if (generic_format) {
+			header_size = put_ptr - data;	/* +2 for last 0x0000 */
+		} else {
+			put_word(5);
+			if (hdr->header_level == HEADER_LEVEL1)
+				header_size = put_ptr - data - 2;
+			put_byte(0x50);	/* permission */
+			put_word(hdr->unix_mode);
+			put_word(7);
+			put_byte(0x51);	/* gid and uid */
+			put_word(hdr->unix_gid);
+			put_word(hdr->unix_uid);
+
+			if (p = (char *) rindex(hdr->name, DELIM2)) {
+				int             i;
+
+				name_length = p - hdr->name + 1;
+				put_word(name_length + 3);
+				put_byte(2);	/* dirname */
+				for (i = 0; i < name_length; i++)
+					put_byte(hdr->name[i]);
+			}
+		}		/* if generic .. */
+
+		if (header_level != HEADER_LEVEL2) {
+			if (!generic_format) {
+				put_word(7);
+				put_byte(0x54);	/* time stamp */
+				put_longword(hdr->unix_last_modified_stamp);
+			}
+			hdr->packed_size += put_ptr - ptr;
+			ptr = put_ptr;
+			setup_put(data + I_PACKED_SIZE);
+			put_longword(hdr->packed_size);
+			put_ptr = ptr;
+			data[I_HEADER_SIZE] = header_size;
+			data[I_HEADER_CHECKSUM] = calc_sum(data + I_METHOD, header_size);
+		} else {		/* header level 2 */
+			int             i;
+			if (p = (char *) rindex(hdr->name, DELIM2))
+				name_length = strlen(++p);
+			else {
+				p = hdr->name;
+				name_length = strlen(hdr->name);
+			}
+			put_word(name_length + 3);
+			put_byte(1);	/* filename */
+			for (i = 0; i < name_length; i++)
+				put_byte(*p++);
+		}		/* if he.. != HEAD_LV2 */
+		header_size = put_ptr - data;
+	}
+
+	if (header_level == HEADER_LEVEL2) {
+		unsigned short  hcrc;
+		setup_put(data + I_HEADER_SIZE);
+		put_word(header_size + 2);
+		/* common header */
+		hcrc = calc_header_crc(data, (unsigned int) header_size + 2);
+		setup_put(headercrc_ptr);
+		put_word(hcrc);
+	}
+
+	if (fwrite(data, sizeof(char), header_size + 2, nafp) == 0)
+		fatal_error("Cannot write to temporary file");
+
+	convdelim(hdr->name, DELIM);
+}
+
+/* Local Variables: */
+/* mode:c */
+/* tab-width:4 */
+/* compile-command:"gcc -c header.c" */
+/* End: */
--- lha-1.14i.orig/debian/org/lharc.c
+++ lha-1.14i/debian/org/lharc.c
@@ -0,0 +1,1135 @@
+/* ------------------------------------------------------------------------ */
+/* LHa for UNIX    															*/
+/*				lharc.c -- append to archive								*/
+/*																			*/
+/*		Copyright (C) MCMLXXXIX Yooichi.Tagawa								*/
+/*		Modified          		Nobutaka Watazaki							*/
+/*							Thanks to H.Yoshizaki. (MS-DOS LHarc)			*/
+/*																			*/
+/*  Ver. 0.00  Original							1988.05.23  Y.Tagawa		*/
+/*  Ver. 0.01  Alpha Version (for 4.2BSD)		1989.05.28  Y.Tagawa		*/
+/*  Ver. 0.02  Alpha Version Rel.2				1989.05.29  Y.Tagawa		*/
+/*  Ver. 0.03  Release #3  Beta Version			1989.07.02  Y.Tagawa		*/
+/*  Ver. 0.03a Debug							1989.07.03  Y.Tagawa		*/
+/*  Ver. 0.03b Modified							1989.07.13  Y.Tagawa		*/
+/*  Ver. 0.03c Debug (Thanks to void@rena.dit.junet)						*/
+/*												1989.08.09  Y.Tagawa		*/
+/*  Ver. 0.03d Modified (quiet and verbose)		1989.09.14  Y.Tagawa		*/
+/*  V1.00  Fixed								1989.09.22  Y.Tagawa		*/
+/*  V1.01  Bug Fixed							1989.12.25  Y.Tagawa		*/
+/*																			*/
+/*  DOS-Version Original LHx V C2.01 		(C) H.Yohizaki					*/
+/*																			*/
+/*  V2.00  UNIX Lharc + DOS LHx -> OSK LHx		1990.11.01  Momozou			*/
+/*  V2.01  Minor Modified						1990.11.24  Momozou			*/
+/*																			*/
+/*  Ver. 0.02  LHx for UNIX						1991.11.18  M.Oki			*/
+/*  Ver. 0.03  LHa for UNIX						1991.12.17  M.Oki			*/
+/*  Ver. 0.04  LHa for UNIX	beta version		1992.01.20  M.Oki			*/
+/*  Ver. 1.00  LHa for UNIX	Fixed				1992.03.19  M.Oki			*/
+/*																			*/
+/*  Ver. 1.10  for Symblic Link					1993.06.25  N.Watazaki		*/
+/*  Ver. 1.11  for Symblic Link	Bug Fixed		1993.08.18  N.Watazaki		*/
+/*  Ver. 1.12  for File Date Check				1993.10.28  N.Watazaki		*/
+/*  Ver. 1.13  Bug Fixed (Idicator calcurate)	1994.02.21  N.Watazaki		*/
+/*  Ver. 1.13a Bug Fixed (Sym. Link delete)		1994.03.11  N.Watazaki		*/
+/*	Ver. 1.13b Bug Fixed (Sym. Link delete)		1994.07.29  N.Watazaki		*/
+/*	Ver. 1.14  Source All chagned				1995.01.14	N.Watazaki		*/
+/*	Ver. 1.14b,c  Bug Fixed                     1996.03.07  t.okamoto		*/
+/*  Ver. 1.14d Version up                       1997.01.12  t.okamoto       */
+/*  Ver. 1.14g Bug Fixed                        2000.05.06  t.okamoto       */
+/*  Ver. 1.14i Modified                         2000.10.06  t.okamoto       */
+/* ------------------------------------------------------------------------ */
+#define LHA_MAIN_SRC
+
+#include "lha.h"
+
+/* ------------------------------------------------------------------------ */
+/*								PROGRAM										*/
+/* ------------------------------------------------------------------------ */
+static int      cmd = CMD_UNKNOWN;
+
+/* 1996.8.13 t.okamoto */
+#if 0
+char          **cmd_filev;
+int             cmd_filec;
+
+char           *archive_name;
+char            expanded_archive_name[FILENAME_LENGTH];
+char            temporary_name[FILENAME_LENGTH];
+char            backup_archive_name[FILENAME_LENGTH];
+#endif
+
+/* static functions */
+static void     sort_files();
+static void		print_version();
+
+char		    *extract_directory = NULL;
+char		  **xfilev;
+int             xfilec = 257;
+
+/* 1996.8.13 t.okamoto */
+#if 0
+char           *writting_filename;
+char           *reading_filename;
+
+int             archive_file_mode;
+int             archive_file_gid;
+#endif
+/* ------------------------------------------------------------------------ */
+static void
+init_variable()		/* Added N.Watazaki */
+{
+/* options */
+	quiet			= FALSE;
+	text_mode		= FALSE;
+	verbose			= FALSE;
+	noexec			= FALSE;	/* debugging option */
+	force			= FALSE;
+	prof			= FALSE;
+#ifndef SUPPORT_LH7
+	compress_method = LZHUFF5_METHOD_NUM;
+#endif
+#ifdef SUPPORT_LH7
+	compress_method = LZHUFF7_METHOD_NUM;
+#endif
+
+	header_level	= HEADER_LEVEL1;
+	quiet_mode		= 0;
+
+#ifdef EUC
+	euc_mode		= FALSE;
+#endif
+
+/* view command flags */
+	verbose_listing = FALSE;
+
+/* extract command flags */
+	output_to_stdout = FALSE;
+
+/* append command flags */
+	new_archive			= FALSE;
+	update_if_newer		= FALSE;
+	delete_after_append = FALSE;
+	generic_format		= FALSE;
+
+	remove_temporary_at_error 				= FALSE;
+	recover_archive_when_interrupt			= FALSE;
+	remove_extracting_file_when_interrupt	= FALSE;
+	get_filename_from_stdin					= FALSE;
+	ignore_directory						= FALSE;
+	verify_mode								= FALSE;
+
+	noconvertcase							= FALSE;
+
+	extract_directory = NULL;
+	xfilec = 257;
+}
+
+/* ------------------------------------------------------------------------ */
+/* NOTES :			Text File Format										*/
+/* GENERATOR		NewLine													*/
+/* [generic]		0D 0A													*/
+/* [MS-DOS]			0D 0A													*/
+/* [OS9][MacOS]		0D														*/
+/* [UNIX]			0A														*/
+/* ------------------------------------------------------------------------ */
+static void
+print_tiny_usage_and_exit()
+{
+	fprintf(stderr, "\
+LHarc    for UNIX  V 1.02  Copyright(C) 1989  Y.Tagawa\n\
+LHx      for MSDOS V C2.01 Copyright(C) 1990  H.Yoshizaki\n\
+LHx(arc) for OSK   V 2.01  Modified     1990  Momozou\n\
+LHa      for UNIX  V 1.00  Copyright(C) 1992  Masaru Oki\n\
+LHa      for UNIX  V 1.14  Modified     1995  Nobutaka Watazaki\n\
+LHa      for UNIX  V 1.14i Modified     2000  Tsugio Okamoto\n\
+");
+	fprintf(stderr, "\
+usage: lha [-]{axelvudmcp[q[num]][vnfodizg012]}[w=<dir>] archive_file [file...]\n\
+commands:                           options:\n\
+ a   Add(or replace) to archive      q{num} quiet (num:quiet mode)\n\
+ x,e EXtract from archive            v  verbose\n\
+ l,v List / Verbose List             n  not execute\n\
+ u   Update newer files to archive   f  force (over write at extract)\n\
+ d   Delete from archive             t  FILES are TEXT file\n");
+#ifdef SUPPORT_LH7
+	fprintf(stderr, "\
+ m   Move to archive (means 'ad')    o[567] compression method (a/u)\n\
+");
+#endif
+#ifndef SUPPORT_LH7
+	fprintf(stderr, "\
+ m   Move to archive (means 'ad')    o  use LHarc compatible method (a/u)\n\
+");
+#endif
+	fprintf(stderr, "\
+ c   re-Construct new archive        w=<dir> specify extract directory (a/u/m/x/e)\n\
+ p   Print to STDOUT from archive    d  delete FILES after (a/u/c)\n\
+ t   Test file CRC in archive        i  ignore directory path (x/e)\n\
+                                     z  files not compress (a/u)\n\
+                                     g  Generic format (for compatibility)\n\
+                                        or not convert case when extracting\n\
+                                     0/1/2 header level (a/u)\n\
+");
+#ifdef EUC
+	fprintf(stderr, "\
+                                     e  TEXT code convert from/to EUC\n\
+");
+#endif
+	exit(1);
+}
+
+/* ------------------------------------------------------------------------ */
+int
+main(argc, argv)
+	int             argc;
+	char           *argv[];
+{
+	char           *p, inpbuf[256];
+
+	int i;
+	int  ac;
+	char **av, *m;
+
+	init_variable();		/* Added N.Watazaki */
+
+	ac = argc;
+	av = (char **)malloc( sizeof(char*)*argc );
+	if (av == NULL) fatal_error("not enough memory\n");
+	for (i=0; i<argc; i++) {
+	  if ((av[i] = strdup( argv[i] )) == NULL)
+		fatal_error("not enough memory\n");
+	}
+
+	if (ac < 2)
+		print_tiny_usage_and_exit();
+
+	if (strcmp(av[1], "--version") == 0) {
+		print_version();
+		exit(1);
+	}
+
+	if (ac < 3) {
+		cmd = CMD_LIST;
+		av--; /* argv--; */ /* 1999.7.18 */
+		ac++; /* argc++; */
+		goto work;
+	}
+
+	m = av[1];
+
+	if (m[0] == '-')
+		m++;
+	/* commands */
+	switch (*m) {
+	case 'x':
+	case 'e':
+		cmd = CMD_EXTRACT;
+		break;
+
+	case 'p':
+		output_to_stdout = TRUE;
+		cmd = CMD_EXTRACT;
+		break;
+
+	case 'c':
+		new_archive = TRUE;
+		cmd = CMD_ADD;
+		break;
+
+	case 'a':
+		cmd = CMD_ADD;
+		break;
+
+	case 'd':
+		cmd = CMD_DELETE;
+		break;
+
+	case 'u':
+		update_if_newer = TRUE;
+		cmd = CMD_ADD;
+		break;
+
+	case 'm':
+		delete_after_append = TRUE;
+		cmd = CMD_ADD;
+		break;
+
+	case 'v':
+		verbose_listing = TRUE;
+		cmd = CMD_LIST;
+		break;
+
+	case 'l':
+		cmd = CMD_LIST;
+		break;
+
+	case 't':
+		cmd = CMD_EXTRACT;
+		verify_mode = TRUE;
+		break;
+
+	default:
+		print_tiny_usage_and_exit();
+
+	}
+
+	/* options */
+	/* p = &argv[1][1]; */
+	p = m+1;
+	while ( *p != 0 ) {
+		switch ((*p++)) {
+		case 'q':
+			switch (*p) {
+			case '0':
+			case '1':
+				quiet_mode = *p - '0';
+				++p;
+				break;
+			case '2':
+			default:
+				quiet = TRUE;
+				break;
+			}
+		case 'f':
+			force = TRUE;
+			break;
+		case 'p':
+			prof = TRUE;
+			break;
+		case 'v':
+			verbose = TRUE;
+			break;
+		case 't':
+			text_mode = TRUE;
+			break;
+#ifdef EUC
+		case 'e':
+			text_mode = TRUE;
+			euc_mode = TRUE;
+			break;
+#endif
+		case 'n':
+			noexec = TRUE;
+			break;
+		case 'g':
+			generic_format = TRUE;
+			noconvertcase = TRUE;
+			header_level = 0;
+			break;
+		case 'd':
+			delete_after_append = TRUE;
+			break;
+		case 'o':
+			switch (*p) {
+			case 0:
+				compress_method = LZHUFF1_METHOD_NUM;
+				header_level = 0;
+				break;
+			case '5':
+				compress_method = LZHUFF5_METHOD_NUM;
+				p++;
+				break;
+#ifdef SUPPORT_LH7
+			case '6':
+				compress_method = LZHUFF6_METHOD_NUM;
+				p++;
+				break;
+			case '7':
+				compress_method = LZHUFF7_METHOD_NUM;
+				p++;
+				break;
+#endif
+			default:
+				fprintf(stderr, "LHa: error option o%c\n", p[-1]);
+				exit(1);
+			}
+			break;
+		case 'z':
+			compress_method = LZHUFF0_METHOD_NUM;	/* Changed N.Watazaki */
+			break;
+		case 'i':
+			ignore_directory = TRUE;
+			break;
+		case 'w':
+			if (*p == '=')
+				p++;
+			extract_directory = p;
+			while (*p)
+				p++;
+			break;
+		case '0':
+			header_level = HEADER_LEVEL0;
+			break;
+		case '1':
+			header_level = HEADER_LEVEL1;
+			break;
+		case '2':
+			header_level = HEADER_LEVEL2;
+			break;
+		default:
+			fprintf(stderr, "LHa: Unknown option '%c'.\n", p[-1]);
+			exit(1);
+		}
+	}
+
+work:
+	/* archive file name */
+	archive_name = av[2];
+
+	if (!strcmp(archive_name, "-")) {
+		if (!isatty(1) && cmd == CMD_ADD)
+			quiet = TRUE;
+	}
+	else {
+		if (ac == 3 && !isatty(0)) { /* 1999.7.18 */
+			get_filename_from_stdin = TRUE;
+		}
+	}
+
+	/* target file name */
+	if (get_filename_from_stdin) {
+		cmd_filec = 0;
+		if ((xfilev = (char **) malloc(sizeof(char *) * xfilec)) == NULL)
+			fatal_error("Virtual memory exhausted\n");
+		while (fgets(inpbuf, sizeof(inpbuf), stdin)) {
+		    /* delete \n if it exist */
+			i=0; p=inpbuf;
+			while (i < sizeof(inpbuf) && p != 0) {
+			    if (*p == '\n') {
+				    *p = 0;
+					break;
+				}
+				p++; i++;
+			}
+
+			if (cmd_filec >= xfilec) {
+				xfilec += 256;
+				cmd_filev = (char **) realloc(xfilev,
+						   sizeof(char *) * xfilec);
+				if (cmd_filev == NULL)
+					fatal_error("Virtual memory exhausted\n");
+				xfilev = cmd_filev;
+			}
+			if (strlen(inpbuf) < 1)
+				continue;
+			if ((xfilev[cmd_filec++] = (char *) strdup(inpbuf)) == NULL)
+				fatal_error("Virtual memory exhausted\n");
+		}
+		xfilev[cmd_filec] = NULL;
+		cmd_filev = xfilev;
+	} else {
+		cmd_filec = ac - 3;
+		cmd_filev = av + 3;
+	}
+	sort_files();
+
+	/* make crc table */
+	make_crctable();
+
+	switch (cmd) {
+	case CMD_EXTRACT:
+		cmd_extract();
+		break;
+	case CMD_ADD:
+		cmd_add();
+		break;
+	case CMD_LIST:
+		cmd_list();
+		break;
+	case CMD_DELETE:
+		cmd_delete();
+		break;
+	}
+
+#ifdef USE_PROF
+	if (!prof)
+		exit(0);
+#endif
+
+	return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* */
+/* ------------------------------------------------------------------------ */
+
+/* ------------------------------------------------------------------------ */
+static void
+print_version()
+{
+	fprintf(stderr, "%s\n", LHA_VERSION);
+}
+
+/* ------------------------------------------------------------------------ */
+static void
+message_1(title, subject, name)
+	char           *title, *subject, *name;
+{
+	fprintf(stderr, "LHa: %s%s ", title, subject);
+	fflush(stderr);
+
+	if (errno == 0)
+		fprintf(stderr, "%s\n", name);
+	else
+		perror(name);
+}
+
+/* ------------------------------------------------------------------------ */
+void
+message(subject, name)
+	char           *subject, *name;
+{
+	message_1("", subject, name);
+}
+
+/* ------------------------------------------------------------------------ */
+void
+warning(subject, name)
+	char           *subject, *name;
+{
+	message_1("Warning: ", subject, name);
+}
+
+/* ------------------------------------------------------------------------ */
+void
+error(subject, msg)
+	char           *subject, *msg;
+{
+	message_1("Error: ", subject, msg);
+}
+
+/* ------------------------------------------------------------------------ */
+void
+fatal_error(msg)
+	char           *msg;
+{
+	message_1("Fatal error:", "", msg);
+
+	if (remove_temporary_at_error)
+		unlink(temporary_name);
+
+	exit(1);
+}
+
+/* ------------------------------------------------------------------------ */
+void
+write_error()
+{
+	fatal_error(writting_filename);
+}
+
+/* ------------------------------------------------------------------------ */
+void
+read_error()
+{
+	fatal_error(reading_filename);
+}
+
+/* ------------------------------------------------------------------------ */
+void
+interrupt(signo)
+	int             signo;
+{
+	errno = 0;
+	message("Interrupted\n", "");
+
+	if (temporary_fp)
+		fclose(temporary_fp);
+	unlink(temporary_name);
+	if (recover_archive_when_interrupt)
+		rename(backup_archive_name, archive_name);
+	if (remove_extracting_file_when_interrupt) {
+		errno = 0;
+		message("Removing", writting_filename);
+		unlink(writting_filename);
+	}
+	signal(SIGINT, SIG_DFL);
+	signal(SIGHUP, SIG_DFL);
+	kill(getpid(), signo);
+}
+
+/* ------------------------------------------------------------------------ */
+/*																			*/
+/* ------------------------------------------------------------------------ */
+static int
+sort_by_ascii(a, b)
+	char          **a, **b;
+{
+	register char  *p, *q;
+	register int    c1, c2;
+
+	p = *a, q = *b;
+	if (generic_format) {
+		do {
+			c1 = *(unsigned char *) p++;
+			c2 = *(unsigned char *) q++;
+			if (!c1 || !c2)
+				break;
+			if (islower(c1))
+				c1 = toupper(c1);
+			if (islower(c2))
+				c2 = toupper(c2);
+		}
+		while (c1 == c2);
+		return c1 - c2;
+	}
+	else {
+		while (*p == *q && *p != '\0')
+			p++, q++;
+		return *(unsigned char *) p - *(unsigned char *) q;
+	}
+}
+
+/* ------------------------------------------------------------------------ */
+static void
+sort_files()
+{
+	if (cmd_filec > 1)
+		qsort(cmd_filev, cmd_filec, sizeof(char *), sort_by_ascii);
+}
+
+/* ------------------------------------------------------------------------ */
+char           *
+xmalloc(size)
+	int             size;
+{
+	char           *p = (char *) malloc(size);
+	if (!p)
+		fatal_error("Not enough memory");
+	return p;
+}
+
+/* ------------------------------------------------------------------------ */
+char           *
+xrealloc(old, size)
+	char           *old;
+	int             size;
+{
+	char           *p = (char *) realloc(old, size);
+	if (!p)
+		fatal_error("Not enough memory");
+	return p;
+}
+
+/* ------------------------------------------------------------------------ */
+/*								STRING POOL									*/
+/* ------------------------------------------------------------------------ */
+/*
+  string pool :
+	+-------------+-------------+------+-------------+----------+
+	| N A M E 1 \0| N A M E 2 \0| .... | N A M E n \0|			|
+	+-------------+-------------+------+-------------+----------+
+	  ^ ^		 ^ buffer+0 buffer+used buffer+size
+
+  vector :
+	+---------------+---------------+------------- -----------------+
+	| pointer to	| pointer to	| pointer to   ...  pointer to	|
+	|  stringpool	|  N A M E 1	|  N A M E 2   ...   N A M E n	|
+	+---------------+---------------+-------------     -------------+
+	^ malloc base      returned
+*/
+
+/* ------------------------------------------------------------------------ */
+void
+init_sp(sp)
+	struct string_pool *sp;
+{
+	sp->size = 1024 - 8;	/* any ( >=0 ) */
+	sp->used = 0;
+	sp->n = 0;
+	sp->buffer = (char *) xmalloc(sp->size * sizeof(char));
+}
+
+/* ------------------------------------------------------------------------ */
+void
+add_sp(sp, name, len)
+	struct string_pool *sp;
+	char           *name;	/* stored '\0' at tail */
+	int             len;	/* include '\0' */
+{
+	while (sp->used + len > sp->size) {
+		sp->size *= 2;
+		sp->buffer = (char *) xrealloc(sp->buffer, sp->size * sizeof(char));
+	}
+	bcopy(name, sp->buffer + sp->used, len);
+	sp->used += len;
+	sp->n++;
+}
+
+/* ------------------------------------------------------------------------ */
+void
+finish_sp(sp, v_count, v_vector)
+	register struct string_pool *sp;
+	int            *v_count;
+	char         ***v_vector;
+{
+	int             i;
+	register char  *p;
+	char          **v;
+
+	v = (char **) xmalloc((sp->n + 1) * sizeof(char *));
+	*v++ = sp->buffer;
+	*v_vector = v;
+	*v_count = sp->n;
+	p = sp->buffer;
+	for (i = sp->n; i; i--) {
+		*v++ = p;
+		if (i - 1)
+			p += strlen(p) + 1;
+	}
+}
+
+/* ------------------------------------------------------------------------ */
+void
+free_sp(vector)
+	char          **vector;
+{
+	vector--;
+	free(*vector);		/* free string pool */
+	free(vector);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*							READ DIRECTORY FILES							*/
+/* ------------------------------------------------------------------------ */
+static          boolean
+include_path_p(path, name)
+	char           *path, *name;
+{
+	char           *n = name;
+	while (*path)
+		if (*path++ != *n++)
+			return (path[-1] == '/' && *n == '\0');
+	return (*n == '/' || (n != name && path[-1] == '/' && n[-1] == '/'));
+}
+
+/* ------------------------------------------------------------------------ */
+void
+cleaning_files(v_filec, v_filev)
+	int            *v_filec;
+	char         ***v_filev;
+{
+	char           *flags;
+	struct stat     stbuf;
+
+	register char **filev = *v_filev;
+	register int    filec = *v_filec;
+	register char  *p;
+	register int    i, j;
+
+	if (filec == 0)
+		return;
+
+	flags = xmalloc(filec * sizeof(char));
+
+	/* flags & 0x01 :	1: ignore */
+	/* flags & 0x02 :	1: directory, 0 : regular file */
+	/* flags & 0x04 :	1: need delete */
+
+	
+	for (i = 0; i < filec; i++)
+		if (GETSTAT(filev[i], &stbuf) < 0) {
+			flags[i] = 0x04;
+			fprintf(stderr,
+			 "LHa: Cannot access \"%s\", ignored.\n", filev[i]);
+		}
+		else {
+			if (is_regularfile(&stbuf))
+				flags[i] = 0x00;
+			else if (is_directory(&stbuf))
+				flags[i] = 0x02;
+#ifdef S_IFLNK
+			else if (is_symlink(&stbuf)) /* t.okamoto */
+				flags[i] = 0x00;
+#endif			
+			else {
+				flags[i] = 0x04;
+				fprintf(stderr,
+					"LHa: Cannot archive \"%s\", ignored.\n", filev[i]);
+			}
+		}
+	errno = 0;
+
+	for (i = 0; i < filec; i++) {
+		p = filev[i];
+		if ((flags[i] & 0x07) == 0x00) {	/* regular file, not
+							 * deleted/ignored */
+			for (j = i + 1; j < filec; j++) {
+				if ((flags[j] & 0x07) == 0x00) {	/* regular file, not
+									 * deleted/ignored */
+					if (STREQU(p, filev[j]))
+						flags[j] = 0x04;	/* delete */
+				}
+			}
+		}
+		else if ((flags[i] & 0x07) == 0x02) {	/* directory, not
+							 * deleted/ignored */
+			for (j = i + 1; j < filec; j++) {
+				if ((flags[j] & 0x07) == 0x00) {	/* regular file, not
+									 * deleted/ignored */
+					if (include_path_p(p, filev[j]))
+						flags[j] = 0x04;	/* delete */
+				}
+				else if ((flags[j] & 0x07) == 0x02) {	/* directory, not
+									 * deleted/ignored */
+					if (include_path_p(p, filev[j]))
+						flags[j] = 0x04;	/* delete */
+				}
+			}
+		}
+	}
+
+	for (i = j = 0; i < filec; i++) {
+		if ((flags[i] & 0x04) == 0) {
+			if (i != j)
+				filev[j] = filev[i];
+			j++;
+		}
+	}
+	*v_filec = j;
+
+	free(flags);
+}
+
+/* ------------------------------------------------------------------------ */
+#ifdef NODIRECTORY
+/* please need your imprementation */
+boolean
+find_files(name, v_filec, v_filev)
+	char           *name;
+	int            *v_filec;
+	char         ***v_filev;
+{
+	return FALSE;		/* DUMMY */
+}
+
+/* ------------------------------------------------------------------------ */
+void
+free_files(filec, filev)
+	int             filec;
+	char          **filev;
+{
+	/* do nothing */
+}
+/* ------------------------------------------------------------------------ */
+#else
+boolean
+find_files(name, v_filec, v_filev)
+	char           *name;
+	int            *v_filec;
+	char         ***v_filev;
+{
+	struct string_pool sp;
+	char            newname[FILENAME_LENGTH];
+	int             len, n;
+	DIR            *dirp;
+	DIRENTRY       *dp;
+	struct stat     tmp_stbuf, arc_stbuf, fil_stbuf;
+
+	strcpy(newname, name);
+	len = strlen(name);
+	if (len > 0 && newname[len - 1] != '/')
+		newname[len++] = '/';
+
+	dirp = opendir(name);
+	if (!dirp)
+		return FALSE;
+
+	init_sp(&sp);
+
+	GETSTAT(temporary_name, &tmp_stbuf);
+	GETSTAT(archive_name, &arc_stbuf);
+
+	for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
+		n = NAMLEN(dp);
+		strncpy(newname + len, dp->d_name, n);
+		newname[len + n] = '\0';
+		if (GETSTAT(newname, &fil_stbuf) < 0)
+			continue;
+#ifdef NO_INODE
+		if ( dp->d_name[0] != '.' ||
+			(n != 1 &&
+			 (dp->d_name[1] != '.' ||
+			  n != 2))  ) {
+			add_sp(&sp, newname, len+n+1);
+		}
+#else		
+		if ((dp->d_ino != 0) &&
+		/* exclude '.' and '..' */
+		    ((dp->d_name[0] != '.') ||
+		     ((n != 1) &&
+		      ((dp->d_name[1] != '.') ||
+		       (n != 2)))) &&
+		    ((tmp_stbuf.st_dev != fil_stbuf.st_dev ||
+		      tmp_stbuf.st_ino != fil_stbuf.st_ino) &&
+		     (arc_stbuf.st_dev != fil_stbuf.st_dev ||
+		      arc_stbuf.st_ino != fil_stbuf.st_ino))) {
+			add_sp(&sp, newname, len + n + 1);
+		}
+#endif
+	}
+	closedir(dirp);
+	finish_sp(&sp, v_filec, v_filev);
+	if (*v_filec > 1)
+		qsort(*v_filev, *v_filec, sizeof(char *), sort_by_ascii);
+	cleaning_files(v_filec, v_filev);
+
+	return TRUE;
+}
+
+/* ------------------------------------------------------------------------ */
+void
+free_files(filec, filev)
+	int             filec;
+	char          **filev;
+{
+	free_sp(filev);
+}
+#endif
+/* ------------------------------------------------------------------------ */
+/*																			*/
+/* ------------------------------------------------------------------------ */
+/* Build temporary file name and store to TEMPORARY_NAME */
+void
+build_temporary_name()
+{
+#ifdef TMP_FILENAME_TEMPLATE
+	/* "/tmp/lhXXXXXX" etc. */
+	if (extract_directory == NULL) {
+		strcpy(temporary_name, TMP_FILENAME_TEMPLATE);
+	}
+	else {
+		sprintf(temporary_name, "%s/lhXXXXXX", extract_directory);
+	}
+#ifdef MKSTEMP
+	mkstemp(temporary_name);
+#else
+	mktemp(temporary_name);
+#endif
+#else
+	char           *p, *s;
+
+	strcpy(temporary_name, archive_name);
+	for (p = temporary_name, s = (char *) 0; *p; p++)
+		if (*p == '/')
+			s = p;
+	strcpy((s ? s + 1 : temporary_name), "lhXXXXXX");
+#ifdef MKSTEMP
+	mkstemp(temporary_name);
+#else
+	mktemp(temporary_name);
+#endif
+#endif
+}
+
+/* ------------------------------------------------------------------------ */
+static void
+modify_filename_extention(buffer, ext)
+	char           *buffer;
+	char           *ext;
+{
+	register char  *p, *dot;
+
+	for (p = buffer, dot = (char *) 0; *p; p++) {
+		if (*p == '.')
+			dot = p;
+		else if (*p == '/')
+			dot = (char *) 0;
+	}
+
+	if (dot)
+		p = dot;
+
+	strcpy(p, ext);
+}
+
+/* ------------------------------------------------------------------------ */
+/* build backup file name */
+void
+build_backup_name(buffer, original)
+	char           *buffer;
+	char           *original;
+{
+	strcpy(buffer, original);
+	modify_filename_extention(buffer, BACKUPNAME_EXTENTION);	/* ".bak" */
+}
+
+/* ------------------------------------------------------------------------ */
+void
+build_standard_archive_name(buffer, orginal)
+	char           *buffer;
+	char           *orginal;
+{
+	strcpy(buffer, orginal);
+	modify_filename_extention(buffer, ARCHIVENAME_EXTENTION);	/* ".lzh" */
+}
+
+/* ------------------------------------------------------------------------ */
+/*																			*/
+/* ------------------------------------------------------------------------ */
+boolean
+need_file(name)
+	char           *name;
+{
+	int             i;
+
+	if (cmd_filec == 0)
+		return TRUE;
+
+	for (i = 0; i < cmd_filec; i++) {
+		if (patmatch(cmd_filev[i], name, 0))
+			return TRUE;
+	}
+
+	return FALSE;
+}
+
+FILE           *
+xfopen(name, mode)
+	char           *name, *mode;
+{
+	FILE           *fp;
+
+	if ((fp = fopen(name, mode)) == NULL)
+		fatal_error(name);
+
+	return fp;
+}
+
+/* ------------------------------------------------------------------------ */
+/*																			*/
+/* ------------------------------------------------------------------------ */
+static          boolean
+open_old_archive_1(name, v_fp)
+	char           *name;
+	FILE          **v_fp;
+{
+	FILE           *fp;
+	struct stat     stbuf;
+
+	if (stat(name, &stbuf) >= 0 &&
+	    is_regularfile(&stbuf) &&
+	    (fp = fopen(name, READ_BINARY)) != NULL) {
+		*v_fp = fp;
+		archive_file_gid = stbuf.st_gid;
+		archive_file_mode = stbuf.st_mode;
+		return TRUE;
+	}
+
+	*v_fp = NULL;
+	archive_file_gid = -1;
+	return FALSE;
+}
+
+/* ------------------------------------------------------------------------ */
+FILE           *
+open_old_archive()
+{
+	FILE           *fp;
+	char           *p;
+
+	if (!strcmp(archive_name, "-")) {
+		if (cmd == CMD_EXTRACT || cmd == CMD_LIST)
+			return stdin;
+		else
+			return NULL;
+	}
+	if (p = (char *) rindex(archive_name, '.')) {
+		if (strucmp(".LZH", p) == 0
+		    || strucmp(".LZS", p) == 0
+		    || strucmp(".COM", p) == 0	/* DOS SFX */
+		    || strucmp(".EXE", p) == 0
+		    || strucmp(".X", p) == 0	/* HUMAN SFX */
+		    || strucmp(".BAK", p) == 0) {	/* for BackUp */
+			open_old_archive_1(archive_name, &fp);
+			return fp;
+		}
+	}
+
+	if (open_old_archive_1(archive_name, &fp))
+		return fp;
+	sprintf(expanded_archive_name, "%s.lzh", archive_name);
+	if (open_old_archive_1(expanded_archive_name, &fp)) {
+		archive_name = expanded_archive_name;
+		return fp;
+	}
+	/*
+	 * if ( (errno&0xffff)!=E_PNNF ) { archive_name =
+	 * expanded_archive_name; return NULL; }
+	 */
+	sprintf(expanded_archive_name, "%s.lzs", archive_name);
+	if (open_old_archive_1(expanded_archive_name, &fp)) {
+		archive_name = expanded_archive_name;
+		return fp;
+	}
+	/*
+	 * if ( (errno&0xffff)!=E_PNNF ) { archive_name =
+	 * expanded_archive_name; return NULL; }
+	 */
+	/*
+	 * sprintf( expanded_archive_name , "%s.lzh",archive_name);
+	 * archive_name = expanded_archive_name;
+	 */
+	return NULL;
+}
+
+/* ------------------------------------------------------------------------ */
+int
+inquire(msg, name, selective)
+	char           *msg, *name, *selective;
+{
+	char            buffer[1024];
+	char           *p;
+
+	for (;;) {
+		fprintf(stderr, "%s %s ", name, msg);
+		fflush(stderr);
+
+		fgets(buffer, 1024, stdin);
+
+		for (p = selective; *p; p++)
+			if (buffer[0] == *p)
+				return p - selective;
+	}
+	/* NOTREACHED */
+}
+
+/* ------------------------------------------------------------------------ */
+void
+write_archive_tail(nafp)
+	FILE           *nafp;
+{
+	putc(0x00, nafp);
+}
+
+/* ------------------------------------------------------------------------ */
+void
+copy_old_one(oafp, nafp, hdr)
+	FILE           *oafp, *nafp;
+	LzHeader       *hdr;
+{
+	if (noexec) {
+		fseek(oafp, (long) (hdr->header_size + 2) + hdr->packed_size, SEEK_CUR);
+	}
+	else {
+		reading_filename = archive_name;
+		writting_filename = temporary_name;
+		if (hdr->header_level != 2) {
+			copyfile(oafp, nafp,
+					 (long) (hdr->header_size + 2) + hdr->packed_size, 0);
+		} else {
+			copyfile(oafp, nafp,
+					 (long) (hdr->header_size) + hdr->packed_size, 0);
+		}
+	}
+}
+
+/* Local Variables: */
+/* mode:c */
+/* tab-width:4 */
+/* compile-command:"gcc -c lharc.c" */
+/* End: */
--- lha-1.14i.orig/debian/org/util.c
+++ lha-1.14i/debian/org/util.c
@@ -0,0 +1,375 @@
+/* ------------------------------------------------------------------------ */
+/* LHa for UNIX    															*/
+/*				util.c -- LHarc Util										*/
+/*																			*/
+/*		Modified          		Nobutaka Watazaki							*/
+/*																			*/
+/*	Ver. 1.14 	Source All chagned				1995.01.14	N.Watazaki		*/
+/*  Ver. 1.14e  Support for sfx archives		1999.05.28	T.Okamoto       */
+/* ------------------------------------------------------------------------ */
+#include "lha.h"
+/*
+ * util.c - part of LHa for UNIX Feb 26 1992 modified by Masaru Oki Mar  4
+ * 1992 modified by Masaru Oki #ifndef USESTRCASECMP added. Mar 31 1992
+ * modified by Masaru Oki #ifdef NOMEMSET added.
+ */
+#include <errno.h>
+
+/* ------------------------------------------------------------------------ */
+extern unsigned short crc;
+extern int      quiet;
+/* ------------------------------------------------------------------------ */
+long
+copyfile(f1, f2, size, crc_flg)	/* return: size of source file */
+	FILE           *f1;
+	FILE           *f2;
+	long            size;
+	int             crc_flg;/* 0: no crc, 1: crc check, 2: extract, 3:
+				 * append */
+{
+	unsigned short  xsize;
+	char           *buf;
+	long            rsize = 0;
+
+	if ((buf = (char *) malloc(BUFFERSIZE)) == NULL)
+		fatal_error("virtual memory exhausted.\n");
+	crc = 0;
+	if ((crc_flg == 2 || crc_flg) && text_mode)
+		init_code_cache();
+	while (size > 0) {
+		/* read */
+		if (crc_flg == 3 && text_mode) {
+			xsize = fread_txt(buf, BUFFERSIZE, f1);
+			if (xsize == 0)
+				break;
+			if (ferror(f1)) {
+				fatal_error("file read error\n");
+			}
+		}
+		else {
+			xsize = (size > BUFFERSIZE) ? BUFFERSIZE : size;
+			if (fread(buf, 1, xsize, f1) != xsize) {
+				fatal_error("file read error\n");
+			}
+		}
+		/* write */
+		if (f2) {
+			if (crc_flg == 2 && text_mode) {
+				if (fwrite_txt(buf, xsize, f2)) {
+					fatal_error("file write error\n");
+				}
+			}
+			else {
+				if (fwrite(buf, 1, xsize, f2) != xsize) {
+					fatal_error("file write error\n");
+				}
+			}
+		}
+		/* calculate crc */
+		if (crc_flg) {
+			calccrc(buf, xsize);
+		}
+		rsize += xsize;
+		if (crc_flg != 3 || !text_mode)
+			size -= xsize;
+	}
+	free(buf);
+	return rsize;
+}
+
+/* ------------------------------------------------------------------------ */
+int
+encode_stored_crc(ifp, ofp, size, original_size_var, write_size_var)
+	FILE           *ifp, *ofp;
+	long            size;
+	long           *original_size_var;
+	long           *write_size_var;
+{
+	int             save_quiet;
+
+	save_quiet = quiet;
+	quiet = 1;
+	size = copyfile(ifp, ofp, size, 3);
+	*original_size_var = *write_size_var = size;
+	quiet = save_quiet;
+	return crc;
+}
+
+/* ------------------------------------------------------------------------ */
+/*	convert path delimit
+	erreturns *filename														*/
+/* ------------------------------------------------------------------------ */
+unsigned char  *
+convdelim(path, delim)
+	unsigned char  *path;
+	unsigned char   delim;
+{
+	unsigned char   c;
+	unsigned char  *p;
+#ifdef MULTIBYTE_CHAR
+	int             kflg;
+
+	kflg = 0;
+#endif
+	for (p = path; (c = *p) != 0; p++) {
+#ifdef MULTIBYTE_CHAR
+		if (kflg) {
+			kflg = 0;
+		}
+		else if (MULTIBYTE_FIRST_P(c)) {
+			kflg = 1;
+		}
+		else
+#endif
+		if (c == '\\' || c == DELIM || c == DELIM2) {
+			*p = delim;
+			path = p + 1;
+		}
+	}
+	return path;
+}
+
+/* ------------------------------------------------------------------------ */
+/* If TRUE, archive file name is msdos SFX file name. */
+boolean
+archive_is_msdos_sfx1(name)
+	char           *name;
+{
+	int             len = strlen(name);
+
+	return ((len >= 4) &&
+		(strucmp(".COM", name + len - 4) == 0 ||
+		 strucmp(".EXE", name + len - 4) == 0)) ||
+		((len >= 2) &&
+		 (strucmp(".x", name + len - 2) == 0));
+}
+
+/* ------------------------------------------------------------------------ */
+/* skip SFX header */
+boolean
+skip_msdos_sfx1_code(fp)
+	FILE           *fp;
+{
+	unsigned char   buffer[MAXSFXCODE];
+	unsigned char  *p, *q;
+	int             n;
+
+	n = fread(buffer, sizeof(char), MAXSFXCODE, fp);
+
+	for (p = buffer + 2, q = buffer + n - /* 5 */ (I_HEADER_LEVEL+1)-2; p < q; p++) {
+		/* found "-l??-" keyword (as METHOD type string) */
+		if (p[0] == '-' && p[1] == 'l' && p[4] == '-') {
+			/* size and checksum validate check */
+			if ( (p[I_HEADER_LEVEL-2] == 0 || p[I_HEADER_LEVEL-2] == 0)
+				&& p[I_HEADER_SIZE-2] > 20
+				&& p[I_HEADER_CHECKSUM-2] == calc_sum(p, p[-2])) {
+					fseek(fp, ((p - 2) - buffer) - n, SEEK_CUR);
+				return TRUE;
+			} else if (p[I_HEADER_LEVEL-2] == 2 && p[I_HEADER_SIZE-2] >= 24
+					   && p[I_ATTRIBUTE-2] == 0x20) {
+				fseek(fp, ((p - 2) - buffer) - n, SEEK_CUR);
+				return TRUE;
+			}
+		}
+	}
+
+	fseek(fp, -n, SEEK_CUR);
+	return FALSE;
+}
+
+/*
+ * strdup(3)
+ */
+
+/* ------------------------------------------------------------------------ */
+#ifdef NOSTRDUP
+char           *
+strdup(buf)
+	char           *buf;
+{
+	char           *p;
+
+	if ((p = (char *) malloc(strlen(buf) + 1)) == NULL)
+		return NULL;
+	strcpy(p, buf);
+	return p;
+}
+#endif
+
+/*
+ * memmove( char *dst , char *src , size_t cnt )
+ */
+
+/* ------------------------------------------------------------------------ */
+#if defined(NOBSTRING) && !defined(__STDC__)
+void           *
+memmove(dst, src, cnt)
+	register char  *dst, *src;
+	register int    cnt;
+{
+	if (dst == src)
+		return dst;
+	if (src > dst) {
+		while (--cnt >= 0)
+			*dst++ = *src++;
+	}
+	else {
+		dst += cnt;
+		src += cnt;
+		while (--cnt >= 0)
+			*--dst = *--src;
+	}
+	return dst;
+}
+#endif
+
+/*
+ * rename - change the name of file 91.11.02 by Tomohiro Ishikawa
+ * (ishikawa@gaia.cow.melco.CO.JP) 92.01.20 little modified (added #ifdef) by
+ * Masaru Oki 92.01.28 added mkdir() and rmdir() by Tomohiro Ishikawa
+ */
+
+#if defined(NOFTRUNCATE) && !defined(_MINIX)
+
+/* ------------------------------------------------------------------------ */
+int
+rename(from, to)
+	char           *from, *to;
+{
+	struct stat     s1, s2;
+	extern int      errno;
+
+	if (stat(from, &s1) < 0)
+		return (-1);
+	/* is 'FROM' file a directory? */
+	if ((s1.st_mode & S_IFMT) == S_IFDIR) {
+		errno = ENOTDIR;
+		return (-1);
+	}
+	if (stat(to, &s2) >= 0) {	/* 'TO' exists! */
+		/* is 'TO' file a directory? */
+		if ((s2.st_mode & S_IFMT) == S_IFDIR) {
+			errno = EISDIR;
+			return (-1);
+		}
+		if (unlink(to) < 0)
+			return (-1);
+	}
+	if (link(from, to) < 0)
+		return (-1);
+	if (unlink(from) < 0)
+		return (-1);
+	return (0);
+}
+#endif				/* NOFTRUNCATE */
+/* ------------------------------------------------------------------------ */
+
+#ifdef	NOMKDIR
+#ifndef	MKDIRPATH
+#define	MKDIRPATH	"/bin/mkdir"
+#endif
+#ifndef	RMDIRPATH
+#define	RMDIRPATH	"/bin/rmdir"
+#endif
+int
+rmdir(path)
+	char           *path;
+{
+	int             stat, rtn = 0;
+	char           *cmdname;
+	if ((cmdname = (char *) malloc(strlen(RMDIRPATH) + 1 + strlen(path) + 1))
+	    == 0)
+		return (-1);
+	strcpy(cmdname, RMDIRPATH);
+	*(cmdname + strlen(RMDIRPATH)) = ' ';
+	strcpy(cmdname + strlen(RMDIRPATH) + 1, path);
+	if ((stat = system(cmdname)) < 0)
+		rtn = -1;	/* fork or exec error */
+	else if (stat) {	/* RMDIR command error */
+		errno = EIO;
+		rtn = -1;
+	}
+	free(cmdname);
+	return (rtn);
+}
+
+/* ------------------------------------------------------------------------ */
+int
+mkdir(path, mode)
+	char           *path;
+	int             mode;
+{
+	int             child, stat;
+	char           *cmdname, *cmdpath = MKDIRPATH;
+	if ((cmdname = (char *) strrchr(cmdpath, '/')) == (char *) 0)
+		cmdname = cmdpath;
+	if ((child = fork()) < 0)
+		return (-1);	/* fork error */
+	else if (child) {	/* parent process */
+		while (child != wait(&stat))	/* ignore signals */
+			continue;
+	}
+	else {			/* child process */
+		int             maskvalue;
+		maskvalue = umask(0);	/* get current umask() value */
+		umask(maskvalue | (0777 & ~mode));	/* set it! */
+		execl(cmdpath, cmdname, path, (char *) 0);
+		/* never come here except execl is error */
+		return (-1);
+	}
+	if (stat != 0) {
+		errno = EIO;	/* cannot get error num. */
+		return (-1);
+	}
+	return (0);
+}
+#endif
+
+/*
+ * strucmp modified: Oct 29 1991 by Masaru Oki
+ */
+
+#ifndef USESTRCASECMP
+static int
+my_toupper(n)
+	register int    n;
+{
+	if (n >= 'a' && n <= 'z')
+		return n & (~('a' - 'A'));
+	return n;
+}
+
+/* ------------------------------------------------------------------------ */
+int
+strucmp(s, t)
+	register char  *s, *t;
+{
+	while (my_toupper(*s++) == my_toupper(*t++))
+		if (!*s || !*t)
+			break;
+	if (!*s && !*t)
+		return 0;
+	return 1;
+}
+#endif
+
+/* ------------------------------------------------------------------------ */
+#ifdef NOMEMSET
+/* Public Domain memset(3) */
+char           *
+memset(s, c, n)
+	char           *s;
+	int             c, n;
+{
+	char           *p = s;
+	while (n--)
+		*p++ = (char) c;
+	return s;
+}
+#endif
+
+/* Local Variables: */
+/* mode:c */
+/* tab-width:4 */
+/* compile-command:"gcc -c util.c" */
+/* End: */
--- lha-1.14i.orig/debian/org/lhext.c
+++ lha-1.14i/debian/org/lhext.c
@@ -0,0 +1,425 @@
+/* ------------------------------------------------------------------------ */
+/* LHa for UNIX    															*/
+/*				lhext.c -- LHarc extract									*/
+/*																			*/
+/*		Copyright (C) MCMLXXXIX Yooichi.Tagawa								*/
+/*		Modified          		Nobutaka Watazaki							*/
+/*																			*/
+/*  Ver. 0.00  Original								1988.05.23  Y.Tagawa	*/
+/*  Ver. 1.00  Fixed								1989.09.22  Y.Tagawa	*/
+/*  Ver. 0.03  LHa for UNIX							1991.12.17  M.Oki		*/
+/*  Ver. 1.12  LHa for UNIX							1993.10.01	N.Watazaki	*/
+/*  Ver. 1.13b Symbolic Link Update Bug Fix			1994.06.21	N.Watazaki	*/
+/*	Ver. 1.14  Source All chagned					1995.01.14	N.Watazaki	*/
+/*  Ver. 1.14e bugfix                               1999.04.30  T.Okamoto   */
+/* ------------------------------------------------------------------------ */
+#include "lha.h"
+/* ------------------------------------------------------------------------ */
+static int      skip_flg = FALSE;	/* FALSE..No Skip , TRUE..Skip */
+static char	   *methods[] =
+{
+	LZHUFF0_METHOD, LZHUFF1_METHOD, LZHUFF2_METHOD, LZHUFF3_METHOD,
+	LZHUFF4_METHOD, LZHUFF5_METHOD, LZHUFF6_METHOD, LZHUFF7_METHOD,
+	LARC_METHOD, LARC5_METHOD, LARC4_METHOD,
+	LZHDIRS_METHOD,
+	NULL
+};
+
+/* ------------------------------------------------------------------------ */
+static          boolean
+inquire_extract(name)
+	char           *name;
+{
+	struct stat     stbuf;
+
+	skip_flg = FALSE;
+	if (stat(name, &stbuf) >= 0) {
+		if (!is_regularfile(&stbuf)) {
+			error("Already exist (not a file)", name);
+			return FALSE;
+		}
+
+		if (noexec) {
+			printf("EXTRACT %s but file is exist.\n", name);
+			return FALSE;
+		}
+		else if (!force) {
+			if (!isatty(0))
+				return FALSE;
+
+			switch (inquire("OverWrite ?(Yes/[No]/All/Skip)", name, "YyNnAaSs\n")) {
+			case 0:
+			case 1:/* Y/y */
+				break;
+			case 2:
+			case 3:/* N/n */
+			case 8:/* Return */
+				return FALSE;
+			case 4:
+			case 5:/* A/a */
+				force = TRUE;
+				break;
+			case 6:
+			case 7:/* S/s */
+				skip_flg = TRUE;
+				break;
+			}
+		}
+	}
+	if (noexec)
+		printf("EXTRACT %s\n", name);
+
+	return TRUE;
+}
+
+/* ------------------------------------------------------------------------ */
+static          boolean
+make_parent_path(name)
+	char           *name;
+{
+	char            path[FILENAME_LENGTH];
+	struct stat     stbuf;
+	register char  *p;
+
+	/* make parent directory name into PATH for recursive call */
+	strcpy(path, name);
+	for (p = path + strlen(path); p > path; p--)
+		if (p[-1] == '/') {
+			*--p = '\0';
+			break;
+		}
+
+	if (p == path) {
+		message("Why?", "ROOT");
+		return FALSE;	/* no more parent. */
+	}
+
+	if (GETSTAT(path, &stbuf) >= 0) {
+		if (is_directory(&stbuf))
+			return TRUE;
+		error("Not a directory", path);
+		return FALSE;
+	}
+	errno = 0;
+
+	if (verbose)
+		printf("Making directory \"%s\".\n", path);
+
+	if (mkdir(path, 0777) >= 0)	/* try */
+		return TRUE;	/* successful done. */
+	errno = 0;
+
+	if (!make_parent_path(path))
+		return FALSE;
+
+	if (mkdir(path, 0777) < 0) {	/* try again */
+		message("Cannot make directory", path);
+		return FALSE;
+	}
+
+	return TRUE;
+}
+
+/* ------------------------------------------------------------------------ */
+static FILE    *
+open_with_make_path(name)
+	char           *name;
+{
+	FILE           *fp;
+
+	if ((fp = fopen(name, WRITE_BINARY)) == NULL) {
+		errno = 0;
+		if (!make_parent_path(name) ||
+		    (fp = fopen(name, WRITE_BINARY)) == NULL)
+			error("Cannot extract", name);
+		errno = 0;
+	}
+	return fp;
+}
+
+/* ------------------------------------------------------------------------ */
+static void
+adjust_info(name, hdr)
+	char           *name;
+	LzHeader       *hdr;
+{
+	time_t          utimebuf[2];
+
+	/* adjust file stamp */
+	utimebuf[0] = utimebuf[1] = hdr->unix_last_modified_stamp;
+
+	if ((hdr->unix_mode & UNIX_FILE_TYPEMASK) != UNIX_FILE_SYMLINK)
+		utime(name, utimebuf);
+
+	if (hdr->extend_type == EXTEND_UNIX
+	    || hdr->extend_type == EXTEND_OS68K
+	    || hdr->extend_type == EXTEND_XOSK) {
+#ifdef NOT_COMPATIBLE_MODE
+		Please need your modification in this space.
+#else
+		if ((hdr->unix_mode & UNIX_FILE_TYPEMASK) != UNIX_FILE_SYMLINK)
+			chmod(name, hdr->unix_mode);
+#endif
+		if (!getuid()) {
+#ifndef HAVE_NO_LCHOWN
+			if ((hdr->unix_mode & UNIX_FILE_TYPEMASK) == UNIX_FILE_SYMLINK)
+				lchown(name, hdr->unix_uid, hdr->unix_gid);
+			else
+#endif /* HAVE_NO_LCHWON */
+				chown(name, hdr->unix_uid, hdr->unix_gid);
+		}
+		errno = 0;
+	}
+}
+
+/* ------------------------------------------------------------------------ */
+static void
+extract_one(afp, hdr)
+	FILE           *afp;	/* archive file */
+	LzHeader       *hdr;
+{
+	FILE           *fp;	/* output file */
+	struct stat     stbuf;
+	char            name[257];
+	int             crc;
+	int             method;
+	boolean         save_quiet, save_verbose, up_flag;
+	char           *q = hdr->name, c;
+
+	if (ignore_directory && rindex(hdr->name, '/')) {
+		q = (char *) rindex(hdr->name, '/') + 1;
+	}
+	else {
+		if (*q == '/') {
+			q++;
+			/*
+			 * if OSK then strip device name
+			 */
+			if (hdr->extend_type == EXTEND_OS68K
+			    || hdr->extend_type == EXTEND_XOSK) {
+				do
+					c = (*q++);
+				while (c && c != '/');
+				if (!c || !*q)
+					q = ".";	/* if device name only */
+			}
+		}
+	}
+
+	if (extract_directory)
+		sprintf(name, "%s/%s", extract_directory, q);
+	else
+		strcpy(name, q);
+
+
+	/* LZHDIRS_METHODを持つヘッダをチェックする */
+	/* 1999.4.30 t.okamoto */
+	for (method = 0;; method++) {
+		if (methods[method] == NULL) {
+			error("Unknown method skiped ...", name);
+			return;
+		}
+		if (bcmp(hdr->method, methods[method], 5) == 0)
+			break;
+	}
+
+	if ((hdr->unix_mode & UNIX_FILE_TYPEMASK) == UNIX_FILE_REGULAR
+		&& method != LZHDIRS_METHOD_NUM) {
+#if 0
+		for (method = 0;; method++) {
+			if (methods[method] == NULL) {
+				error("Unknown method skiped ...", name);
+				return;
+			}
+			if (bcmp(hdr->method, methods[method], 5) == 0)
+				break;
+		}
+#endif
+
+		reading_filename = archive_name;
+		writting_filename = name;
+		if (output_to_stdout || verify_mode) {
+			if (noexec) {
+				printf("%s %s\n", verify_mode ? "VERIFY" : "EXTRACT", name);
+				if (afp == stdin) {
+					int             i = hdr->packed_size;
+					while (i--)
+						fgetc(afp);
+				}
+				return;
+			}
+
+			save_quiet = quiet;
+			save_verbose = verbose;
+			if (!quiet && output_to_stdout) {
+				printf("::::::::\n%s\n::::::::\n", name);
+				quiet = TRUE;
+				verbose = FALSE;
+			}
+			else if (verify_mode) {
+				quiet = FALSE;
+				verbose = TRUE;
+			}
+
+			crc = decode_lzhuf
+				(afp, stdout, hdr->original_size, hdr->packed_size, name, method);
+			quiet = save_quiet;
+			verbose = save_verbose;
+		}
+		else {
+			if (skip_flg == FALSE)  {
+				up_flag = inquire_extract(name);
+				if (up_flag == FALSE && force == FALSE) {
+					return;
+				}
+			}
+
+			if (skip_flg == TRUE) {	/* if skip_flg */
+				if (stat(name, &stbuf) == 0 && force != TRUE) {
+					if (stbuf.st_mtime >= hdr->unix_last_modified_stamp) {
+						if (quiet != TRUE)
+							printf("%s : Skipped...\n", name);
+						return;
+					}
+				}
+			}
+			if (noexec) {
+				if (afp == stdin) {
+					int i = hdr->packed_size;
+					while (i--)
+						fgetc(afp);
+				}
+				return;
+			}
+
+			signal(SIGINT, interrupt);
+			signal(SIGHUP, interrupt);
+
+			unlink(name);
+			errno = 0;
+			remove_extracting_file_when_interrupt = TRUE;
+
+			if ((fp = open_with_make_path(name)) != NULL) {
+				crc = decode_lzhuf
+					(afp, fp, hdr->original_size, hdr->packed_size, name, method);
+				fclose(fp);
+			}
+			remove_extracting_file_when_interrupt = FALSE;
+			signal(SIGINT, SIG_DFL);
+			signal(SIGHUP, SIG_DFL);
+
+			if (!fp)
+				return;
+		}
+
+		errno = 0;
+		if (hdr->has_crc && crc != hdr->crc)
+			error("CRC error", name);
+	}
+	else if ((hdr->unix_mode & UNIX_FILE_TYPEMASK) == UNIX_FILE_DIRECTORY
+			 || (hdr->unix_mode & UNIX_FILE_TYPEMASK) == UNIX_FILE_SYMLINK
+			 || method == LZHDIRS_METHOD_NUM) {
+		/* ↑これで、Symblic Link は、大丈夫か? */
+		if (!ignore_directory && !verify_mode) {
+			if (noexec) {
+				if (quiet != TRUE)
+					printf("EXTRACT %s (directory)\n", name);
+				return;
+			}
+			/* NAME has trailing SLASH '/', (^_^) */
+			if ((hdr->unix_mode & UNIX_FILE_TYPEMASK) == UNIX_FILE_SYMLINK) {
+				char            buf[256], *bb1, *bb2;
+				int             l_code;
+				strcpy(buf, name);
+				bb1 = strtok(buf, "|");
+				bb2 = strtok(NULL, "|");
+
+#ifdef S_IFLNK
+				if (skip_flg == FALSE)  {
+					up_flag = inquire_extract(name);
+					if (up_flag == FALSE && force == FALSE) {
+						return;
+					}
+				} else {
+					if (GETSTAT(bb1, &stbuf) == 0 && force != TRUE) {
+						if (stbuf.st_mtime >= hdr->unix_last_modified_stamp) {
+							if (quiet != TRUE)
+								printf("%s : Skipped...\n", bb1);
+							return;
+						}
+					}
+				}
+
+				unlink(bb1);
+				l_code = symlink(bb2, bb1);
+				if (l_code < 0) {
+					if (quiet != TRUE)
+						warning("Can't make Symbolic Link : ");
+				}
+				if (quiet != TRUE) {
+					printf("Symbolic Link %s -> %s\n", bb1, bb2);
+				}
+				strcpy(name, bb1);	/* Symbolic's name set */
+#else
+				sprintf(buf, "%s -> %s", bb1, bb2);
+				warning("Can't make Symbolic Link", buf);
+				return;
+#endif
+			} else { /* make directory */
+				if (!output_to_stdout && !make_parent_path(name))
+					return;
+			}
+		}
+	}
+	else {
+		error("Unknown information", name);
+	}
+
+	if (!output_to_stdout)
+		adjust_info(name, hdr);
+}
+
+/* ------------------------------------------------------------------------ */
+/* EXTRACT COMMAND MAIN														*/
+/* ------------------------------------------------------------------------ */
+void
+cmd_extract()
+{
+	LzHeader        hdr;
+	long            pos;
+	FILE           *afp;
+
+	/* open archive file */
+	if ((afp = open_old_archive()) == NULL)
+		fatal_error(archive_name);
+
+	if (archive_is_msdos_sfx1(archive_name))
+		skip_msdos_sfx1_code(afp);
+
+	/* extract each files */
+	while (get_header(afp, &hdr)) {
+		if (need_file(hdr.name)) {
+			pos = ftell(afp);
+			extract_one(afp, &hdr);
+			fseek(afp, pos + hdr.packed_size, SEEK_SET);
+		} else {
+			if (afp != stdin)
+				fseek(afp, hdr.packed_size, SEEK_CUR);
+			else {
+				int             i = hdr.packed_size;
+				while (i--)
+					fgetc(afp);
+			}
+		}
+	}
+
+	/* close archive file */
+	fclose(afp);
+
+	return;
+}
+
+/* Local Variables: */
+/* mode:c */
+/* tab-width:4 */
+/* End: */
--- lha-1.14i.orig/debian/org/lha_macro.h
+++ lha-1.14i/debian/org/lha_macro.h
@@ -0,0 +1,420 @@
+/* ------------------------------------------------------------------------ */
+/* LHa for UNIX    Archiver Driver	macro define							*/
+/*																			*/
+/*		Modified          		Nobutaka Watazaki							*/
+/*																			*/
+/*	Ver. 1.14	Soruce All chagned				1995.01.14	N.Watazaki		*/
+/*	Ver. 1.14g	modified   						2000.05.06	T.OKAMOTO		*/
+/* ------------------------------------------------------------------------ */
+
+#define LHA_VERSION "lha for unix version 1.14i"
+
+/* Most of System V, define SYSTIME_HAS_NO_TM */
+#ifdef	SYSTIME_HAS_NO_TM
+#include <time.h>
+#else
+#include <sys/time.h>
+#endif	/* SYSTIME_HAS_NO_TM */
+
+/* ------------------------------------------------------------------------ */
+/*	Directory Access Stuff													*/
+/* ------------------------------------------------------------------------ */
+#ifndef NODIRECTORY
+#ifdef SYSV_SYSTEM_DIR
+
+#include <dirent.h>
+
+#define DIRENTRY	struct dirent
+#define NAMLEN(p)	strlen (p->d_name)
+
+#else	/* not SYSV_SYSTEM_DIR */
+
+#ifdef NONSYSTEM_DIR_LIBRARY
+#include "lhdir.h"
+#else
+#include <sys/dir.h>
+#endif	/* not NONSYSTEM_DIR_LIBRARY */
+
+#define DIRENTRY		struct direct
+#define NAMLEN(p)		p->d_namlen
+
+#endif	/* not SYSV_SYSTEM_DIR */
+#endif  /* NODIRECTORY */
+
+/* ------------------------------------------------------------------------ */
+/*	Other Define															*/
+/* ------------------------------------------------------------------------ */
+/* Not support 'void' */
+#ifdef NOVOID
+#define void
+#endif
+
+#ifndef SEEK_SET
+#define SEEK_SET		0
+#define SEEK_CUR		1
+#define SEEK_END		2
+#endif	/* SEEK_SET
+
+
+/* non-integral functions */
+extern struct tm *localtime();
+extern char    *getenv();
+
+#ifndef _MINIX
+#ifndef __STDC__
+extern char    *malloc();
+extern char    *realloc();
+#endif
+#endif
+
+/* external variables */
+extern int      errno;
+
+#define	FALSE			0
+#define TRUE			1
+typedef int				boolean;
+
+/* used by qsort() for alphabetic-sort */
+#define STRING_COMPARE(a,b)		strcmp((a),(b))
+
+#define FILENAME_LENGTH	1024
+
+/* ------------------------------------------------------------------------ */
+/* YOUR CUSTOMIZIES															*/
+/* ------------------------------------------------------------------------ */
+
+#ifndef ARCHIVENAME_EXTENTION
+#define ARCHIVENAME_EXTENTION	".lzh"
+#endif
+#ifndef BACKUPNAME_EXTENTION
+#define BACKUPNAME_EXTENTION	".bak"
+#endif
+#ifndef TMP_FILENAME_TEMPLATE
+#define TMP_FILENAME_TEMPLATE	"/tmp/lhXXXXXX"
+#endif
+
+#define SJC_FIRST_P(c)			\
+  (((unsigned char)(c) >= 0x80) &&	\
+   (((unsigned char)(c) < 0xa0) ||	\
+    ((unsigned char)(c) >= 0xe0) &&	\
+    ((unsigned char)(c) < 0xfd)))
+#define SJC_SECOND_P(c)			\
+  (((unsigned char)(c) >= 0x40) &&	\
+   ((unsigned char)(c) < 0xfd) &&	\
+   ((unsigned char)(c) != 0x7f))
+
+#ifdef MULTIBYTE_CHAR
+#define MULTIBYTE_FIRST_P	SJC_FIRST_P
+#define MULTIBYTE_SECOND_P	SJC_SECOND_P
+#endif				/* MULTIBYTE_CHAR */
+
+/* ------------------------------------------------------------------------ */
+/*	LHa File Definitions													*/
+/* ------------------------------------------------------------------------ */
+#ifdef S_IFLNK
+#define GETSTAT lstat
+#else
+#define GETSTAT stat
+#endif
+
+#ifdef LHA_MAIN_SRC
+#define EXTERN
+#else
+#define EXTERN				extern
+#endif	/* LHA_MAIN_SRC */
+
+#define LZHUFF0_METHOD			"-lh0-"
+#define LZHUFF1_METHOD			"-lh1-"
+#define LZHUFF2_METHOD			"-lh2-"
+#define LZHUFF3_METHOD			"-lh3-"
+#define LZHUFF4_METHOD			"-lh4-"
+#define LZHUFF5_METHOD			"-lh5-"
+#define LZHUFF6_METHOD			"-lh6-"
+#define LZHUFF7_METHOD			"-lh7-"
+#define LARC_METHOD				"-lzs-"
+#define LARC5_METHOD			"-lz5-"
+#define LARC4_METHOD			"-lz4-"
+#define LZHDIRS_METHOD			"-lhd-"
+
+#define METHOD_TYPE_STRAGE		5
+
+/* Added N.Watazaki ..V */
+#define LZHUFF0_METHOD_NUM		0
+#define LZHUFF1_METHOD_NUM		1
+#define LZHUFF2_METHOD_NUM		2
+#define LZHUFF3_METHOD_NUM		3
+#define LZHUFF4_METHOD_NUM		4
+#define LZHUFF5_METHOD_NUM		5
+#define LZHUFF6_METHOD_NUM		6
+#define LZHUFF7_METHOD_NUM		7
+#define LARC_METHOD_NUM			8
+#define LARC5_METHOD_NUM		9
+#define LARC4_METHOD_NUM		10
+#define LZHDIRS_METHOD_NUM		11
+/* Added N.Watazaki ..^ */
+
+#define I_HEADER_SIZE			0
+#define I_HEADER_CHECKSUM		1
+#define I_METHOD				2
+#define I_PACKED_SIZE			7
+#define I_ORIGINAL_SIZE			11
+#define I_LAST_MODIFIED_STAMP	15
+#define I_ATTRIBUTE				19
+#define I_HEADER_LEVEL			20
+#define I_NAME_LENGTH			21
+#define I_NAME					22
+
+#define I_CRC						22	/* + name_length */
+#define I_EXTEND_TYPE				24	/* + name_length */
+#define I_MINOR_VERSION				25	/* + name_length */
+#define I_UNIX_LAST_MODIFIED_STAMP	26	/* + name_length */
+#define I_UNIX_MODE					30	/* + name_length */
+#define I_UNIX_UID					32	/* + name_length */
+#define I_UNIX_GID					34	/* + name_length */
+#define I_UNIX_EXTEND_BOTTOM		36	/* + name_length */
+
+#define I_GENERIC_HEADER_BOTTOM		I_EXTEND_TYPE
+
+#define EXTEND_GENERIC			0
+#define EXTEND_UNIX				'U'
+#define EXTEND_MSDOS			'M'
+#define EXTEND_MACOS			'm'
+#define EXTEND_OS9				'9'
+#define EXTEND_OS2				'2'
+#define EXTEND_OS68K			'K'
+#define EXTEND_OS386			'3'	/* OS-9000??? */
+#define EXTEND_HUMAN			'H'
+#define EXTEND_CPM				'C'
+#define EXTEND_FLEX				'F'
+#define EXTEND_RUNSER			'R'
+
+/* this OS type is not official */
+
+#define EXTEND_TOWNSOS			'T'
+#define EXTEND_XOSK				'X'
+
+/*---------------------------------------------------------------------------*/
+
+#define GENERIC_ATTRIBUTE				0x20
+#define GENERIC_DIRECTORY_ATTRIBUTE		0x10
+#define HEADER_LEVEL0					0x00
+#define HEADER_LEVEL1					0x01
+#define HEADER_LEVEL2					0x02
+
+#define CURRENT_UNIX_MINOR_VERSION		0x00
+
+#define DELIM		('/')
+#define DELIM2		(0xff)
+#define DELIMSTR	"/"
+
+#define OSK_RW_RW_RW			0000033
+#define OSK_FILE_REGULAR		0000000
+#define OSK_DIRECTORY_PERM		0000200
+#define OSK_SHARED_PERM			0000100
+#define OSK_OTHER_EXEC_PERM		0000040
+#define OSK_OTHER_WRITE_PERM	0000020
+#define OSK_OTHER_READ_PERM		0000010
+#define OSK_OWNER_EXEC_PERM		0000004
+#define OSK_OWNER_WRITE_PERM	0000002
+#define OSK_OWNER_READ_PERM		0000001
+
+#define UNIX_FILE_TYPEMASK		0170000
+#define UNIX_FILE_REGULAR		0100000
+#define UNIX_FILE_DIRECTORY		0040000
+#define UNIX_FILE_SYMLINK		0120000
+#define UNIX_SETUID				0004000
+#define UNIX_SETGID				0002000
+#define UNIX_STYCKYBIT			0001000
+#define UNIX_OWNER_READ_PERM	0000400
+#define UNIX_OWNER_WRITE_PERM	0000200
+#define UNIX_OWNER_EXEC_PERM	0000100
+#define UNIX_GROUP_READ_PERM	0000040
+#define UNIX_GROUP_WRITE_PERM	0000020
+#define UNIX_GROUP_EXEC_PERM	0000010
+#define UNIX_OTHER_READ_PERM	0000004
+#define UNIX_OTHER_WRITE_PERM	0000002
+#define UNIX_OTHER_EXEC_PERM	0000001
+#define UNIX_RW_RW_RW			0000666
+
+#define LZHEADER_STRAGE			4096
+
+#define MAX_INDICATOR_COUNT		64
+
+typedef short   				node;
+
+/* ------------------------------------------------------------------------ */
+/*	Slide relation															*/
+/* ------------------------------------------------------------------------ */
+#if defined(__STDC__) || defined(AIX)
+
+#include <limits.h>
+
+#else
+
+#ifndef CHAR_BIT
+#define CHAR_BIT  8
+#endif
+
+#ifndef UCHAR_MAX
+#define UCHAR_MAX				((1<<(sizeof(unsigned char)*8))-1)
+#endif
+
+#ifndef USHRT_MAX
+#define USHRT_MAX				((1<<(sizeof(unsigned short)*8))-1)
+#endif
+
+#ifndef SHRT_MAX
+#define SHRT_MAX				((1<<(sizeof(short)*8-1))-1)
+#endif
+
+#ifndef SHRT_MIN
+#define SHRT_MIN				(SHRT_MAX-USHRT_MAX)
+#endif
+
+#ifndef ULONG_MAX
+#define ULONG_MAX	((1<<(sizeof(unsigned long)*8))-1)
+#endif
+
+#ifndef LONG_MAX
+#define LONG_MAX	((1<<(sizeof(long)*8-1))-1)
+#endif
+
+#ifndef LONG_MIN
+#define LONG_MIN	(LONG_MAX-ULONG_MAX)
+#endif
+
+#endif	/* not __STDC__ */
+
+/* ------------------------------------------------------------------------ */
+/*	FILE Attribute															*/
+/* ------------------------------------------------------------------------ */
+#define is_directory(statp)		(((statp)->st_mode & S_IFMT) == S_IFDIR)
+#define is_symlink(statp)		(((statp)->st_mode & S_IFMT) == S_IFLNK)
+#define is_regularfile(statp)	(((statp)->st_mode & S_IFMT) == S_IFREG)
+
+#ifdef MSDOS
+#define WRITE_BINARY	"wb"
+#define READ_BINARY		"rb"
+#else
+#define WRITE_BINARY	"w"
+#define READ_BINARY		"r"
+#endif
+
+/* ------------------------------------------------------------------------ */
+/*	Memory and String function												*/
+/* ------------------------------------------------------------------------ */
+#include <string.h>
+
+#ifdef NOINDEX
+#define index			strchr
+#define rindex			strrchr
+#endif	/* NOINDEX */
+
+#ifdef NOBSTRING
+#define bcmp(a,b,n)		memcmp ((a),(b),(n))
+#define bzero(d,n)		memset((d),0,(n))
+#define bcopy(s,d,n)	memmove((d),(s),(n))
+#endif	/* NOBSTRING */
+
+#ifdef USESTRCASECMP
+#define strucmp(p,q)	strcasecmp((p),(q))
+#endif
+
+/* ------------------------------------------------------------------------ */
+/* Individual macro define													*/
+/* ------------------------------------------------------------------------ */
+
+/* from crcio.c */
+#define CRCPOLY			0xA001		/* CRC-16 */
+#define UPDATE_CRC(c)	crc = crctable[(crc ^ (c)) & 0xFF] ^ (crc >> CHAR_BIT)
+
+/* dhuf.c */
+#define N_CHAR      (256 + 60 - THRESHOLD + 1)
+#define TREESIZE_C  (N_CHAR * 2)
+#define TREESIZE_P  (128 * 2)
+#define TREESIZE    (TREESIZE_C + TREESIZE_P)
+#define ROOT_C      0
+#define ROOT_P      TREESIZE_C
+
+/* header.c */
+#define setup_get(PTR)	(get_ptr = (PTR))
+#define get_byte()		(*get_ptr++ & 0xff)
+#define put_ptr			get_ptr
+#define setup_put(PTR)	(put_ptr = (PTR))
+#define put_byte(c)		(*put_ptr++ = (char)(c))
+
+/* huf.c */
+#define NP			(MAX_DICBIT + 1)
+#define NT			(USHRT_BIT + 3)
+#if 0
+#define PBIT		4		/* smallest integer such that (1 << PBIT) > * NP */
+#define TBIT 		5		/* smallest integer such that (1 << TBIT) > * NT */
+#endif
+
+#define PBIT		5		/* smallest integer such that (1 << PBIT) > * NP */
+#define TBIT 		5		/* smallest integer such that (1 << TBIT) > * NT */
+
+#define NC 			(UCHAR_MAX + MAXMATCH + 2 - THRESHOLD)
+
+/*		#if NT > NP #define NPT NT #else #define NPT NP #endif	*/
+#define NPT			0x80
+
+/* larc.c */
+#define MAGIC0		18
+#define MAGIC5		19
+
+/* lharc.c */
+#define CMD_UNKNOWN	0
+#define CMD_EXTRACT	1
+#define CMD_ADD		2
+#define CMD_LIST	3
+#define CMD_DELETE	4
+
+#define STREQU(a,b)	(((a)[0] == (b)[0]) ? (strcmp ((a),(b)) == 0) : FALSE)
+
+/* shuf.c */
+#define N1			286				/* alphabet size */
+#define N2			(2 * N1 - 1)	/* # of nodes in Huffman tree */
+#define EXTRABITS	8				/* >= log2(F-THRESHOLD+258-N1) */
+#define BUFBITS		16				/* >= log2(MAXBUF) */
+#define LENFIELD	4				/* bit size of length field for tree output */
+
+/* util.c */
+#define BUFFERSIZE	2048
+#define MAXSFXCODE	1024*64
+
+#ifndef NULL
+#define NULL		(char *)0
+#endif
+
+/* slide.c */
+/*
+#define PERCOLATE  1
+#define NIL        0
+#define HASH(p, c) ((p) + ((c) << hash1) + hash2)
+*/
+
+/* slide.c */
+#ifdef SUPPORT_LH7
+#define MAX_DICBIT			16      /* lh7 use 16bits */
+#endif
+
+#ifndef SUPPORT_LH7
+#define MAX_DICBIT			15      /* lh6 use 15bits */
+#endif
+
+#define MAX_DICSIZ			(1 << MAX_DICBIT)
+#define MATCHBIT			8	/* bits for MAXMATCH - THRESHOLD */
+#define MAXMATCH			256	/* formerly F (not more than UCHAR_MAX + 1) */
+#define THRESHOLD			3	/* choose optimal value */
+
+/* from huf.c */
+
+/* alphabet = {0, 1, 2, ..., NC - 1} */
+#define CBIT				9	/* $\lfloor \log_2 NC \rfloor + 1$ */
+#define USHRT_BIT			16	/* (CHAR_BIT * sizeof(ushort)) */
+
+/* Local Variables: */
+/* mode:c */
+/* tab-width:4 */
+/* End: */
--- lha-1.14i.orig/debian/org/lhlist.c
+++ lha-1.14i/debian/org/lhlist.c
@@ -0,0 +1,348 @@
+/* ------------------------------------------------------------------------ */
+/* LHa for UNIX    															*/
+/*				lhlist.c -- LHarc list										*/
+/*																			*/
+/*		Copyright (C) MCMLXXXIX Yooichi.Tagawa								*/
+/*		Modified          		Nobutaka Watazaki							*/
+/*																			*/
+/*  Ver. 0.00	Original						1988.05.23  Y.Tagawa		*/
+/*  Ver. 1.00	Fixed							1989.09.22  Y.Tagawa		*/
+/*  Ver. 1.01	Bug Fix for month name			1989.12.25  Y.Tagawa		*/
+/*  Ver. 1.10	Changed list format				1993.10.01	N.Watazaki		*/
+/*	Ver. 1.14	Source All chagned				1995.01.14	N.Watazaki		*/
+/*	Ver. 1.14e	Bug Fix for many problems		1999.05.25  T.Okamoto       */
+/* ------------------------------------------------------------------------ */
+#include "lha.h"
+
+/* ------------------------------------------------------------------------ */
+static long     packed_size_total;
+static long     original_size_total;
+static int      list_files;
+
+/* ------------------------------------------------------------------------ */
+/* Print Stuff																*/
+/* ------------------------------------------------------------------------ */
+/* need 14 or 22 (when verbose_listing is TRUE) column spaces */
+static void
+print_size(packed_size, original_size)
+	long            packed_size, original_size;
+{
+	if (verbose_listing)
+		printf("%7d ", packed_size);
+
+	printf("%7d ", original_size);
+
+	if (original_size == 0L)
+		printf("******");
+	else	/* Changed N.Watazaki */
+		printf("%5.1f%%", packed_size * 100.0 / original_size);
+}
+
+/* ------------------------------------------------------------------------ */
+/* need 12 or 17 (when verbose_listing is TRUE) column spaces */
+static void
+print_stamp(t)
+	time_t          t;
+{
+	static boolean  got_now = FALSE;
+	static time_t   now;
+	static unsigned int threshold;
+	static char     t_month[12 * 3 + 1] = "JanFebMarAprMayJunJulAugSepOctNovDec";
+	struct tm      *p;
+
+	if (t == 0) {
+		printf("            ");	/* 12 spaces */
+		return;
+	}
+
+	if (!got_now) {
+		now = time((time_t *) 0);
+		p = localtime(&now);
+		threshold = p->tm_year * 12 + p->tm_mon - 6;
+		got_now = TRUE;
+	}
+
+	p = localtime(&t);
+
+	if (p->tm_year * 12 + p->tm_mon > threshold)
+		printf("%.3s %2d %02d:%02d",
+		&t_month[p->tm_mon * 3], p->tm_mday, p->tm_hour, p->tm_min);
+	else
+		printf("%.3s %2d  %04d",
+		    &t_month[p->tm_mon * 3], p->tm_mday, p->tm_year + 1900);
+}
+
+/* ------------------------------------------------------------------------ */
+static void
+print_bar()
+{
+	char           *p, *q;
+	/* 17+1+(0 or 7+1)+7+1+6+1+(0 or 1+4)+(12 or 17)+1+20 */
+	/* 12345678901234567_  1234567_123456  _123456789012   1234 */
+
+	if (verbose_listing) {
+		p = "- ------ ---------- ";
+		q = " -------------";
+	}
+	else {
+		p = " ";
+		q = " --------------------";
+	}
+
+	if (verbose)
+		q = "";
+
+	printf("---------- ----------- ------- ------%s------------%s\n", p, q);
+}
+
+/* ------------------------------------------------------------------------ */
+/*																			*/
+/* ------------------------------------------------------------------------ */
+static void
+list_header()
+{
+	char           *p, *q;
+
+	if (verbose_listing) {
+		p = "PACKED    SIZE  RATIO METHOD CRC";
+		q = "          NAME";
+	}
+	else {
+		p = "  SIZE  RATIO";
+		q = "           NAME";
+	}
+
+	if (verbose)
+		q = "";
+
+	printf(" PERMSSN    UID  GID    %s     STAMP%s\n", p, q);
+#if 0
+	printf(" PERMSSN  UID GID %s   SIZE  RATIO%s %s    STAMP%s%s\n",
+	       verbose_listing ? " PACKED " : "",	/* 8,0 */
+	       verbose_listing ? "  CRC" : "",	/* 5,0 */
+	       verbose_listing ? "  " : "",	/* 2,0 */
+	       verbose_listing ? "      " : "   ",	/* 6,3 */
+	       verbose ? "" : " NAME");
+#endif
+	print_bar();
+}
+
+/* ------------------------------------------------------------------------ */
+static void
+list_one(hdr)
+	register LzHeader *hdr;
+{
+	register int    mode;
+	register char  *p;
+	char            method[6];
+	char modebits[11];
+
+	if (verbose)
+		printf("%s\n", hdr->name);
+
+	strncpy(method, hdr->method, 5);
+	method[5] = '\0';
+
+	switch (mode = hdr->extend_type) {
+	case EXTEND_UNIX:
+		mode = hdr->unix_mode;
+
+		if (mode & UNIX_FILE_DIRECTORY)
+			modebits[0] = 'd';
+		else if ((mode & UNIX_FILE_SYMLINK) == UNIX_FILE_SYMLINK)
+			modebits[0] = 'l';
+		else
+			modebits[0] = '-';
+		modebits[1] = ((mode & UNIX_OWNER_READ_PERM) ? 'r' : '-');
+		modebits[2] = ((mode & UNIX_OWNER_WRITE_PERM) ? 'w' : '-');
+		modebits[3] = (mode & UNIX_SETUID) ? 's' :
+			((mode & UNIX_OWNER_EXEC_PERM) ? 'x' : '-');
+		modebits[4] = ((mode & UNIX_GROUP_READ_PERM) ? 'r' : '-');
+		modebits[5] = ((mode & UNIX_GROUP_WRITE_PERM) ? 'w' : '-');
+		modebits[6] = (mode & UNIX_SETGID) ? 's' :
+			((mode & UNIX_GROUP_EXEC_PERM) ? 'x' : '-');
+		modebits[7] = ((mode & UNIX_OTHER_READ_PERM) ? 'r' : '-');
+		modebits[8] = ((mode & UNIX_OTHER_WRITE_PERM) ? 'w' : '-');
+		modebits[9] = (mode & UNIX_STYCKYBIT) ? 't' :
+			((mode & UNIX_OTHER_EXEC_PERM) ? 'x' : '-');
+		modebits[10] = 0;
+
+		printf("%s %5d/%-5d ", modebits,
+		       hdr->unix_uid, hdr->unix_gid);
+		break;
+	case EXTEND_OS68K:
+	 /**/ case EXTEND_XOSK:/**/
+		mode = hdr->unix_mode;
+		printf("%c%c%c%c%c%c%c%c %5d/%-5d",
+		       ((mode & OSK_DIRECTORY_PERM) ? 'd' : '-'),
+		       ((mode & OSK_SHARED_PERM) ? 's' : '-'),
+		       ((mode & OSK_OTHER_EXEC_PERM) ? 'e' : '-'),
+		       ((mode & OSK_OTHER_WRITE_PERM) ? 'w' : '-'),
+		       ((mode & OSK_OTHER_READ_PERM) ? 'r' : '-'),
+		       ((mode & OSK_OWNER_EXEC_PERM) ? 'e' : '-'),
+		       ((mode & OSK_OWNER_WRITE_PERM) ? 'w' : '-'),
+		       ((mode & OSK_OWNER_READ_PERM) ? 'r' : '-'),
+		       hdr->unix_uid, hdr->unix_gid);
+		break;
+	default:
+		switch (hdr->extend_type) {	/* max 18 characters */
+		case EXTEND_GENERIC:
+			p = "[generic]";
+			break;
+		case EXTEND_CPM:
+			p = "[CP/M]";
+			break;
+		case EXTEND_FLEX:
+			p = "[FLEX]";
+			break;
+		case EXTEND_OS9:
+			p = "[OS-9]";
+			break;
+		case EXTEND_OS68K:
+			p = "[OS-9/68K]";
+			break;
+		case EXTEND_MSDOS:
+			p = "[MS-DOS]";
+			break;
+		case EXTEND_MACOS:
+			p = "[Mac OS]";
+			break;
+		case EXTEND_OS2:
+			p = "[OS/2]";
+			break;
+		case EXTEND_HUMAN:
+			p = "[Human68K]";
+			break;
+		case EXTEND_OS386:
+			p = "[OS-386]";
+			break;
+		case EXTEND_RUNSER:
+			p = "[Runser]";
+			break;
+#ifdef EXTEND_TOWNSOS
+			/* This ID isn't fixed */
+		case EXTEND_TOWNSOS:
+			p = "[TownsOS]";
+			break;
+#endif
+			/* Ouch!  Please customize it's ID.  */
+		default:
+			p = "[unknown]";
+			break;
+		}
+		printf("%-23.23s", p);
+		break;
+	}
+
+	print_size(hdr->packed_size, hdr->original_size);
+
+	if (verbose_listing)
+		if (hdr->has_crc)
+			printf(" %s %04x", method, hdr->crc);
+		else
+			printf(" %s ****", method);
+
+	printf(" ");
+	print_stamp(hdr->unix_last_modified_stamp);
+
+	if (!verbose)
+		if ((mode & UNIX_FILE_SYMLINK) != UNIX_FILE_SYMLINK)
+			printf(" %s", hdr->name);
+		else {
+			char            buf[256], *b1, *b2;
+			strcpy(buf, hdr->name);
+			b1 = strtok(buf, "|");
+			b2 = strtok(NULL, "|");
+			printf(" %s -> %s", b1, b2);
+		}
+
+	if (verbose)
+		printf(" [%d]", hdr->header_level);
+	printf("\n");
+
+}
+
+/* ------------------------------------------------------------------------ */
+static void
+list_tailer()
+{
+	struct stat     stbuf;
+
+	print_bar();
+
+	printf(" Total %9d file%c ",
+	       list_files, (list_files == 1) ? ' ' : 's');
+	print_size(packed_size_total, original_size_total);
+	printf(" ");
+
+	if (verbose_listing)
+		printf("           ");
+
+	if (stat(archive_name, &stbuf) < 0)
+		print_stamp((time_t) 0);
+	else
+		print_stamp(stbuf.st_mtime);
+
+	printf("\n");
+}
+
+/* ------------------------------------------------------------------------ */
+/* LIST COMMAND MAIN														*/
+/* ------------------------------------------------------------------------ */
+void
+cmd_list()
+{
+	FILE           *afp;
+	LzHeader        hdr;
+	int             i;
+
+	/* initialize total count */
+	packed_size_total = 0L;
+	original_size_total = 0L;
+	list_files = 0;
+
+	/* open archive file */
+	if ((afp = open_old_archive()) == NULL) {
+		error(archive_name, "");
+		exit(1);
+	}
+	if (archive_is_msdos_sfx1(archive_name))
+		skip_msdos_sfx1_code(afp);
+
+	/* print header message */
+	if (!quiet)
+		list_header();
+
+	/* print each file information */
+	while (get_header(afp, &hdr)) {
+		if (need_file(hdr.name)) {
+			list_one(&hdr);
+			list_files++;
+			packed_size_total += hdr.packed_size;
+			original_size_total += hdr.original_size;
+		}
+
+		if (afp != stdin)
+			fseek(afp, hdr.packed_size, SEEK_CUR);
+		else {
+			i = hdr.packed_size;
+			while (i--)
+				fgetc(afp);
+		}
+	}
+
+	/* close archive file */
+	fclose(afp);
+
+	/* print tailer message */
+	if (!quiet)
+		list_tailer();
+
+	return;
+}
+
+/* Local Variables: */
+/* mode:c */
+/* tab-width:4 */
+/* compile-command:"gcc -c lhlist.c" */
+/* End: */
--- lha-1.14i.orig/debian/changelog
+++ lha-1.14i/debian/changelog
@@ -0,0 +1,178 @@
+lha (1.14i-10.1) unstable; urgency=high
+
+  * Security NMU for vulnerabilities inherited from GNU Gzip:
+    [CVE-2006-4335 CVE-2006-4337 CVE-2006-4338]
+
+ -- Moritz Muehlenhoff <jmm@debian.org>  Wed, 13 Dec 2006 20:21:32 +0100
+
+lha (1.14i-10) unstable; urgency=high
+
+  * debian/patch.redhat-sec2: Add one more security patch to fix:
+      - CAN-2004-0771 (-w working directory option buffer overflow)
+        http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2004-0771
+      - CAN-2004-0769 (buffer overflow can be executed arbitrary code
+        via long pathnames in headers, another issue of bug fixed in -9)
+        http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2004-0769
+      - CAN-2004-0745 (execute arbitrary commands via a directory with
+        shell metacharacters in its name.)
+        http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2004-0745
+      - CAN-2004-0694 (reserved number)
+        http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2004-0694
+    taken from RedHat patch.  (Closes: #279870)
+  * man/lha.n: Fix typo "flie" instead of "file".  (Closes: #277545)
+
+ -- GOTO Masanori <gotom@debian.org>  Sat, 13 Nov 2004 15:31:22 +0900
+
+lha (1.14i-9) unstable; urgency=high
+
+  * debian/patch.header-overflow: Add fix another lha buffer overflow
+    problem.  It warns when hitting an archive which includes
+    long directory name with option l, v, x.  See:
+      http://lw.ftw.zamosc.pl/lha-exploit.txt
+      http://www.securityfocus.com/archive/1/363418
+      http://bugs.gentoo.org/show_bug.cgi?id=51285
+    Thanks to Lukasz Wojtow <lw@wszia.edu.pl> for pointing this problem.
+
+ -- GOTO Masanori <gotom@debian.org>  Wed, 16 Jun 2004 09:51:06 +0900
+
+lha (1.14i-8) unstable; urgency=high
+
+  * debian/patch.CAN-2004-0234_0235: Add fix CAN-2004-0235 symlink part
+    patches.  (Closes: #247355, #247357)
+
+ -- GOTO Masanori <gotom@debian.org>  Sat,  8 May 2004 02:24:57 +0900
+
+lha (1.14i-7) unstable; urgency=high
+
+  * debian/patch.CAN-2004-ulf: Add to fix CAN-2004-0234 (buffer overflows),
+    CAN-2004-0235 (directory traversal).  See:
+    http://marc.theaimsgroup.com/?l=full-disclosure&m=108345064008698&w=2
+  * debian/control: Change my mail address.
+
+ -- GOTO Masanori <gotom@debian.org>  Thu,  6 May 2004 15:13:14 +0900
+
+lha (1.14i-6) unstable; urgency=low
+
+  * debian/copyright: Added more copyright license statement, translated
+    by Osamu Aoki <debian@aokiconsulting.com>.
+  * debian/copyright: Added good summary of upstream author, investigated by
+    Osamu Aoki <debian@aokiconsulting.com> and 
+    Tatsuya Kinoshita <tats@iris.ne.jp>.
+  * debian/header-e.doc: Added English version of header.doc (LHa header
+    structure format document) translated by Osamu Aoki
+    <debian@aokiconsulting.com>.
+
+ -- GOTO Masanori <gotom@debian.or.jp>  Tue, 27 Aug 2002 13:08:22 +0900
+
+lha (1.14i-5) unstable; urgency=low
+
+  * debian/patch.multibyte: Add multibyte character mode option 'y'.
+    You can use multibyte filename especially SHIFTJIS code 
+    with this option.
+
+ -- GOTO Masanori <gotom@debian.or.jp>  Fri, 19 Jul 2002 16:57:11 +0900
+
+lha (1.14i-4) unstable; urgency=low
+
+  * debian/copyright: add original/translated license statement
+    (closes: Bug#144582).
+
+ -- GOTO Masanori <gotom@debian.or.jp>  Wed,  1 May 2002 09:53:24 +0900
+
+lha (1.14i-3) unstable; urgency=low
+
+  * fix lha reports a wrong version number (closes: Bug#135199).
+
+ -- GOTO Masanori <gotom@debian.or.jp>  Sun,  3 Mar 2002 21:38:46 +0900
+
+lha (1.14i-2) unstable; urgency=low
+
+  * Applied the patch not to get compiling warning message.
+    Patched by Paul Slootman <paul@wurtel.net>. (Closes: #109634).
+
+ -- GOTO Masanori <gotom@debian.or.jp>  Thu, 23 Aug 2001 00:26:53 +0900
+
+lha (1.14i-1) unstable; urgency=low
+
+  * New upstream release (Closes: #62256).
+  * New maintainer.
+  * Updated Standards-version 3.5.2.
+  * Use build this package with dh_*.
+  * New upstream version is ready for -lh7- format (Closes: #67592).
+  * Japanese manual is now included (Closes: #49245).
+  * Unclosed Bugs (No copyright file is included) 
+    has just re-closed (Closes: #48748).
+
+ -- GOTO Masanori <gotom@debian.or.jp>  Sun, 22 Jul 2001 13:11:50 +0900
+
+lha (1.14e-2) unstable; urgency=low
+
+  * Moved /usr/man/* and /usr/doc/* under /usr/share. Closes: #80759.
+  * Updated Standards-version, fixed lintian warnings.
+
+ -- Steve McIntyre <stevem@chiark.greenend.org.uk>  Sun, 21 Jan 2001 17:35:52 +0000
+
+lha (1.14e-0) unstable; urgency=low
+
+  * New upstream release. Thanks to Jiro Iwamoto <iwamot@maroon.plala.or.jp> for pointing this out.
+
+ -- Steve McIntyre <stevem@chiark.greenend.org.uk>  Sun, 25 Jul 1999 23:05:24 +0100
+
+lha (1.14d-1) unstable; urgency=low
+
+  * Fixed manpage - no need to specify "-b" for command line help. Closes bug #33328.
+
+ -- Steve McIntyre <stevem@chiark.greenend.org.uk>  Sun, 14 Feb 1999 16:24:44 +0000
+
+lha (1.14d-0) unstable; urgency=low
+
+  * New upstream release. Thanks to Tomohiro KUBOTA <kubota@kubota.rcpom.osaka-u.ac.jp> for pointing this out.
+
+ -- Steve McIntyre <stevem@chiark.greenend.org.uk>  Sat, 16 Jan 1999 21:54:37 +0000
+
+lha (1.14c-1) frozen unstable; urgency=low
+
+  * New man page, supplied by Martin Schulze <joey@finlandia.Infodrom.North.DE>. Fixes Bug#27195.
+
+ -- Steve McIntyre <stevem@chiark.greenend.org.uk>  Sun, 18 Oct 1998 13:53:12 +0100
+
+lha (1.14c-0) unstable; urgency=low
+
+  * New upstream release. Thanks to Atsushi KAMOSHIDA <kamop@debian.or.jp> for pointing this out.
+
+ -- Steve McIntyre <stevem@chiark.greenend.org.uk>  Sat, 15 Aug 1998 14:16:19 +0100
+
+lha (1.00-6) unstable; urgency=low
+
+  * New maintainer.
+
+ -- Steve McIntyre <stevem@chiark.greenend.org.uk>  Mon, 12 Jan 1998 00:09:12 +0000
+
+lha (1.00-5) unstable; urgency=low, closes=16756
+
+  * Corrected Standards-Version to 2.3.0.1 (Bug#16756)
+
+ -- Martin Schulze <joey@finlandia.infodrom.north.de>  Fri, 9 Jan 1998 02:08:03 +0100
+
+lha (1.00-4) unstable; urgency=low
+
+  * Compiled against libc6 (Bug#11696)
+
+ -- Martin Schulze <joey@finlandia.infodrom.north.de>  Wed, 31 Dec 1997 20:51:38 +0100
+
+lha (1.00-3) unstable; urgency=low
+
+  * Corrected manpage (Bug#7980)
+  
+  * New maintainer address
+
+ -- Martin Schulze <joey@namib.north.de>  Mon, 28 Apr 1997 13:10:10 +0200
+
+lha (1.00-2) unstable; urgency=low
+
+  * Installed ChangeLog files
+  
+  * Converted into new packaging scheme
+
+ -- Martin Schulze <joey@namib.north.de>  Sun, 23 Feb 1997 12:22:13 +0100
+
--- lha-1.14i.orig/debian/lha.1
+++ lha-1.14i/debian/lha.1
@@ -0,0 +1,139 @@
+		  .\" lha - LZH un-archiver
+.\" Copyright (c) 1996  Martin Schulze <joey@namib.north.de>
+.\" 
+.\" This manual page is free software; you can redistribute it and/or modify
+.\" it under the terms of the GNU General Public License as published by
+.\" the Free Software Foundation; either version 2 of the License, or
+.\" (at your option) any later version.
+.\" 
+.\" This program is distributed in the hope that it will be useful,
+.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
+.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+.\" GNU General Public License for more details.
+.\" 
+.\" You should have received a copy of the GNU General Public License
+.\" along with this program; if not, write to the Free Software
+.\" Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+.\"
+.\" This manpage is written especially for Debian GNU/Linux.
+.\"
+.\" LHarc    for UNIX  V 1.02  Copyright(C) 1989  Y.Tagawa     
+.\" LHx      for MSDOS V C2.01 Copyright(C) 1990  H.Yoshizaki  
+.\" LHx(arc) for OSK   V 2.01  Modified     1990  Momozou      
+.\" LHa      for UNIX  V 1.00  Copyright(C) 1992  Masaru Oki   
+.\" 
+.\" Additions by Joerg Boehnke <joerg@oggi.oche.de>
+.\" 
+.TH LHA 1 "22 Sept, 1998" "Debian GNU/Linux" "Archiver"
+.SH NAME
+LHa \- LZH un-archiver
+.SH SYNOPSIS
+.B lha
+.B key
+[
+.B -
+]
+.B {axelvudmcp}
+[
+.B qvnfodizg012
+]
+[
+.B w=<dir>
+]
+.I archive_file
+[
+.I flie
+\&.\|.\|. ]
+.br
+.B lha
+.I archive_file
+.SH DESCRIPTION
+The
+.B lha
+program displays or extracts the contents of a LZH archive.
+
+For a list of commands, please refer to the executable.  It will
+display a list of valid commands and modifiers if you omit any
+parameter.
+
+.TP
+commands:
+                           
+.B a
+Add(or replace) to archive
+
+.B x,e
+EXtract from archive
+    
+.B l,v
+List / Verbose List        
+         
+.B u        
+Update newer files to archive  
+
+.B d
+Delete from archive        
+         
+.B m
+Move to archive (means 'ad')   
+
+.B c        
+re-Construct new archive       
+
+.B p        
+Print to STDOUT from archive   
+
+.B t        
+Test file CRC in archive
+
+.TP
+options: 
+                                
+.B q
+quiet                                
+
+.B v
+verbose                              
+
+.B n
+not execute                          
+
+.B f
+force (over write at extract)        
+
+.B t
+FILES are TEXT file                  
+
+.B o 
+use LHarc compatible method (a/u)    
+
+.B w=<dir>
+specify extract directory (x/e) 
+
+.B d
+delete FILES after (a/u/c)           
+
+.B i
+ignore directory path (x/e)          
+
+.B z
+files not compress (a/u)             
+
+.B g  
+[Generic] format (for compatibility) 
+
+.B 0/1/2 
+header level (a/u)                
+
+.B e  
+TEXT code convert from/to EUC        
+
+.B y
+filename multibyte convert
+
+.SH BUGS
+
+This manpage is poor, it really should be improved, but the original
+is in Japanese.
+
+Try lha without any command line arguments to get help
--- lha-1.14i.orig/debian/rules
+++ lha-1.14i/debian/rules
@@ -0,0 +1,115 @@
+#!/usr/bin/make -f
+# Sample debian/rules that uses debhelper.
+# GNU copyright 1997 to 1999 by Joey Hess.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+# This is the debhelper compatability version to use.
+export DH_COMPAT=3
+
+configure: configure-stamp
+configure-stamp:
+	dh_testdir
+	# Add here commands to configure the package.
+	
+	patch -p0 < debian/patch.paul
+	patch -p0 < debian/patch.multibyte
+	patch -p0 < debian/patch.CAN-2004-0234_0235
+	patch -p0 < debian/patch.header-overflow
+	patch -p1 < debian/patch.redhat-sec2
+	patch -p1 < debian/patch.CVE-2006-4335-CVE-2006-4337-CVE-2006-4338
+
+	touch configure-stamp
+
+build: configure-stamp build-stamp
+build-stamp:
+	dh_testdir
+
+	# Add here commands to compile the package.
+	$(MAKE)
+	#/usr/bin/docbook-to-man debian/lha.sgml > lha.1
+
+	touch build-stamp
+
+clean:
+	dh_testdir
+	dh_testroot
+	rm -f build-stamp configure-stamp
+
+	# Add here commands to clean up after the build process.
+	-$(MAKE) clean
+
+	# delete copied docs.
+	rm -f MACHINES MACHINES2 PROBLEMS README
+	rm -f header.doc debian/lha.euc.1.gz debian/lha.1.gz
+	cp debian/org/lha.h src/lha.h
+	cp debian/org/header.c src/header.c
+	cp debian/org/lharc.c src/lharc.c
+	cp debian/org/util.c src/util.c
+	cp debian/org/lhext.c src/lhext.c
+	cp debian/org/lhlist.c src/lhlist.c
+	cp debian/org/lha_macro.h src/lha_macro.h
+
+	dh_clean
+
+install: build
+	dh_testdir
+	dh_testroot
+	dh_clean -k
+	dh_installdirs
+
+	# Add here commands to install the package into debian/lha.
+	# $(MAKE) install BINDIR=$(CURDIR)/debian/lha/usr/bin \
+	#		MANDIR=$(CURDIR)/debian/lha/usr/share/man \
+	#		MANSECT=1
+	install -m 755 src/lha $(CURDIR)/debian/lha/usr/bin
+
+	# Copy the filenames without the .euc extension
+	cp MACHINES.euc MACHINES 
+	cp MACHINES2.euc MACHINES2
+	cp PROBLEMS.euc PROBLEMS 
+	cp README.euc README 
+	cp header.doc.euc header.doc
+
+	gzip -9 -c man/lha.n > debian/lha.euc.1.gz
+	gzip -9 -c debian/lha.1 > debian/lha.1.gz
+	install -m 644 debian/lha.euc.1.gz $(CURDIR)/debian/lha/usr/share/man/ja/man1/lha.1.gz
+	install -m 644 debian/lha.1.gz $(CURDIR)/debian/lha/usr/share/man/man1/lha.1.gz
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+	dh_testdir
+	dh_testroot
+#	dh_installdebconf	
+	dh_installdocs
+	dh_installexamples
+	dh_installmenu
+#	dh_installlogrotate
+#	dh_installemacsen
+#	dh_installpam
+#	dh_installmime
+#	dh_installinit
+#	dh_installcron
+#	dh_installman
+#	dh_installinfo
+#	dh_undocumented
+	dh_installchangelogs CHANGES.euc
+	dh_link
+	dh_strip
+	dh_compress
+	dh_fixperms
+#	dh_makeshlibs
+	dh_installdeb
+#	dh_perl
+	dh_shlibdeps
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install configure
--- lha-1.14i.orig/debian/dirs
+++ lha-1.14i/debian/dirs
@@ -0,0 +1,3 @@
+usr/bin
+usr/share/man/man1
+usr/share/man/ja/man1/
--- lha-1.14i.orig/debian/copyright
+++ lha-1.14i/debian/copyright
@@ -0,0 +1,172 @@
+This package was debianized by Atsushi KAMOSHIDA kamop@post1.com on
+Sun, 13 Apr 1997 17:52:59 +0900.
+
+It was downloaded from http://www2m.biglobe.ne.jp/~dolphin/lha/lha.htm
+
+Upstream Authors: 
+
+      LHarc 0.01-1.00:   Yooichi Tagawa (LHa code taken from here, 1988-1989)
+     	  Nikkei-mix ID: y.tagawa (Now this is defunct BBS, Licensing term
+     	  in manual page come from his licence for lharc)
+     	  His new web page seems to be www2s.biglibe.ne.jp/~yex/
+     	  yooedit2001@yahoo.co.jp is the contact e-mail address for another
+     	  software.  Page updated at least July/2001
+     	  
+      LHa   0.01-1.00:   Masaru Oki     (LHa original author, 1991-1992)
+     	  E-Mail address: oki@netbsd.org
+     
+      LHa   1.10-1.14:   Nobutaka Watazaki (Last official release? 1993-1995)
+	  ALICE-NET       ALS00595    Nasty
+	  E-Mail          JBD02514@niftyserve.or.jp
+	  E-Mail          femcs@mbox.kyoto-inet.or.jp
+	  NIFTY-Serve     JBD02514
+	  E-Mail address: watazaki@shimadzu.co.jp
+	  E-Mail address: watazaki@shimadzusd.co.jp
+     	  
+      Lha   1.14a-1.14e: Tsugio Okamoto <tsugio@muc.biglobe.ne.jp> (1996-2000)
+     
+
+Copyright:
+
+Original Source Code License Statement:
+
+   /*    Copyright (C) MCMLXXXIX Yooichi.Tagawa                      */
+   /*    Modified                Nobutaka Watazaki                   */
+   /*                   Thanks to H.Yoshizaki. (MS-DOS LHarc)        */
+
+
+Original Authors License Statement (from man/lha.man, in Japanese
+EUC-JP):
+
+   再配布について
+       以下の条件で、再配布、転載、改変を許可します。
+
+       1.     著作権表示を削除しないこと。
+
+       2.     配布内容については、
+
+              a.     配布の際に存在する内容(すなわち ソー ス コー
+                     ド、 ド キュメント、プログラマーへの手引きな
+                     ど)が再配布されたものの中に必ず存在 す る こ
+                     と。 改 変されているならば、それを明示したド
+                     キュメントを用意すること。
+
+              b.     LHa に対する付加価値が付けられて再配布される
+                     場合にはそれらもできるだけ含めるよう努力する
+                     こと。また、その際には付加価値が付けられてい
+                     ることを明示したドキュメントを用意すること。
+
+              c.     バイナリのみの配布は許されない。(付加価値 の
+                     ものも含む)
+
+       3.     最新版の配布に務めること。(義務はない)
+
+              注.    なお、ネットでの配付は自由であるが、ネットに
+                     アクセスできない方(雑誌および、 CDROM な ど
+                     に よる)配付は、配付前にこちらに EMail をお
+                     願いします。配付前に出来ない際には、後日必ず
+                     EMail をお願いします。
+
+       4.      このプログラムの存在や使用したことによって生じた損
+              害は全く保証しない。
+
+       5.     作者は、このプログラムに不備があっても、それを訂 正
+              する義務を負わない。
+
+       6.      このプログラムの一部、または全部を他のプログラムに
+              組み込んで利用してもかまわない。この場合、そのプ ロ
+              グラムは LHa ではなく、 LHa と名乗ってはいけない。
+
+       7.      商利用に関しては、上記の条件に加え、下記の条件のも
+              とにこれを認める。
+
+              a.     このプログラムをメインとする商利用は禁 止 す
+                     る。
+
+              b.     商利用の相手がこのプログラムの使用者として不
+                     適切と判断した場合には配布しない。
+
+              c.     インストールの手段として使用する場合、このプ
+                     ログラムを使うことを相手に強制しない。この場
+                     合、商利用者が作業を行う。また、そのときの損
+                     害は、商利用者が全責任を負う。
+
+              d.     商利用を付加価値として行いこのプログラムを使
+                     用する場合、商利用者は、そのサポートを行う。
+
+
+Original Authors License Statement (from man/lha.man, translated by
+Osamu Aoki <debian@aokiconsulting.com>):
+
+   Permission is given for redistribution, copy, and modification provided
+   following conditions are met.
+   
+   1. Do not remove copyright clause.
+   2. Distribution shall conform:
+    a. The content of redistribution (i.e., source code, documentation,
+       and reference guide for programmers) shall include original contents.
+       If contents are modified, the document clearly indicating
+       the fact of modification must be included.
+    b. If LHa is redistributed with added values, you must put your best
+       effort to include them (Translator comment: If read literally,
+       original Japanese was unclear what "them" means here.  But
+       undoubtedly this "them" means source code for the added value
+       portion and this is a typical Japanese sloppy writing style to
+       abbreviate as such)  Also the document clearly indicating that
+       added value was added must be included. 
+    c. Binary only distribution is not allowed (including added value
+       ones.)
+   3. You need to put effort to distribute the latest version (This is not
+      your duty).
+   
+      NB: Distribution on Internet is free.  Please notify me by e-mail or
+      other means prior to the distribution if distribution is done through
+      non-Internet media (Magazine, CDROM etc.)  If not, make sure to Email
+      me later.
+   
+   4. Any damage caused by the existence and use of this program will not
+      be compensated.
+   
+   5. Author will not be responsible to correct errors even if program is
+      defective.
+   
+   6. This program, either as a part of this or as a whole of this, may be
+      included into other programs.  In this case, that program is not LHa
+      and can not call itself LHa.
+   
+   7. For commercial use, in addition to above conditions, following
+      condition needs to be met.
+   
+      a.  The program whose content is mainly this program can not be used
+          commercially.
+      b.  If the recipient of commercial use deems inappropriate as a
+          program user, you must not distribute.
+      c.  If used as a method for the installation, you must not force
+          others to use this program.  In this case, commercial user will
+          perform its work while taking full responsibility of its outcome.
+      d.  If added value is done under the commercial use by using this
+          program, commercial user shall provide its support.
+
+
+(Osamu Aoki also comments:
+   Here "commercial" may be interpreted as "for-fee".  "Added value" seems
+   to mean "feature enhancement".  )
+
+
+License Statement by Tsugio Okamoto (in Japanese EUC-JP):
+
+   なお、ネットでの配付は自由ですが、ネットにアクセスできない方(雑誌および、
+   CD-ROM などによる)への配付は、配付前にこちらに Inter-Net の方にE-Mail
+   を お願いします。 どこそこに、掲載するという旨があれば結構ですので。
+   また、それも出来ない際には、後日 E-Mail を必ずお願いします。
+
+
+Translated License Statement by Tsugio Okamoto (translated by
+GOTO Masanori <gotom@debian.org>):
+
+   It's free to distribute on the network, but if you distribute for
+   the people who cannot access the network (by magazine or CD-ROM),
+   please send E-Mail (Inter-Net address) to the author before the
+   distribution. That's well where this software is appeard.
+   If you cannot do, you must send me the E-Mail later.
+
--- lha-1.14i.orig/debian/control
+++ lha-1.14i/debian/control
@@ -0,0 +1,13 @@
+Source: lha
+Section: non-free/utils
+Priority: optional
+Maintainer: GOTO Masanori <gotom@debian.org>
+Build-Depends: debhelper (>> 4.0.0)
+Standards-Version: 3.6.0
+
+Package: lha
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: lzh archiver
+ The famous lzh archiver, known from DOS.  When mixing DOS and Unix
+ you might need it.  (Especially for fido <--> rfc conversions.)
--- lha-1.14i.orig/debian/docs
+++ lha-1.14i/debian/docs
@@ -0,0 +1,10 @@
+README.euc
+change-114e.txt
+change-114g.txt
+change-114h.txt
+change-114i.txt
+MACHINES
+MACHINES2
+PROBLEMS
+header.doc
+debian/header-e.doc
--- lha-1.14i.orig/debian/patch.paul
+++ lha-1.14i/debian/patch.paul
@@ -0,0 +1,10 @@
+--- src/lha.h	Thu Oct  5 19:35:38 2000
++++ src/lha.h	Wed Aug 22 15:49:55 2001
+@@ -16,6 +16,7 @@
+ #include <sys/types.h>
+ #include <sys/file.h>
+ #include <sys/stat.h>
++#include <stdlib.h>
+ 
+ #include <signal.h>
+
--- lha-1.14i.orig/debian/header-e.doc
+++ lha-1.14i/debian/header-e.doc
@@ -0,0 +1,189 @@
+/* header.doc (In English) */
+Header structure used in LHa for UNIX              Mar. 2, 1992, Masaru Oki.
+(Translated by Osamu Aoki)
+
+----------------------------------------------------------------
+This version, as a transitional mreasure, uses level-1 as default value while
+offering 3 types of header types. In the future, I plan to use level-2 which
+has no limit on number of characters for the path mname.
+
+  A. Spec for header
+
+Basic part
+-----------------------------------------------------------------------------
+        level-0                 level-1                 level-2
+-----------------------------------------------------------------------------
+      1 header size           1 header size           2 total header size
+      1 header sum            1 header sum
+      5 method ID             5 method ID             5 method ID
+      4 packed size           4 skip size             4 packed size
+      4 original size         4 original size         4 original size
+      2 time                  2 time                  4 time(UNIX type)
+      2 date                  2 date
+      1 attribute             1 0x20                  1 RESERVED
+      1 level 0x00            1 level 0x01            1 level 0x02
+      1 name length           1 name length
+      ? pathname              ? filename
+      2 file crc              2 file crc              2 file crc
+      . ........              1 OS ID 'U'             1 OS ID 'U'
+                              . ........
+                              2 next-header size      2 next-header size
+    *************************************************************************
+     24 + ?                  27 + ?                  26
+
+Extension part
+-----------------------------------------------------------------------------
+                              1 ext-type              1 ext-type
+                              . ........              . ........
+                              2 next-header size      2 next-header size
+  
+-----------------------------------------------------------------------------
+
+    a. Types of header
+
+      level-0 header
+          Same format as conventional LHarc, LArc.  Separator for directory
+	  name is '\' as default.
+
+      level-1 header
+          This header is used as default. Archive type -lh0 made with -x0 can
+	  be unfrozen by LHarc but there will be no checking on CRC.
+
+      level-2 header
+          Header for supporting long file names.  I would like to standarize
+	  on this format in the future.  Please follow this if you wish to
+	  make utilities related ti LH.
+
+    b. method ID for freeze/unfreeze
+
+      * these methods are freeze/unfreeze, others are unfreeze only
+
+      -lh0- * no compression
+
+      -lh1- * 4k sliding dictionary(max 60 bytes) + dynamic Huffman
+              + fixed encoding of position
+
+      -lh2-   8k sliding dictionary(max 256 bytes) + dynamic Huffman
+
+      -lh3-   8k sliding dictionary(max 256 bytes) + static Huffman
+
+      -lh4- * 4k sliding dictionary(max 256 bytes) + static Huffman
+              + improved encoding of position and trees
+
+      -lh5- * 8k sliding dictionary(max 256 bytes) + static Huffman
+              + improved encoding of position and trees
+
+      -lh6-   32k sliding dictionary(max 256 bytes) + static Huffman
+			  + improved encoding of position and trees
+
+      -lh7-   64k sliding dictionary(max 256 bytes) + static Huffman
+			  + improved encoding of position and trees
+
+      -lzs-   2k sliding dictionary(max 17 bytes)
+
+      -lz4-   no compression
+
+      -lz5-   4k sliding dictionary(max 17 bytes)
+
+    c. About OS ID
+
+      Following OS ID are reserved.
+
+        MS-DOS  'M'
+        OS/2    '2'
+        OS9     '9'
+        OS/68K  'K'
+        OS/386  '3'
+        HUMAN   'H'
+        UNIX    'U'
+        CP/M    'C'
+        FLEX    'F'
+        Mac     'm'
+        Runser  'R'
+
+  B. Extension
+
+    a. OS independent (0x00 - 0x3f)
+
+        common header
+         1 0x00
+         2 header crc
+       ( 1 information )
+         2 next-header size
+
+        filename header
+         1 0x01
+         ? filename
+         2 next-header size
+
+        dirname header
+         1 0x02
+         ? dirname
+         2 next-header size
+
+        comment header
+         1 0x3f
+         ? comments
+         2 next-header size
+
+(Above portion, from lhx.doc by Mr. Yoshizaki)
+----------------------------------------------------------------
+LHa for UNIX : specification for extension header
+
+* Category of machine specific information (Information to be recorded)
+	Followings are UNIX specific information which requires to be recorded
+	(1) Permission
+	(2) GID,UID
+	(3) Group name, User name
+	(4) Last change time (UNIX time)
+
+* Type of machine specific information (ext-type)
+	First 1 byte of extension header contain value to distinguish types of
+	the infoemation. Foe UNIX specific information,  0x50 - 0x54 will be
+	used.
+
+* Method to store 
+	Above categories (1) - (4) will be different type.
+	
+
+	(1) Pemission
+		size	value
+		1	0x50
+		2	Valur of permission
+		2	next-header size
+
+	(2)GID,UID
+		size	value
+		1	0x51
+		2	GID
+		2	UID
+		2	next-header size
+
+	(3)-1 Group name
+		1	0x52
+		?	Group name string
+		2	next-header size
+
+	(3)-2 user name
+		1	0x53
+		?	User name string
+		2	next-header size
+
+	(4) Last change time (for header_level1)
+		1	0x54
+		4	UNIX time
+		2	next-header size
+
+* Implimentation of LHa for UNIX ver 1.14 (Watazaki)
+	Above (3) is not supported
+	Group name and user name specified by (3) is not used to make an
+	archive thus ignored during expansion.
+	Also (4) is contained only in level-1 archive.
+----------------------------------------------------------------
+That's all folks :)
+
+Partially modified by
+Nobutaka Watazaki
+watazaki@shimadzu.co.jp
+
+
--- lha-1.14i.orig/debian/patch.CAN-2004-0234_0235
+++ lha-1.14i/debian/patch.CAN-2004-0234_0235
@@ -0,0 +1,85 @@
+--- src/header.c.old	2000-10-05 19:36:03.000000000 +0200
++++ src/header.c	2004-04-17 23:55:54.000000000 +0200
+@@ -538,6 +538,10 @@
+ 				/*
+ 				 * filename
+ 				 */
++				if (header_size >= 256) {
++				  fprintf(stderr, "Possible buffer overflow hack attack, type #1\n");
++				  exit(109);
++				}
+ 				for (i = 0; i < header_size - 3; i++)
+ 					hdr->name[i] = (char) get_byte();
+ 				hdr->name[header_size - 3] = '\0';
+@@ -547,6 +551,10 @@
+ 				/*
+ 				 * directory
+ 				 */
++				if (header_size >= FILENAME_LENGTH) {
++				  fprintf(stderr, "Possible buffer overflow hack attack, type #2\n");
++				  exit(110);
++				}
+ 				for (i = 0; i < header_size - 3; i++)
+ 					dirname[i] = (char) get_byte();
+ 				dirname[header_size - 3] = '\0';
+--- src/lhext.c.old	2000-10-04 16:57:38.000000000 +0200
++++ src/lhext.c	2004-04-18 01:27:44.000000000 +0200
+@@ -190,8 +190,13 @@
+ 		q = (char *) rindex(hdr->name, '/') + 1;
+ 	}
+ 	else {
++		if (is_directory_traversal(q)) {
++		  fprintf(stderr, "Possible directory traversal hack attempt in %s\n", q);
++		  exit(111);
++		}
++
+ 		if (*q == '/') {
+-			q++;
++			while (*q == '/') { q++; }
+ 			/*
+ 			 * if OSK then strip device name
+ 			 */
+@@ -419,6 +424,33 @@
+ 	return;
+ }
+ 
++int
++is_directory_traversal(char *string)
++{
++  unsigned int type = 0; /* 0 = new, 1 = only dots, 2 = other chars than dots */
++  char *temp;
++
++  temp = string;
++
++  while (*temp != 0) {
++    if (temp[0] == '/') {
++      if (type == 1) { return 1; }
++      type = 0;
++      temp++;
++      continue;
++    }
++
++    if ((temp[0] == '.') && (type < 2))
++      type = 1;
++    if (temp[0] != '.')
++      type = 2;
++
++    temp++;
++  } /* while */
++
++  return (type == 1);
++}
++
+ /* Local Variables: */
+ /* mode:c */
+ /* tab-width:4 */
+--- src/lhext.c.symlink	2000-10-04 10:57:38.000000000 -0400
++++ src/lhext.c	2003-05-19 22:55:57.000000000 -0400
+@@ -351,6 +351,7 @@ extract_one(afp, hdr)
+ 				}
+ 
+ 				unlink(bb1);
++				make_parent_path(bb1);
+ 				l_code = symlink(bb2, bb1);
+ 				if (l_code < 0) {
+ 					if (quiet != TRUE)
--- lha-1.14i.orig/debian/patch.header-overflow
+++ lha-1.14i/debian/patch.header-overflow
@@ -0,0 +1,21 @@
+--- src/header.c	2002-07-19 17:23:58.000000000 +0900
++++ src/header.c	2004-06-16 09:49:23.000000000 +0900
+@@ -648,8 +648,17 @@
+ 	}
+ 
+ 	if (dir_length) {
++		if ((dir_length + name_length) > sizeof(dirname)) {
++			fprintf(stderr, "Insufficient buffer size\n");
++			exit(112);
++		}
+ 		strcat(dirname, hdr->name);
+-		strcpy(hdr->name, dirname);
++
++		if ((dir_length + name_length) > sizeof(hdr->name)) {
++			fprintf(stderr, "Insufficient buffer size\n");
++			exit(112);
++		}
++		strncpy(hdr->name, dirname, sizeof(hdr->name));
+ 		name_length += dir_length;
+ 	}
+ 
--- lha-1.14i.orig/debian/patch.redhat-sec2
+++ lha-1.14i/debian/patch.redhat-sec2
@@ -0,0 +1,196 @@
+diff -urNp lha-114i.orig/src/lha_macro.h lha-114i/src/lha_macro.h
+--- lha-114i.orig/src/lha_macro.h	2004-08-03 15:53:56.000000000 -0500
++++ lha-114i/src/lha_macro.h	2004-08-03 15:54:05.000000000 -0500
+@@ -53,7 +53,7 @@
+ #define SEEK_SET		0
+ #define SEEK_CUR		1
+ #define SEEK_END		2
+-#endif	/* SEEK_SET
++#endif	/* SEEK_SET */
+ 
+ 
+ /* non-integral functions */
+diff -urNp lha-114i.orig/src/lharc.c lha-114i/src/lharc.c
+--- lha-114i.orig/src/lharc.c	2004-08-03 15:53:56.000000000 -0500
++++ lha-114i/src/lharc.c	2004-08-03 15:54:05.000000000 -0500
+@@ -830,9 +830,10 @@ find_files(name, v_filec, v_filev)
+ 	DIRENTRY       *dp;
+ 	struct stat     tmp_stbuf, arc_stbuf, fil_stbuf;
+ 
+-	strcpy(newname, name);
++	strncpy(newname, name, sizeof(newname));
++	newname[sizeof(newname)-1] = 0;
+ 	len = strlen(name);
+-	if (len > 0 && newname[len - 1] != '/')
++	if (len > 0 && newname[len - 1] != '/' && len < (sizeof(newname)-1))
+ 		newname[len++] = '/';
+ 
+ 	dirp = opendir(name);
+@@ -846,6 +847,11 @@ find_files(name, v_filec, v_filev)
+ 
+ 	for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
+ 		n = NAMLEN(dp);
++		if (len >= (sizeof(newname)-1) ||
++				(len+n) >= (sizeof(newname)-1) ||
++					 n  <= 0                   ||
++				(len+n) <= 0)
++			break;
+ 		strncpy(newname + len, dp->d_name, n);
+ 		newname[len + n] = '\0';
+ 		if (GETSTAT(newname, &fil_stbuf) < 0)
+@@ -903,7 +909,8 @@ build_temporary_name()
+ 		strcpy(temporary_name, TMP_FILENAME_TEMPLATE);
+ 	}
+ 	else {
+-		sprintf(temporary_name, "%s/lhXXXXXX", extract_directory);
++		snprintf(temporary_name, sizeof(temporary_name),
++			"%s/lhXXXXXX", extract_directory);
+ 	}
+ #ifdef MKSTEMP
+ 	mkstemp(temporary_name);
+@@ -913,10 +920,16 @@ build_temporary_name()
+ #else
+ 	char           *p, *s;
+ 
+-	strcpy(temporary_name, archive_name);
++	strncpy(temporary_name, archive_name, sizeof(temporary_name));
++	temporary_name[sizeof(temporary_name)-1] = 0;
+ 	for (p = temporary_name, s = (char *) 0; *p; p++)
+ 		if (*p == '/')
+ 			s = p;
++
++	if( sizeof(temporary_name) - ((size_t) (s-temporary_name)) - 1
++		<= strlen("lhXXXXXX"))
++			exit(-1);
++
+ 	strcpy((s ? s + 1 : temporary_name), "lhXXXXXX");
+ #ifdef MKSTEMP
+ 	mkstemp(temporary_name);
+@@ -1052,7 +1065,8 @@ open_old_archive()
+ 
+ 	if (open_old_archive_1(archive_name, &fp))
+ 		return fp;
+-	sprintf(expanded_archive_name, "%s.lzh", archive_name);
++	snprintf(expanded_archive_name, sizeof(expanded_archive_name),
++		"%s.lzh", archive_name);
+ 	if (open_old_archive_1(expanded_archive_name, &fp)) {
+ 		archive_name = expanded_archive_name;
+ 		return fp;
+@@ -1061,7 +1075,8 @@ open_old_archive()
+ 	 * if ( (errno&0xffff)!=E_PNNF ) { archive_name =
+ 	 * expanded_archive_name; return NULL; }
+ 	 */
+-	sprintf(expanded_archive_name, "%s.lzs", archive_name);
++	snprintf(expanded_archive_name, sizeof(expanded_archive_name),
++		"%s.lzs", archive_name);
+ 	if (open_old_archive_1(expanded_archive_name, &fp)) {
+ 		archive_name = expanded_archive_name;
+ 		return fp;
+diff -urNp lha-114i.orig/src/lhext.c lha-114i/src/lhext.c
+--- lha-114i.orig/src/lhext.c	2004-08-03 15:53:56.000000000 -0500
++++ lha-114i/src/lhext.c	2004-08-03 15:55:40.000000000 -0500
+@@ -82,7 +82,8 @@ make_parent_path(name)
+ 	register char  *p;
+ 
+ 	/* make parent directory name into PATH for recursive call */
+-	strcpy(path, name);
++	memset(path, 0, sizeof(path));
++	strncpy(path, name, sizeof(path)-1);
+ 	for (p = path + strlen(path); p > path; p--)
+ 		if (p[-1] == '/') {
+ 			*--p = '\0';
+@@ -212,9 +213,11 @@ extract_one(afp, hdr)
+ 	}
+ 
+ 	if (extract_directory)
+-		sprintf(name, "%s/%s", extract_directory, q);
+-	else
+-		strcpy(name, q);
++		snprintf(name, sizeof(name), "%s/%s", extract_directory, q);
++	else {
++		strncpy(name, q, sizeof(name));
++		name[sizeof(name) - 1] = '\0';
++	}
+ 
+ 
+ 	/* LZHDIRS_METHOD鐃緒申鐃緒申鐃縦ヘッワ申鐃緒申鐃緒申鐃緒申鐃獣ワ申鐃緒申鐃緒申 */
+@@ -335,7 +338,8 @@ extract_one(afp, hdr)
+ 			if ((hdr->unix_mode & UNIX_FILE_TYPEMASK) == UNIX_FILE_SYMLINK) {
+ 				char            buf[256], *bb1, *bb2;
+ 				int             l_code;
+-				strcpy(buf, name);
++				strncpy(buf, name, sizeof(buf));
++				buf[sizeof(buf)-1] = 0;
+ 				bb1 = strtok(buf, "|");
+ 				bb2 = strtok(NULL, "|");
+ 
+@@ -365,9 +369,10 @@ extract_one(afp, hdr)
+ 				if (quiet != TRUE) {
+ 					printf("Symbolic Link %s -> %s\n", bb1, bb2);
+ 				}
+-				strcpy(name, bb1);	/* Symbolic's name set */
++				strncpy(name, bb1, 255);	/* Symbolic's name set */
++				name[255] = 0;
+ #else
+-				sprintf(buf, "%s -> %s", bb1, bb2);
++				sprintf(buf, sizeof(buf), "%s -> %s", bb1, bb2);
+ 				warning("Can't make Symbolic Link", buf);
+ 				return;
+ #endif
+diff -urNp lha-114i.orig/src/lhlist.c lha-114i/src/lhlist.c
+--- lha-114i.orig/src/lhlist.c	2004-08-03 15:53:56.000000000 -0500
++++ lha-114i/src/lhlist.c	2004-08-03 15:54:05.000000000 -0500
+@@ -250,7 +250,8 @@ list_one(hdr)
+ 			printf(" %s", hdr->name);
+ 		else {
+ 			char            buf[256], *b1, *b2;
+-			strcpy(buf, hdr->name);
++			strncpy(buf, hdr->name, sizeof(buf));
++			buf[sizeof(buf)-1] = 0;
+ 			b1 = strtok(buf, "|");
+ 			b2 = strtok(NULL, "|");
+ 			printf(" %s -> %s", b1, b2);
+diff -urNp lha-114i.orig/src/util.c lha-114i/src/util.c
+--- lha-114i.orig/src/util.c	2004-08-03 15:53:56.000000000 -0500
++++ lha-114i/src/util.c	2004-08-03 15:54:05.000000000 -0500
+@@ -276,21 +276,27 @@ rmdir(path)
+ 	char           *path;
+ {
+ 	int             stat, rtn = 0;
+-	char           *cmdname;
+-	if ((cmdname = (char *) malloc(strlen(RMDIRPATH) + 1 + strlen(path) + 1))
+-	    == 0)
++	pid_t           child;
++
++
++	/* XXX thomas: shell meta chars in path could exec commands */
++	/* therefore we should avoid using system() */
++	if ((child = fork()) < 0)
++		return (-1);    /* fork error */
++	else if (child) {       /* parent process */
++		while (child != wait(&stat))    /* ignore signals */
++			continue;
++	}
++	else {                  /* child process */
++		execl(RMDIRPATH, "rmdir", path, (char *) 0);
++		/* never come here except execl is error */
+ 		return (-1);
+-	strcpy(cmdname, RMDIRPATH);
+-	*(cmdname + strlen(RMDIRPATH)) = ' ';
+-	strcpy(cmdname + strlen(RMDIRPATH) + 1, path);
+-	if ((stat = system(cmdname)) < 0)
+-		rtn = -1;	/* fork or exec error */
+-	else if (stat) {	/* RMDIR command error */
+-		errno = EIO;
+-		rtn = -1;
+ 	}
+-	free(cmdname);
+-	return (rtn);
++	if (stat != 0) {
++		errno = EIO;    /* cannot get error num. */
++		return (-1);
++	}
++	return (0);
+ }
+ 
+ /* ------------------------------------------------------------------------ */
--- lha-1.14i.orig/debian/patch.CVE-2006-4335-CVE-2006-4337-CVE-2006-4338
+++ lha-1.14i/debian/patch.CVE-2006-4335-CVE-2006-4337-CVE-2006-4338
@@ -0,0 +1,137 @@
+diff -aur lha-1.14i.orig/src/huf.c lha-1.14i/src/huf.c
+--- lha-1.14i.orig/src/huf.c	2000-10-05 19:35:49.000000000 +0200
++++ lha-1.14i/src/huf.c	2006-12-11 10:07:31.000000000 +0100
+@@ -332,7 +332,7 @@
+ 	}
+ 	else {
+ 		i = 0;
+-		while (i < n) {
++		while (i < MIN(n, NPT)) {
+ 			c = bitbuf >> (16 - 3);
+ 			if (c == 7) {
+ 				unsigned short  mask = 1 << (16 - 4);
+@@ -345,7 +345,7 @@
+ 			pt_len[i++] = c;
+ 			if (i == i_special) {
+ 				c = getbits(2);
+-				while (--c >= 0)
++				while (--c >= 0 && i < NPT)
+ 					pt_len[i++] = 0;
+ 			}
+ 		}
+@@ -370,7 +370,7 @@
+ 			c_table[i] = c;
+ 	} else {
+ 		i = 0;
+-		while (i < n) {
++		while (i < MIN(n,NC)) {
+ 			c = pt_table[bitbuf >> (16 - 8)];
+ 			if (c >= NT) {
+ 				unsigned short  mask = 1 << (16 - 9);
+@@ -380,7 +380,7 @@
+ 					else
+ 						c = left[c];
+ 					mask >>= 1;
+-				} while (c >= NT);
++				} while (c >= NT && (mask || c != left[c])); /* CVE-2006-4338 */
+ 			}
+ 			fillbuf(pt_len[c]);
+ 			if (c <= 2) {
+@@ -427,7 +427,7 @@
+ 			else
+ 				j = left[j];
+ 			mask >>= 1;
+-		} while (j >= NC);
++		} while (j >= NC && (mask || j != left[j])); /* CVE-2006-4338 */
+ 		fillbuf(c_len[j] - 12);
+ 	}
+ 	return j;
+@@ -451,7 +451,7 @@
+ 			else
+ 				j = left[j];
+ 			mask >>= 1;
+-		} while (j >= np);
++		} while (j >= np && (mask || j != left[j])); /* CVE-2006-4338 */
+ 		fillbuf(pt_len[j] - 8);
+ 	}
+ 	if (j != 0)
+Only in lha-1.14i/src: huf.c~
+diff -aur lha-1.14i.orig/src/lha_macro.h lha-1.14i/src/lha_macro.h
+--- lha-1.14i.orig/src/lha_macro.h	2006-12-11 09:43:54.000000000 +0100
++++ lha-1.14i/src/lha_macro.h	2006-12-11 09:55:42.000000000 +0100
+@@ -408,6 +408,8 @@
+ #define MAXMATCH			256	/* formerly F (not more than UCHAR_MAX + 1) */
+ #define THRESHOLD			3	/* choose optimal value */
+ 
++#define MIN(a,b) ((a) <= (b) ? (a) : (b))
++
+ /* from huf.c */
+ 
+ /* alphabet = {0, 1, 2, ..., NC - 1} */
+Only in lha-1.14i/src: lha_macro.h~
+diff -aur lha-1.14i.orig/src/maketbl.c lha-1.14i/src/maketbl.c
+--- lha-1.14i.orig/src/maketbl.c	2000-10-04 16:57:38.000000000 +0200
++++ lha-1.14i/src/maketbl.c	2006-12-11 09:59:51.000000000 +0100
+@@ -32,8 +32,15 @@
+ 	}
+ 
+ 	/* count */
+-	for (i = 0; i < nchar; i++)
+-		count[bitlen[i]]++;
++	for (i = 0; i < nchar; i++) {
++		if (bitlen[i] > 16) {
++		/* CVE-2006-4335 */
++		error("Bad table (case a)");
++		exit(1);
++	}
++	else
++		count[bitlen[i]]++;
++	}
+ 
+ 	/* calculate first code */
+ 	total = 0;
+@@ -41,8 +48,11 @@
+ 		start[i] = total;
+ 		total += weight[i] * count[i];
+ 	}
+-	if ((total & 0xffff) != 0)
+-		error("make_table()", "Bad table (5)\n");
++
++	if ((total & 0xffff) != 0 || tablebits > 16) { /* 16 for weight below */
++		error("make_table(): Bad table (case b)");
++		exit(1);
++	}
+ 
+ 	/* shift data for make table. */
+ 	m = 16 - tablebits;
+@@ -53,7 +63,7 @@
+ 
+ 	/* initialize */
+ 	j = start[tablebits + 1] >> m;
+-	k = 1 << tablebits;
++	k = MIN(1 << tablebits, 4096);
+ 	if (j != 0)
+ 		for (i = j; i < k; i++)
+ 			table[i] = 0;
+@@ -66,12 +76,19 @@
+ 		l = start[k] + weight[k];
+ 		if (k <= tablebits) {
+ 			/* code in table */
++		l = MIN(l, 4096);
+ 			for (i = start[k]; i < l; i++)
+ 				table[i] = j;
+ 		}
+ 		else {
+ 			/* code not in table */
+-			p = &table[(i = start[k]) >> m];
++			i = start[k];
++			if ((i >> m) > 4096) {
++			/* CVE-2006-4337 */
++			error("Bad table (case c)");
++			exit(1);
++			}
++			p = &table[i >> m];
+ 			i <<= tablebits;
+ 			n = k - tablebits;
+ 			/* make tree (n length) */
+Only in lha-1.14i/src: maketbl.c~