Annotation of solidite/utils/uname.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 <locale>
! 19: #include <string>
! 20:
! 21: #include <cstddef>
! 22: #include <cstdint>
! 23: #include <cstring>
! 24:
! 25: #include <sys/utsname.h>
! 26:
! 27: int main(int argc, char* argv[]) {
! 28: // locale work
! 29: std::locale::global(std::locale(""));
! 30: std::cerr.imbue(std::locale());
! 31:
! 32: std::bitset<6> options = 0b000000;
! 33: /* options[0]=print system hardware type (-m)
! 34: * options[1]=write node (-n)
! 35: * options[2]=write OS release level (-r)
! 36: * options[3]=write the name of the operating system (-s)
! 37: * options[4]=write OS version level of the OS release (-v)
! 38: * options[5]=error occurred, return code 1*/
! 39:
! 40: for (int i = 1; i < argc; ++i) {
! 41: if (argv[i][0] != '-')
! 42: continue;
! 43: for (std::size_t j = 1; j < strlen(argv[i]); ++j) {
! 44: switch (argv[i][j]) {
! 45: case 'a':
! 46: for (int i = 0; i < 5; ++i)
! 47: options.set(i);
! 48: break;
! 49: case 'm':
! 50: options.set(0);
! 51: break;
! 52: case 'n':
! 53: options.set(1);
! 54: break;
! 55: case 'r':
! 56: options.set(2);
! 57: break;
! 58: case 's':
! 59: options.set(3);
! 60: break;
! 61: case 'v':
! 62: options.set(4);
! 63: break;
! 64: default:
! 65: std::cerr << "bad option\n";
! 66: options.set(5);
! 67: break;
! 68: }
! 69: }
! 70: }
! 71:
! 72: if (options == 0)
! 73: options.set(3);
! 74:
! 75: struct utsname uts_name;
! 76: if (uname(&uts_name) != 0) {
! 77: std::cerr << "getting uname failed\n";
! 78: return 1;
! 79: }
! 80:
! 81: std::string output_buffer {};
! 82: if (options.test(0) == 1) {
! 83: output_buffer+=uts_name.machine;
! 84: output_buffer+=' ';
! 85: }
! 86: if (options.test(1) == 1) {
! 87: output_buffer+=uts_name.nodename;
! 88: output_buffer+=' ';
! 89: }
! 90: if (options.test(2) == 1) {
! 91: output_buffer+=uts_name.release;
! 92: output_buffer+=' ';
! 93: }
! 94: if (options.test(3) == 1) {
! 95: output_buffer+=uts_name.sysname;
! 96: output_buffer+=' ';
! 97: }
! 98: if (options.test(4) == 1) {
! 99: output_buffer+=uts_name.version;
! 100: output_buffer+=' ';
! 101: }
! 102: output_buffer.erase(output_buffer.length() - 1, 1);
! 103: std::cout << output_buffer + '\n';
! 104: return options.test(5);
! 105: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>