mirror of
https://github.com/troglobit/finit.git
synced 2026-10-12 10:12:32 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7360ef1f08 | ||
|
|
529224153f | ||
|
|
0f8393ef0e | ||
|
|
a1d7e48225 | ||
|
|
938773765c | ||
|
|
367049a11c | ||
|
|
efcdc141c8 | ||
|
|
dfed328d47 | ||
|
|
804aa3c747 | ||
|
|
3ce7638dab | ||
|
|
b0746f5220 | ||
|
|
c324eff01a | ||
|
|
a6f534621c | ||
|
|
b0e3dbc47f | ||
|
|
220b2c9ae3 | ||
|
|
173853ca17 | ||
|
|
9f83bbe788 | ||
|
|
a187b88dd9 | ||
|
|
134d9f3463 | ||
|
|
25e9d84673 | ||
|
|
765bef0991 | ||
|
|
7d10388158 | ||
|
|
a0382dfab8 | ||
|
|
ead2eb7076 | ||
|
|
0f2a14bf4f | ||
|
|
4e8be438e9 | ||
|
|
2f3404165f | ||
|
|
ca9ee99f59 | ||
|
|
0ab62c8871 | ||
|
|
efdac3fc2d | ||
|
|
c127735e2d | ||
|
|
d621b0ba15 | ||
|
|
33469873a5 | ||
|
|
36043c04f9 | ||
|
|
ec10fecd8d | ||
|
|
0fc7654a83 | ||
|
|
ba9c897e83 | ||
|
|
4948844f82 | ||
|
|
9f99f38561 | ||
|
|
f516108ca6 | ||
|
|
04b91da9f9 | ||
|
|
f94504ad96 | ||
|
|
698c5a1852 | ||
|
|
d5037d1352 | ||
|
|
57ad91136b | ||
|
|
9488e65998 | ||
|
|
19540d148e | ||
|
|
df14fd5255 |
@@ -0,0 +1,2 @@
|
||||
*.o
|
||||
*.gz
|
||||
@@ -1,3 +1,12 @@
|
||||
0.5 (20080821)
|
||||
- add option to start dbus and consolekit before the X server
|
||||
- finit-alt listens to /dev/initctl to work with reboot(8) (smurfy)
|
||||
- write runlevel to utmp, needed by Printerdrake (Pascal Terjan)
|
||||
- fix ownership of /var/run/utmp (reported by Pascal Terjan)
|
||||
- remove obsolete code to load AGP drivers
|
||||
- conditional build of /etc/resolveconf/run support
|
||||
- add support to /var/run/resolvconf in Mandriva (blino)
|
||||
|
||||
O.4 (20080516)
|
||||
- default username for finit-alt configurable in Makefile
|
||||
- create loopback device node in finit-alt (for squashfs)
|
||||
|
||||
@@ -3,11 +3,11 @@ CFLAGS = -Os -Wall -DVERSION=\"$(VERSION)\" -DWHOAMI=\"`whoami`@`hostname`\"
|
||||
LD = gcc
|
||||
LDFLAGS =
|
||||
LIBS =
|
||||
VERSION = 0.4
|
||||
VERSION = 0.5
|
||||
PKG = finit-$(VERSION)
|
||||
DFILES = Makefile README finit.c finit-mod.c finit-alt.c helpers.c helpers.h \
|
||||
patches/*patch contrib/services.sh*
|
||||
BINS = finit finit-mod finit-mdv
|
||||
patches/*patch contrib/services.sh* contrib/Makefile.*
|
||||
BINS = finit-mod finit-alt finit-mdv #finit-exb
|
||||
|
||||
|
||||
|
||||
@@ -51,6 +51,10 @@ finit-mod: finit-mod.o helpers.o
|
||||
$(LD) $(LDFLAGS) -o $@ $+ $(LIBS)
|
||||
strip $@
|
||||
|
||||
finit-alt: finit-alt.o helpers.o
|
||||
$(LD) $(LDFLAGS) -o $@ $+ $(LIBS)
|
||||
strip $@
|
||||
|
||||
finit-mdv: finit-mdv.o helpers.o
|
||||
$(LD) $(LDFLAGS) -o $@ $+ $(LIBS)
|
||||
strip $@
|
||||
@@ -58,6 +62,13 @@ finit-mdv: finit-mdv.o helpers.o
|
||||
finit-mdv.o: finit-alt.c Makefile
|
||||
$(CC) -c $(CFLAGS) -DDIST_MDV -o $@ finit-alt.c
|
||||
|
||||
finit-exb: finit-exb.o helpers.o
|
||||
$(LD) $(LDFLAGS) -o $@ $+ $(LIBS)
|
||||
strip $@
|
||||
|
||||
finit-exb.o: finit-alt.c Makefile
|
||||
$(CC) -c $(CFLAGS) -DDIST_EEEXUBUNTU -o $@ finit-alt.c
|
||||
|
||||
clean:
|
||||
rm -f *.o core *~ $(BINS)
|
||||
|
||||
|
||||
@@ -1,68 +1,48 @@
|
||||
|
||||
Eeepc "fastinit" reimplementations
|
||||
----------------------------------
|
||||
Finit is a reimplementation of the Eeepc "fastinit" program based on its
|
||||
system calls with gaps filled with frog DNA.
|
||||
|
||||
finit.c is a reimplementation of the Asus Eeepc fastinit program based
|
||||
on its library calls. It tries to be an accurate re-creation and keeps
|
||||
the original bugs and unoptimized calls.
|
||||
Finit's purpose is to build upon the general workings of fastinit and
|
||||
improve/optimize it for Xandros or alternative distributions running on
|
||||
the Eeepc. Finit comes in three flavors: finit is a replica of the Asus
|
||||
fastinit, finit-mod is an improved drop-in replacement for fastinit,
|
||||
and finit-alt is a generic replacement for other systems. Finit-mod
|
||||
and finit-alt were much improved with patches from Metalshark.
|
||||
|
||||
finit-mod.c is a fixed/improved version of finit.c intended to be a drop-in
|
||||
replacement for the original Eeepc OS.
|
||||
|
||||
finit-alt.c is a fixed/improved version of finit.c for alternative Linux
|
||||
distributions running on the Eeepc (previously ffinit.c). It's currently
|
||||
able to boot Mandriva Linux 2008.0/2008.1.
|
||||
|
||||
See Makefile for configurable parameters to better suit your system.
|
||||
See more information at http://helllabs.org/finit/
|
||||
|
||||
|
||||
* Eeepc boot process
|
||||
Usage scenarios
|
||||
---------------
|
||||
|
||||
The essential steps in the boot process carried out in initramfs are:
|
||||
1. Replace the original Eeepc 702 fastinit (finit-mod)
|
||||
|
||||
ROOT=`sed 's!.*root=\([^ ]*\).*!\1!' < /proc/cmdline`
|
||||
mount -t proc proc /proc
|
||||
mount -t ext2 -o ro $ROOT /mnt-system
|
||||
mount -t ext3 -o rw /dev/sda2 /mnt-user
|
||||
mount -t unionfs -o dirs=/mnt-user=rw:/mnt-system=ro unionfs /mnt
|
||||
mount --move /mnt-system /mnt/mnt
|
||||
umount -l /mnt-user
|
||||
umount /proc
|
||||
exec switch_root /mnt /sbin/fastinit "$@" </mnt/dev/console >/mnt/dev/console
|
||||
|
||||
If mounting the root filesystem fails, execute a maintenance shell. If
|
||||
mounting the user filesystem fails, fsck and reboot.
|
||||
2. Allow fast booting in alternative Linux distributions running on the
|
||||
Eeepc and other netbooks (finit-alt)
|
||||
|
||||
|
||||
* Utilities available in the Eeepc initramfs busybox:
|
||||
|
||||
[ cat cp cut dd
|
||||
dmesg echo env expr false
|
||||
grep insmod ln losetup ls
|
||||
mdev mkdir mknod mount mv
|
||||
pivot_root realpath rm rmmod sed
|
||||
sh sleep switch_root test true
|
||||
umount vi
|
||||
Finit-alt is distribution-specific. Currently it generates a finit-mdv
|
||||
executable for Mandriva 2008/2008.1 systems. Smurfy ported it to
|
||||
eeeXubuntu, and parts of his port have been merged to finit-alt.
|
||||
|
||||
|
||||
* Devices in the Eeepc initramfs /dev:
|
||||
Finit-alt features
|
||||
------------------
|
||||
|
||||
console fb null ram0 sda1 sda2 sda3 sr0 tty0
|
||||
Finit-alt reads configuration information from /etc/finit.conf. See
|
||||
the source code for available options.
|
||||
|
||||
|
||||
Reboot and poweroff
|
||||
-------------------
|
||||
Rebooting and halting
|
||||
---------------------
|
||||
|
||||
Stock reboot and poweroff utilities of a modern Linux distribution may not
|
||||
work correctly with finit. You can replace them with simple scripts that
|
||||
send SIGUSR1 to finit for reboot, SIGUSR2 for poweroff.
|
||||
Finit handles SIGUSR1 and SIGUSR2 for reboot and halt, and listens to
|
||||
/dev/initctl so standard Linux reboot and halt commands should also
|
||||
work.
|
||||
|
||||
|
||||
Using finit with KDE
|
||||
--------------------
|
||||
|
||||
If you use finit to start KDE with auto-login enabled, hal-based device
|
||||
automounting may not work correctly. That happens because the session
|
||||
is started before the system message bus, so add a "dcop kded mediamanager
|
||||
reloadBackends" call in the user AutoStart to restart the client.
|
||||
Debugging
|
||||
---------
|
||||
|
||||
Add finit_debug to the kernel parameter line to enable trace messages
|
||||
and to run a shell after the X server.
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
|
||||
Experimental eeeXubuntu support merged from smurfy's port, see
|
||||
http://forum.eeeuser.com/viewtopic.php?id=15685
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
CC = gcc
|
||||
CFLAGS = -Os -Wall -DVERSION=\"$(VERSION)\" -DWHOAMI=\"`whoami`@`hostname`\"
|
||||
LD = gcc
|
||||
LDFLAGS =
|
||||
LIBS =
|
||||
VERSION = 0.5-pre
|
||||
PKG = finit-$(VERSION)
|
||||
DFILES = Makefile README finit.c finit-mod.c finit-alt.c helpers.c helpers.h \
|
||||
patches/*patch contrib/services.sh*
|
||||
BINS = finit-mod finit-alt finit-mdv #finit-exb
|
||||
|
||||
|
||||
|
||||
#### Configurable parameters
|
||||
|
||||
# Default user for finit-alt if not "user"
|
||||
#DEFUSER = fred
|
||||
|
||||
# Use -march=pentium-m to build for Eeepc
|
||||
#CFLAGS += -march=pentium-m
|
||||
|
||||
# Omit the first /sbin/hwclock if CONFIG_RTC_HCTOSYS is enabled in the kernel
|
||||
CFLAGS += -DNO_HCTOSYS
|
||||
|
||||
# Append -directisa to /sbin/hwclock lines if the user has disabled
|
||||
# CONFIG_GENRTC and enabled CONFIG_RTC but not enabled CONFIG_HPET_TIMER
|
||||
# and CONFIG_HPET_RTC_IRQ.
|
||||
#CFLAGS += -DDIRECTISA
|
||||
|
||||
# Use built-in run-parts instead of /bin/run-parts
|
||||
CFLAGS += -DBUILTIN_RUNPARTS
|
||||
|
||||
#### End of configurable parameters
|
||||
|
||||
|
||||
|
||||
ifneq ($(DEFUSER),)
|
||||
CFLAGS += -DDEFUSER=\"$(DEFUSER)\"
|
||||
endif
|
||||
|
||||
.c.o:
|
||||
$(CC) -c $(CFLAGS) -o $*.o $<
|
||||
|
||||
all: $(BINS)
|
||||
|
||||
finit: finit.o
|
||||
$(LD) $(LDFLAGS) -o $@ $+ $(LIBS)
|
||||
strip $@
|
||||
|
||||
finit-mod: finit-mod.o helpers.o
|
||||
$(LD) $(LDFLAGS) -o $@ $+ $(LIBS)
|
||||
strip $@
|
||||
|
||||
finit-alt: finit-alt.o helpers.o
|
||||
$(LD) $(LDFLAGS) -o $@ $+ $(LIBS)
|
||||
strip $@
|
||||
|
||||
finit-mdv: finit-mdv.o helpers.o
|
||||
$(LD) $(LDFLAGS) -o $@ $+ $(LIBS)
|
||||
strip $@
|
||||
|
||||
finit-mdv.o: finit-alt.c Makefile
|
||||
$(CC) -c $(CFLAGS) -DDIST_MDV -o $@ finit-alt.c
|
||||
|
||||
finit-exb: finit-exb.o helpers.o
|
||||
$(LD) $(LDFLAGS) -o $@ $+ $(LIBS)
|
||||
strip $@
|
||||
|
||||
finit-exb.o: finit-alt.c Makefile
|
||||
$(CC) -c $(CFLAGS) -DDIST_EEEXUBUNTU -o $@ finit-alt.c
|
||||
|
||||
clean:
|
||||
rm -f *.o core *~ $(BINS)
|
||||
|
||||
finit.o: finit.c Makefile
|
||||
|
||||
finit-mod.o: finit-mod.c Makefile
|
||||
|
||||
helpers.o: helpers.c Makefile
|
||||
|
||||
dist:
|
||||
rm -Rf $(PKG)
|
||||
mkdir -p $(PKG)/contrib $(PKG)/patches
|
||||
for i in $(DFILES); do cp $$i $(PKG)/`dirname $$i`; done
|
||||
tar cf - $(PKG) | gzip -c > $(PKG).tar.gz
|
||||
rm -Rf $(PKG)
|
||||
ls -l $(PKG).tar.gz
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Else oocalc will crash
|
||||
mknod /dev/random c 1 8
|
||||
|
||||
mkdir /var/lock/subsys
|
||||
chmod 1777 /var/lock/subsys
|
||||
mkdir /var/run/dbus
|
||||
mkdir /var/run/netreport
|
||||
|
||||
/etc/init.d/messagebus start
|
||||
|
||||
/sbin/start_udev.simple
|
||||
for module in `/bin/grep -hv '#' /etc/modprobe.preload /etc/modprobe.preload.d/*`; do
|
||||
/sbin/modprobe $module
|
||||
done
|
||||
|
||||
# Need to find a way to apply udev config
|
||||
chmod 0666 /dev/ptmx
|
||||
|
||||
/etc/init.d/network-up start
|
||||
/etc/init.d/network start
|
||||
/etc/init.d/acpid start
|
||||
/etc/init.d/haldaemon start
|
||||
sleep 10
|
||||
for i in /etc/rc5.d/S*; do
|
||||
$i status > /dev/null 2>&1 || $i start
|
||||
done
|
||||
+227
-18
@@ -37,6 +37,7 @@ THE SOFTWARE.
|
||||
#include <sys/reboot.h>
|
||||
#include <sys/wait.h>
|
||||
#include <linux/fs.h>
|
||||
#include <utmp.h>
|
||||
|
||||
#include "helpers.h"
|
||||
|
||||
@@ -46,7 +47,7 @@ THE SOFTWARE.
|
||||
|
||||
/* Distribution configuration */
|
||||
|
||||
#ifdef DIST_MDV /* Mandriva */
|
||||
#if defined DIST_MDV /* Mandriva */
|
||||
#define RANDOMSEED "/var/lib/random-seed"
|
||||
#define SYSROOT "/sysroot"
|
||||
#define GETTY "/usr/bin/openvt /sbin/mingetty tty2"
|
||||
@@ -54,12 +55,28 @@ THE SOFTWARE.
|
||||
#define REMOUNT_ROOTFS_RW
|
||||
#define MAKE_DEVICES
|
||||
#define PAM_CONSOLE
|
||||
#define LISTEN_INITCTL
|
||||
#define RUNLEVEL 5
|
||||
#define USE_VAR_RUN_RESOLVCONF
|
||||
#define USE_MESSAGE_BUS
|
||||
#define USE_CONSOLEKIT
|
||||
#elif defined DIST_EEEXUBUNTU /* eeeXubuntu */
|
||||
#define RANDOMSEED "/var/lib/urandom/random-seed"
|
||||
#define SYSROOT "/sysroot"
|
||||
#define GETTY "/usr/bin/openvt /sbin/getty 38400 tty2"
|
||||
#define RUNPARTS "/bin/run-parts"
|
||||
#define REMOUNT_ROOTFS_RW
|
||||
#define MAKE_DEVICES
|
||||
#define TOUCH_ETC_NETWORK_RUN_IFSTATE
|
||||
#define LISTEN_INITCTL
|
||||
#define USE_USPLASH
|
||||
#else /* original Eeepc distribution */
|
||||
#define RANDOMSEED "/var/lib/urandom/random-seed"
|
||||
#define SYSROOT "/mnt"
|
||||
#define GETTY "/usr/bin/openvt /sbin/getty 38400 tty2"
|
||||
#define RUNPARTS "/bin/run-parts"
|
||||
#define TOUCH_ETC_NETWORK_RUN_IFSTATE
|
||||
#define USE_ETC_RESOLVCONF_RUN
|
||||
#endif
|
||||
|
||||
#ifdef DIRECTISA
|
||||
@@ -79,6 +96,20 @@ THE SOFTWARE.
|
||||
sigaction(sig, &sa, NULL); \
|
||||
} while (0)
|
||||
|
||||
#ifdef LISTEN_INITCTL
|
||||
|
||||
#define INIT_MAGIC 0x03091969
|
||||
#define INIT_CMD_RUNLVL 1
|
||||
|
||||
struct init_request {
|
||||
int magic; /* Magic number */
|
||||
int cmd; /* What kind of request */
|
||||
int runlevel; /* Runlevel to change to */
|
||||
int sleeptime; /* Time between TERM and KILL */
|
||||
char data[368];
|
||||
};
|
||||
#endif
|
||||
|
||||
#define touch(x) mknod((x), S_IFREG|0644, 0)
|
||||
#define chardev(x,m,maj,min) mknod((x), S_IFCHR|(m), makedev((maj),(min)))
|
||||
#define blkdev(x,m,maj,min) mknod((x), S_IFBLK|(m), makedev((maj),(min)))
|
||||
@@ -95,7 +126,44 @@ void shutdown(int);
|
||||
void signal_handler(int);
|
||||
void chld_handler(int);
|
||||
|
||||
#ifdef DEBUG_TIMESTAMP /* For profiling */
|
||||
#include <time.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
static int debug = 1;
|
||||
|
||||
static struct timeval t0;
|
||||
|
||||
void _d(char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
struct timeval t;
|
||||
int s, ms;
|
||||
|
||||
if (!debug)
|
||||
return;
|
||||
|
||||
va_start(ap, fmt);
|
||||
|
||||
gettimeofday(&t, NULL);
|
||||
|
||||
s = t.tv_sec - t0.tv_sec;
|
||||
ms = (t.tv_usec - t0.tv_usec) / 1000;
|
||||
if (ms < 0) {
|
||||
ms += 1000;
|
||||
s -= 1;
|
||||
}
|
||||
|
||||
printf("[%d.%03d] ", s, ms);
|
||||
vprintf(fmt, ap);
|
||||
printf("\n");
|
||||
va_end(ap);
|
||||
}
|
||||
#else
|
||||
#define _d(x...) do { if (debug) { printf(x); printf("\n"); } } while (0)
|
||||
static int debug = 0;
|
||||
#endif
|
||||
|
||||
|
||||
static void build_cmd(char *cmd, char *x, int len)
|
||||
{
|
||||
@@ -103,30 +171,90 @@ static void build_cmd(char *cmd, char *x, int len)
|
||||
char *c;
|
||||
|
||||
c = cmd + strlen(cmd);
|
||||
|
||||
/* skip spaces */
|
||||
for (; *x && (*x == ' ' || *x == '\t'); x++);
|
||||
for (l = 0; *x && *x != ' ' && *x != '\t' && l < len; l++)
|
||||
|
||||
/* copy next arg */
|
||||
for (l = 0; *x && *x != '#' && *x != '\t' && l < len; l++)
|
||||
*c++ = *x++;
|
||||
*c = 0;
|
||||
if (debug)
|
||||
printf("cmd = %s\n", cmd);
|
||||
|
||||
_d("cmd = %s", cmd);
|
||||
}
|
||||
|
||||
|
||||
#ifdef LISTEN_INITCTL
|
||||
|
||||
/* Standard reboot/shutdown utilities talk to init using /dev/initctl.
|
||||
* We should check if the fifo was recreated and reopen it.
|
||||
*/
|
||||
static void listen_initctl()
|
||||
{
|
||||
if (!fork()) {
|
||||
int ctl;
|
||||
fd_set fds;
|
||||
struct init_request request;
|
||||
|
||||
mkfifo("/dev/initctl", 0600);
|
||||
ctl = open("/dev/initctl", O_RDONLY);
|
||||
|
||||
while (1) {
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(ctl, &fds);
|
||||
if (select(ctl + 1, &fds, NULL, NULL, NULL) <= 0)
|
||||
continue;
|
||||
|
||||
read(ctl, &request, sizeof(request));
|
||||
|
||||
if (request.magic != INIT_MAGIC)
|
||||
continue;
|
||||
|
||||
if (request.cmd == INIT_CMD_RUNLVL) {
|
||||
switch (request.runlevel) {
|
||||
case '0':
|
||||
shutdown(SIGUSR2);
|
||||
break;
|
||||
case '6':
|
||||
shutdown(SIGUSR1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
int i;
|
||||
FILE *f;
|
||||
char line[LINE_SIZE];
|
||||
int fd;
|
||||
DIR *dir;
|
||||
struct dirent *d;
|
||||
struct sigaction sa, act;
|
||||
sigset_t nmask, nmask2;
|
||||
char username[USERNAME_SIZE] = DEFUSER;
|
||||
char hostname[HOSTNAME_SIZE] = "eviltwin";
|
||||
char cmd[CMD_SIZE];
|
||||
#ifdef USE_ETC_RESOLVCONF_RUN
|
||||
DIR *dir;
|
||||
struct dirent *d;
|
||||
#endif
|
||||
#ifdef RUNLEVEL
|
||||
struct utmp entry;
|
||||
#endif
|
||||
|
||||
puts("finit-alt " VERSION " (built " __DATE__ " by " WHOAMI ")");
|
||||
#ifdef DEBUG_TIMESTAMP
|
||||
gettimeofday(&t0, NULL);
|
||||
#endif
|
||||
|
||||
puts("finit-alt " VERSION " (built " __DATE__ " " __TIME__
|
||||
" by " WHOAMI ")");
|
||||
|
||||
#ifdef USE_USPLASH
|
||||
system("usplash_write \"TEXT-URGENT finit " VERSION " (build "__DATE__ " " __TIME__ ") \"");
|
||||
system("usplash_write \"PROGRESS 80\"");
|
||||
#endif
|
||||
|
||||
chdir("/");
|
||||
umask(022);
|
||||
@@ -172,6 +300,8 @@ int main()
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
setsid();
|
||||
|
||||
/*
|
||||
* Parse configuration file
|
||||
*/
|
||||
@@ -181,9 +311,9 @@ int main()
|
||||
fgets(line, LINE_SIZE, f);
|
||||
chomp(line);
|
||||
|
||||
if (debug)
|
||||
printf("conf: %s\n", line);
|
||||
_d("conf: %s", line);
|
||||
|
||||
/* Do this before mounting / read-write */
|
||||
if (MATCH_CMD(line, "check ", x)) {
|
||||
strcpy(cmd, "/sbin/fsck -C -a ");
|
||||
build_cmd(cmd, x, CMD_SIZE);
|
||||
@@ -206,15 +336,42 @@ int main()
|
||||
system(cmd);
|
||||
continue;
|
||||
}
|
||||
#ifdef MAKE_DEVICES
|
||||
/* This is used if the system uses udev and doesn't
|
||||
* mount /dev as tmpfs in the initrd, or if it doesn't
|
||||
* use an initrd. Mount /dev as tmpfs and create basic
|
||||
* device nodes.
|
||||
*/
|
||||
if (MATCH_CMD(line, "mountdev", x)) {
|
||||
mount("none", "/dev", "tmpfs", 0, "mode=0755");
|
||||
blkdev("/dev/sda", 0660, 8, 0);
|
||||
blkdev("/dev/sda1", 0660, 8, 1);
|
||||
blkdev("/dev/sda2", 0660, 8, 2);
|
||||
blkdev("/dev/sda3", 0660, 8, 3);
|
||||
blkdev("/dev/sda4", 0660, 8, 4);
|
||||
blkdev("/dev/sda5", 0660, 8, 5);
|
||||
blkdev("/dev/sda6", 0660, 8, 6);
|
||||
continue;
|
||||
}
|
||||
/* This works only if /dev is tmpfs! If not, create
|
||||
* devices statically on the filesystem
|
||||
*/
|
||||
if (MATCH_CMD(line, "mknod ", x)) {
|
||||
strcpy(cmd, "/bin/mknod ");
|
||||
build_cmd(cmd, x, CMD_SIZE);
|
||||
system(cmd);
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
setsid();
|
||||
|
||||
/*
|
||||
* Mount filesystems
|
||||
*/
|
||||
_d("mount filesystems");
|
||||
|
||||
#ifdef REMOUNT_ROOTFS_RW
|
||||
system("/bin/mount -n -o remount,rw /");
|
||||
#endif
|
||||
@@ -234,15 +391,18 @@ int main()
|
||||
mount("none", "/proc/bus/usb", "usbfs", 0, NULL);
|
||||
mount(SYSROOT, "/", NULL, MS_MOVE, NULL);
|
||||
|
||||
_d("make devices");
|
||||
#ifdef MAKE_DEVICES
|
||||
mkdir("/dev/input", 0755);
|
||||
chardev("/dev/urandom", 0666, 1, 9);
|
||||
chardev("/dev/ptmx", 0666, 5, 2);
|
||||
chardev("/dev/null", 0666, 1, 3);
|
||||
chmod("/dev/null", 0666);
|
||||
chardev("/dev/mem", 0640, 1, 1);
|
||||
chmod("/dev/null", 0667);
|
||||
chmod("/dev/mem", 0640);
|
||||
chardev("/dev/tty0", 0660, 4, 0);
|
||||
chardev("/dev/tty1", 0660, 4, 1);
|
||||
chardev("/dev/tty2", 0660, 4, 2);
|
||||
chardev("/dev/tty3", 0660, 4, 3);
|
||||
chardev("/dev/input/mice", 0660, 13, 63);
|
||||
chardev("/dev/input/event0", 0660, 13, 64);
|
||||
chardev("/dev/agpgart", 0660, 10, 175);
|
||||
@@ -261,13 +421,18 @@ int main()
|
||||
write(fd, "0.0 0 0.0\n", 10);
|
||||
close(fd);
|
||||
}
|
||||
_d("adjust clock");
|
||||
#ifndef NO_HCTOSYS
|
||||
#ifndef DEBUG_TIMESTAMP
|
||||
system("/sbin/hwclock --hctosys --localtime" HWCLOCK_DIRECTISA);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Network stuff
|
||||
*/
|
||||
|
||||
#ifdef USE_ETC_RESOLVCONF_RUN
|
||||
makepath("/dev/shm/network");
|
||||
makepath("/dev/shm/resolvconf/interface");
|
||||
|
||||
@@ -282,8 +447,26 @@ int main()
|
||||
|
||||
closedir(dir);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_VAR_RUN_RESOLVCONF
|
||||
makepath("/var/run/resolvconf/interface");
|
||||
symlink("../../../etc/resolv.conf", "/var/run/resolvconf/resolv.conf");
|
||||
#endif
|
||||
|
||||
touch("/var/run/utmp");
|
||||
chown("/var/run/utmp", 0, getgroup("utmp"));
|
||||
chmod("/var/run/utmp", 0664);
|
||||
|
||||
#ifdef RUNLEVEL
|
||||
memset(&entry, 0, sizeof(struct utmp));
|
||||
entry.ut_type = RUN_LVL;
|
||||
entry.ut_pid = '0' + RUNLEVEL;
|
||||
setutent();
|
||||
pututline(&entry);
|
||||
endutent();
|
||||
#endif
|
||||
|
||||
touch("/etc/resolvconf/run/enable-updates");
|
||||
|
||||
chdir("/etc/resolvconf/run/interface");
|
||||
@@ -339,19 +522,26 @@ int main()
|
||||
mkdir("/tmp/.ICE-unix", 01777);
|
||||
umask(022);
|
||||
|
||||
#ifdef USE_USPLASH
|
||||
system("usplash_write \"PROGRESS 90\"");
|
||||
#endif
|
||||
|
||||
system(GETTY "&");
|
||||
|
||||
_d("forking");
|
||||
if (!fork()) {
|
||||
/* child process */
|
||||
|
||||
vhangup();
|
||||
|
||||
#ifndef DEBUG_TIMESTAMP
|
||||
close(2);
|
||||
close(1);
|
||||
close(0);
|
||||
|
||||
if (open("/dev/tty1", O_RDWR) != 0)
|
||||
exit(1);
|
||||
#endif
|
||||
|
||||
sigemptyset(&act.sa_mask);
|
||||
act.sa_handler = SIG_DFL;
|
||||
@@ -363,20 +553,38 @@ int main()
|
||||
for (i = 1; i < NSIG; i++)
|
||||
sigaction(i, &sa, NULL);
|
||||
|
||||
#ifndef DEBUG_TIMESTAMP
|
||||
dup2(0, 0);
|
||||
dup2(0, 1);
|
||||
dup2(0, 2);
|
||||
#endif
|
||||
|
||||
touch("/tmp/nologin");
|
||||
|
||||
#ifdef AGPDRV
|
||||
system("/sbin/modprobe agpgart");
|
||||
system("/sbin/modprobe " AGPDRV);
|
||||
#ifdef USE_MESSAGE_BUS
|
||||
_d("dbus");
|
||||
mkdir("/var/run/dbus", 0755);
|
||||
mkdir("/var/lock/subsys/messagebus", 0755);
|
||||
system("dbus-uuidgen --ensure;dbus-daemon --system");
|
||||
/* dbus-daemon needs this delay, even after checking
|
||||
* availability of /var/run/dbus/system_bus_socket */
|
||||
usleep(500000);
|
||||
#endif
|
||||
|
||||
#ifdef USE_CONSOLEKIT
|
||||
_d("consolekit");
|
||||
system("/usr/sbin/console-kit-daemon");
|
||||
#endif
|
||||
|
||||
#ifdef LISTEN_INITCTL
|
||||
listen_initctl();
|
||||
#endif
|
||||
|
||||
while (access("/tmp/shutdown", F_OK) < 0) {
|
||||
_d("start X as %s\n", username);
|
||||
#ifdef DEBUG_TIMESTAMP
|
||||
sleep(10);
|
||||
#endif
|
||||
if (debug) {
|
||||
printf("Starting X as %s\n", username);
|
||||
snprintf(line, LINE_SIZE,
|
||||
"su -c startx -l %s\n", username);
|
||||
system(line);
|
||||
@@ -394,6 +602,7 @@ int main()
|
||||
|
||||
/* parent process */
|
||||
|
||||
|
||||
sleep(1);
|
||||
system("/usr/sbin/services.sh &>/dev/null&");
|
||||
|
||||
|
||||
+4
-5
@@ -34,12 +34,10 @@ Changelog from the original Eeepc fastinit:
|
||||
- Add –directisa to hwclock if user has disabled CONFIG_GENRTC and enabled
|
||||
CONFIG_RTC but not CONFIG_HPET_TIMER and CONFIG_HPET_RTC_IRQ (by Metalshark)
|
||||
- Drop system() call to clean /tmp, it's a fresh mounted tmpfs
|
||||
- Change /proc/acpi/sleep to /sys/power/state (by Metalshark)
|
||||
- Set loopback interface using direct calls instead of system("ifconfig")
|
||||
- Copy 4096 data block in C instead of system("cat") or system("dd")
|
||||
- Draw shutdown splash screen using C calls instead of system("echo;cat")
|
||||
- Change poweroff method from writing 5 to /sys/power/state to
|
||||
reboot(RB_POWER_OFF) (by Metalshark)
|
||||
- Change poweroff method to reboot(RB_POWER_OFF) (by Metalshark)
|
||||
- Mount /var/run and /var/lock as tmpfs
|
||||
- Use SIG_IGN instead of empty signal handler (by Metalshark)
|
||||
- Add built-in run-parts option to be used instead of system("run-parts")
|
||||
@@ -81,7 +79,7 @@ Changelog from the original Eeepc fastinit:
|
||||
sa.sa_flags = flags; \
|
||||
sigemptyset(&sa.sa_mask); \
|
||||
sigaction(sig, &sa, NULL); \
|
||||
} while(0)
|
||||
} while (0)
|
||||
|
||||
#define touch(x) mknod((x), S_IFREG|0644, 0)
|
||||
|
||||
@@ -103,7 +101,8 @@ int main()
|
||||
char *x;
|
||||
sigset_t nmask, nmask2;
|
||||
|
||||
puts("finit-mod " VERSION " (built " __DATE__ " by " WHOAMI ")");
|
||||
puts("finit-mod " VERSION " (built " __DATE__ " " __TIME__
|
||||
" by " WHOAMI ")");
|
||||
|
||||
chdir("/");
|
||||
umask(022);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
@@ -17,6 +18,8 @@
|
||||
#include <sys/wait.h>
|
||||
#endif
|
||||
|
||||
#include <grp.h>
|
||||
|
||||
#include "helpers.h"
|
||||
|
||||
/*
|
||||
@@ -157,6 +160,16 @@ int run_parts(char *dir, ...)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int getgroup(char *s)
|
||||
{
|
||||
struct group *grp;
|
||||
|
||||
if ((grp = getgrnam(s)) == NULL)
|
||||
return -1;
|
||||
|
||||
return grp->gr_gid;
|
||||
}
|
||||
|
||||
/*
|
||||
* Other convenience functions
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user