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/reboot.h> 16 #include <sys/types.h> 17 18 #include <unistd.h> 19 20 #include "procd.h" 21 22 static void do_reboot(void) 23 { 24 LOG("reboot\n"); 25 fflush(stderr); 26 sync(); 27 sleep(2); 28 reboot(RB_AUTOBOOT); 29 while (1) 30 ; 31 } 32 33 static void signal_shutdown(int signal, siginfo_t *siginfo, void *data) 34 { 35 int event = 0; 36 char *msg = NULL; 37 38 #ifndef DISABLE_INIT 39 switch(signal) { 40 case SIGINT: 41 case SIGTERM: 42 event = RB_AUTOBOOT; 43 msg = "reboot"; 44 break; 45 case SIGUSR1: 46 case SIGUSR2: 47 case SIGPWR: 48 event = RB_POWER_OFF; 49 msg = "poweroff"; 50 break; 51 } 52 #endif 53 54 DEBUG(1, "Triggering %s\n", msg); 55 if (event) 56 procd_shutdown(event); 57 } 58 59 struct sigaction sa_shutdown = { 60 .sa_sigaction = signal_shutdown, 61 .sa_flags = SA_SIGINFO 62 }; 63 64 static void signal_crash(int signal, siginfo_t *siginfo, void *data) 65 { 66 ERROR("Rebooting as procd has crashed\n"); 67 do_reboot(); 68 } 69 70 struct sigaction sa_crash = { 71 .sa_sigaction = signal_crash, 72 .sa_flags = SA_SIGINFO 73 }; 74 75 static void signal_dummy(int signal, siginfo_t *siginfo, void *data) 76 { 77 ERROR("Got unexpected signal %d\n", signal); 78 } 79 80 struct sigaction sa_dummy = { 81 .sa_sigaction = signal_dummy, 82 .sa_flags = SA_SIGINFO 83 }; 84 85 void procd_signal(void) 86 { 87 signal(SIGPIPE, SIG_IGN); 88 if (getpid() != 1) 89 return; 90 sigaction(SIGTERM, &sa_shutdown, NULL); 91 sigaction(SIGINT, &sa_shutdown, NULL); 92 sigaction(SIGUSR1, &sa_shutdown, NULL); 93 sigaction(SIGUSR2, &sa_shutdown, NULL); 94 sigaction(SIGPWR, &sa_shutdown, NULL); 95 sigaction(SIGSEGV, &sa_crash, NULL); 96 sigaction(SIGBUS, &sa_crash, NULL); 97 sigaction(SIGHUP, &sa_dummy, NULL); 98 sigaction(SIGKILL, &sa_dummy, NULL); 99 sigaction(SIGSTOP, &sa_dummy, NULL); 100 #ifndef DISABLE_INIT 101 reboot(RB_DISABLE_CAD); 102 #endif 103 } 104
This page was automatically generated by LXR 0.3.1. • OpenWrt