Annotation of solidite/utils/chmod.cpp, revision 1.1.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>