Serenity Operating System
at master 62 lines 1.4 kB view raw
1/* 2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <AK/Format.h> 8#include <LibCore/System.h> 9#include <LibMain/Main.h> 10#include <stdlib.h> 11#include <sys/stat.h> 12#include <sys/sysmacros.h> 13 14static int usage() 15{ 16 warnln("usage: mknod <name> <c|b|p> [<major> <minor>]"); 17 return 1; 18} 19 20ErrorOr<int> serenity_main(Main::Arguments arguments) 21{ 22 TRY(Core::System::pledge("stdio dpath")); 23 24 // FIXME: Add some kind of option for specifying the file permissions. 25 if (arguments.strings.size() < 3) 26 return usage(); 27 28 if (arguments.strings[2].starts_with('p')) { 29 if (arguments.strings.size() != 3) 30 return usage(); 31 } else if (arguments.strings.size() != 5) { 32 return usage(); 33 } 34 35 auto name = arguments.strings[1]; 36 mode_t mode = 0666; 37 switch (arguments.strings[2][0]) { 38 case 'c': 39 case 'u': 40 mode |= S_IFCHR; 41 break; 42 case 'b': 43 mode |= S_IFBLK; 44 break; 45 case 'p': 46 mode |= S_IFIFO; 47 break; 48 default: 49 return usage(); 50 } 51 52 int major = 0; 53 int minor = 0; 54 if (arguments.strings.size() == 5) { 55 major = atoi(arguments.argv[3]); 56 minor = atoi(arguments.argv[4]); 57 } 58 59 TRY(Core::System::mknod(name, mode, makedev(major, minor))); 60 61 return 0; 62}