しらいです。

 file & directory 管理ツール FDclone 2.08 の patch その 1
です。

Submitted-by: shirai@chandra2
Archive-name: FD-2.08.patch/part01

---- Cut Here and feed the following to sh ----
#!/bin/sh
# This is FD-2.08.patch, a shell archive (produced by GNU sharutils 4.2)
# To extract the files from this archive, save it to some FILE, remove
# everything before the `!/bin/sh' line above, then type `sh FILE'.
#
# Made on 2005-12-26 00:00 JST by <shirai@chandra2>.
# Source directory was `/usr/home/shirai/src/fd2'.
#
# Existing files will *not* be overwritten unless `-c' is specified.
#
# This is part 1 of a multipart archive.                                   
# Do not concatenate these parts, unpack them in order with `/bin/sh'.     
#
# This shar contains:
# length mode       name
# ------ ---------- ------------------------------------------
# 161284 -rw-r--r-- FD-2.08.patch
#
echo=echo
touch -am 1231235999 $$.touch >/dev/null 2>&1
if test ! -f 1231235999 && test -f $$.touch; then
  shar_touch=touch
else
  shar_touch=:
  echo
  $echo 'WARNING: not restoring timestamps.  Consider getting and'
  $echo "installing GNU \`touch', distributed in GNU File Utilities..."
  echo
fi
rm -f 1231235999 $$.touch
#
if mkdir _sh00599; then
  $echo 'x -' 'creating lock directory'
else
  $echo 'failed to create lock directory'
  exit 1
fi
if test -r _sh00599/seq; then
  $echo 'Must unpack archives in sequence!'
  $echo 'Please unpack part' '`cat _sh00599/seq`' 'next!'
  exit 1
fi
# ============= FD-2.08.patch ==============
if test -f 'FD-2.08.patch' && test "$first_param" != -c; then
  $echo 'x -' SKIPPING 'FD-2.08.patch' '(file already exists)'
  rm -f _sh00599/new
else
  > _sh00599/new
  $echo 'x -' extracting 'FD-2.08.patch' '(text)'
  sed 's/^X//' << 'SHAR_EOF' > 'FD-2.08.patch' &&
