Annotation of solidite/utils/kill.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 <iostream>
        !            18: #include <vector>
        !            19: 
        !            20: #include <cstddef>
        !            21: #include <cstdint>
        !            22: #include <cstring>
        !            23: 
        !            24: #include <libintl.h>
        !            25: #include <signal.h>
        !            26: 
        !            27: /* Questionably IEEE Std 1003.1-2024 and XSI conformant
        !            28:  * needs testing */
        !            29: 
        !            30: constexpr char SIGNALS_LIST[] = "SIGHUP SIGINT SIGQUIT SIGABRT SIGKILL SIGALRM"
        !            31:                                 " SIGTERM\n";
        !            32: 
        !            33: int main(int argc, char* argv[]) {
        !            34:   // locale work
        !            35:   std::locale::global(std::locale(""));
        !            36:   std::cerr.imbue(std::locale()); 
        !            37: 
        !            38:   std::bitset<2> options = 0b00;
        !            39:   // options[0]=skip next arg from being processed
        !            40:   // options[1]=stop processing arguments (-- encountered)
        !            41:   std::vector<std::size_t> pids;
        !            42:   int signal = 15;
        !            43: 
        !            44:   for (int i = 1; i < argc; ++i) {
        !            45:     if (options.test(0) == 1) {
        !            46:       options.reset(0);
        !            47:       continue;
        !            48:     } else if (std::strcmp(argv[i], "--") == 0 && options.test(1) == 0) {
        !            49:       options.set(1);
        !            50:       continue;
        !            51:     } else if (options.test(1) == 1) {
        !            52:       pids.push_back(std::atoi(argv[i]));
        !            53:       continue;
        !            54:     }
        !            55: 
        !            56:     if (std::strcmp(argv[i], "-l") == 0 && argv[i + 1] == nullptr) {
        !            57:       std::cout << SIGNALS_LIST;
        !            58:       return 0;
        !            59:     } else if (std::strcmp(argv[i], "-l") == 0) {
        !            60:       switch (std::atoi(argv[i + 1])) {
        !            61:         case 0:
        !            62:           std::cout << "0\n";
        !            63:           options.set(0);
        !            64:           break;
        !            65:         case 1:
        !            66:           std::cout << "HUP\n";
        !            67:           options.set(0);
        !            68:           break;
        !            69:         case 2:
        !            70:           std::cout << "INT\n";
        !            71:           options.set(0);
        !            72:           break;
        !            73:         case 3:
        !            74:           std::cout << "QUIT\n";
        !            75:           options.set(0);
        !            76:           break;
        !            77:         case 6:
        !            78:           std::cout << "ABRT\n";
        !            79:           options.set(0);
        !            80:           break;
        !            81:         case 9:
        !            82:           std::cout << "KILL\n";
        !            83:           options.set(0);
        !            84:           break;
        !            85:         case 14:
        !            86:           std::cout << "ALRM\n";
        !            87:           options.set(0);
        !            88:           break;
        !            89:         case 15:
        !            90:           std::cout << "TERM\n";
        !            91:           options.set(0);
        !            92:           break;
        !            93:         default:
        !            94:           std::cerr << "bad signal\n";
        !            95:           options.set(0);
        !            96:           break;
        !            97:       }
        !            98:     } else if (std::strcmp(argv[i], "-s") == 0) {
        !            99:       if (argv[i + 1] == nullptr) {
        !           100:         std::cerr << "signal name required after -s\n";
        !           101:         continue;
        !           102:       }
        !           103:       if (std::strcmp(argv[i + 1], "0") == 0) {
        !           104:         signal = 0;
        !           105:       } else if (std::strcmp(argv[i + 1], "HUP") == 0) {
        !           106:         signal = 1;
        !           107:       } else if (std::strcmp(argv[i + 1], "INT") == 0) {
        !           108:         signal = 2;
        !           109:       } else if (std::strcmp(argv[i + 1], "QUIT") == 0) {
        !           110:         signal = 3;
        !           111:       } else if (std::strcmp(argv[i + 1], "ABRT") == 0) {
        !           112:         signal = 6;
        !           113:       } else if (std::strcmp(argv[i + 1], "KILL") == 0) {
        !           114:         signal = 9;
        !           115:       } else if (std::strcmp(argv[i + 1], "ALRM") == 0) {
        !           116:         signal = 14;
        !           117:       } else if (std::strcmp(argv[i + 1], "TERM") == 0) {
        !           118:         signal = 15;
        !           119:       } else {
        !           120:         std::cerr << "bad signal name\n";
        !           121:       }
        !           122:       options.set(0);
        !           123:       continue;
        !           124:     } else if (std::strcmp(argv[i], "-0") == 0) {
        !           125:       signal = 0;
        !           126:     } else if (std::strcmp(argv[i], "-1") == 0) {
        !           127:       signal = 1;
        !           128:     } else if (std::strcmp(argv[i], "-2") == 0) {
        !           129:       signal = 2;
        !           130:     } else if (std::strcmp(argv[i], "-3") == 0) {
        !           131:       signal = 3;
        !           132:     } else if (std::strcmp(argv[i], "-6") == 0) {
        !           133:       signal = 6;
        !           134:     } else if (std::strcmp(argv[i], "-9") == 0) {
        !           135:       signal = 9;
        !           136:     } else if (std::strcmp(argv[i], "-14") == 0) {
        !           137:       signal = 14;
        !           138:     } else if (std::strcmp(argv[i], "-15") == 0) {
        !           139:       signal = 15;
        !           140:     } else if (std::strcmp(argv[i], "-UP") == 0) {
        !           141:       signal = 1;
        !           142:     } else if (std::strcmp(argv[i], "-INT") == 0) {
        !           143:       signal = 2;
        !           144:     } else if (std::strcmp(argv[i], "-QUIT") == 0) {
        !           145:       signal = 3;
        !           146:     } else if (std::strcmp(argv[i], "-ABRT") == 0) {
        !           147:       signal = 6;
        !           148:     } else if (std::strcmp(argv[i], "-KILL") == 0) {
        !           149:       signal = 9;
        !           150:     } else if (std::strcmp(argv[i], "-ALRM") == 0) {
        !           151:       signal = 14;
        !           152:     } else if (std::strcmp(argv[i], "-TERM") == 0) {
        !           153:       signal =  15;
        !           154:     } else {
        !           155:       pids.push_back(std::atoi(argv[i]));
        !           156:     }
        !           157:   }
        !           158:   for (std::size_t pid : pids) {
        !           159:     kill(pid, signal); 
        !           160:   }
        !           161:   return 0;
        !           162: }

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