FDclone 2.08 patch [1/4]
しらいです。
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
--
しらい たかし
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735