From b118c93b4fce733b1c996a2ff0f137f05db07c85 Mon Sep 17 00:00:00 2001 From: Jean-Francois Dockes Date: Mon, 17 Jan 2022 15:46:40 +0100 Subject: [PATCH] small cleanups to avoid a few ifdef _WIN32 --- src/index/mimetype.cpp | 2 - src/internfile/extrameta.cpp | 2 +- src/internfile/mh_text.cpp | 5 +- src/qtgui/winschedtool.cpp | 4 +- src/testmains/trcopyfile.cpp | 94 ++++ src/testmains/trcpuconf.cpp | 38 ++ src/utils/circache.cpp | 1 - src/utils/copyfile.cpp | 91 +-- src/utils/cpuconf.cpp | 27 +- src/utils/pathut.cpp | 1 - src/utils/pathut.h | 44 +- src/utils/pxattr.cpp | 1002 +++++++++++++++++----------------- src/utils/readfile.cpp | 2 +- src/utils/wipedir.cpp | 6 - 14 files changed, 671 insertions(+), 648 deletions(-) create mode 100644 src/testmains/trcopyfile.cpp create mode 100644 src/testmains/trcpuconf.cpp diff --git a/src/index/mimetype.cpp b/src/index/mimetype.cpp index 7d8c8798..07ceaa22 100644 --- a/src/index/mimetype.cpp +++ b/src/index/mimetype.cpp @@ -161,7 +161,6 @@ string mimetype(const string &fn, const struct PathStat *stp, string mtype; -#ifndef _WIN32 // Extended attribute has priority on everything, as per: // http://freedesktop.org/wiki/CommonExtendedAttributes if (pxattr::get(fn, "mime_type", &mtype)) { @@ -172,7 +171,6 @@ string mimetype(const string &fn, const struct PathStat *stp, return mtype; } } -#endif if (cfg == 0) { LOGERR("Mimetype: null config ??\n"); diff --git a/src/internfile/extrameta.cpp b/src/internfile/extrameta.cpp index 2064a541..c050828a 100644 --- a/src/internfile/extrameta.cpp +++ b/src/internfile/extrameta.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2004 J.F.Dockes +/* Copyright (C) 2004-2022 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or diff --git a/src/internfile/mh_text.cpp b/src/internfile/mh_text.cpp index 63a127e5..25dbf03c 100644 --- a/src/internfile/mh_text.cpp +++ b/src/internfile/mh_text.cpp @@ -69,11 +69,9 @@ bool MimeHandlerText::set_document_file_impl(const string&, const string &fn) return false; } -#ifndef _WIN32 // Check for charset defined in extended attribute as per: // http://freedesktop.org/wiki/CommonExtendedAttributes pxattr::get(m_fn, "charset", &m_charsetfromxattr); -#endif getparams(); if (m_maxmbs != -1 && m_totlen / (1024*1024) > m_maxmbs) { @@ -88,8 +86,7 @@ bool MimeHandlerText::set_document_file_impl(const string&, const string &fn) return true; } -bool MimeHandlerText::set_document_string_impl(const string&, - const string& otext) +bool MimeHandlerText::set_document_string_impl(const string&, const string& otext) { m_fn.clear(); m_totlen = otext.size(); diff --git a/src/qtgui/winschedtool.cpp b/src/qtgui/winschedtool.cpp index 07b79dbd..54892dd3 100644 --- a/src/qtgui/winschedtool.cpp +++ b/src/qtgui/winschedtool.cpp @@ -14,8 +14,9 @@ * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifdef _WIN32 + #include "autoconfig.h" + #include "winschedtool.h" #include @@ -97,4 +98,3 @@ void WinSchedToolW::startWinScheduler() vector lcmd{"c:/windows/system32/taskschd.msc"}; m_cmd->startExec("rclstartw", lcmd, false, false); } -#endif /* _WIN32 */ diff --git a/src/testmains/trcopyfile.cpp b/src/testmains/trcopyfile.cpp new file mode 100644 index 00000000..2f046111 --- /dev/null +++ b/src/testmains/trcopyfile.cpp @@ -0,0 +1,94 @@ +/* Copyright (C) 2021 J.F.Dockes + * + * License: GPL 2.1 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#include +#include +#include + +#include +#include + +#include "copyfile.h" + +using namespace std; + +static int op_flags; +#define OPT_MOINS 0x1 +#define OPT_m 0x2 +#define OPT_e 0x4 + +static const char *thisprog; +static char usage [] = + "trcopyfile [-m] src dst\n" + " -m : move instead of copying\n" + " -e : fail if dest exists (only for copy)\n" + "\n" + ; +static void +Usage(void) +{ + fprintf(stderr, "%s: usage:\n%s", thisprog, usage); + exit(1); +} + +int main(int argc, const char **argv) +{ + thisprog = argv[0]; + argc--; argv++; + + while (argc > 0 && **argv == '-') { + (*argv)++; + if (!(**argv)) + /* Cas du "adb - core" */ + Usage(); + while (**argv) + switch (*(*argv)++) { + case 'm': op_flags |= OPT_m; break; + case 'e': op_flags |= OPT_e; break; + default: Usage(); break; + } + argc--; argv++; + } + + if (argc != 2) + Usage(); + string src = *argv++;argc--; + string dst = *argv++;argc--; + bool ret; + string reason; + if (op_flags & OPT_m) { + ret = renameormove(src.c_str(), dst.c_str(), reason); + } else { + int flags = 0; + if (op_flags & OPT_e) { + flags |= COPYFILE_EXCL; + } + ret = copyfile(src.c_str(), dst.c_str(), reason, flags); + } + if (!ret) { + cerr << reason << endl; + exit(1); + } else { + cout << "Succeeded" << endl; + if (!reason.empty()) { + cout << "Warnings: " << reason << endl; + } + exit(0); + } +} diff --git a/src/testmains/trcpuconf.cpp b/src/testmains/trcpuconf.cpp new file mode 100644 index 00000000..54599fd1 --- /dev/null +++ b/src/testmains/trcpuconf.cpp @@ -0,0 +1,38 @@ +/* Copyright (C) 2021 J.F.Dockes + * + * License: GPL 2.1 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include + +#include +using namespace std; + +#include "cpuconf.h" + +// Test driver +int main(int argc, const char **argv) +{ + CpuConf cpus; + if (!getCpuConf(cpus)) { + cerr << "getCpuConf failed" << endl; + exit(1); + } + cout << "Cpus: " << cpus.ncpus << endl; + exit(0); +} diff --git a/src/utils/circache.cpp b/src/utils/circache.cpp index be66e756..05117cff 100644 --- a/src/utils/circache.cpp +++ b/src/utils/circache.cpp @@ -37,7 +37,6 @@ #ifndef _WIN32 #include -#define O_BINARY 0 #else struct iovec { void *iov_base; diff --git a/src/utils/copyfile.cpp b/src/utils/copyfile.cpp index 1cb2d6ee..5ac37af8 100644 --- a/src/utils/copyfile.cpp +++ b/src/utils/copyfile.cpp @@ -14,25 +14,26 @@ * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef TEST_COPYFILE + #include "autoconfig.h" +#include "copyfile.h" + #include #include #include "safefcntl.h" #include #include "safesysstat.h" #include "safeunistd.h" -#include "pathut.h" + #ifndef _WIN32 #include #include -#define O_BINARY 0 #endif #include -#include "copyfile.h" +#include "pathut.h" #include "log.h" using namespace std; @@ -189,85 +190,3 @@ bool renameormove(const char *src, const char *dst, string &reason) return true; } - - -#else - -#include -#include -#include - -#include -#include - -#include "copyfile.h" - -using namespace std; - -static int op_flags; -#define OPT_MOINS 0x1 -#define OPT_m 0x2 -#define OPT_e 0x4 - -static const char *thisprog; -static char usage [] = - "trcopyfile [-m] src dst\n" - " -m : move instead of copying\n" - " -e : fail if dest exists (only for copy)\n" - "\n" - ; -static void -Usage(void) -{ - fprintf(stderr, "%s: usage:\n%s", thisprog, usage); - exit(1); -} - -int main(int argc, const char **argv) -{ - thisprog = argv[0]; - argc--; argv++; - - while (argc > 0 && **argv == '-') { - (*argv)++; - if (!(**argv)) - /* Cas du "adb - core" */ - Usage(); - while (**argv) - switch (*(*argv)++) { - case 'm': op_flags |= OPT_m; break; - case 'e': op_flags |= OPT_e; break; - default: Usage(); break; - } - argc--; argv++; - } - - if (argc != 2) - Usage(); - string src = *argv++;argc--; - string dst = *argv++;argc--; - bool ret; - string reason; - if (op_flags & OPT_m) { - ret = renameormove(src.c_str(), dst.c_str(), reason); - } else { - int flags = 0; - if (op_flags & OPT_e) { - flags |= COPYFILE_EXCL; - } - ret = copyfile(src.c_str(), dst.c_str(), reason, flags); - } - if (!ret) { - cerr << reason << endl; - exit(1); - } else { - cout << "Succeeded" << endl; - if (!reason.empty()) { - cout << "Warnings: " << reason << endl; - } - exit(0); - } -} - -#endif - diff --git a/src/utils/cpuconf.cpp b/src/utils/cpuconf.cpp index 4d1c3a4e..f9c440ac 100644 --- a/src/utils/cpuconf.cpp +++ b/src/utils/cpuconf.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2013 J.F.Dockes +/* Copyright (C) 2013-2022 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -14,11 +14,8 @@ * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef TEST_CPUCONF - #include "autoconfig.h" - #include "cpuconf.h" #include @@ -39,25 +36,3 @@ bool getCpuConf(CpuConf& cpus) return true; } - -#else // TEST_CPUCONF - -#include - -#include -using namespace std; - -#include "cpuconf.h" - -// Test driver -int main(int argc, const char **argv) -{ - CpuConf cpus; - if (!getCpuConf(cpus)) { - cerr << "getCpuConf failed" << endl; - exit(1); - } - cout << "Cpus: " << cpus.ncpus << endl; - exit(0); -} -#endif // TEST_CPUCONF diff --git a/src/utils/pathut.cpp b/src/utils/pathut.cpp index 52421039..9e61d224 100644 --- a/src/utils/pathut.cpp +++ b/src/utils/pathut.cpp @@ -171,7 +171,6 @@ #define DIRENT dirent #define DIRHDL DIR #define MKDIR(a,b) mkdir(a,b) -#define O_BINARY 0 #define OPEN ::open #define UNLINK ::unlink #define RMDIR ::rmdir diff --git a/src/utils/pathut.h b/src/utils/pathut.h index 85fdd2ea..ee16aec2 100644 --- a/src/utils/pathut.h +++ b/src/utils/pathut.h @@ -81,6 +81,8 @@ bool path_exists(const std::string& path); bool path_readable(const std::string& path); #ifdef _WIN32 + +// Constants for _waccess() # ifndef R_OK # define R_OK 4 # endif @@ -94,7 +96,30 @@ bool path_readable(const std::string& path); # ifndef F_OK # define F_OK 0 # endif -#endif /* _WIN32 */ + +// Conversion between utf-8 and wide char file names. + +#include +bool wchartoutf8(const wchar_t *in, std::string& out, size_t len = 0); +std::string wchartoutf8(const wchar_t *in, size_t len = 0); +bool utf8towchar(const std::string& in, wchar_t *out, size_t obytescap); +std::unique_ptr utf8towchar(const std::string& in); + +// Convert between slash and backslash separators. +void path_slashize(std::string& s); +void path_backslashize(std::string& s); + +extern std::string path_shortpath(const std::string& path); + +#else // !_WIN32 -> + +#include +#define path_shortpath(path) (path) +#ifndef O_BINARY +#define O_BINARY 0 +#endif +#endif /* !_WIN32 */ + /// access() or _waccess() bool path_access(const std::string& path, int mode); @@ -125,14 +150,6 @@ extern int path_fileprops(const std::string path, struct PathStat *stp, /// Return separator for PATH environment variable extern std::string path_PATHsep(); -#ifdef _WIN32 -#include -bool wchartoutf8(const wchar_t *in, std::string& out, size_t len = 0); -std::string wchartoutf8(const wchar_t *in, size_t len = 0); -bool utf8towchar(const std::string& in, wchar_t *out, size_t obytescap); -std::unique_ptr utf8towchar(const std::string& in); -#endif - /// Directory reading interface. UTF-8 on Windows. class PathDirContents { public: @@ -219,15 +236,6 @@ public: std::string fragment; }; -#ifdef _WIN32 -/// Convert \ separators to / -void path_slashize(std::string& s); -void path_backslashize(std::string& s); -extern std::string path_shortpath(const std::string& path); -#else -#define path_shortpath(path) (path) -#endif - /// Lock/pid file class. This is quite close to the pidfile_xxx /// utilities in FreeBSD with a bit more encapsulation. I'd have used /// the freebsd code if it was available elsewhere diff --git a/src/utils/pxattr.cpp b/src/utils/pxattr.cpp index fb2572b7..f13b49ee 100644 --- a/src/utils/pxattr.cpp +++ b/src/utils/pxattr.cpp @@ -1,36 +1,36 @@ /* -Copyright (c) 2009 Jean-Francois Dockes + Copyright (c) 2009 Jean-Francois Dockes -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. */ /** \file pxattr.cpp \brief Portable External Attributes API - */ +*/ // PXALINUX: platforms like kfreebsd which aren't linux but use the // same xattr interface -#if defined(__linux__) || \ - (defined(__FreeBSD_kernel__)&&defined(__GLIBC__)&&!defined(__FreeBSD__)) ||\ +#if defined(__linux__) || \ + (defined(__FreeBSD_kernel__)&&defined(__GLIBC__)&&!defined(__FreeBSD__)) || \ defined(__CYGWIN__) #define PXALINUX #endif @@ -44,11 +44,13 @@ OTHER DEALINGS IN THE SOFTWARE. // just let the methods return errors (like they would on a non-xattr // fs on e.g. linux) -#if defined(__DragonFly__) || defined(__OpenBSD__) +// Not exactly true for win32, but makes my life easier by avoiding ifdefs in recoll (the calls just +// fail, which is expected) +#if defined(__DragonFly__) || defined(__OpenBSD__) || defined(_WIN32) #define HAS_NO_XATTR #endif -#if defined(__FreeBSD__) || defined(PXALINUX) || defined(__APPLE__) \ +#if defined(__FreeBSD__) || defined(PXALINUX) || defined(__APPLE__) \ || defined(HAS_NO_XATTR) @@ -80,14 +82,14 @@ public: AutoBuf() : buf(0) {} ~AutoBuf() {if (buf) free(buf); buf = 0;} bool alloc(int n) - { - if (buf) { - free(buf); - buf = 0; - } - buf = (char *)malloc(n); - return buf != 0; - } + { + if (buf) { + free(buf); + buf = 0; + } + buf = (char *)malloc(n); + return buf != 0; + } }; static bool @@ -96,92 +98,92 @@ get(int fd, const string& path, const string& _name, string *value, { string name; if (!sysname(dom, _name, &name)) - return false; + return false; ssize_t ret = -1; AutoBuf buf; #if defined(__FreeBSD__) if (fd < 0) { - if (flags & PXATTR_NOFOLLOW) { - ret = extattr_get_link(path.c_str(), EXTATTR_NAMESPACE_USER, - name.c_str(), 0, 0); + if (flags & PXATTR_NOFOLLOW) { + ret = extattr_get_link(path.c_str(), EXTATTR_NAMESPACE_USER, + name.c_str(), 0, 0); + } else { + ret = extattr_get_file(path.c_str(), EXTATTR_NAMESPACE_USER, + name.c_str(), 0, 0); + } } else { - ret = extattr_get_file(path.c_str(), EXTATTR_NAMESPACE_USER, - name.c_str(), 0, 0); - } - } else { - ret = extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, name.c_str(), 0, 0); + ret = extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, name.c_str(), 0, 0); } if (ret < 0) - return false; + return false; if (!buf.alloc(ret+1)) // Don't want to deal with possible ret=0 - return false; + return false; if (fd < 0) { - if (flags & PXATTR_NOFOLLOW) { - ret = extattr_get_link(path.c_str(), EXTATTR_NAMESPACE_USER, - name.c_str(), buf.buf, ret); + if (flags & PXATTR_NOFOLLOW) { + ret = extattr_get_link(path.c_str(), EXTATTR_NAMESPACE_USER, + name.c_str(), buf.buf, ret); + } else { + ret = extattr_get_file(path.c_str(), EXTATTR_NAMESPACE_USER, + name.c_str(), buf.buf, ret); + } } else { - ret = extattr_get_file(path.c_str(), EXTATTR_NAMESPACE_USER, - name.c_str(), buf.buf, ret); - } - } else { - ret = extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, - name.c_str(), buf.buf, ret); + ret = extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, + name.c_str(), buf.buf, ret); } #elif defined(PXALINUX) if (fd < 0) { - if (flags & PXATTR_NOFOLLOW) { - ret = lgetxattr(path.c_str(), name.c_str(), 0, 0); + if (flags & PXATTR_NOFOLLOW) { + ret = lgetxattr(path.c_str(), name.c_str(), 0, 0); + } else { + ret = getxattr(path.c_str(), name.c_str(), 0, 0); + } } else { - ret = getxattr(path.c_str(), name.c_str(), 0, 0); - } - } else { - ret = fgetxattr(fd, name.c_str(), 0, 0); + ret = fgetxattr(fd, name.c_str(), 0, 0); } if (ret < 0) - return false; + return false; if (!buf.alloc(ret+1)) // Don't want to deal with possible ret=0 - return false; + return false; if (fd < 0) { - if (flags & PXATTR_NOFOLLOW) { - ret = lgetxattr(path.c_str(), name.c_str(), buf.buf, ret); + if (flags & PXATTR_NOFOLLOW) { + ret = lgetxattr(path.c_str(), name.c_str(), buf.buf, ret); + } else { + ret = getxattr(path.c_str(), name.c_str(), buf.buf, ret); + } } else { - ret = getxattr(path.c_str(), name.c_str(), buf.buf, ret); - } - } else { - ret = fgetxattr(fd, name.c_str(), buf.buf, ret); + ret = fgetxattr(fd, name.c_str(), buf.buf, ret); } #elif defined(__APPLE__) if (fd < 0) { - if (flags & PXATTR_NOFOLLOW) { - ret = getxattr(path.c_str(), name.c_str(), 0, 0, 0, XATTR_NOFOLLOW); + if (flags & PXATTR_NOFOLLOW) { + ret = getxattr(path.c_str(), name.c_str(), 0, 0, 0, XATTR_NOFOLLOW); + } else { + ret = getxattr(path.c_str(), name.c_str(), 0, 0, 0, 0); + } } else { - ret = getxattr(path.c_str(), name.c_str(), 0, 0, 0, 0); - } - } else { - ret = fgetxattr(fd, name.c_str(), 0, 0, 0, 0); + ret = fgetxattr(fd, name.c_str(), 0, 0, 0, 0); } if (ret < 0) - return false; + return false; if (!buf.alloc(ret+1)) // Don't want to deal with possible ret=0 - return false; + return false; if (fd < 0) { - if (flags & PXATTR_NOFOLLOW) { - ret = getxattr(path.c_str(), name.c_str(), buf.buf, ret, 0, - XATTR_NOFOLLOW); + if (flags & PXATTR_NOFOLLOW) { + ret = getxattr(path.c_str(), name.c_str(), buf.buf, ret, 0, + XATTR_NOFOLLOW); + } else { + ret = getxattr(path.c_str(), name.c_str(), buf.buf, ret, 0, 0); + } } else { - ret = getxattr(path.c_str(), name.c_str(), buf.buf, ret, 0, 0); - } - } else { - ret = fgetxattr(fd, name.c_str(), buf.buf, ret, 0, 0); + ret = fgetxattr(fd, name.c_str(), buf.buf, ret, 0, 0); } #else errno = ENOTSUP; #endif if (ret >= 0) - value->assign(buf.buf, ret); + value->assign(buf.buf, ret); return ret >= 0; } @@ -191,87 +193,87 @@ set(int fd, const string& path, const string& _name, { string name; if (!sysname(dom, _name, &name)) - return false; + return false; ssize_t ret = -1; #if defined(__FreeBSD__) if (flags & (PXATTR_CREATE|PXATTR_REPLACE)) { - // Need to test existence - bool exists = false; - ssize_t eret; + // Need to test existence + bool exists = false; + ssize_t eret; + if (fd < 0) { + if (flags & PXATTR_NOFOLLOW) { + eret = extattr_get_link(path.c_str(), EXTATTR_NAMESPACE_USER, + name.c_str(), 0, 0); + } else { + eret = extattr_get_file(path.c_str(), EXTATTR_NAMESPACE_USER, + name.c_str(), 0, 0); + } + } else { + eret = extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, + name.c_str(), 0, 0); + } + if (eret >= 0) + exists = true; + if (eret < 0 && errno != ENOATTR) + return false; + if ((flags & PXATTR_CREATE) && exists) { + errno = EEXIST; + return false; + } + if ((flags & PXATTR_REPLACE) && !exists) { + errno = ENOATTR; + return false; + } + } if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { - eret = extattr_get_link(path.c_str(), EXTATTR_NAMESPACE_USER, - name.c_str(), 0, 0); + ret = extattr_set_link(path.c_str(), EXTATTR_NAMESPACE_USER, + name.c_str(), value.c_str(), value.length()); } else { - eret = extattr_get_file(path.c_str(), EXTATTR_NAMESPACE_USER, - name.c_str(), 0, 0); + ret = extattr_set_file(path.c_str(), EXTATTR_NAMESPACE_USER, + name.c_str(), value.c_str(), value.length()); } } else { - eret = extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, - name.c_str(), 0, 0); - } - if (eret >= 0) - exists = true; - if (eret < 0 && errno != ENOATTR) - return false; - if ((flags & PXATTR_CREATE) && exists) { - errno = EEXIST; - return false; - } - if ((flags & PXATTR_REPLACE) && !exists) { - errno = ENOATTR; - return false; - } - } - if (fd < 0) { - if (flags & PXATTR_NOFOLLOW) { - ret = extattr_set_link(path.c_str(), EXTATTR_NAMESPACE_USER, - name.c_str(), value.c_str(), value.length()); - } else { - ret = extattr_set_file(path.c_str(), EXTATTR_NAMESPACE_USER, - name.c_str(), value.c_str(), value.length()); - } - } else { - ret = extattr_set_fd(fd, EXTATTR_NAMESPACE_USER, - name.c_str(), value.c_str(), value.length()); + ret = extattr_set_fd(fd, EXTATTR_NAMESPACE_USER, + name.c_str(), value.c_str(), value.length()); } #elif defined(PXALINUX) int opts = 0; if (flags & PXATTR_CREATE) - opts = XATTR_CREATE; + opts = XATTR_CREATE; else if (flags & PXATTR_REPLACE) - opts = XATTR_REPLACE; + opts = XATTR_REPLACE; if (fd < 0) { - if (flags & PXATTR_NOFOLLOW) { - ret = lsetxattr(path.c_str(), name.c_str(), value.c_str(), - value.length(), opts); + if (flags & PXATTR_NOFOLLOW) { + ret = lsetxattr(path.c_str(), name.c_str(), value.c_str(), + value.length(), opts); + } else { + ret = setxattr(path.c_str(), name.c_str(), value.c_str(), + value.length(), opts); + } } else { - ret = setxattr(path.c_str(), name.c_str(), value.c_str(), - value.length(), opts); - } - } else { - ret = fsetxattr(fd, name.c_str(), value.c_str(), value.length(), opts); + ret = fsetxattr(fd, name.c_str(), value.c_str(), value.length(), opts); } #elif defined(__APPLE__) int opts = 0; if (flags & PXATTR_CREATE) - opts = XATTR_CREATE; + opts = XATTR_CREATE; else if (flags & PXATTR_REPLACE) - opts = XATTR_REPLACE; + opts = XATTR_REPLACE; if (fd < 0) { - if (flags & PXATTR_NOFOLLOW) { - ret = setxattr(path.c_str(), name.c_str(), value.c_str(), - value.length(), 0, XATTR_NOFOLLOW|opts); + if (flags & PXATTR_NOFOLLOW) { + ret = setxattr(path.c_str(), name.c_str(), value.c_str(), + value.length(), 0, XATTR_NOFOLLOW|opts); + } else { + ret = setxattr(path.c_str(), name.c_str(), value.c_str(), + value.length(), 0, opts); + } } else { - ret = setxattr(path.c_str(), name.c_str(), value.c_str(), - value.length(), 0, opts); - } - } else { - ret = fsetxattr(fd, name.c_str(), value.c_str(), - value.length(), 0, opts); + ret = fsetxattr(fd, name.c_str(), value.c_str(), + value.length(), 0, opts); } #else errno = ENOTSUP; @@ -284,41 +286,41 @@ del(int fd, const string& path, const string& _name, flags flags, nspace dom) { string name; if (!sysname(dom, _name, &name)) - return false; + return false; int ret = -1; #if defined(__FreeBSD__) if (fd < 0) { - if (flags & PXATTR_NOFOLLOW) { - ret = extattr_delete_link(path.c_str(), EXTATTR_NAMESPACE_USER, - name.c_str()); + if (flags & PXATTR_NOFOLLOW) { + ret = extattr_delete_link(path.c_str(), EXTATTR_NAMESPACE_USER, + name.c_str()); + } else { + ret = extattr_delete_file(path.c_str(), EXTATTR_NAMESPACE_USER, + name.c_str()); + } } else { - ret = extattr_delete_file(path.c_str(), EXTATTR_NAMESPACE_USER, - name.c_str()); - } - } else { - ret = extattr_delete_fd(fd, EXTATTR_NAMESPACE_USER, name.c_str()); + ret = extattr_delete_fd(fd, EXTATTR_NAMESPACE_USER, name.c_str()); } #elif defined(PXALINUX) if (fd < 0) { - if (flags & PXATTR_NOFOLLOW) { - ret = lremovexattr(path.c_str(), name.c_str()); + if (flags & PXATTR_NOFOLLOW) { + ret = lremovexattr(path.c_str(), name.c_str()); + } else { + ret = removexattr(path.c_str(), name.c_str()); + } } else { - ret = removexattr(path.c_str(), name.c_str()); - } - } else { - ret = fremovexattr(fd, name.c_str()); + ret = fremovexattr(fd, name.c_str()); } #elif defined(__APPLE__) if (fd < 0) { - if (flags & PXATTR_NOFOLLOW) { - ret = removexattr(path.c_str(), name.c_str(), XATTR_NOFOLLOW); + if (flags & PXATTR_NOFOLLOW) { + ret = removexattr(path.c_str(), name.c_str(), XATTR_NOFOLLOW); + } else { + ret = removexattr(path.c_str(), name.c_str(), 0); + } } else { - ret = removexattr(path.c_str(), name.c_str(), 0); - } - } else { - ret = fremovexattr(fd, name.c_str(), 0); + ret = fremovexattr(fd, name.c_str(), 0); } #else errno = ENOTSUP; @@ -334,75 +336,75 @@ list(int fd, const string& path, vector* names, flags flags, nspace dom) #if defined(__FreeBSD__) if (fd < 0) { - if (flags & PXATTR_NOFOLLOW) { - ret = extattr_list_link(path.c_str(), EXTATTR_NAMESPACE_USER, 0, 0); + if (flags & PXATTR_NOFOLLOW) { + ret = extattr_list_link(path.c_str(), EXTATTR_NAMESPACE_USER, 0, 0); + } else { + ret = extattr_list_file(path.c_str(), EXTATTR_NAMESPACE_USER, 0, 0); + } } else { - ret = extattr_list_file(path.c_str(), EXTATTR_NAMESPACE_USER, 0, 0); - } - } else { - ret = extattr_list_fd(fd, EXTATTR_NAMESPACE_USER, 0, 0); + ret = extattr_list_fd(fd, EXTATTR_NAMESPACE_USER, 0, 0); } if (ret < 0) - return false; + return false; if (!buf.alloc(ret+1)) // NEEDED on FreeBSD (no ending null) - return false; + return false; buf.buf[ret] = 0; if (fd < 0) { - if (flags & PXATTR_NOFOLLOW) { - ret = extattr_list_link(path.c_str(), EXTATTR_NAMESPACE_USER, - buf.buf, ret); + if (flags & PXATTR_NOFOLLOW) { + ret = extattr_list_link(path.c_str(), EXTATTR_NAMESPACE_USER, + buf.buf, ret); + } else { + ret = extattr_list_file(path.c_str(), EXTATTR_NAMESPACE_USER, + buf.buf, ret); + } } else { - ret = extattr_list_file(path.c_str(), EXTATTR_NAMESPACE_USER, - buf.buf, ret); - } - } else { - ret = extattr_list_fd(fd, EXTATTR_NAMESPACE_USER, buf.buf, ret); + ret = extattr_list_fd(fd, EXTATTR_NAMESPACE_USER, buf.buf, ret); } #elif defined(PXALINUX) if (fd < 0) { - if (flags & PXATTR_NOFOLLOW) { - ret = llistxattr(path.c_str(), 0, 0); + if (flags & PXATTR_NOFOLLOW) { + ret = llistxattr(path.c_str(), 0, 0); + } else { + ret = listxattr(path.c_str(), 0, 0); + } } else { - ret = listxattr(path.c_str(), 0, 0); - } - } else { - ret = flistxattr(fd, 0, 0); + ret = flistxattr(fd, 0, 0); } if (ret < 0) - return false; + return false; if (!buf.alloc(ret+1)) // Don't want to deal with possible ret=0 - return false; + return false; if (fd < 0) { - if (flags & PXATTR_NOFOLLOW) { - ret = llistxattr(path.c_str(), buf.buf, ret); + if (flags & PXATTR_NOFOLLOW) { + ret = llistxattr(path.c_str(), buf.buf, ret); + } else { + ret = listxattr(path.c_str(), buf.buf, ret); + } } else { - ret = listxattr(path.c_str(), buf.buf, ret); - } - } else { - ret = flistxattr(fd, buf.buf, ret); + ret = flistxattr(fd, buf.buf, ret); } #elif defined(__APPLE__) if (fd < 0) { - if (flags & PXATTR_NOFOLLOW) { - ret = listxattr(path.c_str(), 0, 0, XATTR_NOFOLLOW); + if (flags & PXATTR_NOFOLLOW) { + ret = listxattr(path.c_str(), 0, 0, XATTR_NOFOLLOW); + } else { + ret = listxattr(path.c_str(), 0, 0, 0); + } } else { - ret = listxattr(path.c_str(), 0, 0, 0); - } - } else { - ret = flistxattr(fd, 0, 0, 0); + ret = flistxattr(fd, 0, 0, 0); } if (ret < 0) - return false; + return false; if (!buf.alloc(ret+1)) // Don't want to deal with possible ret=0 - return false; + return false; if (fd < 0) { - if (flags & PXATTR_NOFOLLOW) { - ret = listxattr(path.c_str(), buf.buf, ret, XATTR_NOFOLLOW); + if (flags & PXATTR_NOFOLLOW) { + ret = listxattr(path.c_str(), buf.buf, ret, XATTR_NOFOLLOW); + } else { + ret = listxattr(path.c_str(), buf.buf, ret, 0); + } } else { - ret = listxattr(path.c_str(), buf.buf, ret, 0); - } - } else { - ret = flistxattr(fd, buf.buf, ret, 0); + ret = flistxattr(fd, buf.buf, ret, 0); } #else errno = ENOTSUP; @@ -419,9 +421,9 @@ list(int fd, const string& path, vector* names, flags flags, nspace dom) char *cp = buf.buf; unsigned int len; while (cp < buf.buf + ret + 1) { - len = *cp; - *cp = 0; - cp += len + 1; + len = *cp; + *cp = 0; + cp += len + 1; } bufstart = buf.buf + 1; *cp = 0; // don't forget, we allocated one more @@ -429,15 +431,15 @@ list(int fd, const string& path, vector* names, flags flags, nspace dom) if (ret > 0) { - int pos = 0; - while (pos < ret) { - string n = string(bufstart + pos); - string n1; - if (pxname(PXATTR_USER, n, &n1)) { - names->push_back(n1); + int pos = 0; + while (pos < ret) { + string n = string(bufstart + pos); + string n1; + if (pxname(PXATTR_USER, n, &n1)) { + names->push_back(n1); + } + pos += n.length() + 1; } - pos += n.length() + 1; - } } return true; } @@ -445,7 +447,7 @@ list(int fd, const string& path, vector* names, flags flags, nspace dom) static const string nullstring(""); bool get(const string& path, const string& _name, string *value, - flags flags, nspace dom) + flags flags, nspace dom) { return get(-1, path, _name, value, flags, dom); } @@ -454,12 +456,12 @@ bool get(int fd, const string& _name, string *value, flags flags, nspace dom) return get(fd, nullstring, _name, value, flags, dom); } bool set(const string& path, const string& _name, const string& value, - flags flags, nspace dom) + flags flags, nspace dom) { return set(-1, path, _name, value, flags, dom); } bool set(int fd, const string& _name, const string& value, - flags flags, nspace dom) + flags flags, nspace dom) { return set(fd, nullstring, _name, value, flags, dom); } @@ -488,9 +490,9 @@ static const string userstring(""); bool sysname(nspace dom, const string& pname, string* sname) { if (dom != PXATTR_USER) { - errno = EINVAL; - return false; - } + errno = EINVAL; + return false; + } *sname = userstring + pname; return true; } @@ -498,8 +500,8 @@ bool sysname(nspace dom, const string& pname, string* sname) bool pxname(nspace dom, const string& sname, string* pname) { if (!userstring.empty() && sname.find(userstring) != 0) { - errno = EINVAL; - return false; + errno = EINVAL; + return false; } *pname = sname.substr(userstring.length()); return true; @@ -553,18 +555,18 @@ static void quote(const string& in, string& out, int c) { out.clear(); for (string::const_iterator it = in.begin(); it != in.end(); it++) { - if (*it == '\\') { - out += "\\\\"; - } else if (*it == "\n"[0]) { - out += "\\n"; - } else if (*it == "\r"[0]) { - out += "\\r"; - } else if (*it == c) { - out += "\\"; - out += c; - } else { - out += *it; - } + if (*it == '\\') { + out += "\\\\"; + } else if (*it == "\n"[0]) { + out += "\\n"; + } else if (*it == "\r"[0]) { + out += "\\r"; + } else if (*it == c) { + out += "\\"; + out += c; + } else { + out += *it; + } } } @@ -573,20 +575,20 @@ static void unquote(const string& in, string& out) { out.clear(); for (unsigned int i = 0; i < in.size(); i++) { - if (in[i] == '\\') { - if (i == in.size() -1) { - out += in[i]; + if (in[i] == '\\') { + if (i == in.size() -1) { + out += in[i]; + } else { + int c = in[++i]; + switch (c) { + case 'n': out += "\n";break; + case 'r': out += "\r";break; + default: out += c; + } + } } else { - int c = in[++i]; - switch (c) { - case 'n': out += "\n";break; - case 'r': out += "\r";break; - default: out += c; + out += in[i]; } - } - } else { - out += in[i]; - } } } @@ -595,18 +597,18 @@ string::size_type find_first_unquoted(const string& in, int c) { int q = 0; for (unsigned int i = 0;i < in.size(); i++) { - if (in[i] == '\\') { - q++; - } else if (in[i] == c) { - if (q&1) { - // quoted - q = 0; + if (in[i] == '\\') { + q++; + } else if (in[i] == c) { + if (q&1) { + // quoted + q = 0; + } else { + return i; + } } else { - return i; + q = 0; } - } else { - q = 0; - } } return string::npos; } @@ -616,11 +618,11 @@ static bool listattrs(const string& path) { vector names; if (!pxattr::list(path, &names)) { - if (errno == ENOENT) { - return false; - } - printsyserr("pxattr::list"); - exit(1); + if (errno == ENOENT) { + return false; + } + printsyserr("pxattr::list"); + exit(1); } if (names.empty()) { return true; @@ -634,19 +636,19 @@ static bool listattrs(const string& path) quote(path, quoted, 0); message(PATH_START << quoted << endl); for (vector::const_iterator it = names.begin(); - it != names.end(); it++) { - string value; - if (!pxattr::get(path, *it, &value)) { - if (errno == ENOENT) { - return false; + it != names.end(); it++) { + string value; + if (!pxattr::get(path, *it, &value)) { + if (errno == ENOENT) { + return false; + } + printsyserr("pxattr::get"); + exit(1); } - printsyserr("pxattr::get"); - exit(1); - } - quote(*it, quoted, '='); - message(" " << quoted << "="); - quote(value, quoted, 0); - message(quoted << endl); + quote(*it, quoted, '='); + message(" " << quoted << "="); + quote(value, quoted, 0); + message(quoted << endl); } return true; } @@ -654,8 +656,8 @@ static bool listattrs(const string& path) bool setxattr(const string& path, const string& name, const string& value) { if (!pxattr::set(path, name, value)) { - printsyserr("pxattr::set"); - return false; + printsyserr("pxattr::set"); + return false; } return true; } @@ -664,10 +666,10 @@ bool printxattr(const string &path, const string& name) { string value; if (!pxattr::get(path, name, &value)) { - if (errno == ENOENT) { - return false; - } - printsyserr("pxattr::get"); + if (errno == ENOENT) { + return false; + } + printsyserr("pxattr::get"); return false; } message(PATH_START << path << endl); @@ -678,7 +680,7 @@ bool printxattr(const string &path, const string& name) bool delxattr(const string &path, const string& name) { if (pxattr::del(path, name) < 0) { - printsyserr("pxattr::del"); + printsyserr("pxattr::del"); return false; } return true; @@ -690,10 +692,10 @@ static void restore(const char *backupnm) istream *input; ifstream fin; if (!strcmp(backupnm, "stdin")) { - input = &cin; + input = &cin; } else { - fin.open(backupnm, ios::in); - input = &fin; + fin.open(backupnm, ios::in); + input = &fin; } bool done = false; @@ -701,72 +703,72 @@ static void restore(const char *backupnm) string path; map attrs; while (!done) { - string line; - getline(*input, line); - if (!input->good()) { - if (input->bad()) { + string line; + getline(*input, line); + if (!input->good()) { + if (input->bad()) { cerr << "Input I/O error" << endl; - exit(1); + exit(1); + } + done = true; + } else { + linenum++; } - done = true; - } else { - linenum++; - } - // message("Got line " << linenum << " : [" << line << "] done " << - // done << endl); + // message("Got line " << linenum << " : [" << line << "] done " << + // done << endl); - if (line.find(PATH_START) == 0 || done) { - if (!path.empty() && !attrs.empty()) { - for (map::const_iterator it = attrs.begin(); - it != attrs.end(); it++) { - setxattr(path, it->first, it->second); + if (line.find(PATH_START) == 0 || done) { + if (!path.empty() && !attrs.empty()) { + for (map::const_iterator it = attrs.begin(); + it != attrs.end(); it++) { + setxattr(path, it->first, it->second); + } + } + if (!done) { + line = line.substr(PATH_START.size(), string::npos); + unquote(line, path); + attrs.clear(); + } + } else if (line.empty()) { + continue; + } else { + // Should be attribute line + if (line[0] != ' ') { + cerr << "Found bad line (no space) at " << linenum << endl; + exit(1); + } + string::size_type pos = find_first_unquoted(line, '='); + if (pos == string::npos || pos < 2 || pos >= line.size()) { + cerr << "Found bad line at " << linenum << endl; + exit(1); + } + string qname = line.substr(1, pos-1); + pair entry; + unquote(qname, entry.first); + unquote(line.substr(pos+1), entry.second); + attrs.insert(entry); } - } - if (!done) { - line = line.substr(PATH_START.size(), string::npos); - unquote(line, path); - attrs.clear(); - } - } else if (line.empty()) { - continue; - } else { - // Should be attribute line - if (line[0] != ' ') { - cerr << "Found bad line (no space) at " << linenum << endl; - exit(1); - } - string::size_type pos = find_first_unquoted(line, '='); - if (pos == string::npos || pos < 2 || pos >= line.size()) { - cerr << "Found bad line at " << linenum << endl; - exit(1); - } - string qname = line.substr(1, pos-1); - pair entry; - unquote(qname, entry.first); - unquote(line.substr(pos+1), entry.second); - attrs.insert(entry); - } } } static char *thisprog; static char usage [] = -"pxattr [-hs] -n name pathname [...] : show value for name\n" -"pxattr [-hs] -n name -r regexp pathname [...] : test value against regexp\n" -"pxattr [-hs] -n name -v value pathname [...] : add/replace attribute\n" -"pxattr [-hs] -x name pathname [...] : delete attribute\n" -"pxattr [-hs] [-l] [-R] pathname [...] : list attribute names and values\n" -" For all the options above, if no pathname arguments are given, pxattr\n" -" will read file names on stdin, one per line.\n" -" [-h] : don't follow symbolic links (act on link itself)\n" -" [-R] : recursive listing. Args should be directory(ies)\n" -" [-s] : be silent. With one option stdout is suppressed, with 2 stderr too\n" -"pxattr -S Restore xattrs from file created by pxattr -lR output\n" -" if backupfile is 'stdin', reads from stdin\n" -"pxattr -T: run tests on temp file in current directory" -"\n" -; + "pxattr [-hs] -n name pathname [...] : show value for name\n" + "pxattr [-hs] -n name -r regexp pathname [...] : test value against regexp\n" + "pxattr [-hs] -n name -v value pathname [...] : add/replace attribute\n" + "pxattr [-hs] -x name pathname [...] : delete attribute\n" + "pxattr [-hs] [-l] [-R] pathname [...] : list attribute names and values\n" + " For all the options above, if no pathname arguments are given, pxattr\n" + " will read file names on stdin, one per line.\n" + " [-h] : don't follow symbolic links (act on link itself)\n" + " [-R] : recursive listing. Args should be directory(ies)\n" + " [-s] : be silent. With one option stdout is suppressed, with 2 stderr too\n" + "pxattr -S Restore xattrs from file created by pxattr -lR output\n" + " if backupfile is 'stdin', reads from stdin\n" + "pxattr -T: run tests on temp file in current directory" + "\n" + ; static void Usage(void) { @@ -794,10 +796,10 @@ bool regex_test(const char *path, regex_t *preg) { string value; if (!pxattr::get(path, name, &value)) { - if (errno == ENOENT) { - return false; - } - printsyserr("pxattr::get"); + if (errno == ENOENT) { + return false; + } + printsyserr("pxattr::get"); return false; } @@ -821,15 +823,15 @@ bool processfile(const char* fn, const struct stat *, int) //message("processfile " << fn << " opflags " << op_flags << endl); if (op_flags & OPT_l) { - return listattrs(fn); + return listattrs(fn); } else if (op_flags & OPT_n) { - if (op_flags & OPT_v) { - return setxattr(fn, name, value); - } else { - return printxattr(fn, name); - } + if (op_flags & OPT_v) { + return setxattr(fn, name, value); + } else { + return printxattr(fn, name); + } } else if (op_flags & OPT_x) { - return delxattr(fn, name); + return delxattr(fn, name); } Usage(); } @@ -847,49 +849,49 @@ int main(int argc, char **argv) argc--; argv++; while (argc > 0 && **argv == '-') { - (*argv)++; - if (!(**argv)) - /* Cas du "adb - core" */ - Usage(); - while (**argv) - switch (*(*argv)++) { - case 'l': op_flags |= OPT_l; break; - case 'n': op_flags |= OPT_n; if (argc < 2) Usage(); - name = *(++argv); argc--; - goto b1; - case 'R': op_flags |= OPT_R; break; - case 'r': op_flags |= OPT_r; if (argc < 2) Usage(); - regexp_string = *(++argv); argc--; - goto b1; - case 's': antiverbose++; break; - case 'S': op_flags |= OPT_S; break; - case 'T': op_flags |= OPT_T; break; - case 'v': op_flags |= OPT_v; if (argc < 2) Usage(); - value = *(++argv); argc--; - goto b1; - case 'x': op_flags |= OPT_x; if (argc < 2) Usage(); - name = *(++argv); argc--; - goto b1; - default: Usage(); break; - } + (*argv)++; + if (!(**argv)) + /* Cas du "adb - core" */ + Usage(); + while (**argv) + switch (*(*argv)++) { + case 'l': op_flags |= OPT_l; break; + case 'n': op_flags |= OPT_n; if (argc < 2) Usage(); + name = *(++argv); argc--; + goto b1; + case 'R': op_flags |= OPT_R; break; + case 'r': op_flags |= OPT_r; if (argc < 2) Usage(); + regexp_string = *(++argv); argc--; + goto b1; + case 's': antiverbose++; break; + case 'S': op_flags |= OPT_S; break; + case 'T': op_flags |= OPT_T; break; + case 'v': op_flags |= OPT_v; if (argc < 2) Usage(); + value = *(++argv); argc--; + goto b1; + case 'x': op_flags |= OPT_x; if (argc < 2) Usage(); + name = *(++argv); argc--; + goto b1; + default: Usage(); break; + } b1: argc--; argv++; } if (op_flags & OPT_T) { - if (argc > 0) - Usage(); - dotests(); - exit(0); + if (argc > 0) + Usage(); + dotests(); + exit(0); } if ((op_flags & OPT_r) && !(op_flags & OPT_n)) { Usage(); } if (op_flags & OPT_S) { - if (argc != 1) - Usage(); - restore(argv[0]); - exit(0); + if (argc != 1) + Usage(); + restore(argv[0]); + exit(0); } regex_t regexp; if (op_flags & OPT_r) { @@ -905,39 +907,39 @@ int main(int argc, char **argv) // Default option is 'list' if ((op_flags&(OPT_l|OPT_n|OPT_x)) == 0) - op_flags |= OPT_l; + op_flags |= OPT_l; bool readstdin = false; if (argc == 0) - readstdin = true; + readstdin = true; int exitvalue = 0; for (;;) { - const char *fn = 0; - if (argc > 0) { - fn = *argv++; - argc--; - } else if (readstdin) { - static char filename[1025]; - if (!fgets(filename, 1024, stdin)) - break; - filename[strlen(filename)-1] = 0; - fn = filename; - } else - break; + const char *fn = 0; + if (argc > 0) { + fn = *argv++; + argc--; + } else if (readstdin) { + static char filename[1025]; + if (!fgets(filename, 1024, stdin)) + break; + filename[strlen(filename)-1] = 0; + fn = filename; + } else + break; - if (op_flags & OPT_R) { - if (ftw(fn, ftwprocessfile, 20)) - exit(1); - } else if (op_flags & OPT_r) { + if (op_flags & OPT_R) { + if (ftw(fn, ftwprocessfile, 20)) + exit(1); + } else if (op_flags & OPT_r) { if (!regex_test(fn, ®exp)) { exitvalue = 1; } } else { - if (!processfile(fn, 0, 0)) { + if (!processfile(fn, 0, 0)) { exitvalue = 1; } - } + } } exit(exitvalue); @@ -958,39 +960,39 @@ static bool testbackups() static const char *tfn2 = "tpxattr2.txt"; static const char *dump = "attrdump.txt"; static const char *NAMES[] = {"ORG.PXATTR.NAME1", - "ORG=PXATTR\"=\\=\n", - "=", "Name4"}; + "ORG=PXATTR\"=\\=\n", + "=", "Name4"}; static const char *VALUES[] = - {"VALUE1", "VALUE2", "VALUE3=VALUE3equal", - "VALUE4\n is more like" - " normal text\n with new lines and \"\\\" \\\" backslashes"}; + {"VALUE1", "VALUE2", "VALUE3=VALUE3equal", + "VALUE4\n is more like" + " normal text\n with new lines and \"\\\" \\\" backslashes"}; static const int nattrs = sizeof(NAMES) / sizeof(char *); if (mkdir(top, 0777)) - fatal("Cant mkdir ttop"); + fatal("Cant mkdir ttop"); if (chdir(top)) - fatal("cant chdir ttop"); + fatal("cant chdir ttop"); if (mkdir(d1, 0777) || mkdir(d2, 0777)) - fatal("Can't mkdir ttdop/dx\n"); + fatal("Can't mkdir ttdop/dx\n"); if (chdir(d1)) - fatal("chdir d1"); + fatal("chdir d1"); int fd; if ((fd = open(tfn1, O_RDWR|O_CREAT, 0755)) < 0) - fatal("create d1/tpxattr1.txt"); + fatal("create d1/tpxattr1.txt"); /* Set attrs */ for (int i = 0; i < nattrs; i++) { - if (!pxattr::set(fd, NAMES[i], VALUES[i])) - fatal("pxattr::set"); + if (!pxattr::set(fd, NAMES[i], VALUES[i])) + fatal("pxattr::set"); } close(fd); if ((fd = open(tfn2, O_RDWR|O_CREAT, 0755)) < 0) - fatal("create d1/tpxattr2.txt"); + fatal("create d1/tpxattr2.txt"); /* Set attrs */ for (int i = 0; i < nattrs; i++) { - if (!pxattr::set(fd, NAMES[i], VALUES[i])) - fatal("pxattr::set"); + if (!pxattr::set(fd, NAMES[i], VALUES[i])) + fatal("pxattr::set"); } close(fd); @@ -998,44 +1000,44 @@ static bool testbackups() string cmd; cmd = string("pxattr -lR . > " ) + dump; if (system(cmd.c_str())) - fatal(cmd + " in d1"); + fatal(cmd + " in d1"); if (chdir("../d2")) - fatal("chdir ../d2"); + fatal("chdir ../d2"); if (close(open(tfn1, O_RDWR|O_CREAT, 0755))) - fatal("create d2/tpxattr.txt"); + fatal("create d2/tpxattr.txt"); if (close(open(tfn2, O_RDWR|O_CREAT, 0755))) - fatal("create d2/tpxattr.txt"); + fatal("create d2/tpxattr.txt"); cmd = string("pxattr -S ../d1/" ) + dump; if (system(cmd.c_str())) - fatal(cmd); + fatal(cmd); cmd = string("pxattr -lR . > " ) + dump; if (system(cmd.c_str())) - fatal(cmd + " in d2"); + fatal(cmd + " in d2"); cmd = string("diff ../d1/") + dump + " " + dump; if (system(cmd.c_str())) - fatal(cmd); + fatal(cmd); cmd = string("cat ") + dump; system(cmd.c_str()); if (1) { - unlink(dump); - unlink(tfn1); - unlink(tfn2); - if (chdir("../d1")) - fatal("chdir ../d1"); - unlink(dump); - unlink(tfn1); - unlink(tfn2); - if (chdir("../")) - fatal("chdir .. 1"); - if (rmdir(d1)) - fatal("rmdir d1"); - if (rmdir(d2)) - fatal("rmdir d2"); - if (chdir("../")) - fatal("chdir .. 2"); - if (rmdir(top)) - fatal("rmdir ttop"); + unlink(dump); + unlink(tfn1); + unlink(tfn2); + if (chdir("../d1")) + fatal("chdir ../d1"); + unlink(dump); + unlink(tfn1); + unlink(tfn2); + if (chdir("../")) + fatal("chdir .. 1"); + if (rmdir(d1)) + fatal("rmdir d1"); + if (rmdir(d2)) + fatal("rmdir d2"); + if (chdir("../")) + fatal("chdir .. 2"); + if (rmdir(top)) + fatal("rmdir ttop"); } return true; } @@ -1044,122 +1046,122 @@ static void dotests() { static const char *tfn = "pxattr_testtmp.xyz"; static const char *NAMES[] = {"ORG.PXATTR.NAME1", "ORG.PXATTR.N2", - "ORG.PXATTR.LONGGGGGGGGisSSSHHHHHHHHHNAME3"}; + "ORG.PXATTR.LONGGGGGGGGisSSSHHHHHHHHHNAME3"}; static const char *VALUES[] = {"VALUE1", "VALUE2", "VALUE3"}; /* Create test file if it doesn't exist, remove all attributes */ int fd = open(tfn, O_RDWR|O_CREAT, 0755); if (fd < 0) { - printsyserr("open/create"); - exit(1); + printsyserr("open/create"); + exit(1); } if (!antiverbose) - message("Cleanup old attrs\n"); + message("Cleanup old attrs\n"); vector names; if (!pxattr::list(tfn, &names)) { - printsyserr("pxattr::list"); - exit(1); - } - for (vector::const_iterator it = names.begin(); - it != names.end(); it++) { - string value; - if (!pxattr::del(fd, *it)) { - printsyserr("pxattr::del"); + printsyserr("pxattr::list"); exit(1); } + for (vector::const_iterator it = names.begin(); + it != names.end(); it++) { + string value; + if (!pxattr::del(fd, *it)) { + printsyserr("pxattr::del"); + exit(1); + } } /* Check that there are no attributes left */ names.clear(); if (!pxattr::list(tfn, &names)) { - printsyserr("pxattr::list"); - exit(1); + printsyserr("pxattr::list"); + exit(1); } if (names.size() != 0) { - errno=0;printsyserr("Attributes remain after initial cleanup !\n"); - for (vector::const_iterator it = names.begin(); - it != names.end(); it++) { + errno=0;printsyserr("Attributes remain after initial cleanup !\n"); + for (vector::const_iterator it = names.begin(); + it != names.end(); it++) { if (antiverbose < 2) cerr << *it << endl; - } - exit(1); + } + exit(1); } /* Create attributes, check existence and value */ message("Creating extended attributes\n"); for (int i = 0; i < 3; i++) { - if (!pxattr::set(fd, NAMES[i], VALUES[i])) { - printsyserr("pxattr::set"); - exit(1); - } + if (!pxattr::set(fd, NAMES[i], VALUES[i])) { + printsyserr("pxattr::set"); + exit(1); + } } message("Checking creation\n"); for (int i = 0; i < 3; i++) { - string value; - if (!pxattr::get(tfn, NAMES[i], &value)) { - printsyserr("pxattr::get"); - exit(1); - } - if (value.compare(VALUES[i])) { + string value; + if (!pxattr::get(tfn, NAMES[i], &value)) { + printsyserr("pxattr::get"); + exit(1); + } + if (value.compare(VALUES[i])) { errno = 0; - printsyserr("Wrong value after create !"); - exit(1); - } + printsyserr("Wrong value after create !"); + exit(1); + } } /* Delete one, check list */ message("Delete one\n"); if (!pxattr::del(tfn, NAMES[1])) { - printsyserr("pxattr::del one name"); - exit(1); + printsyserr("pxattr::del one name"); + exit(1); } message("Check list\n"); for (int i = 0; i < 3; i++) { - string value; - if (!pxattr::get(fd, NAMES[i], &value)) { - if (i == 1) - continue; - printsyserr("pxattr::get"); - exit(1); - } else if (i == 1) { - errno=0; + string value; + if (!pxattr::get(fd, NAMES[i], &value)) { + if (i == 1) + continue; + printsyserr("pxattr::get"); + exit(1); + } else if (i == 1) { + errno=0; printsyserr("Name at index 1 still exists after deletion\n"); - exit(1); - } - if (value.compare(VALUES[i])) { + exit(1); + } + if (value.compare(VALUES[i])) { errno = 0; - printsyserr("Wrong value after delete 1 !"); - exit(1); - } + printsyserr("Wrong value after delete 1 !"); + exit(1); + } } /* Test the CREATE/REPLACE flags */ // Set existing with flag CREATE should fail message("Testing CREATE/REPLACE flags use\n"); if (pxattr::set(tfn, NAMES[0], VALUES[0], pxattr::PXATTR_CREATE)) { - errno=0;printsyserr("Create existing with flag CREATE succeeded !\n"); - exit(1); + errno=0;printsyserr("Create existing with flag CREATE succeeded !\n"); + exit(1); } // Set new with flag REPLACE should fail if (pxattr::set(tfn, NAMES[1], VALUES[1], pxattr::PXATTR_REPLACE)) { - errno=0;printsyserr("Create new with flag REPLACE succeeded !\n"); - exit(1); + errno=0;printsyserr("Create new with flag REPLACE succeeded !\n"); + exit(1); } // Set new with flag CREATE should succeed if (!pxattr::set(fd, NAMES[1], VALUES[1], pxattr::PXATTR_CREATE)) { - errno=0;printsyserr("Create new with flag CREATE failed !\n"); - exit(1); + errno=0;printsyserr("Create new with flag CREATE failed !\n"); + exit(1); } // Set existing with flag REPLACE should succeed if (!pxattr::set(fd, NAMES[0], VALUES[0], pxattr::PXATTR_REPLACE)) { - errno=0;printsyserr("Create existing with flag REPLACE failed !\n"); - exit(1); + errno=0;printsyserr("Create existing with flag REPLACE failed !\n"); + exit(1); } close(fd); unlink(tfn); if (testbackups()) - exit(0); + exit(0); exit(1); } #endif // Testing pxattr diff --git a/src/utils/readfile.cpp b/src/utils/readfile.cpp index 0ad5c2a9..d71d2ec6 100644 --- a/src/utils/readfile.cpp +++ b/src/utils/readfile.cpp @@ -35,7 +35,7 @@ #define OPEN _wopen #else -#define O_BINARY 0 + #include #include #include diff --git a/src/utils/wipedir.cpp b/src/utils/wipedir.cpp index 847b04a1..c03a8fca 100644 --- a/src/utils/wipedir.cpp +++ b/src/utils/wipedir.cpp @@ -24,12 +24,6 @@ #include "log.h" #include "pathut.h" -#ifdef _WIN32 -# include "safeunistd.h" -#else // Not windows -> -# include -#endif - int wipedir(const std::string& dir, bool selfalso, bool recurse) {