Annotation of solidite/utils/chmod.cpp, revision 1.1

1.1     ! user        1: /* Copyright (c) 2026 The Solidite Developers
        !             2:  *
        !             3:  * This program is free software: you can redistribute it and/or modify it under
        !             4:  * the terms of the GNU Affero General Public License as published by the Free
        !             5:  * Software Foundation, either version 3 of the License, or (at your option)
        !             6:  * any later version.
        !             7:  *
        !             8:  * This program is distributed in the hope that it will be useful, but WITHOUT
        !             9:  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
        !            10:  * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
        !            11:  * details.
        !            12:  *
        !            13:  * You should have received a copy of the GNU Affero General Public License
        !            14:  * along with this program. If not, see <https://www.gnu.org/licenses/>. */
        !            15: 
        !            16: #include <bitset>
        !            17: #include <filesystem>
        !            18: #include <iostream>
        !            19: #include <locale>
        !            20: #include <string>
        !            21: #include <sstream>
        !            22: #include <vector>
        !            23: 
        !            24: #include <cstdint>
        !            25: #include <cstring>
        !            26: 
        !            27: #include <sys/stat.h>
        !            28: 
        !            29: int main(int argc, char* argv[]) {
        !            30:   // locale work
        !            31:   std::locale::global(std::locale(""));
        !            32:   std::cout.imbue(std::locale()); 
        !            33:   std::wcout.imbue(std::locale()); 
        !            34:   std::cerr.imbue(std::locale()); 
        !            35:   std::wcerr.imbue(std::locale()); 
        !            36: 
        !            37:   std::bitset<3> options = 0b001;
        !            38:   /* options[0]=process args? (-- not encountered), set to 0 if --
        !            39:    * options[1]=recursive (if -R then true)
        !            40:    * options[2]=mode found (if not found then error)
        !            41:    * reminder std::bitset initializes RTL so 001 sets [0] to true*/
        !            42: 
        !            43:   std::vector<char*> files;
        !            44:   uint_fast16_t mode = 511;
        !            45:   // mode will get converted to octal
        !            46: 
        !            47:   for (int i = 1; i < argc; ++i) {
        !            48:     if (options.test(0) == 0)
        !            49:       files.push_back(argv[i]);
        !            50:     else if (std::strcmp(argv[i], "--") == 0)
        !            51:       options.reset(0);
        !            52:     else if (options.test(1) == 0 && std::strcmp(argv[i], "-R") == 0)
        !            53:       options.set(1);
        !            54:     else if (options.test(2) == 0) {
        !            55:       try {
        !            56:         std::istringstream(argv[i]) >> std::oct >> mode;
        !            57:       } catch (...) {
        !            58:         std::cerr << "not an octal integer: " + std::string(argv[i]) + '\n';
        !            59:         return 1;
        !            60:       }
        !            61:       options.set(2);
        !            62:     } else
        !            63:       files.push_back(argv[i]);
        !            64:   }
        !            65: 
        !            66:   for (char* file : files) {
        !            67:     try {
        !            68:       if (options.test(1) == 0) {
        !            69:         chmod(file, mode);
        !            70:       } else {
        !            71:         // loop through the files/folders recursively and chmod them
        !            72:         chmod(file, mode); // chmod the original directory
        !            73:         for (const std::filesystem::directory_entry& ENTRY :
        !            74:              std::filesystem::recursive_directory_iterator(file)) {
        !            75:           std::string what;
        !            76:           chmod(ENTRY.path().string().c_str(), mode); // chmod the subdirectories
        !            77:         }
        !            78:       }
        !            79:     } catch (...) {
        !            80:       std::cerr << "failed to change permissions: " + std::string(file) + '\n';
        !            81:       return 1;
        !            82:     }
        !            83:   }
        !            84:   return 0;
        !            85: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>