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:
-rw-r--r--colorer/configs/base/hrc/base/cpp.hrc2
-rwxr-xr-xfar2l/bootstrap/trash.sh12
-rw-r--r--far2l/src/delete.cpp29
-rw-r--r--far2l/src/message.cpp12
-rw-r--r--far2l/src/message.hpp1
-rw-r--r--utils/CMakeLists.txt1
-rw-r--r--utils/include/utils.h2
-rw-r--r--utils/src/ReadWholeFile.cpp27
8 files changed, 74 insertions, 12 deletions
diff --git a/colorer/configs/base/hrc/base/cpp.hrc b/colorer/configs/base/hrc/base/cpp.hrc
index d897c2ef..bf064818 100644
--- a/colorer/configs/base/hrc/base/cpp.hrc
+++ b/colorer/configs/base/hrc/base/cpp.hrc
@@ -185,7 +185,7 @@
<word name="__uuidof"/>
<word name="__virtual_inheritance"/>
- <word name="nullptr" region="KeywordConstant"/>
+ <word name="nullptr" region="c:KeywordConstant"/>
</keywords>
diff --git a/far2l/bootstrap/trash.sh b/far2l/bootstrap/trash.sh
index 338bff5f..d185ef8a 100755
--- a/far2l/bootstrap/trash.sh
+++ b/far2l/bootstrap/trash.sh
@@ -12,8 +12,12 @@ if [ -x ~/.config/far2l/trash.sh ]; then
. ~/.config/far2l/trash.sh
fi
-if command -v gvfs-trash >/dev/null 2>&1; then
- gvfs-trash -f -- "$1"
-elif command -v gio >/dev/null 2>&1; then
- gio trash -f -- "$1"
+if command -v gio >/dev/null 2>&1; then
+ gio trash -f -- "$1" 2>"$2"
+
+elif command -v gvfs-trash >/dev/null 2>&1; then
+ gvfs-trash -f -- "$1" 2>"$2"
+
+else
+ echo 'No gio or gvfs-trash available' >"$2"
fi
diff --git a/far2l/src/delete.cpp b/far2l/src/delete.cpp
index 391e6731..4aacf5da 100644
--- a/far2l/src/delete.cpp
+++ b/far2l/src/delete.cpp
@@ -801,25 +801,40 @@ int ERemoveDirectory(const wchar_t *Name,int Wipe)
return DELETE_SUCCESS;
}
-int RemoveToRecycleBin(const wchar_t *Name)
+static int RemoveToRecycleBin(const wchar_t *Name)
{
- std::string name_mb = Wide2MB(Name);
+ FARString err_file;
+ FarMkTempEx(err_file, L"trash");
+
+ std::string name_arg = Wide2MB(Name);
+ std::string err_file_arg = err_file.GetMB();
unsigned int flags = EF_HIDEOUT;
- if (sudo_client_is_required_for(name_mb.c_str(), true))
+ if (sudo_client_is_required_for(name_arg.c_str(), true))
flags|= EF_SUDO;
- QuoteCmdArgIfNeed(name_mb);
+ QuoteCmdArgIfNeed(name_arg);
+ QuoteCmdArgIfNeed(err_file_arg);
std::string cmd = GetMyScriptQuoted("trash.sh");
cmd+= ' ';
- cmd+= name_mb;
+ cmd+= name_arg;
+ cmd+= ' ';
+ cmd+= err_file_arg;
int r = farExecuteA(cmd.c_str(), flags);
- if (r==0)
+ if (r == 0)
return TRUE;
- errno = r;
+ std::string err_str;
+ if (ReadWholeFile(err_file.GetMB().c_str(), err_str, 0x10000)) {
+ // gio: file:///.../xxx/yyy: Unable to trash file .../xxx/yyy: Permission denied
+ err_str.erase(0, err_str.rfind(':') + 1);
+ StrTrim(err_str, " \t\r\n");
+ SetErrorString(err_str);
+ }
+ unlink(err_file.GetMB().c_str());
+
return FALSE;
}
diff --git a/far2l/src/message.cpp b/far2l/src/message.cpp
index e2e273dc..3072e5d6 100644
--- a/far2l/src/message.cpp
+++ b/far2l/src/message.cpp
@@ -566,9 +566,16 @@ void GetMessagePosition(int &X1,int &Y1,int &X2,int &Y2)
Y2=MessageY2;
}
+static FARString s_ErrorString;
+
bool GetErrorString(FARString &strErrStr)
{
auto err = errno;
+ if (err == -1 && !s_ErrorString.IsEmpty()) {
+ strErrStr = s_ErrorString;
+ return true;
+ }
+
const char *str = strerror(err);
if (str) {
strErrStr.Format(L"%s (%u)", str, err);
@@ -578,6 +585,11 @@ bool GetErrorString(FARString &strErrStr)
return true;
}
+void SetErrorString(const FARString &strErrStr)
+{
+ s_ErrorString = strErrStr;
+ errno = -1;
+}
void SetMessageHelp(const wchar_t *Topic)
{
diff --git a/far2l/src/message.hpp b/far2l/src/message.hpp
index ee091471..ab5ba49e 100644
--- a/far2l/src/message.hpp
+++ b/far2l/src/message.hpp
@@ -93,3 +93,4 @@ void GetMessagePosition(int &X1,int &Y1,int &X2,int &Y2);
int AbortMessage();
bool GetErrorString(FARString &strErrStr);
+void SetErrorString(const FARString &strErrStr);
diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt
index 77966432..31d67575 100644
--- a/utils/CMakeLists.txt
+++ b/utils/CMakeLists.txt
@@ -33,6 +33,7 @@ set(SOURCES
src/CharClasses.cpp
src/POpen.cpp
src/VT256ColorTable.cpp
+ src/ReadWholeFile.cpp
)
add_library (utils ${SOURCES})
diff --git a/utils/include/utils.h b/utils/include/utils.h
index 1e2f381f..167bf116 100644
--- a/utils/include/utils.h
+++ b/utils/include/utils.h
@@ -134,6 +134,8 @@ size_t WriteAll(int fd, const void *data, size_t len, size_t chunk = (size_t)-1)
size_t ReadAll(int fd, void *data, size_t len);
ssize_t ReadWritePiece(int fd_src, int fd_dst);
+bool ReadWholeFile(const char *path, std::string &result, size_t limit = (size_t)-1);
+
int pipe_cloexec(int pipedes[2]);
diff --git a/utils/src/ReadWholeFile.cpp b/utils/src/ReadWholeFile.cpp
new file mode 100644
index 00000000..cb80627b
--- /dev/null
+++ b/utils/src/ReadWholeFile.cpp
@@ -0,0 +1,27 @@
+#include <fcntl.h>
+#include "utils.h"
+#include "ScopeHelpers.h"
+
+bool ReadWholeFile(const char *path, std::string &result, size_t limit)
+{
+ FDScope fd(open(path, O_RDONLY));
+ if (!fd.Valid())
+ return false;
+
+ for (;;) {
+ char buf[0x1000] = {};
+ ssize_t r = ReadAll(fd, buf, sizeof(buf));
+ if (r > 0) {
+ result.append(buf, r);
+ if (result.size() >= limit) {
+ return true;
+ }
+
+ } else if (r < 0 && result.empty()) {
+ return false;
+
+ } else {
+ return true;
+ }
+ }
+}