• source navigation  • diff markup  • identifier search  • freetext search  • 

Sources/procd/initd/early.c

  1 /*
  2  * Copyright (C) 2013 Felix Fietkau <nbd@openwrt.org>
  3  * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
  4  *
  5  * This program is free software; you can redistribute it and/or modify
  6  * it under the terms of the GNU Lesser General Public License version 2.1
  7  * as published by the Free Software Foundation
  8  *
  9  * This program is distributed in the hope that it will be useful,
 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 12  * GNU General Public License for more details.
 13  */
 14 
 15 #include <sys/mount.h>
 16 #include <sys/types.h>
 17 #include <sys/stat.h>
 18 #include <sys/sysmacros.h>
 19 
 20 #include <stdio.h>
 21 #include <fcntl.h>
 22 #include <unistd.h>
 23 #include <stdlib.h>
 24 
 25 #include "../utils/utils.h"
 26 #include "init.h"
 27 #include "../libc-compat.h"
 28 #include "../container.h"
 29 
 30 static void
 31 early_dev(void)
 32 {
 33         mkdev("*", 0600);
 34         mknod("/dev/null", 0666, makedev(1, 3));
 35 }
 36 
 37 static void
 38 early_console(const char *dev)
 39 {
 40         struct stat s;
 41 
 42         if (stat(dev, &s)) {
 43                 ERROR("Failed to stat %s: %m\n", dev);
 44                 return;
 45         }
 46 
 47         if (patch_stdio(dev)) {
 48                 ERROR("Failed to setup i/o redirection\n");
 49                 return;
 50         }
 51 
 52         fcntl(STDERR_FILENO, F_SETFL, fcntl(STDERR_FILENO, F_GETFL) | O_NONBLOCK);
 53 }
 54 
 55 static void
 56 early_mounts(void)
 57 {
 58         unsigned int oldumask = umask(0);
 59 
 60         if (!is_container()) {
 61                 mount("proc", "/proc", "proc", MS_NOATIME | MS_NODEV | MS_NOEXEC | MS_NOSUID, 0);
 62                 mount("sysfs", "/sys", "sysfs", MS_NOATIME | MS_NODEV | MS_NOEXEC | MS_NOSUID, 0);
 63                 mount("cgroup2", "/sys/fs/cgroup", "cgroup2",  MS_NODEV | MS_NOEXEC | MS_NOSUID | MS_RELATIME, "nsdelegate");
 64                 mount("tmpfs", "/dev", "tmpfs", MS_NOATIME | MS_NOSUID, "mode=0755,size=512K");
 65                 ignore(symlink("/tmp/shm", "/dev/shm"));
 66                 mkdir("/dev/pts", 0755);
 67                 mount("devpts", "/dev/pts", "devpts", MS_NOATIME | MS_NOEXEC | MS_NOSUID, "mode=600");
 68 
 69                 early_dev();
 70         }
 71 
 72         early_console("/dev/console");
 73         if (mount_zram_on_tmp()) {
 74                 mount("tmpfs", "/tmp", "tmpfs", MS_NOSUID | MS_NODEV | MS_NOATIME, "mode=01777");
 75                 mkdir("/tmp/shm", 01777);
 76         } else {
 77                 mkdir("/tmp/shm", 01777);
 78                 mount("tmpfs", "/tmp/shm", "tmpfs", MS_NOSUID | MS_NODEV | MS_NOATIME,
 79                                 "mode=01777");
 80         }
 81         mkdir("/tmp/run", 0755);
 82         mkdir("/tmp/lock", 0755);
 83         mkdir("/tmp/state", 0755);
 84         umask(oldumask);
 85 }
 86 
 87 static void
 88 early_env(void)
 89 {
 90         setenv("PATH", EARLY_PATH, 1);
 91 }
 92 
 93 void
 94 early(void)
 95 {
 96         if (getpid() != 1)
 97                 return;
 98 
 99         early_mounts();
100         early_env();
101 
102         LOG("Console is alive\n");
103 }
104 

This page was automatically generated by LXR 0.3.1.  •  OpenWrt