Serenity Operating System
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}