Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/elfmz/far2l.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelfmz <fenix1905@tut.by>2022-07-10 20:18:55 +0300
committerelfmz <fenix1905@tut.by>2022-07-10 20:30:21 +0300
commitcafc2f8eed536c1914405e1211a9bd454fcec372 (patch)
tree194d3b41b1c11d7a31a8c1da45c577ba8336484a
parent23d2f58c03605ff711c021fe64550ac6f56d0d0a (diff)
add SUID/SGID/Sticky bits to attrs; fix build
-rw-r--r--far2l/bootstrap/scripts/farlang.templ.m447
-rw-r--r--far2l/src/mix/FSFileFlags.cpp18
-rw-r--r--far2l/src/mix/FSFileFlags.h20
-rw-r--r--far2l/src/setattr.cpp88
4 files changed, 111 insertions, 62 deletions
diff --git a/far2l/bootstrap/scripts/farlang.templ.m4 b/far2l/bootstrap/scripts/farlang.templ.m4
index 2496b53f..fe953e6d 100644
--- a/far2l/bootstrap/scripts/farlang.templ.m4
+++ b/far2l/bootstrap/scripts/farlang.templ.m4
@@ -13982,15 +13982,15 @@ upd:"Im&mutable"
upd:"Im&mutable"
upd:"Im&mutable"
-SetAttrUndeletable
-"Не&удаляемый"
-"&Undeletable"
-upd:"&Undeletable"
-upd:"&Undeletable"
-upd:"&Undeletable"
-upd:"&Undeletable"
-upd:"&Undeletable"
-upd:"&Undeletable"
+SetAttrAppend
+"Дополнение"
+"&Append"
+upd:"&Append"
+upd:"&Append"
+upd:"&Append"
+upd:"&Append"
+upd:"&Append"
+upd:"&Append"
SetAttrHidden
"С&крытый"
@@ -14002,6 +14002,35 @@ upd:"&Hidden"
upd:"&Hidden"
upd:"&Hidden"
+SetAttrSUID
+"SUID"
+"SUID"
+"SUID"
+"SUID"
+"SUID"
+"SUID"
+"SUID"
+"SUID"
+
+SetAttrSGID
+"SGID"
+"SGID"
+"SGID"
+"SGID"
+"SGID"
+"SGID"
+"SGID"
+"SGID"
+
+SetAttrSticky
+"Sticky"
+"Sticky"
+"Sticky"
+"Sticky"
+"Sticky"
+"Sticky"
+"Sticky"
+"Sticky"
SetAttrOwner
"Владелец:"
diff --git a/far2l/src/mix/FSFileFlags.cpp b/far2l/src/mix/FSFileFlags.cpp
index 5c999d04..07114caf 100644
--- a/far2l/src/mix/FSFileFlags.cpp
+++ b/far2l/src/mix/FSFileFlags.cpp
@@ -52,23 +52,23 @@ void FSFileFlags::SetImmutable(bool v)
}
}
-#if defined(__APPLE__) || defined(__FreeBSD__)
-
-bool FSFileFlags::Undeletable() const
+bool FSFileFlags::Append() const
{
- return FS_FLAGS_CONTAIN_UNDELETABLE(_flags);
+ return FS_FLAGS_CONTAIN_APPEND(_flags);
}
-void FSFileFlags::SetUndeletable(bool v)
+void FSFileFlags::SetAppend(bool v)
{
- if (v && !FS_FLAGS_CONTAIN_UNDELETABLE(_flags)) {
- _flags = FS_FLAGS_WITH_UNDELETABLE(_flags);
+ if (v && !FS_FLAGS_CONTAIN_APPEND(_flags)) {
+ _flags = FS_FLAGS_WITH_APPEND(_flags);
- } else if (!v && FS_FLAGS_CONTAIN_UNDELETABLE(_flags)) {
- _flags = FS_FLAGS_WITHOUT_UNDELETABLE(_flags);
+ } else if (!v && FS_FLAGS_CONTAIN_APPEND(_flags)) {
+ _flags = FS_FLAGS_WITHOUT_APPEND(_flags);
}
}
+#if defined(__APPLE__) || defined(__FreeBSD__)
+
bool FSFileFlags::Hidden() const
{
return FS_FLAGS_CONTAIN_HIDDEN(_flags);
diff --git a/far2l/src/mix/FSFileFlags.h b/far2l/src/mix/FSFileFlags.h
index dcc173c8..701ee651 100644
--- a/far2l/src/mix/FSFileFlags.h
+++ b/far2l/src/mix/FSFileFlags.h
@@ -18,10 +18,10 @@ public:
bool Immutable() const;
void SetImmutable(bool v);
-#if defined(__APPLE__) || defined(__FreeBSD__)
- bool Undeletable() const;
- void SetUndeletable(bool v);
+ bool Append() const;
+ void SetAppend(bool v);
+#if defined(__APPLE__) || defined(__FreeBSD__)
bool Hidden() const;
void SetHidden(bool v);
#endif
@@ -32,12 +32,12 @@ public:
# define FS_FLAGS_WITHOUT_IMMUTABLE(flags) ((flags) & (~(UF_IMMUTABLE | SF_IMMUTABLE)))
# define FS_FLAGS_WITH_IMMUTABLE(flags) ((flags) | (UF_IMMUTABLE))
-# define FS_FLAGS_CONTAIN_UNDELETABLE(flags) (((flags) & (UF_NOUNLINK | SF_NOUNLINK)) != 0)
-# define FS_FLAGS_WITHOUT_UNDELETABLE(flags) ((flags) & (~(UF_NOUNLINK | SF_NOUNLINK)))
-# define FS_FLAGS_WITH_UNDELETABLE(flags) ((flags) | (UF_NOUNLINK))
+# define FS_FLAGS_CONTAIN_APPEND(flags) (((flags) & (UF_APPEND | SF_APPEND)) != 0)
+# define FS_FLAGS_WITHOUT_APPEND(flags) ((flags) & (~(UF_APPEND | SF_APPEND)))
+# define FS_FLAGS_WITH_APPEND(flags) ((flags) | (UF_APPEND))
-# define FS_FLAGS_CONTAIN_HIDDEN(flags) (((flags) & (UF_HIDDEN | SF_HIDDEN)) != 0)
-# define FS_FLAGS_WITHOUT_HIDDEN(flags) ((flags) & (~(UF_HIDDEN | SF_HIDDEN)))
+# define FS_FLAGS_CONTAIN_HIDDEN(flags) (((flags) & (UF_HIDDEN)) != 0)
+# define FS_FLAGS_WITHOUT_HIDDEN(flags) ((flags) & (~(UF_HIDDEN)))
# define FS_FLAGS_WITH_HIDDEN(flags) ((flags) | (UF_HIDDEN))
#else
@@ -45,4 +45,8 @@ public:
# define FS_FLAGS_WITHOUT_IMMUTABLE(flags) ((flags) & (~FS_IMMUTABLE_FL))
# define FS_FLAGS_WITH_IMMUTABLE(flags) ((flags) | FS_IMMUTABLE_FL)
+# define FS_FLAGS_CONTAIN_APPEND(flags) (((flags) & FS_APPEND_FL) != 0)
+# define FS_FLAGS_WITHOUT_APPEND(flags) ((flags) & (~FS_APPEND_FL))
+# define FS_FLAGS_WITH_APPEND(flags) ((flags) | (FS_APPEND_FL))
+
#endif
diff --git a/far2l/src/setattr.cpp b/far2l/src/setattr.cpp
index 829de581..7574e6b6 100644
--- a/far2l/src/setattr.cpp
+++ b/far2l/src/setattr.cpp
@@ -70,10 +70,13 @@ enum SETATTRDLG
SA_SEPARATOR2,
SA_CHECKBOX_IMMUTABLE,
+ SA_CHECKBOX_APPEND,
#if defined(__APPLE__) || defined(__FreeBSD__)
- SA_CHECKBOX_UNDELETABLE,
SA_CHECKBOX_HIDDEN,
#endif
+ SA_CHECKBOX_SUID,
+ SA_CHECKBOX_SGID,
+ SA_CHECKBOX_STICKY,
SA_TEXT_MODE_USER,
SA_TEXT_MODE_GROUP,
SA_TEXT_MODE_OTHER,
@@ -124,16 +127,25 @@ AP[]=
{SA_CHECKBOX_OTHER_READ, S_IROTH },
{SA_CHECKBOX_OTHER_WRITE, S_IWOTH },
{SA_CHECKBOX_OTHER_EXECUTE, S_IXOTH },
+ {SA_CHECKBOX_SUID, S_ISUID },
+ {SA_CHECKBOX_SGID, S_ISGID },
+ {SA_CHECKBOX_STICKY, S_ISVTX }
};
-#define EDITABLE_MODES (S_IXOTH | S_IWOTH | S_IROTH | S_IXGRP | S_IWGRP | S_IRGRP | S_IXUSR | S_IWUSR | S_IRUSR)
+#define EDITABLE_MODES (S_IXOTH | S_IWOTH | S_IROTH \
+ | S_IXGRP | S_IWGRP | S_IRGRP \
+ | S_IXUSR | S_IWUSR | S_IRUSR \
+ | S_ISUID | S_ISGID | S_ISVTX)
static const int PreserveOriginalIDs[] = {
SA_CHECKBOX_IMMUTABLE,
+ SA_CHECKBOX_APPEND,
#if defined(__APPLE__) || defined(__FreeBSD__)
- SA_CHECKBOX_UNDELETABLE,
SA_CHECKBOX_HIDDEN,
#endif
+ SA_CHECKBOX_SUID,
+ SA_CHECKBOX_SGID,
+ SA_CHECKBOX_STICKY,
SA_CHECKBOX_USER_READ,
SA_CHECKBOX_USER_WRITE,
SA_CHECKBOX_USER_EXECUTE,
@@ -627,8 +639,8 @@ static void ApplyFSFileFlags(DialogItemEx *AttrDlg, const FARString &strSelName)
{
FSFileFlags FFFlags(strSelName.GetMB());
FFFlags.SetImmutable(AttrDlg[SA_CHECKBOX_IMMUTABLE].Selected != 0);
+ FFFlags.SetAppend(AttrDlg[SA_CHECKBOX_APPEND].Selected != 0);
#if defined(__APPLE__) || defined(__FreeBSD__)
- FFFlags.SetUndeletable(AttrDlg[SA_CHECKBOX_UNDELETABLE].Selected != 0);
FFFlags.SetHidden(AttrDlg[SA_CHECKBOX_HIDDEN].Selected != 0);
#endif
FFFlags.Apply(strSelName.GetMB());
@@ -641,7 +653,7 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
SudoClientRegion scr;
ChangePriority ChPriority(ChangePriority::NORMAL);
- short DlgX=70,DlgY=23;
+ short DlgX=70,DlgY=24;
DialogDataEx AttrDlgData[]=
{
@@ -656,40 +668,44 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
{DI_TEXT,3,7,0,7,{},DIF_SEPARATOR,L""},
{DI_CHECKBOX,5,8,0,8,{},DIF_FOCUS|DIF_3STATE, Msg::SetAttrImmutable},
+ {DI_CHECKBOX,short(DlgX/3),8,0,8,{},DIF_FOCUS|DIF_3STATE, Msg::SetAttrAppend},
#if defined(__APPLE__) || defined(__FreeBSD__)
- {DI_CHECKBOX,short(DlgX/3),8,0,8,{},DIF_FOCUS|DIF_3STATE, Msg::SetAttrUndeletable},
{DI_CHECKBOX,short(2*DlgX/3),8,0,8,{},DIF_FOCUS|DIF_3STATE, Msg::SetAttrHidden},
#endif
- {DI_TEXT,5,9,0,9,{},0,Msg::SetAttrAccessUser},//L"User",
- {DI_TEXT,short(DlgX/3),9,0,9,{},0,Msg::SetAttrAccessGroup},//L"Group",
- {DI_TEXT,short(2*DlgX/3),9,0,9,{},0,Msg::SetAttrAccessOther},//L"Other",
- {DI_CHECKBOX,5,10,0,10,{},DIF_FOCUS|DIF_3STATE, Msg::SetAttrAccessUserRead},//L"Read",
- {DI_CHECKBOX,5,11,0,11,{},DIF_3STATE, Msg::SetAttrAccessUserWrite},//L"Write",
- {DI_CHECKBOX,5,12,0,12,{},DIF_3STATE, Msg::SetAttrAccessUserExecute},//L"Execute",
- {DI_CHECKBOX,short(DlgX/3),10,0,10,{},DIF_3STATE, Msg::SetAttrAccessGroupRead},//L"Read",
- {DI_CHECKBOX,short(DlgX/3),11,0,11,{},DIF_3STATE, Msg::SetAttrAccessGroupWrite},//L"Write",
- {DI_CHECKBOX,short(DlgX/3),12,0,12,{},DIF_3STATE, Msg::SetAttrAccessGroupExecute},//L"Execute",
- {DI_CHECKBOX,short(2*DlgX/3),10,0,10,{},DIF_3STATE, Msg::SetAttrAccessOtherRead},//L"Read",
- {DI_CHECKBOX,short(2*DlgX/3),11,0,11,{},DIF_3STATE, Msg::SetAttrAccessOtherWrite},//L"Write",
- {DI_CHECKBOX,short(2*DlgX/3),12,0,12,{},DIF_3STATE, Msg::SetAttrAccessOtherExecute},//L"Execute",
-
- {DI_TEXT,3,13,0,13,{},DIF_SEPARATOR,L""},
- {DI_TEXT,short(DlgX-29),14,0,14,{},0,L""},
- {DI_TEXT, 5,15,0,15,{},0, Msg::SetAttrAccessTime},//L"Last access time",
- {DI_FIXEDIT,short(DlgX-29),15,short(DlgX-19),15,{},DIF_MASKEDIT,L""},
- {DI_FIXEDIT,short(DlgX-17),15,short(DlgX-6),15,{},DIF_MASKEDIT,L""},
- {DI_TEXT, 5,16,0,16,{},0, Msg::SetAttrModificationTime},//L"Last modification time",
+ {DI_CHECKBOX,5,9,0,9,{},DIF_FOCUS|DIF_3STATE, Msg::SetAttrSUID},
+ {DI_CHECKBOX,short(DlgX/3),9,0,9,{},DIF_FOCUS|DIF_3STATE, Msg::SetAttrSGID},
+ {DI_CHECKBOX,short(2*DlgX/3),9,0,9,{},DIF_FOCUS|DIF_3STATE, Msg::SetAttrSticky},
+
+ {DI_TEXT,5,10,0,10,{},0,Msg::SetAttrAccessUser},//L"User",
+ {DI_TEXT,short(DlgX/3),10,0,10,{},0,Msg::SetAttrAccessGroup},//L"Group",
+ {DI_TEXT,short(2*DlgX/3),10,0,10,{},0,Msg::SetAttrAccessOther},//L"Other",
+ {DI_CHECKBOX,5,11,0,11,{},DIF_FOCUS|DIF_3STATE, Msg::SetAttrAccessUserRead},//L"Read",
+ {DI_CHECKBOX,5,12,0,12,{},DIF_3STATE, Msg::SetAttrAccessUserWrite},//L"Write",
+ {DI_CHECKBOX,5,13,0,13,{},DIF_3STATE, Msg::SetAttrAccessUserExecute},//L"Execute",
+ {DI_CHECKBOX,short(DlgX/3),11,0,11,{},DIF_3STATE, Msg::SetAttrAccessGroupRead},//L"Read",
+ {DI_CHECKBOX,short(DlgX/3),12,0,12,{},DIF_3STATE, Msg::SetAttrAccessGroupWrite},//L"Write",
+ {DI_CHECKBOX,short(DlgX/3),13,0,13,{},DIF_3STATE, Msg::SetAttrAccessGroupExecute},//L"Execute",
+ {DI_CHECKBOX,short(2*DlgX/3),11,0,11,{},DIF_3STATE, Msg::SetAttrAccessOtherRead},//L"Read",
+ {DI_CHECKBOX,short(2*DlgX/3),12,0,12,{},DIF_3STATE, Msg::SetAttrAccessOtherWrite},//L"Write",
+ {DI_CHECKBOX,short(2*DlgX/3),13,0,13,{},DIF_3STATE, Msg::SetAttrAccessOtherExecute},//L"Execute",
+
+ {DI_TEXT,3,14,0,14,{},DIF_SEPARATOR,L""},
+ {DI_TEXT,short(DlgX-29),15,0,15,{},0,L""},
+ {DI_TEXT, 5,16,0,16,{},0, Msg::SetAttrAccessTime},//L"Last access time",
{DI_FIXEDIT,short(DlgX-29),16,short(DlgX-19),16,{},DIF_MASKEDIT,L""},
{DI_FIXEDIT,short(DlgX-17),16,short(DlgX-6),16,{},DIF_MASKEDIT,L""},
- {DI_TEXT, 5,17,0,17,{},0, Msg::SetAttrStatusChangeTime},//L"Last status change time",
- {DI_FIXEDIT,short(DlgX-29),17,short(DlgX-19),17,{},DIF_MASKEDIT|DIF_READONLY,L""},
- {DI_FIXEDIT,short(DlgX-17),17,short(DlgX-6),17,{},DIF_MASKEDIT|DIF_READONLY,L""},
- {DI_BUTTON,0,18,0,18,{},DIF_CENTERGROUP|DIF_BTNNOCLOSE,Msg::SetAttrOriginal},
- {DI_BUTTON,0,18,0,18,{},DIF_CENTERGROUP|DIF_BTNNOCLOSE,Msg::SetAttrCurrent},
- {DI_BUTTON,0,18,0,18,{},DIF_CENTERGROUP|DIF_BTNNOCLOSE,Msg::SetAttrBlank},
- {DI_TEXT,3,19,0,19,{},DIF_SEPARATOR|DIF_HIDDEN,L""},
- {DI_CHECKBOX,5,20,0,20,{},DIF_DISABLE|DIF_HIDDEN,Msg::SetAttrSubfolders},
+ {DI_TEXT, 5,17,0,17,{},0, Msg::SetAttrModificationTime},//L"Last modification time",
+ {DI_FIXEDIT,short(DlgX-29),17,short(DlgX-19),17,{},DIF_MASKEDIT,L""},
+ {DI_FIXEDIT,short(DlgX-17),17,short(DlgX-6),17,{},DIF_MASKEDIT,L""},
+ {DI_TEXT, 5,18,0,18,{},0, Msg::SetAttrStatusChangeTime},//L"Last status change time",
+ {DI_FIXEDIT,short(DlgX-29),18,short(DlgX-19),18,{},DIF_MASKEDIT|DIF_READONLY,L""},
+ {DI_FIXEDIT,short(DlgX-17),18,short(DlgX-6),18,{},DIF_MASKEDIT|DIF_READONLY,L""},
+ {DI_BUTTON,0,19,0,19,{},DIF_CENTERGROUP|DIF_BTNNOCLOSE,Msg::SetAttrOriginal},
+ {DI_BUTTON,0,19,0,19,{},DIF_CENTERGROUP|DIF_BTNNOCLOSE,Msg::SetAttrCurrent},
+ {DI_BUTTON,0,19,0,19,{},DIF_CENTERGROUP|DIF_BTNNOCLOSE,Msg::SetAttrBlank},
+ {DI_TEXT,3,20,0,20,{},DIF_SEPARATOR|DIF_HIDDEN,L""},
+ {DI_CHECKBOX,5,21,0,21,{},DIF_DISABLE|DIF_HIDDEN,Msg::SetAttrSubfolders},
{DI_TEXT,3,short(DlgY-4),0,short(DlgY-4),{},DIF_SEPARATOR,L""},
{DI_BUTTON,0,short(DlgY-3),0,short(DlgY-3),{},DIF_DEFAULT|DIF_CENTERGROUP,Msg::SetAttrSet},
{DI_BUTTON,0,short(DlgY-3),0,short(DlgY-3),{},DIF_CENTERGROUP|DIF_DISABLE,Msg::SetAttrBriefInfo},
@@ -836,8 +852,8 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
AttrDlg[AP[i].Item].Selected = (FileMode&AP[i].Mode) ? BSTATE_CHECKED : BSTATE_UNCHECKED;
}
AttrDlg[SA_CHECKBOX_IMMUTABLE].Selected = FFFlags.Immutable() ? BSTATE_CHECKED : BSTATE_UNCHECKED;
+ AttrDlg[SA_CHECKBOX_APPEND].Selected = FFFlags.Append() ? BSTATE_CHECKED : BSTATE_UNCHECKED;
#if defined(__APPLE__) || defined(__FreeBSD__)
- AttrDlg[SA_CHECKBOX_UNDELETABLE].Selected = FFFlags.Undeletable() ? BSTATE_CHECKED : BSTATE_UNCHECKED;
AttrDlg[SA_CHECKBOX_HIDDEN].Selected = FFFlags.Hidden() ? BSTATE_CHECKED : BSTATE_UNCHECKED;
#endif
}
@@ -936,9 +952,9 @@ bool ShellSetFileAttributes(Panel *SrcPanel,LPCWSTR Object)
FSFileFlags FFFlags(strSelName.GetMB());
if (FFFlags.Immutable())
AttrDlg[SA_CHECKBOX_IMMUTABLE].Selected++;
+ if (FFFlags.Append())
+ AttrDlg[SA_CHECKBOX_APPEND].Selected++;
#if defined(__APPLE__) || defined(__FreeBSD__)
- if (FFFlags.Undeletable())
- AttrDlg[SA_CHECKBOX_UNDELETABLE].Selected++;
if (FFFlags.Hidden())
AttrDlg[SA_CHECKBOX_HIDDEN].Selected++;
#endif