Annotation of solidite/utils/kill.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 <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>