>Мне нужно делать это когда юзера не залогинились
собираеш простенькую схемку кнопки в СОМ-порт
и вешаеш в систему демона...
(с) не мои. Работает железобетонно (freebsd 4.11, 5.3)
------------------------КУСЬ...
Subject: Схема простого переключателя для последовательного порта
Схема переключателя с индикатором текущего режима, подключаемого к
последовательному порту и периодически запускающего один из 2 скриптов
в зависимости от режима переключателя.
switcher.c
------------
/*
Simple program to monitor the state of switcher and execute two
different scripts according to the state. Current state
is displayed by LED indicator
DB-9 Connector
Pin Signal Pin Signal
-------------------------------------------------------------------
1 CD Carrier Detect 6 DSR Data Set Ready
2 RXD Receive Data 7 RTS Request to Send
3 TXD Transmit Data 8 CTS Clear to Send
4 DTR Data Term. Ready 9 RI Ring Indicator
5 GND Signal GND
Circuit diagram
DB9
1 DCD o-------------|------------|
4 DTR o---/\/\/\----| |
10k \\ switcher
\\
|
5 GND o--------------------------|
-------
| - |
| LED |
| + |
7 RTS o---/\/\/\-----------------|
1k
Author: Tigran Zakaryan tigr@irphe.am
*/
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int fd;
int dtr_bit = TIOCM_DTR;
int rts_bit = TIOCM_RTS;
int flags, cntr_bits;
int status, oldstat = -1;
//
if (argc < 4) {
fprintf(stderr, "Usage: switcher <device> <script1> <script2>\\n");
exit(1);
}
// Daemonize
switch(fork()) {
case 0: // Child
setsid();
break;
case -1: // Error
exit(1);
default: // Parent
exit(0);
}
if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) {
exit(1);
}
// DTR should be high. Force it
ioctl(fd, TIOCMGET, &cntr_bits);
cntr_bits |= dtr_bit;
ioctl(fd, TIOCMSET, &cntr_bits);
// Sample the DCD line
while(1) {
// Get the status
ioctl(fd, TIOCMGET, &flags);
// Calculate present status
status = (flags & TIOCM_CAR);
// Did DCD drop to zero? (switch is "ON", light is "ON")
if (oldstat != 0 && status == 0) {
// Script1
system(argv[2]);
// Switch light "ON"
ioctl(fd, TIOCMGET, &cntr_bits);
cntr_bits |= rts_bit;
ioctl(fd, TIOCMSET, &cntr_bits);
}
// Did DCD come up again? (switch is "OFF", light is "OFF")
if ((oldstat == 0 && status != 0) || (oldstat == -1 && status != 0)) {
// Script2
system(argv[3]);
// Switch light "OFF"
ioctl(fd, TIOCMGET, &cntr_bits);
cntr_bits &= ~rts_bit;
ioctl(fd, TIOCMSET, &cntr_bits);
}
// Remember status and sleep for 1 second
oldstat = status;
usleep(1000000);
}
// Never happens
return(0);
}
Makefile
-----------
CC=g++
all: switcher
switcher: switcher.c
$(CC) -o switcher switcher.c
chmod 700 switcher
clean:
rm -f *~ core switcher