Merge with git+ssh://master.kernel.org/pub/scm/libs/klibc/klibc.git
diff --git a/usr/klibc/arch/x86_64/MCONFIG b/usr/klibc/arch/x86_64/MCONFIG
index 8edf343..edcd638 100644
--- a/usr/klibc/arch/x86_64/MCONFIG
+++ b/usr/klibc/arch/x86_64/MCONFIG
@@ -17,10 +17,10 @@
KLIBCARCHREQFLAGS = -m64
ifeq ($(DEBUG),y)
KLIBCOPTFLAGS = -Os -fomit-frame-pointer \
- -falign-functions=0 -falign-jumps=0 -falign-loops=0
+ -falign-functions=1 -falign-jumps=1 -falign-loops=1
else
KLIBCOPTFLAGS = -Os -fno-asynchronous-unwind-tables -fomit-frame-pointer \
- -falign-functions=0 -falign-jumps=0 -falign-loops=0
+ -falign-functions=1 -falign-jumps=1 -falign-loops=1
endif
KLIBCBITSIZE = 64
KLIBCLDFLAGS = -m elf_x86_64
diff --git a/usr/utils/Kbuild b/usr/utils/Kbuild
index b3b8d8a..75618cc 100644
--- a/usr/utils/Kbuild
+++ b/usr/utils/Kbuild
@@ -2,7 +2,7 @@
# Kbuild file for klib utils
#
-progs := chroot dd mkdir mkfifo mount pivot_root umount
+progs := chroot dd mkdir mkfifo mknod mount pivot_root umount
progs += true false sleep ln nuke minips cat
progs += insmod uname halt
@@ -18,6 +18,8 @@
shared/mkdir-y := mkdir.o file_mode.o
static/mkfifo-y := mkfifo.o file_mode.o
shared/mkfifo-y := mkfifo.o file_mode.o
+static/mknod-y := mknod.o file_mode.o
+shared/mknod-y := mknod.o file_mode.o
static/mount-y := mount_main.o mount_opts.o
shared/mount-y := mount_main.o mount_opts.o
static/pivot_root-y := pivot_root.o
diff --git a/usr/utils/mknod.c b/usr/utils/mknod.c
new file mode 100644
index 0000000..1facda7
--- /dev/null
+++ b/usr/utils/mknod.c
@@ -0,0 +1,58 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+
+char *progname;
+
+static __noreturn usage(void)
+{
+ fprintf(stderr, "Usage: %s name {b|c} major minor\n", progname);
+ exit(1);
+}
+
+int main(int argc, char *argv[], char *envp[])
+{
+ char *name = NULL, *endp;
+ unsigned int major, minor;
+ mode_t mode;
+ dev_t dev;
+
+ progname = argv[0];
+ if (argc != 5)
+ usage();
+
+ name = argv[1];
+ if (!name) {
+ perror("device");
+ usage();
+ }
+
+ mode = 0666;
+ if (argv[2][0] == 'c')
+ mode |= S_IFCHR;
+ else if (argv[2][0] == 'b')
+ mode |= S_IFBLK;
+ else {
+ perror("block or char devices.");
+ usage();
+ }
+
+ major = strtol(argv[3], &endp, 0);
+ if (*endp != '\0') {
+ perror("major.");
+ usage();
+ }
+ minor = strtol(argv[4], &endp, 0);
+ if (*endp != '\0') {
+ perror("minor.");
+ usage();
+ }
+ dev = makedev(major, minor);
+
+ if (mknod(name, mode, dev) == -1) {
+ perror("mknod");
+ exit(1);
+ }
+
+ exit(0);
+}