|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Eugene Grosbein 2:5006/1 28 Sep 2002 19:06:27 To : All Subject : headless shutdown -------------------------------------------------------------------------------- Тут кто-то интересовался, как заставить систему погудеть динамиком после того, как диски отмонтированы во время shutdown, чтобы знать, что можно уже выключить питание, когда нет консоли у машины. Теперь есть патч для этого. Пользоваться так: cd /usr/src/sys; patch </path/to/patch Потом пересобрать ядро (через config или make kernel, неважно) и перегрузиться. Патч вводит четыре новых целочисленных sysctl: kern.shutdown.beep_duration - длительность гудка в милисекундах, ноль - нет гудков (по умолчанию) kern.shutdown.beep_hz - высота тона в герцах, ноль - нет гудков (по умолчанию) kern.shutdown.beep_number - количество гудков, ноль - нет гудков (по умолчанию) kern.shutdown.beep_pause - пауза между гудками в милисекундах, ноль - бесконечный гудок (1 по умолчанию) Гудки выдаются после того, как система выведет: >The operating system has halted >Please press any key to reboot Выдаются при halt, shutdown -h. Hе выдаются при reboot, shutdown -r. Критика приветствуется. Enjoy. Index: i386/include/clock.h =================================================================== RCS file: /home/ncvs/src/sys/i386/include/clock.h,v retrieving revision 1.38 diff -u -r1.38 clock.h - --- i386/include/clock.h 29 Dec 1999 04:32:58 -0000 1.38 +++ i386/include/clock.h 28 Sep 2002 08:46:50 -0000 @@ -44,6 +44,7 @@ int release_timer1 __P((void)); #endif int sysbeep __P((int pitch, int period)); +void sysbeepstop __P((void *chan)); void i8254_restore __P((void)); #endif /* _KERNEL */ Index: i386/isa/clock.c =================================================================== RCS file: /home/ncvs/src/sys/i386/isa/clock.c,v retrieving revision 1.149.2.5 diff -u -r1.149.2.5 clock.c - --- i386/isa/clock.c 30 Jun 2002 07:56:49 -0000 1.149.2.5 +++ i386/isa/clock.c 28 Sep 2002 08:41:43 -0000 @@ -509,7 +509,7 @@ #endif } -static void +void sysbeepstop(void *chan) { outb(IO_PPI, inb(IO_PPI)&0xFC); /* disable counter2 output to speaker */ Index: kern/kern_shutdown.c =================================================================== RCS file: /home/ncvs/src/sys/kern/kern_shutdown.c,v retrieving revision 1.72.2.12 diff -u -r1.72.2.12 kern_shutdown.c - --- kern/kern_shutdown.c 21 Feb 2002 19:15:10 -0000 1.72.2.12 +++ kern/kern_shutdown.c 28 Sep 2002 10:31:21 -0000 @@ -324,7 +324,28 @@ /* * If the shutdown was a clean halt, behave accordingly. + * Issue beeps if requested. It may be useful for headless system shutdown. */ + +static unsigned beep_duration = 0; /* duration of beep in miliseconds */ + /* zero disables beeps */ +static unsigned beep_hz = 0; /* tone of beep in hertz, zero - no beeps */ +static unsigned beep_number = 0; /* number of beeps, zero disables beeps */ +static unsigned beep_pause = 1; /* pause between beeps, zero-infinite beep */ + +SYSCTL_UINT(_kern_shutdown, OID_AUTO, beep_duration, CTLFLAG_RW, + &beep_duration, 0, ""); +SYSCTL_UINT(_kern_shutdown, OID_AUTO, beep_hz, CTLFLAG_RW, + &beep_hz, 0, ""); +SYSCTL_UINT(_kern_shutdown, OID_AUTO, beep_number, CTLFLAG_RW, + &beep_number, 0, ""); +SYSCTL_UINT(_kern_shutdown, OID_AUTO, beep_pause, CTLFLAG_RW, + &beep_pause, 0, ""); + +#ifndef TIMER_FREQ +#define TIMER_FREQ 1193182 +#endif + static void shutdown_halt(void *junk, int howto) { @@ -332,6 +353,26 @@ printf("\n"); printf("The operating system has halted.\n"); printf("Please press any key to reboot.\n\n"); + + if (beep_hz>0 && beep_duration>0 && + beep_number>0 ) { /* Beeps requested */ + int i; + if (beep_pause<0) beep_pause=1; + for (i=1; i<beep_number; i++) { + sysbeep(TIMER_FREQ/beep_hz,0); /* Issue one */ + DELAY(beep_duration*1000); + if (beep_pause>0) { + sysbeepstop(NULL); /* Do pause */ + DELAY(beep_pause*1000); + } + } + sysbeep(TIMER_FREQ/beep_hz,0); + if (beep_pause>0) { /* Zero pause gives infinite */ + DELAY(beep_duration*1000); + sysbeepstop(NULL); + } + } + switch (cngetc()) { case -1: /* No console, just die */ cpu_halt(); Eugene --- slrn/0.9.7.4 (FreeBSD) * Origin: Svyaz Service JSC (2:5006/1@fidonet) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/8869c85b52d2.html, оценка из 5, голосов 10
|