diff -urNP ../FD-2.07c/Configur ./Configur
--- ../FD-2.07c/Configur        Tue Dec 13 00:00:00 2005
+++ ./Configur  Mon Dec 26 00:00:00 2005
@@ -175,7 +175,7 @@
X USEVFCNAME USEFFSTYPE \
X USERE_COMP USEREGCOMP USEREGCMP \
X USERAND48 USESETENV NOSELECT DEFFDSETSIZE SELECTRWONLY NOVSPRINTF NOTERMVAR \
-USEUTIME USEGETWD USEFCNTLOCK USELOCKF NOFLOCK \
+USEUTIME USEGETWD USEFCNTLOCK USELOCKF NOFLOCK NOSYSLOG \
X USETIMELOCAL USEMKTIME USESYSCONF USELLSEEK USEUNAME \
X USEWAITPID USESIGACTION USESIGPMASK \
X USERESOURCEH USEULIMITH USEGETRUSAGE USETIMES \
@@ -580,6 +580,9 @@
X       echo "#define      USELOCKF"
X else
X       echo "#define      NOFLOCK"
+fi
+if noexist "syslog(0,0,0)" "syslog"; then
+       echo "#define      NOSYSLOG"
X fi
X if isexist "mktime(0)" time; then
X       echo "#define      USEMKTIME"
diff -urNP ../FD-2.07c/HISTORY ./HISTORY
--- ../FD-2.07c/HISTORY Tue Dec 13 00:00:00 2005
+++ ./HISTORY   Mon Dec 26 00:00:00 2005
@@ -1,3 +1,15 @@
+Ver. 2.08      内部変数 PTYINKCODE, PTYOUTKCODE の追加。
+ (12/26/05)    内部変数 LOGFILE, LOGSIZE, USESYSLOG の追加。
+               内部変数 LOGLEVEL, ROOTLOGLEVEL の追加。
+               内部変数 THRUARGS の追加。
+               組込みコマンド savetty を追加。
+               組込みコマンド set に -o autosavetty, -S オプションの追加。
+               組込みコマンド set に -o ptyshell, -T オプションの追加。
+               組込みコマンド set に -o physical の別名 -P オプションを追加。
+               ATTR_DIR コマンドの追加
+               ATTR_FILE で owner/group を変更可能に。
+               ディレクトリ書込み時に再配置に失敗することがある点を修正。
+
X Ver. 2.07c    重複するパス名デリミタで終わるアーカイバ出力に対応。
X  (12/13/05)   fdsh から fd を起動する際の引数が重複評価されていた点を修正。
X               カスタマイザで FNAMEKCODE に HEX/CAP を定義出来ない点を修正。
diff -urNP ../FD-2.07c/HISTORY.eng ./HISTORY.eng
--- ../FD-2.07c/HISTORY.eng     Tue Dec 13 00:00:00 2005
+++ ./HISTORY.eng       Mon Dec 26 00:00:00 2005
@@ -1,3 +1,15 @@
+Ver. 2.08      Add 'PTYINKCODE' and 'PTYOUTKCODE' internal variables.
+ (12/26/05)    Add 'LOGFILE', 'LOGSIZE' and 'USESYSLOG' internal variables.
+               Add 'LOGLEVEL' and 'ROOTLOGLEVEL' internal variables.
+               Add 'THRUARGS' internal variable.
+               Add 'savetty' builtin.
+               Add -o autosavetty and -S option in 'set' builtin.
+               Add -o ptyshell and -T option in 'set' builtin.
+               Add -P option in 'set' builtin as an alias of -o physical.
+               Add ATTR_DIR command.
+               Support changing file owner/group in ATTR_FILE.
+               Bug that some files may be lost in writing directory is fixed.
+
X Ver. 2.07c    Support archive list terminated with duplicate path delimiters.
X  (12/13/05)   Bug that arguments of fd from fdsh are re-evaluated is fixed.
X               Bug that customizer cannot set HEX/CAP as FNAMEKCODE is fixed.
diff -urNP ../FD-2.07c/Makefile.in ./Makefile.in
--- ../FD-2.07c/Makefile.in     Tue Dec 13 00:00:00 2005
+++ ./Makefile.in       Mon Dec 26 00:00:00 2005
@@ -25,7 +25,7 @@
X UNITBL        = fd-unicd.tbl
X 
X SRC   = main.c printf.c termio.c term.c pathname.c \
-       system.c posixsh.c doscom.c \
+       system.c posixsh.c doscom.c log.c \
X       dosdisk.c dosemu.c mkunitbl.c \
X       unixdisk.c unixemu.c \
X       pty.c termemu.c frontend.c backend.c \
@@ -90,7 +90,7 @@
X PROGRAM       = fd
X ALIAS = fdsh
X OBJ1  = main__OBJ__ printf__OBJ__ termio__OBJ__ term__OBJ__ \
-       pathname__OBJ__ system__OBJ__ posixsh__OBJ__ doscom__OBJ__
+       pathname__OBJ__ system__OBJ__ posixsh__OBJ__ doscom__OBJ__ log__OBJ__
X OBJ2  = dosdisk__OBJ__ __OBJS__ \
X       pty__OBJ__ termemu__OBJ__ frontend__OBJ__ backend__OBJ__ \
X       libc__OBJ__ file__OBJ__ apply__OBJ__ \
@@ -542,6 +542,11 @@
X doscom__OBJ__: pathname.h
X doscom__OBJ__: system.h termio.h
X doscom__OBJ__: wait.h
+log__OBJ__: fd.h
+log__OBJ__: machine.h config.h types.h
+log__OBJ__: printf.h kctype.h
+log__OBJ__: pathname.h term.h func.h
+log__OBJ__: dosdisk.h
X dosdisk__OBJ__: machine.h config.h
X dosdisk__OBJ__: dosdisk.h
X dosdisk__OBJ__: kctype.h
@@ -599,7 +604,7 @@
X backend__OBJ__: termio.h
X backend__OBJ__: func.h
X backend__OBJ__: dosdisk.h
-backend__OBJ__: termemu.h
+backend__OBJ__: termemu.h system.h wait.h
X libc__OBJ__: fd.h
X libc__OBJ__: machine.h config.h types.h
X libc__OBJ__: printf.h
diff -urNP ../FD-2.07c/README ./README
--- ../FD-2.07c/README  Tue Dec 13 00:00:00 2005
+++ ./README    Mon Dec 26 00:00:00 2005
@@ -1,9 +1,9 @@
X ############################################################
X #
-#      FDclone Ver. 2.07 に関して
+#      FDclone Ver. 2.08 に関して
X #
X #     Takashi SHIRAI, <shirai@unixusers.net>
-#      Dec 13, 2005
+#      Dec 26, 2005
X #
X ############################################################
X 
@@ -35,7 +35,7 @@
X 
X 
X --
- FDclone-2.07 のパッケージには、以下のファイルが含まれます。
+ FDclone-2.08 のパッケージには、以下のファイルが含まれます。
X 
X README                このファイル
X README.eng    このファイル (英文)
@@ -91,6 +91,7 @@
X system.h      system.c 用のヘッダ
X posixsh.c     system.c で使う POSIX 互換コマンド
X doscom.c      system.c で使う COMMAND.COM 内部コマンド
+log.c          ログファイル関連
X dosdisk.c     フロッピードライブドライバ部分
X dosdisk.h     dosdisk.c 用のヘッダ
X dosemu.c      システム関数群のフロッピードライブ対応版
diff -urNP ../FD-2.07c/README.eng ./README.eng
--- ../FD-2.07c/README.eng      Tue Dec 13 00:00:00 2005
+++ ./README.eng        Mon Dec 26 00:00:00 2005
@@ -1,9 +1,9 @@
X ############################################################
X #
-#      About FDclone Ver. 2.07
+#      About FDclone Ver. 2.08
X #
X #     Takashi SHIRAI, <shirai@unixusers.net>
-#      Dec 13, 2005
+#      Dec 26, 2005
X #
X ############################################################
X 
@@ -33,7 +33,7 @@
X 
X 
X --
-  FDclone-2.07 package includes the following files.
+  FDclone-2.08 package includes the following files.
X 
X README                this file (in Japanese)
X README.eng    this file
@@ -89,6 +89,7 @@
X system.h      header for system.c
X posixsh.c     POSIX based builtin commands used in system.c
X doscom.c      COMMAND.COM builtin commands used in system.c
+log.c          system logging module
X dosdisk.c     floppy drive driver
X dosdisk.h     header for dosdisk.c
X dosemu.c      system call wrapper for floppy drive
diff -urNP ../FD-2.07c/TECHKNOW ./TECHKNOW
--- ../FD-2.07c/TECHKNOW        Tue Dec 13 00:00:00 2005
+++ ./TECHKNOW  Mon Dec 26 00:00:00 2005
@@ -345,6 +345,8 @@
X NOFLOCK
X       ファイルロック関数として flock(2) も lockf(2) も使う
X       ことができません。
+NOSYSLOG
+       システムロガー関数 syslog(3) を使うことができません。
X USETIMELOCAL
X       時間変換関数 timelocal(3) が localtime(3) の逆関数と
X       して使えます。
@@ -916,6 +918,8 @@
X       _NODOSCOMMAND   UNIX 版で COMMAND.COM 内蔵コマンドが使用不能
X       _NOEXTRAWIN     各分割ウィンドウのサイズが変更不能
X       _NOPTY          疑似端末機能が使用不能
+       _NOEXTRAATTR    ファイル属性変更コマンドの拡張機能が使用不能
+       _NOLOGGING      ログファイル機能が使用不能
X 
X  config.hin を編集してこれらの識別子の定義を追加しておけば、
X 機能を縮小してサイズを小さくしたり、エンドユーザに使用させた
diff -urNP ../FD-2.07c/TECHKNOW.eng ./TECHKNOW.eng
--- ../FD-2.07c/TECHKNOW.eng    Tue Dec 13 00:00:00 2005
+++ ./TECHKNOW.eng      Mon Dec 26 00:00:00 2005
@@ -366,6 +366,9 @@
X NOFLOCK
X       Both of the function flock(2) and lockf(2) are
X       unavailable to lock files.
+NOSYSLOG
+       The function syslog(3) is unavailable for system
+       logger.
X USETIMELOCAL
X       The function timelocal(3) is available as the inverse
X       function of localtime(3) for the time conversion.
@@ -964,6 +967,8 @@
X       _NODOSCOMMAND   cannot use COMMAND.COM builtins on UNIX
X       _NOEXTRAWIN     cannot resize each split window
X       _NOPTY          cannot use pseudo terminal
+       _NOEXTRAATTR    cannot use extra attribute changing command
+       _NOLOGGING      cannot use system logging
X 
X   If you edit config.hin to add the definition of these
X identifiers, you can reduce functions to make size small,
diff -urNP ../FD-2.07c/ToAdmin ./ToAdmin
--- ../FD-2.07c/ToAdmin Tue Dec 13 00:00:00 2005
+++ ./ToAdmin   Mon Dec 26 00:00:00 2005
@@ -27,7 +27,16 @@
X てしまうという弊害があります。
X  加えて、最も問題なのがセキュリティです。誤操作による被害の
X 及ぶ範囲が大きいというリスクだけでなく、FDclone 内での操作は
-log に一切残らないという問題もあります。
+後で追跡しにくいという問題もあります。
+
+ しかし、それでも尚 root での作業を行なうというのであれば、
+少なくともログを残すようにして欲しいと思います。
+ FDclone にはログを残す機能が実装されており、ファイルだけで
+なく syslogd(8) にもログを出力できます。特に root 時のログレ
+ベルは独立して設定できるようになっています。
+ /etc/fd2rc でこのログ設定をしておき、尚且つそれらの設定変
+数を readonly 属性にしておけば、FDclone 起動後に設定変更によ
+りログを回避することが出来なくなります。
X 
X  こういった、root ならではの問題点に対し、きちんと問題意識
X を持って頂き、安易に root 権限で FDclone を起動することがな
diff -urNP ../FD-2.07c/ToAdmin.eng ./ToAdmin.eng
--- ../FD-2.07c/ToAdmin.eng     Tue Dec 13 00:00:00 2005
+++ ./ToAdmin.eng       Mon Dec 26 00:00:00 2005
@@ -26,8 +26,18 @@
X some accidents and the shell programming.
X   And the most important problem is a security. There is not
X only the risk that a miss operation can cause damages widely,
-but also the problem that any FDclone operation can remain
-in no log.
+but also the problem that FDclone operations is hard to be
+traced later.
+
+  If you nevertheless dare to operate as a root, I suggest
+that you should record the log at least.
+  FDclone has the function to record the log, which can
+output to not only a file but also syslogd(8). The log level
+of the root especially can be specified individually.
+  If you specify this log setting in /etc/fd2rc and then
+attribute readonly to the variables for the setting, no one
+can avoid logging with changing settings after FDclone has
+been invoked.
X 
X   You should keep a awareness of the problem for just root,
X and walk on the road of UNIX administrator not invoking
diff -urNP ../FD-2.07c/_fdrc ./_fdrc
--- ../FD-2.07c/_fdrc   Tue Dec 13 00:00:00 2005
+++ ./_fdrc     Mon Dec 26 00:00:00 2005
@@ -191,6 +191,40 @@
X #     Default: none
X #PTYMENUKEY=""
X 
+# filename for logging
+#      Default: none
+#LOGFILE=""
+
+# file size for logging
+#      Default: 1024 (KB)
+#LOGSIZE=1024
+
+# whether if use syslog for logging
+#      0: not use (Default)
+#      >= 1: use
+#USESYSLOG=0
+
+# logging level for normal users
+#      0: not logging (Default)
+#      1: for warning
+#      2: for notice
+#      3: for information
+#      >= 4: for debug
+#LOGLEVEL=0
+
+# logging level for the super user
+#      0: not logging
+#      1: for warning (Default)
+#      2: for notice
+#      3: for information
+#      >= 4: for debug
+#ROOTLOGLEVEL=1
+
+# whether if pass through the startup arguments as is
+#      0: evaluate arguments (Default)
+#      >= 1: pass through
+#THRUARGS=0
+
X # whether if hold the UNICODE translation table on memory
X #     0: not hold (Default)
X #     >= 1: hold
@@ -234,6 +268,22 @@
X #     utf8, UTF8: UTF-8
X #     utf8-mac, UTF8-MAC: UTF-8 for Mac OS X
X #INPUTKCODE=""
+
+# Kanji code to be inputted to the pseudo terminal
+#      Default: No convert
+#      euc, EUC: EUC-JP
+#      sjis, SJIS: Shift JIS
+#      utf8, UTF8: UTF-8
+#      utf8-mac, UTF8-MAC: UTF-8 for Mac OS X
+#PTYINKCODE=""
+
+# Kanji code to be outputted from the pseudo terminal
+#      Default: No convert
+#      euc, EUC: EUC-JP
+#      sjis, SJIS: Shift JIS
+#      utf8, UTF8: UTF-8
+#      utf8-mac, UTF8-MAC: UTF-8 for Mac OS X
+#PTYOUTKCODE=""
X 
X # Kanji code in filename
X #     Default: No convert
diff -urNP ../FD-2.07c/_fdrc.dif ./_fdrc.dif
--- ../FD-2.07c/_fdrc.dif       Tue Dec 13 00:00:00 2005
+++ ./_fdrc.dif Mon Dec 26 00:00:00 2005
@@ -1,5 +1,5 @@
X --- ../FD-1.03u/_fdrc Tue Dec 18 00:00:00 2001
-+++ _fdrc      Sun May 24 00:00:00 2005
++++ _fdrc      Mon Dec 26 00:00:00 2005
X @@ -10,7 +10,7 @@
X  #    5: length       13: length (reversal)
X  #    100-113: preserve previous sort type
@@ -9,7 +9,7 @@
X  
X  # default display mode
X  #    0: normal (Default)
-@@ -21,98 +21,211 @@
+@@ -21,98 +21,245 @@
X  #    5: sym-link status &                                invisible dot file
X  #    6:                      file type symbol &  invisible dot file
X  #    7: sym-link status &        file type symbol &  invisible dot file
@@ -202,6 +202,40 @@
X +#    Default: none
X +#PTYMENUKEY=""
X +
++# filename for logging
++#     Default: none
++#LOGFILE=""
++
++# file size for logging
++#     Default: 1024 (KB)
++#LOGSIZE=1024
++
++# whether if use syslog for logging
++#     0: not use (Default)
++#     >= 1: use
++#USESYSLOG=0
++
++# logging level for normal users
++#     0: not logging (Default)
++#     1: for warning
++#     2: for notice
++#     3: for information
++#     >= 4: for debug
++#LOGLEVEL=0
++
++# logging level for the super user
++#     0: not logging
++#     1: for warning (Default)
++#     2: for notice
++#     3: for information
++#     >= 4: for debug
++#ROOTLOGLEVEL=1
++
++# whether if pass through the startup arguments as is
++#     0: evaluate arguments (Default)
++#     >= 1: pass through
++#THRUARGS=0
++
X +# whether if hold the UNICODE translation table on memory
X +#    0: not hold (Default)
X +#    >= 1: hold
@@ -241,12 +275,31 @@
X  
X  # Kanji code to be inputted
X  #    Default: No convert
-@@ -120,49 +233,195 @@
+@@ -120,49 +267,211 @@
X  #    sjis, SJIS: Shift JIS
X  #    utf8, UTF8: UTF-8
X  #    utf8-mac, UTF8-MAC: UTF-8 for Mac OS X
X -#INPUTKCODE  =       ""
X +#INPUTKCODE=""
+ 
+-#PAGER        =       more%K
+-#EDITOR       =       vi
+-#SHELL        =       /bin/sh
++# Kanji code to be inputted to the pseudo terminal
++#     Default: No convert
++#     euc, EUC: EUC-JP
++#     sjis, SJIS: Shift JIS
++#     utf8, UTF8: UTF-8
++#     utf8-mac, UTF8-MAC: UTF-8 for Mac OS X
++#PTYINKCODE=""
++
++# Kanji code to be outputted from the pseudo terminal
++#     Default: No convert
++#     euc, EUC: EUC-JP
++#     sjis, SJIS: Shift JIS
++#     utf8, UTF8: UTF-8
++#     utf8-mac, UTF8-MAC: UTF-8 for Mac OS X
++#PTYOUTKCODE=""
X +
X +# Kanji code in filename
X +#    Default: No convert
@@ -275,10 +328,7 @@
X +# directories on which language code type in filename is 7bits JIS
X +#    Default: none
X +#JISPATH=""
- 
--#PAGER        =       more%K
--#EDITOR       =       vi
--#SHELL        =       /bin/sh
++
X +# directories on which language code type in filename is 8bits JIS
X +#    Default: none
X +#JIS8PATH=""
@@ -467,7 +517,7 @@
X  
X  # archiver definition
X  #(Default)
-@@ -178,6 +437,7 @@
+@@ -178,6 +487,7 @@
X  #(Examples)
X  #arch ".zip"       "zip -q %C %TA"                       "unzip -q %C %TA"
X  #arch ".zoo"       "zoo aq %C %TA"                       "zoo xq %C %TA"
@@ -475,7 +525,7 @@
X  
X  # examples for MS-DOS
X  #arch ".lzh"       "lha a %S %TA"                        "lha x %S %TA"
-@@ -198,22 +458,52 @@
+@@ -198,22 +508,52 @@
X  #bind '{'    ROLL_UP
X  #bind '}'    ROLL_DOWN
X  #bind '~'    "cd ~%N%K"
@@ -538,7 +588,7 @@
X  #}
X  
X  # MS-DOS drive definition
-@@ -222,7 +512,7 @@
+@@ -222,7 +562,7 @@
X  
X  # alias definition
X  #(Example)
diff -urNP ../FD-2.07c/apply.c ./apply.c
--- ../FD-2.07c/apply.c Tue Dec 13 00:00:00 2005
+++ ./apply.c   Mon Dec 26 00:00:00 2005
@@ -18,6 +18,13 @@
X #ifdef        HAVEFLAGS
X       u_long flags;
X #endif
+#ifndef        _NOEXTRAATTR
+       u_int mask;
+# ifndef       NOUID
+       uid_t uid;
+       gid_t gid;
+# endif
+#endif /* !_NOEXTRAATTR */
X       char timestr[2][MAXTIMESTR + 1];
X } attrib_t;
X 
@@ -26,6 +33,7 @@
X extern int win_x;
X extern int win_y;
X extern int lcmdline;
+extern int maxcmdline;
X extern int mark;
X #ifdef        HAVEFLAGS
X extern u_long fflaglist[];
@@ -59,7 +67,12 @@
X #ifndef       _NOEXTRACOPY
X static int mvdir __P_((char *));
X #endif
+static VOID NEAR showmode __P_((attrib_t *, int, int));
X static VOID NEAR showattr __P_((namelist *, attrib_t *, int));
+#if    !defined (_NOEXTRAATTR) && !defined (NOUID)
+static int NEAR inputuid __P_((attrib_t *, int));
+static int NEAR inputgid __P_((attrib_t *, int));
+#endif
X static char **NEAR getdirtree __P_((char *, char **, int *, int));
X static int NEAR _applydir __P_((char *, int (*)(char *),
X               int (*)(char *), int (*)(char *), int, char *, int));
@@ -76,6 +89,13 @@
X #ifdef        HAVEFLAGS
X static u_long attrflags = 0;
X #endif
+#ifndef        _NOEXTRAATTR
+static u_short attrmask = 0;
+# ifndef       NOUID
+static uid_t attruid = (uid_t)-1;
+static gid_t attrgid = (gid_t)-1;
+# endif
+#endif /* !_NOEXTRAATTR */
X static time_t attrtime = 0;
X static char *destdir = NULL;
X static short destnlink = 0;
@@ -643,6 +663,39 @@
X       return(0);
X }
X 
+static VOID NEAR showmode(attr, x, y)
+attrib_t *attr;
+int x, y;
+{
+#ifndef        _NOEXTRAATTR
+# if   !MSDOS
+       u_int tmp;
+# endif
+       char mask[WMODE + 1];
+       int i;
+#endif /* !_NOEXTRAATTR */
+       char buf[WMODE + 1];
+
+       Xlocate(x, y);
+       putmode(buf, attr -> mode, 1);
+#ifndef        _NOEXTRAATTR
+       putmode(mask, attr -> mask, 1);
+       for (i = 0; buf[i] && mask[i]; i++) {
+               if (mask[i] != '-') buf[i] = '*';
+# if   !MSDOS
+               else if (!((i + 1) % 3)) {
+                       tmp = (1 << (12 + 3 - ((i + 1) / 3)));
+                       if (attr -> mode & tmp) {
+                               if (buf[i] == '-') buf[i] = '!';
+                               else buf[i] = 'X';
+                       }
+               }
+# endif
+       }
+#endif /* !_NOEXTRAATTR */
+       Xcputs2(buf);
+}
+
X static VOID NEAR showattr(namep, attr, yy)
X namelist *namep;
X attrib_t *attr;
@@ -662,6 +715,12 @@
X               x1 = n_column / 2 - 20;
X               x2 = n_column / 2;
X               w = 16;
+#if    !defined (_NOEXTRAATTR) && !defined (NOUID)
+               if (iswellomit()) {
+                       x1 -= WOWNER / 2;
+                       x2 -= WOWNER / 2;
+               }
+#endif
X       }
X       y = yy;
X 
@@ -684,9 +743,7 @@
X       Xlocate(x2, y);
X       putmode(buf, namep -> st_mode, 1);
X       Xcputs2(buf);
-       Xlocate(x2 + ATTRWIDTH, y);
-       putmode(buf, attr -> mode, 1);
-       Xcputs2(buf);
+       showmode(attr, x2 + ATTRWIDTH, y);
X 
X #ifdef        HAVEFLAGS
X       Xlocate(0, ++y);
@@ -723,8 +780,110 @@
X 
X       Xlocate(0, ++y);
X       Xputterm(L_CLEAR);
+
+#if    !defined (_NOEXTRAATTR) && !defined (NOUID)
+       if (ishardomit()) return;
+
+       y = yy + 1;
+       x2 += 20;
+       Xlocate(x2, y++);
+       Xkanjiputs(TOWN_K);
+       Xlocate(x2, y++);
+       putowner(buf, attr -> uid);
+       Xputch2('<');
+       if (attr -> nlink & TCH_UID) Xputterm(T_STANDOUT);
+       Xkanjiputs(buf);
+       if (attr -> nlink & TCH_UID) Xputterm(END_STANDOUT);
+       Xputch2('>');
+# ifdef        HAVEFLAGS
+       y++;
+# endif
+       Xlocate(x2, y++);
+       Xkanjiputs(TGRP_K);
+       Xlocate(x2, y++);
+       putgroup(buf, attr -> gid);
+       Xputch2('<');
+       if (attr -> nlink & TCH_GID) Xputterm(T_STANDOUT);
+       Xkanjiputs(buf);
+       if (attr -> nlink & TCH_GID) Xputterm(END_STANDOUT);
+       Xputch2('>');
+#endif /* !_NOEXTRAATTR && !NOUID */
+}
+
+#if    !defined (_NOEXTRAATTR) && !defined (NOUID)
+static int NEAR inputuid(attr, yy)
+attrib_t *attr;
+int yy;
+{
+       uidtable *up;
+       char *cp, *s, buf[MAXLONGWIDTH + 1];
+       uid_t uid;
+
+       up = finduid(attr -> uid, NULL);
+       if (up) cp = up -> name;
+       else {
+               snprintf2(buf, sizeof(buf), "%-d", (int)(attr -> uid));
+               cp = buf;
+       }
+
+       yy += 2 + WMODELINE + 2;
+       lcmdline = yy;
+       maxcmdline = 1;
+       if (!(s = inputstr(AOWNR_K, 0, -1, cp, HST_USER))) return(-1);
+       if ((cp = sscanf2(s, "%-*d%$", sizeof(uid_t), &uid))) /*EMPTY*/;
+       else if ((up = finduid(0, s))) uid = up -> uid;
+       else {
+               lcmdline = yy;
+               warning(ENOENT, s);
+               free(s);
+               return(-1);
+       }
+
+       free(s);
+       if (uid != attr -> uid) {
+               attr -> uid = uid;
+               attr -> nlink |= TCH_UID;
+       }
+       return(0);
X }
X 
+static int NEAR inputgid(attr, yy)
+attrib_t *attr;
+int yy;
+{
+       gidtable *gp;
+       char *cp, *s, buf[MAXLONGWIDTH + 1];
+       gid_t gid;
+
+       gp = findgid(attr -> gid, NULL);
+       if (gp) cp = gp -> name;
+       else {
+               snprintf2(buf, sizeof(buf), "%-d", (int)(attr -> gid));
+               cp = buf;
+       }
+
+       yy += 2 + WMODELINE + 2;
+       lcmdline = yy;
+       maxcmdline = 1;
+       if (!(s = inputstr(AGRUP_K, 0, -1, cp, HST_GROUP))) return(-1);
+       if ((cp = sscanf2(s, "%-*d%$", sizeof(gid_t), &gid))) /*EMPTY*/;
+       else if ((gp = findgid(0, s))) gid = gp -> gid;
+       else {
+               lcmdline = yy;
+               warning(ENOENT, s);
+               free(s);
+               return(-1);
+       }
+
+       free(s);
+       if (gid != attr -> gid) {
+               attr -> gid = gid;
+               attr -> nlink |= TCH_GID;
+       }
+       return(0);
+}
+#endif /* !_NOEXTRAATTR && !NOUID */
+
X int inputattr(namep, flag)
X namelist *namep;
X int flag;
@@ -732,9 +891,11 @@
X #if   !MSDOS
X       u_int tmp;
X #endif
+#ifdef HAVEFLAGS
+       char buf[WMODE + 1];
+#endif
X       struct tm *tm;
X       attrib_t attr;
-       char buf[WMODE + 1];
X       u_int mask;
X       int ch, x, y, xx, yy, ymin, ymax, dupwin_x, dupwin_y, excl;
X 
@@ -752,6 +913,20 @@
X       attr.nlink = TCH_CHANGE;
X       if (flag & ATR_MULTIPLE) attr.nlink |= (TCH_MODE | TCH_MTIME);
X       attr.mode = namep -> st_mode;
+#ifndef        _NOEXTRAATTR
+       attr.mode &= ~S_IFMT;
+       attr.mask = 0;
+# if   !MSDOS
+       if ((flag & ATR_RECURSIVE) && excl == ATR_MODEONLY) {
+               for (x = 0; x < 3; x++) attr.mode |= (1 << (x + 12));
+               attr.nlink |= TCH_MODEEXE;
+       }
+# endif
+# ifndef       NOUID
+       attr.uid = namep -> st_uid;
+       attr.gid = namep -> st_gid;
+# endif
+#endif /* !_NOEXTRAATTR */
X #ifdef        HAVEFLAGS
X       attr.flags = namep -> st_flags;
X #endif
@@ -763,6 +938,10 @@
X       showattr(namep, &attr, yy);
X       y = ymin = (excl == ATR_TIMEONLY) ? WMODELINE : 0;
X       ymax = (excl == ATR_MODEONLY) ? 0 : WMODELINE + 1;
+#if    !defined (_NOEXTRAATTR) && !defined (NOUID)
+       if (excl == ATR_OWNERONLY) x = ATTRWIDTH + 1;
+       else
+#endif
X       x = 0;
X 
X       do {
@@ -779,12 +958,26 @@
X               mask = (1 << (8 - x));
X               switch (ch = Xgetkey(1, 0)) {
X                       case K_UP:
+#if    !defined (_NOEXTRAATTR) && !defined (NOUID)
+                               if (x > ATTRWIDTH) {
+                                       if (y) y = 0;
+                                       else y = WMODELINE + 1;
+                                       break;
+                               }
+#endif
X                               if (y > ymin) y--;
X                               else y = ymax;
X                               if (y && x >= 8) x = 7;
X                               if (!y && x >= WMODE - 1) x = WMODE - 2;
X                               break;
X                       case K_DOWN:
+#if    !defined (_NOEXTRAATTR) && !defined (NOUID)
+                               if (x > ATTRWIDTH) {
+                                       if (y) y = 0;
+                                       else y = WMODELINE + 1;
+                                       break;
+                               }
+#endif
X                               if (y < ymax) y++;
X                               else y = ymin;
X                               if (y && x >= 8) x = 7;
@@ -807,6 +1000,28 @@
X                               x = 0;
X                               y = WMODELINE + 1;
X                               break;
+#ifdef HAVEFLAGS
+                       case 'f':
+                       case 'F':
+                               if (excl) break;
+                               x = 0;
+                               y = WMODELINE - 1;
+                               break;
+#endif
+#if    !defined (_NOEXTRAATTR) && !defined (NOUID)
+                       case 'o':
+                       case 'O':
+                               if (excl && excl != ATR_OWNERONLY) break;
+                               x = ATTRWIDTH + 1;
+                               y = 0;
+                               break;
+                       case 'g':
+                       case 'G':
+                               if (excl && excl != ATR_OWNERONLY) break;
+                               x = ATTRWIDTH + 1;
+                               y = WMODELINE + 1;
+                               break;
+#endif /* !_NOEXTRAATTR && !NOUID */
X                       case '0':
X                       case '1':
X                       case '2':
@@ -831,6 +1046,13 @@
X #endif
X                               if (y) {
X                                       if (x >= 7) {
+#if    !defined (_NOEXTRAATTR) && !defined (NOUID)
+                                               if (!excl
+                                               && y == WMODELINE + 1) {
+                                                       x = ATTRWIDTH + 1;
+                                                       break;
+                                               }
+#endif
X                                               if (y == WMODELINE + 1) break;
X                                               y++;
X                                               x = 0;
@@ -841,11 +1063,22 @@
X                                       }
X                               }
X                               else if (x < WMODE - 2) x++;
+#if    !defined (_NOEXTRAATTR) && !defined (NOUID)
+                               else if (!excl) x = ATTRWIDTH + 1;
+#endif
X                               break;
X                       case K_BS:
X                               if (y < WMODELINE) break;
X /*FALLTHRU*/
X                       case K_LEFT:
+#if    !defined (_NOEXTRAATTR) && !defined (NOUID)
+                               if (x > ATTRWIDTH) {
+                                       if (excl || ch == K_BS) break;
+                                       else if (y) x = 7;
+                                       else x = WMODE - 2;
+                               }
+                               else
+#endif
X #ifdef        HAVEFLAGS
X                               if (y == WMODELINE - 1) {
X                                       if (x > 0) x--;
@@ -874,6 +1107,14 @@
X                               showattr(namep, &attr, yy);
X                               break;
X                       case ' ':
+#if    !defined (_NOEXTRAATTR) && !defined (NOUID)
+                               if (x > ATTRWIDTH) {
+                                       if (y) inputgid(&attr, yy);
+                                       else inputuid(&attr, yy);
+                                       showattr(namep, &attr, yy);
+                                       break;
+                               }
+#endif
X #ifdef        HAVEFLAGS
X                               if (y == WMODELINE - 1) {
X                                       attr.flags ^= fflaglist[x];
@@ -890,18 +1131,55 @@
X #else /* !MSDOS */
X                               if (!((x + 1) % 3) && (attr.mode & mask)) {
X                                       tmp = (1 << (12 - ((x + 1) / 3)));
+# ifndef       _NOEXTRAATTR
+                                       if (flag & ATR_RECURSIVE) tmp <<= 3;
+# endif
X                                       if (attr.mode & tmp) {
+# ifndef       _NOEXTRAATTR
+                                               if (flag & ATR_RECURSIVE)
+                                                       /*EMPTY*/;
+                                               else
+# endif
X                                               attr.mode ^= tmp;
X                                       }
+# ifndef       _NOEXTRAATTR
+                                       else if (flag & ATR_RECURSIVE) {
+                                               mask = (tmp >> 3);
+                                               if (attr.mode & mask)
+                                                       attr.mode ^= tmp;
+                                       }
+# endif
X                                       else mask = tmp;
X                               }
+# ifndef       _NOEXTRAATTR
+                               else {
+                                       tmp = (1 << (15 - ((x + 1) / 3)));
+                                       if (attr.mode & tmp) mask = tmp;
+                               }
+# endif
X #endif        /* !MSDOS */
X                               attr.mode ^= mask;
-                               Xlocate(xx, yy + y + 2);
-                               putmode(buf, attr.mode, 1);
-                               Xcputs2(buf);
+                               showmode(&attr, xx, yy + y + 2);
X                               attr.nlink |= TCH_MODE;
X                               break;
+#ifndef        _NOEXTRAATTR
+                       case 'm':
+                       case 'M':
+# ifndef       NOUID
+                               if (x > ATTRWIDTH) break;
+# endif
+                               if (y || !(flag & ATR_MULTIPLE)) break;
+# if   MSDOS
+                               if (x == 2) break;
+# else
+                               if (!((x + 1) % 3))
+                                       mask |= (1 << (12 - ((x + 1) / 3)));
+# endif
+                               attr.mask ^= mask;
+                               showmode(&attr, xx, yy + y + 2);
+                               attr.nlink |= TCH_MASK;
+                               break;
+#endif /* !_NOEXTRAATTR */
X                       default:
X                               break;
X               }
@@ -934,7 +1212,7 @@
X       || tm -> tm_hour > 23 || tm -> tm_min > 59 || tm -> tm_sec > 59)
X               return(-1);
X 
-       mask = TCH_CHANGE;
+       mask = (TCH_CHANGE | TCH_MASK | TCH_MODEEXE);
X       switch (excl) {
X               case ATR_MODEONLY:
X                       mask |= TCH_MODE;
@@ -942,11 +1220,20 @@
X               case ATR_TIMEONLY:
X                       mask |= TCH_MTIME;
X                       break;
+#if    !defined (_NOEXTRAATTR) && !defined (NOUID)
+               case ATR_OWNERONLY:
+                       mask |= (TCH_UID | TCH_GID);
+                       break;
+#endif
X               default:
X                       if (attrmode != namep -> st_mode) mask |= TCH_MODE;
X #ifdef        HAVEFLAGS
X                       if (attrflags != namep -> st_flags) mask |= TCH_FLAGS;
X #endif
+#if    !defined (_NOEXTRAATTR) && !defined (NOUID)
+                       if (attruid != namep -> st_uid) mask |= TCH_UID;
+                       if (attrgid != namep -> st_gid) mask |= TCH_GID;
+#endif
X                       if (attrtime != namep -> st_mtim) mask |= TCH_MTIME;
X                       break;
X       }
@@ -955,6 +1242,13 @@
X #ifdef        HAVEFLAGS
X       attrflags = attr.flags;
X #endif
+#ifndef        _NOEXTRAATTR
+       attrmask = attr.mask;
+# ifndef       NOUID
+       attruid = attr.uid;
+       attrgid = attr.gid;
+# endif
+#endif /* !_NOEXTRAATTR */
X       attrtime = timelocal2(tm);
X 
X       return(1);
@@ -970,6 +1264,13 @@
X #ifdef        HAVEFLAGS
X       st.st_flags = attrflags;
X #endif
+#ifndef        _NOEXTRAATTR
+       st.st_size = (off_t)attrmask;
+# ifndef       NOUID
+       st.st_uid = attruid;
+       st.st_gid = attrgid;
+# endif
+#endif /* !_NOEXTRAATTR */
X       st.st_mtime = attrtime;
X 
X       return(touchfile(path, &st));
diff -urNP ../FD-2.07c/backend.c ./backend.c
--- ../FD-2.07c/backend.c       Tue Dec 13 00:00:00 2005
+++ ./backend.c Mon Dec 26 00:00:00 2005
@@ -13,9 +13,14 @@
X #include "func.h"
X #include "termemu.h"
X 
+#ifndef        _NOORIGSHELL
+#include "system.h"
+#endif
+
X #define       MAXESCPARAM     16
X #define       MAXESCCHAR      4
X #define       MAXTABSTOP      255
+#define        MAXKANJIBUF     (3 + 2 + 3)
X 
X typedef struct _ptyterm_t {
X       short cur_x, cur_y;
@@ -51,6 +56,7 @@
X #define       T_LOCKED        00040
X 
X extern int hideclock;
+extern int fdmode;
X extern int wheader;
X extern int emufd;
X 
@@ -79,6 +85,10 @@
X static VOID NEAR evalsignal __P_((VOID_A));
X #endif
X static int NEAR convkey __P_((int, keyseq_t *));
+#ifndef        _NOKANJICONV
+static int NEAR ptygetch __P_((int));
+static char *NEAR ptykconv __P_((char *, char *, int, int));
+#endif
X static VOID NEAR evalscroll __P_((int, int, int));
X static VOID NEAR evallf __P_((int));
X static VOID NEAR evalnormal __P_((int, int));
@@ -139,7 +149,12 @@
X 
X       pty[w].min_x = (short)0;
X       pty[w].max_x = n_column;
-       if (w == MAXWINDOWS) {
+#ifdef _NOORIGSHELL
+       if (w == MAXWINDOWS)
+#else
+       if (w == MAXWINDOWS || isshptymode())
+#endif
+       {
X               pty[w].min_y = (short)0;
X               pty[w].max_y = n_line;
X       }
@@ -351,6 +366,32 @@
X       return((getdefkeyseq(kp) < 0) ? getkeyseq(kp) : 0);
X }
X 
+#ifndef        _NOKANJICONV
+static int NEAR ptygetch(fd)
+int fd;
+{
+       u_short ch;
+
+       if (recvbuf(fd, &ch, sizeof(ch)) < 0 || (ch & 0xff00)) return(-1);
+       return(ch);
+}
+
+static char *NEAR ptykconv(buf, buf2, incode, outcode)
+char *buf, *buf2;
+int incode, outcode;
+{
+       char *cp, *tmp;
+
+       tmp = kanjiconv2(buf2, buf, MAXKANJIBUF, incode, DEFCODE, L_TERMINAL);
+       if (kanjierrno) return(buf);
+       cp = (tmp == buf) ? buf2 : buf;
+       cp = kanjiconv2(cp, tmp, MAXKANJIBUF, DEFCODE, outcode, L_TERMINAL);
+       if (kanjierrno) return(tmp);
+
+       return(cp);
+}
+#endif /* !_NOKANJICONV */
+
X static VOID NEAR evalscroll(w, n, c)
X int w, n, c;
X {
@@ -375,14 +416,16 @@
X int w, c;
X {
X #ifndef       _NOKANJICONV
-       int code;
+       char buf[MAXKANJIBUF + 1], buf2[MAXKANJIBUF + 1];
+       int len, code, incode, outcode;
X #endif
X       int width;
X 
X #ifndef       _NOKANJICONV
-       code = outputkcode;
-       if (code == NOCNV) code = DEFCODE;
-       if (code == M_UTF8) code = UTF8;
+       outcode = (outputkcode != NOCNV) ? outputkcode : DEFCODE;
+       incode = (w < MAXWINDOWS && ptylist[w].outcode != NOCNV)
+               ? ptylist[w].outcode : outcode;
+       code = (incode != M_UTF8) ? incode : UTF8;
X #endif
X 
X       if ((pty[w].termflags & T_NOAUTOMARGIN)
@@ -437,9 +480,25 @@
X       surelocate(w, 0);
X       settermattr(w);
X       settermcode(w);
-       if (pty[w].last1 >= (short)0) putch2(pty[w].last1);
-       if (pty[w].last2 >= (short)0) putch2(pty[w].last2);
-       putch2(c);
+#ifndef        _NOKANJICONV
+       if (!(pty[w].termflags & T_MULTIBYTE) && incode != outcode) {
+               len = 0;
+               if (pty[w].last1 >= (short)0) buf[len++] = pty[w].last1;
+               if (pty[w].last2 >= (short)0) buf[len++] = pty[w].last2;
+               if (!len) putch2(c);
+               else {
+                       buf[len++] = c;
+                       buf[len] = '\0';
+                       cputs2(ptykconv(buf, buf2, incode, outcode));
+               }
+       }
+       else
+#endif /* !_NOKANJICONV */
+       {
+               if (pty[w].last1 >= (short)0) putch2(pty[w].last1);
+               if (pty[w].last2 >= (short)0) putch2(pty[w].last2);
+               putch2(c);
+       }
X       tflush();
X       pty[w].cur_x += width;
X       last_x += width;
@@ -1246,6 +1305,14 @@
X                       inputkcode = w1;
X                       outputkcode = w2;
X                       break;
+               case TE_CHANGEINKCODE:
+                       if (recvbuf(fd, &w2, sizeof(w2)) < 0) break;
+                       ptylist[w1].incode = (char)w2;
+                       break;
+               case TE_CHANGEOUTKCODE:
+                       if (recvbuf(fd, &w2, sizeof(w2)) < 0) break;
+                       ptylist[w1].outcode = (char)w2;
+                       break;
X #endif        /* !_NOKANJICONV */
X               case TE_AWAKECHILD:
X                       if (recvbuf(fd, &n, sizeof(n)) < 0
@@ -1273,12 +1340,25 @@
X static int NEAR evalinput(fd)
X int fd;
X {
-       keyseq_t key;
+#ifdef _NOKANJICONV
X       char buf[2];
+#else
+       char buf[MAXKANJIBUF + 1], buf2[MAXKANJIBUF + 1];
+       int cnv, code, incode, outcode;
+#endif
+       keyseq_t key;
X       int n;
X 
X       if (recvbuf(fd, &(key.code), sizeof((key.code))) < 0) return(0);
X 
+#ifndef        _NOKANJICONV
+       cnv = 0;
+       incode = (inputkcode != NOCNV) ? inputkcode : DEFCODE;
+       outcode = (win < MAXWINDOWS && ptylist[win].incode != NOCNV)
+               ? ptylist[win].incode : incode;
+       code = (incode != M_UTF8) ? incode : UTF8;
+#endif
+
X       if (ismetakey(key.code)) {
X               key.len = (u_char)2;
X               key.str = buf;
@@ -1290,6 +1370,7 @@
X       else if (isekana2(key.code)) {
X # else
X       else if (inputkcode == EUC && isekana2(key.code)) {
+               if (incode != outcode) cnv++;
X # endif
X               key.len = (u_char)2;
X               key.str = buf;
@@ -1311,7 +1392,37 @@
X               key.len = (u_char)1;
X               key.str = buf;
X               buf[0] = key.code;
+#ifndef        _NOKANJICONV
+               if (incode == outcode) /*EMPTY*/;
+               else if (inputkcode == SJIS && iskana2(key.code)) cnv++;
+               else if (code == UTF8) {
+                       if (!ismsb(key.code)) /*EMPTY*/;
+                       else if ((n = ptygetch(fd)) >= 0) {
+                               buf[1] = n;
+                               (key.len)++;
+                               if (isutf2(buf[0], buf[1])) cnv++;
+                               else if ((n = ptygetch(fd)) >= 0) {
+                                       cnv++;
+                                       buf[2] = n;
+                                       (key.len)++;
+                               }
+                       }
+               }
+               else if (isinkanji1(key.code) && (n = ptygetch(fd)) >= 0) {
+                       cnv++;
+                       buf[1] = n;
+                       (key.len)++;
+               }
+#endif /* !_NOKANJICONV */
X       }
+
+#ifndef        _NOKANJICONV
+       if (cnv) {
+               buf[key.len] = '\0';
+               key.str = ptykconv(buf, buf2, incode, outcode);
+               key.len = (u_char)strlen(key.str);
+       }
+#endif
X 
X       if (win < MAXWINDOWS) sendbuf(ptylist[win].fd, key.str, key.len);
X 
diff -urNP ../FD-2.07c/browse.c ./browse.c
--- ../FD-2.07c/browse.c        Tue Dec 13 00:00:00 2005
+++ ./browse.c  Mon Dec 26 00:00:00 2005
@@ -1651,17 +1651,17 @@
X                                       filelist[filepos].name, 1);
X                               stackbar();
X                       }
-#ifndef        _NOARCHIVE
-                       else if (archivefile) /*EMPTY*/;
-#endif
X #ifndef       _NOWRITEFS
+# ifndef       _NOARCHIVE
+                       else if (archivefile) /*EMPTY*/;
+# endif
X                       else if (chgorder && writefs < 1 && no != WRITE_DIR
X                       && !fd_restricted
X                       && (i = writablefs(".")) > 0 && underhome(NULL) > 0) {
X                               chgorder = 0;
X                               if (yesno(WRTOK_K)) arrangedir(i);
X                       }
-#endif
+#endif /* !_NOWRITEFS */
X               }
X 
X               curfilename = filelist[filepos].name;
diff -urNP ../FD-2.07c/builtin.c ./builtin.c
--- ../FD-2.07c/builtin.c       Tue Dec 13 00:00:00 2005
+++ ./builtin.c Mon Dec 26 00:00:00 2005
@@ -116,6 +116,9 @@
X static int NEAR getinputstr __P_((int, char *[]));
X static int NEAR getyesno __P_((int, char *[]));
X #endif        /* FD >= 2 */
+#if    !MSDOS && (FD >= 2)
+static int NEAR savetty __P_((int, char *[]));
+#endif
X #ifdef        _NOORIGSHELL
X static int NEAR printenv __P_((int, char *[]));
X static int NEAR setalias __P_((int, char *[]));
@@ -204,6 +207,9 @@
X       {getinputstr,   BL_READLINE},
X       {getyesno,      BL_YESNO},
X #endif        /* FD >= 2 */
+#if    !MSDOS && (FD >= 2)
+       {savetty,       BL_SAVETTY},
+#endif
X #ifdef        _NOORIGSHELL
X # if  FD >= 2
X       {printenv,      BL_SET},
@@ -2716,6 +2722,38 @@
X       return((ret) ? 0 : -1);
X }
X #endif        /* FD >= 2 */
+
+#if    !MSDOS
+int savestdio(reset)
+int reset;
+{
+       int n;
+
+       if (isttyiomode) return(0);
+
+       n = savettyio(reset);
+# ifndef       _NOPTY
+       sendparent(TE_SAVETTYIO, reset);
+# endif
+       return(n);
+}
+
+# if   FD >= 2
+static int NEAR savetty(argc, argv)
+int argc;
+char *argv[];
+{
+       int n;
+
+       n = 0;
+       if (argc > 1 && argv[1][0] == '-'
+       && argv[1][1] == 'n' && !(argv[1][2]))
+               n++;
+
+       return(savestdio(n));
+}
+# endif        /* FD >= 2 */
+#endif /* !MSDOS */
X 
X #ifdef        _NOORIGSHELL
X static int NEAR printenv(argc, argv)
diff -urNP ../FD-2.07c/command.c ./command.c
--- ../FD-2.07c/command.c       Tue Dec 13 00:00:00 2005
+++ ./command.c Mon Dec 26 00:00:00 2005
@@ -17,9 +17,15 @@
X #include "termemu.h"
X #endif
X 
+#if    defined (_NOEXTRAATTR) || defined (NOUID)
X #define       MAXATTRSEL      2
X #define       ATTR_X          35
X #define       ATTR_Y          L_INFO
+#else
+#define        MAXATTRSEL      3
+#define        ATTR_X          0
+#define        ATTR_Y          L_HELP
+#endif
X 
X extern int curcolumns;
X extern int mark;
@@ -132,6 +138,9 @@
X static int info_filesys __P_((char *));
X static int NEAR selectattr __P_((char *));
X static int attr_file __P_((char *));
+#ifndef        _NOEXTRAATTR
+static int attr_dir __P_((char *));
+#endif
X #ifndef       _NOTREE
X static int tree_dir __P_((char *));
X #endif
@@ -263,6 +272,9 @@
X       {'w',           WRITE_DIR,      255},
X #endif
X       {'x',           EXECUTE_FILE,   255},
+#ifndef        _NOEXTRAATTR
+       {'A',           ATTR_DIR,       255},
+#endif
X #ifndef       _NOTREE
X       {'C',           COPY_TREE,      255},
X #endif
@@ -1740,11 +1752,21 @@
X       str[1] = CDATE_K;
X       val[0] = ATR_MODEONLY;
X       val[1] = ATR_TIMEONLY;
+#if    !defined (_NOEXTRAATTR) && !defined (NOUID)
+       str[2] = COWNR_K;
+       val[2] = ATR_OWNERONLY;
+#endif
X 
X       n = ATR_MODEONLY;
X       Xlocate(0, ATTR_Y);
X       Xputterm(L_CLEAR);
+#if    !defined (_NOEXTRAATTR) && !defined (NOUID)
+       Xputterm(T_STANDOUT);
+#endif
X       Xkanjiputs(s);
+#if    !defined (_NOEXTRAATTR) && !defined (NOUID)
+       Xputterm(END_STANDOUT);
+#endif
X       if (selectstr(&n, MAXATTRSEL, ATTR_X, str, val) != K_CR) return(-1);
X 
X       return(n);
@@ -1783,6 +1805,30 @@
X 
X       return(FNC_EFFECT);
X }
+
+#ifndef        _NOEXTRAATTR
+/*ARGSUSED*/
+static int attr_dir(arg)
+char *arg;
+{
+       int n, flag;
+
+       if (!isdir(&(filelist[filepos]))) return(warning_bell(arg));
+
+       if ((flag = selectattr(ATTRD_K)) < 0) return(FNC_CANCEL);
+       flag |= (ATR_MULTIPLE | ATR_RECURSIVE);
+       while ((n = inputattr(&(filelist[filepos]), flag)) < 0)
+               warning(0, ILTMS_K);
+       if (!n) {
+               if (FILEPERROW < WFILEMINATTR) return(FNC_EFFECT);
+               return(FNC_UPDATE);
+       }
+       applydir(filelist[filepos].name, setattr,
+               NULL, setattr, ORD_NOPREDIR, NULL);
+
+       return(FNC_EFFECT);
+}
+#endif /* !_NOEXTRAATTR */
X 
X #ifndef       _NOTREE
X /*ARGSUSED*/
diff -urNP ../FD-2.07c/custom.c ./custom.c
--- ../FD-2.07c/custom.c        Tue Dec 13 00:00:00 2005
+++ ./custom.c  Mon Dec 26 00:00:00 2005
@@ -93,6 +93,20 @@
X extern char *ptyterm;
X extern int ptymenukey;
X #endif
+#ifndef        _NOLOGGING
+extern char *logfile;
+extern int logsize;
+# ifndef       NOSYSLOG
+extern int usesyslog;
+# endif
+extern int loglevel;
+# ifndef       NOUID
+extern int rootloglevel;
+# endif
+#endif /* !_NOLOGGING */
+#if    FD >= 2
+extern int thruargs;
+#endif
X extern int wheader;
X extern char fullpath[];
X extern char *origpath;
@@ -196,8 +210,9 @@
X #define       T_KIN           14
X #define       T_KOUT          15
X #define       T_KNAM          16
-#define        T_OCTAL         17
-#define        T_KEYCODE       18
+#define        T_KTERM         17
+#define        T_OCTAL         18
+#define        T_KEYCODE       19
X 
X #ifndef       _NOKANJIFCONV
X typedef struct _pathtable {
@@ -393,6 +408,21 @@
X       {"FD_PTYTERM", &ptyterm, DEFVAL(PTYTERM), PTYTM_E, T_CHARP},
X       {"FD_PTYMENUKEY", &ptymenukey, DEFVAL(PTYMENUKEY), PTYKY_E, T_KEYCODE},
X #endif
+#ifndef        _NOLOGGING
+       {"FD_LOGFILE", &logfile, DEFVAL(LOGFILE), LGFIL_E, T_PATH},
+       {"FD_LOGSIZE", &logsize, DEFVAL(LOGSIZE), LGSIZ_E, T_INT},
+# ifndef       NOSYSLOG
+       {"FD_USESYSLOG", &usesyslog, DEFVAL(USESYSLOG), USYLG_E, T_BOOL},
+# endif
+       {"FD_LOGLEVEL", &loglevel, DEFVAL(LOGLEVEL), LGLVL_E, T_INT},
+# ifndef       NOUID
+       {"FD_ROOTLOGLEVEL", &rootloglevel,
+               DEFVAL(ROOTLOGLEVEL), RLGLV_E, T_INT},
+# endif
+#endif /* !_NOLOGGING */
+#if    FD >= 2
+       {"FD_THRUARGS", &thruargs, DEFVAL(THRUARGS), THARG_E, T_BOOL},
+#endif
X #if   !defined (_NOKANJICONV) || (defined (FD) && !defined (_NODOSDRIVE))
X       {"FD_UNICODEBUFFER", &unicodebuffer,
X               DEFVAL(UNICODEBUFFER), UNBF_E, T_BOOL},
@@ -407,6 +437,10 @@
X #ifndef       _NOKANJICONV
X       {"FD_INPUTKCODE", &inputkcode, DEFVAL(NOCNV), IPKC_E, T_KIN},
X #endif
+#if    !defined (_NOKANJICONV) && !defined (_NOPTY)
+       {"FD_PTYINKCODE", &ptyinkcode, DEFVAL(NOCNV), PIKC_E, T_KTERM},
+       {"FD_PTYOUTKCODE", &ptyoutkcode, DEFVAL(NOCNV), POKC_E, T_KTERM},
+#endif
X #ifndef       _NOKANJIFCONV
X       {"FD_FNAMEKCODE", &fnamekcode, DEFVAL(NOCNV), FNKC_E, T_KNAM},
X       {"FD_SJISPATH", &sjispath, DEFVAL(SJISPATH), SJSP_E, T_PATHS},
@@ -599,6 +633,7 @@
X               case T_KIN:
X               case T_KOUT:
X               case T_KNAM:
+               case T_KTERM:
X                       n = (1 << (envlist[no].type - T_KIN));
X                       *((int *)(envlist[no].var)) = getlang(cp, n);
X                       break;
@@ -705,6 +740,8 @@
X # endif       /* !_NOSPLITWIN */
X # ifndef      _NOPTY
X       changekcode();
+       changeinkcode();
+       changeoutkcode();
X # endif
X }
X #endif        /* !_NOKANJIFCONV */
@@ -748,6 +785,9 @@
X #endif
X       evalheader();
X       errno = duperrno;
+#if    !MSDOS && !defined (_NOORIGSHELL)
+       if (autosavetty) savestdio(0);
+#endif
X }
X 
X #ifdef        DEBUG
@@ -1249,6 +1289,7 @@
X               case T_KIN:
X               case T_KOUT:
X               case T_KNAM:
+               case T_KTERM:
X                       str[NOCNV] = VNCNV_K;
X                       str[ENG] = VENG_K;
X #  ifndef     _NOKANJICONV
@@ -1508,6 +1549,7 @@
X               case T_KIN:
X               case T_KNAM:
X               case T_KOUT:
+               case T_KTERM:
X                       tmp = 0;
X                       str[tmp] = VNCNV_K;
X                       val[tmp++] = NOCNV;
@@ -1651,9 +1693,11 @@
X                       break;
X       }
X 
-       if (getshellvar(envlist[no].env, -1)) setenv2(envlist[no].env, cp, 0);
-       else setenv2(env, cp, 0);
+       if (getshellvar(envlist[no].env, -1))
+               n = setenv2(envlist[no].env, cp, 0);
+       else n = setenv2(env, cp, 0);
X       if (new) free(new);
+       if (n < 0) warning(-1, env);
X #ifndef       _NOKANJIFCONV
X       savepathlang();
X #endif
diff -urNP ../FD-2.07c/dosemu.c ./dosemu.c
--- ../FD-2.07c/dosemu.c        Tue Dec 13 00:00:00 2005
+++ ./dosemu.c  Mon Dec 26 00:00:00 2005
@@ -322,6 +322,7 @@
X               }
X       }
X #endif        /* !_NODOSDRIVE */
+       LOG1(_LOG_INFO_, n, "chdir(\"%k\");", path);
X       if (n >= 0 && !Xgetwd(cachecwd)) {
X               *cachecwd = '\0';
X               n = -1;
@@ -444,6 +445,7 @@
X       else
X #endif
X       n = (symlink(name1, name2)) ? -1 : 0;
+       LOG2(_LOG_WARNING_, n, "symlink(\"%k\", \"%k\");", name1, name2);
X 
X       return(n);
X }
@@ -492,6 +494,7 @@
X       else
X #endif
X       n = (chmod(path, mode)) ? -1 : 0;
+       LOG2(_LOG_NOTICE_, n, "chmod(\"%k\", %05o);", path, mode);
X 
X       return(n);
X }
@@ -510,6 +513,7 @@
X       else
X # endif
X       n = (utime(path, times)) ? -1 : 0;
+       LOG1(_LOG_NOTICE_, n, "utime(\"%k\");", path);
X 
X       return(n);
X }
@@ -527,6 +531,7 @@
X       else
X # endif
X       n = (utimes(path, tvp)) ? -1 : 0;
+       LOG1(_LOG_NOTICE_, n, "utimes(\"%k\");", path);
X 
X       return(n);
X }
@@ -549,6 +554,7 @@
X       else
X # endif
X       n = (chflags(path, flags)) ? -1 : 0;
+       LOG2(_LOG_WARNING_, n, "chflags(\"%k\", %05o);", path, flags);
X 
X       return(n);
X }
@@ -572,6 +578,7 @@
X       else
X # endif
X       n = (chown(path, uid, gid)) ? -1 : 0;
+       LOG3(_LOG_WARNING_, n, "chown(\"%k\", %d, %d);", path, uid, gid);
X 
X       return(n);
X }
@@ -589,6 +596,7 @@
X       else
X #endif
X       n = (unlink(path)) ? -1 : 0;
+       LOG1(_LOG_WARNING_, n, "unlink(\"%k\");", path);
X 
X       return(n);
X }
@@ -616,6 +624,7 @@
X       else
X #endif
X       n = (rename(from, to)) ? -1 : 0;
+       LOG2(_LOG_WARNING_, n, "rename(\"%k\", \"%k\");", from, to);
X 
X       return(n);
X }
@@ -633,6 +642,22 @@
X       else
X #endif
X       fd = open(path, flags, mode);
+#ifndef        _NOLOGGING
+       switch (flags & O_ACCMODE) {
+               case O_WRONLY:
+                       LOG2(_LOG_WARNING_, fd,
+                               "open(\"%k\", O_WRONLY, %05o);", path, mode);
+                       break;
+               case O_RDWR:
+                       LOG2(_LOG_WARNING_, fd,
+                               "open(\"%k\", O_RDWR, %05o);", path, mode);
+                       break;
+               default:
+                       LOG2(_LOG_INFO_, fd,
+                               "open(\"%k\", O_RDONLY, %05o);", path, mode);
+                       break;
+       }
+#endif /* !_NOLOGGING */
X 
X       return(fd);
X }
@@ -731,6 +756,7 @@
X       else
X #endif
X       n = (mkdir(path, mode)) ? -1 : 0;
+       LOG2(_LOG_WARNING_, n, "mkdir(\"%k\", %05o);", path, mode);
X 
X       return(n);
X }
@@ -747,6 +773,7 @@
X       else
X #endif
X       n = (rmdir(path)) ? -1 : 0;
+       LOG1(_LOG_WARNING_, n, "rmdir(\"%k\");", path);
X 
X       return(n);
X }
@@ -763,6 +790,8 @@
X       else
X #endif
X       fp = fopen(path, type);
+       LOG2((*type == 'r') ? _LOG_INFO_ : _LOG_WARNING_, (fp) ? 0 : -1,
+               "fopen(\"%k\", \"%s\");", path, type);
X 
X       return(fp);
X }
diff -urNP ../FD-2.07c/fd.cat ./fd.cat
--- ../FD-2.07c/fd.cat  Tue Dec 13 00:00:00 2005
+++ ./fd.cat    Mon Dec 26 00:00:00 2005
@@ -6,9 +6,9 @@
X      fd - ファイル・ディレクトリ管理ツール
X 
X 形^H^H形式^H^H式
-     f^Hfd^Hd [ -^H-a^Hab^HbC^HCe^Hef^Hfh^Hhi^Hik^Hkl^Hlm^HmN^HNn^Hnr^Hrs^Hst^Htu^Huv^Hvx^Hx ] [ -^H-_^HN_^HA_^HM_^HE=^H=_^Hv_^Ha_^Hl_^Hu_^He ] [ _^Hd_^Hi_^Hr_^He_^Hc_^Ht_^Ho_^Hr_^Hy [
+     f^Hfd^Hd [ -^H-a^Hab^HbC^HCe^Hef^Hfh^Hhi^Hik^Hkl^Hlm^HmN^HNn^HnP^HPr^HrS^HSs^HsT^HTt^Htu^Huv^Hvx^Hx ] [ -^H-_^HN_^HA_^HM_^HE=^H=_^Hv_^Ha_^Hl_^Hu_^He ] [ _^Hd_^Hi_^Hr_^He_^Hc_^Ht_^Ho_^Hr_^Hy [
X      _^Hd_^Hi_^Hr_^He_^Hc_^Ht_^Ho_^Hr_^Hy_^H2 _^H._^H._^H. ]]
-     f^Hfd^Hds^Hsh^Hh [ -^H-a^Hab^HbC^HCc^Hce^Hef^Hfh^Hhi^Hik^Hkl^Hlm^HmN^HNn^Hnr^Hrs^Hst^Htu^Huv^Hvx^Hx ] [ _^Ha_^Hr_^Hg_^Hs ]
+     f^Hfd^Hds^Hsh^Hh [ -^H-a^Hab^HbC^HCc^Hce^Hef^Hfh^Hhi^Hik^Hkl^Hlm^HmN^HNn^HnP^HPr^HrS^HSs^HsT^HTt^Htu^Huv^Hvx^Hx ] [ _^Ha_^Hr_^Hg_^Hs ]
X 
X 解^H^H解説^H^H説
X      f^Hfd^Hd は、UNIX 汎用のテキスト端末用に考えられた、ファイルやディ
@@ -60,7 +60,7 @@
X                T^HTR^HRE^HEE^HE_D^HDI^HIR^HR       B^HBA^HAC^HCK^HKU^HUP^HP_T^HTA^HAP^HPE^HE    E^HED^HDI^HIT^HT_F^HFI^HIL^HLE^HE
X                U^HUN^HNP^HPA^HAC^HCK^HK_F^HFI^HIL^HLE^HE    P^HPA^HAC^HCK^HK_F^HFI^HIL^HLE^HE      L^HLO^HOG^HG_T^HTR^HRE^HEE^HE
X                C^HCO^HOP^HPY^HY_T^HTR^HRE^HEE^HE      M^HMO^HOV^HVE^HE_T^HTR^HRE^HEE^HE      U^HUN^HNP^HPA^HAC^HCK^HK_T^HTR^HRE^HEE^HE
-               F^HFI^HIN^HND^HD_D^HDI^HIR^HR
+               F^HFI^HIN^HND^HD_D^HDI^HIR^HR       A^HAT^HTT^HTR^HR_D^HDI^HIR^HR
X           r^Hrf^Hfd^Hd または r^Hrf^Hfd^Hds^Hsh^Hh として起動された場合には、自動的にこの
X           一部制限シェルになります。
X 
@@ -177,6 +177,7 @@
X      M^HMO^HOV^HVE^HE_T^HTR^HRE^HEE^HE           ツリー選択でファイル移動      M^HM
X      U^HUN^HNP^HPA^HAC^HCK^HK_T^HTR^HRE^HEE^HE         ツリー選択でファイル伸長      U^HU
X      F^HFI^HIN^HND^HD_D^HDI^HIR^HR            ディレクトリの検索移動        F^HF
+     A^HAT^HTT^HTR^HR_D^HDI^HIR^HR            再帰的なファイル属性変更      A^HA
X      S^HSY^HYM^HML^HLI^HIN^HNK^HK_M^HMO^HOD^HDE^HE        symbolic リンク表示形式の切替 S^HS
X      F^HFI^HIL^HLE^HET^HTY^HYP^HPE^HE_M^HMO^HOD^HDE^HE       ファイルタイプシンボルの切替  T^HT
X      D^HDO^HOT^HTF^HFI^HIL^HLE^HE_M^HMO^HOD^HDE^HE        ドットファイル非表示の切替    H^HH
@@ -391,29 +392,38 @@
X 
X         フ^H^Hファ^H^Hァイ^H^Hイル^H^Hル属^H^H属性^H^H性の^H^Hの変^H^H変更^H^H更 (Attr)
X              カーソル位置のファイルの、ファイルアクセスモードとタ
-             イムスタンプを変更します。マークされたファイルがある
-             場合は、カーソル位置のファイルではなくマークファイル
-             が対象となります。マークファイルの場合は、モードかタ
-             イムスタンプかのどちらかを選んでから、入力したものを
-             一括変更することになります。
+             イムスタンプ及びオーナーとグループを変更します。マー
+             クされたファイルがある場合は、カーソル位置のファイル
+             ではなくマークファイルが対象となります。マークファイ
+             ルの場合は、モード、タイムスタンプ、オーナーとグルー
+             プのいずれかを選んでから、入力したものを一括変更する
+             ことになります。
X 
X              モードの入力は、カーソルキーで変更したい位置へカーソ
X              ルを移動し、[S^HSp^Hpa^Hac^Hce^He] でその位置の属性を反転させます。
X              実行ビットの属性は、2 値のトグルではなく、それぞれ
X              setuid ビット、setgid ビット、sticky ビットを含んだ
-             3 値のトグルになっていますので注意して下さい。タイム
-             スタンプの入力は、変更したい位置にカーソルを持ってい
-             って、数値を入力するだけです。最終的に、[R^HRe^Het^Htu^Hur^Hrn^Hn] を
-             押した時点で実行されます。中断する場合は [E^HEs^Hsc^Hc] です。
-             日付の範囲チェックは完全ではありませんので気をつけて
-             下さい。
-
-             なお、[a^Ha](Attr), [d^Hd](Date), [t^Ht](Time) を入力すると、
-             各々の入力ラインの先頭位置にカーソル移動します。
+             3 値のトグルになっていますので注意して下さい。また、
+             対象がマークファイルの場合は、[m^Hm](Mask) を入力すると
+             その位置のビット値は '*^H*' でマスクされ、元のファイル
+             の属性値を保存します。タイムスタンプの入力は、変更し
+             たい位置にカーソルを持っていって、数値を入力するだけ
+             です。オーナーとグループの入力は、それぞれの名前の位
+             置にカーソルを移動し、[S^HSp^Hpa^Hac^Hce^He] で名前または ID 値の入
+             力を行ないます。名前の入力にはユーザ名補完やグループ
+             名補完が有効です。最終的に、[R^HRe^Het^Htu^Hur^Hrn^Hn] を押した時点で
+             実行されます。中断する場合は [E^HEs^Hsc^Hc] です。日付の範囲
+             チェックは完全ではありませんので気をつけて下さい。
+
+             なお、[a^Ha](Attr), [d^Hd](Date), [t^Ht](Time), [o^Ho](Owner),
+             [g^Hg](Group) を入力すると、各々の入力ラインの先頭位置
+             にカーソル移動します。
X 
X              また、ファイルフラグ属性のある OS では、モードの変更
-             と同様にファイルフラグも変更できます。但し、変更でき
-             るフラグの値は実行ユーザの権限に準じます。
+             と同様にファイルフラグも変更できます。この場合、[f^Hf]
+             (Flag) を入力するとフラグ入力ラインの先頭位置にカー
+             ソル移動します。但し、変更できるフラグの値は実行ユー
+             ザの権限に準じます。
X 
X         フ^H^Hファ^H^Hァイ^H^Hイル^H^Hルシ^H^Hシス^H^Hステ^H^Hテム^H^Hムの^H^Hの情^H^H情報^H^H報表^H^H表示^H^H示 (Info)
X              指定されたファイルシステムの情報を表示します。入力さ
@@ -538,6 +548,23 @@
X              かを確認してきますので、目的のファイルが表示されるま
X              では [n^Hn](No) を選択して下さい。
X 
+        再^H^H再帰^H^H帰的^H^H的な^H^Hなフ^H^Hファ^H^Hァイ^H^Hイル^H^Hル属^H^H属性^H^H性変^H^H変更^H^H更
+             カーソル位置のディレクトリファイルを、再帰的にファイ
+             ル属性変更します。マークファイルの属性変更と同様に、
+             モード、タイムスタンプ、オーナーとグループのいずれか
+             を選んでから、ディレクトリ以下の全てのファイル属性を
+             変更します。
+
+             但し、モードの入力では、実行ビットの属性は、3 値のト
+             グルではなく、'X^HX' と '!^H!' を含んだ 5 値のトグルになっ
+             ていますので注意して下さい。'X^HX' は対象がディレクトリ
+             であるかもしくはいずれかの実行ビットが立っている時の
+             み、そのビットを有効にします。同様に '!^H!' は対象がデ
+             ィレクトリであるかもしくはいずれかの実行ビットが立っ
+             ている時のみ、そのビットを無効にします。また、
+             [m^Hm](Mask) を入力するとその位置のビット値は '*^H*' でマ
+             スクされ、元のファイルの属性値を保存します。
+
X         ラ^H^Hラン^H^Hンチ^H^Hチャ^H^Hャの^H^Hの起^H^H起動^H^H動
X              サブディレクトリ以外のカーソル位置で [R^HRe^Het^Htu^Hur^Hrn^Hn] を押す
X              と、それぞれのファイル拡張子に応じた動作をします。デ
SHAR_EOF
  : || $echo 'restore of' 'FD-2.08.patch' 'failed'
fi
$echo 'End of' 'FD-2.08.patch' 'part' '1'
$echo 'File' 'FD-2.08.patch' 'is continued in part' '2'
echo 2 > _sh00599/seq
exit 0
-- 
                                               しらい たかし