1/* vi: set sw=4 ts=4: */ 2/* 3 * Prints out the previous and the current runlevel. 4 * 5 * Version: @(#)runlevel 1.20 16-Apr-1997 MvS 6 * 7 * This file is part of the sysvinit suite, 8 * Copyright 1991-1997 Miquel van Smoorenburg. 9 * 10 * Licensed under GPLv2 or later, see file LICENSE in this source tree. 11 * 12 * initially busyboxified by Bernhard Reutner-Fischer 13 */ 14//config:config RUNLEVEL 15//config: bool "runlevel (559 bytes)" 16//config: default y 17//config: depends on FEATURE_UTMP 18//config: help 19//config: Find the current and previous system runlevel. 20//config: 21//config: This applet uses utmp but does not rely on busybox supporing 22//config: utmp on purpose. It is used by e.g. emdebian via /etc/init.d/rc. 23 24//applet:IF_RUNLEVEL(APPLET_NOEXEC(runlevel, runlevel, BB_DIR_SBIN, BB_SUID_DROP, runlevel)) 25 26//kbuild:lib-$(CONFIG_RUNLEVEL) += runlevel.o 27 28//usage:#define runlevel_trivial_usage 29//usage: "[FILE]" 30//usage:#define runlevel_full_usage "\n\n" 31//usage: "Find the current and previous system runlevel\n" 32//usage: "\n" 33//usage: "If no utmp FILE exists or if no runlevel record can be found,\n" 34//usage: "print \"unknown\"" 35//usage: 36//usage:#define runlevel_example_usage 37//usage: "$ runlevel /var/run/utmp\n" 38//usage: "N 2" 39 40#include "libbb.h" 41 42int runlevel_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 43int runlevel_main(int argc UNUSED_PARAM, char **argv) 44{ 45 struct utmpx *ut; 46 char prev; 47 48 if (argv[1]) utmpxname(argv[1]); 49 50 setutxent(); 51 while ((ut = getutxent()) != NULL) { 52 if (ut->ut_type == RUN_LVL) { 53 prev = ut->ut_pid / 256; 54 if (prev == 0) prev = 'N'; 55 printf("%c %c\n", prev, ut->ut_pid % 256); 56 if (ENABLE_FEATURE_CLEAN_UP) 57 endutxent(); 58 return 0; 59 } 60 } 61 62 puts("unknown"); 63 64 if (ENABLE_FEATURE_CLEAN_UP) 65 endutxent(); 66 return 1; 67} 68