作者 主題: 問個會被揍的問題>_<  (閱讀 7430 次)

0 會員 與 1 訪客 正在閱讀本文。

James Wu

  • 鑽研的研究生
  • *****
  • 文章數: 683
    • 檢視個人資料
問個會被揍的問題>_<
« 於: 2003-08-06 00:36 »
為了使用ups,在軟體還沒考慮花錢買進來的前提下
去污來了一台數據機
找了前人的程式來用
------------------- upscheck.c -------------------- begin (不含此行)
/*
* upscheck Check how UPS & computer communicate.
*
* Usage: upscheck <device> <bits to set>
* For example, upscheck /dev/cua4 4 to set bit 3 &
* monitor /dev/cua4.
*
* Author: Harvey J. Stein <hjstein@math.huji.ac.il>
* (but really just a minor modification of Miquel van
* Smoorenburg's <miquels@drinkel.nl.mugnet.org> powerd.c
*
* Version: 1.0 19940802
*
*
*/
#include <sys/types.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>

#include <syslog.h>
#include "path.h"


void powerfail(ok)
int ok;
{
int fd;

/* Create an info file for init. */
unlink(PWRSTAT);
if ((fd = open(PWRSTAT, O_CREAT|O_WRONLY, 0644)) >= 0) {
if (ok)
write(fd, "OK\n", 3);
else
write(fd, "FAIL\n", 5);
close(fd);
}
kill(1, SIGPWR);
}
/* 這一段由POWERD.C 截選下來..用來通知INIT.下.SHUTDOWN 指令的 */
/* 以下是upscheck 的部份....................................*/

/* Main program. */
int main(int argc, char **argv)
{
int fd;

/* These TIOCM_* parameters are defined in <linux/termios.h>, which */
/* is indirectly included here. */
int dtr_bit = TIOCM_DTR;
int rts_bit = TIOCM_RTS;
int set_bits;
int flags;
int status, oldstat = -1;
int count = 0;
int pc;
int on = 1;
int off = 1;

if (argc < 2) {
fprintf(stderr, "Usage: upscheck <device> <bits-to-set>\n");
exit(1);
}

/* Open monitor device. */
if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) {
fprintf(stderr, "upscheck: %s: %s\n", argv[1], strerro[errno]);
exit(1);}

/* Get the bits to set from the command line. */
sscanf(argv[2], "%d", &set_bits);

while (1) {
/* Set the command line specified bits (& only the command line */
/* specified bits). */
ioctl(fd, TIOCMSET, &set_bits);
/* fprintf(stderr, "Setting %o.\n", set_bits); --remark by lloyd */

sleep(1);
/* ^^^^^^ 這地方可改成10 sec.. or more...*/

/* Get the current line bits */
ioctl(fd, TIOCMGET, &flags);
/* fprintf(stderr, "Flags are %o.\n", flags); --remark by lloyd */

/* Fiddle here by changing TIOCM_CTS to some other TIOCM until */
/* this program detects that the power goes out when you yank */
/* the plug on the UPS. Then you'll know how to modify powerd.c. */
if (flags & TIOCM_CTS)
{
pc = 0 ;
/* fprintf(stderr, "power is up.\n"); --remark by lloyd */
if ( on == 0)
{
on = 1;
off = 1;
powerfail(on);
}
else
{
/* fprintf(stderr, "--------------\n"); --lloyd */
}
}
else
{
pc = pc + 1 ;
/* fprintf(stderr, "power is down.\n"); --lloyd */

on = 0;
if ( off == 1 )
{
powerfail(on);
off = 0;
}
}
}

close(fd);
}
------------------ upscheck.c --------- end (不含此行)

------------ path.h ------------------- begin (不含此行)
/*
* path.h Paths of files that init and related utilities need.
*
* Version: @(#) paths.h 1.60 15-Jan-1995
*
* Author: Miquel van Smoorenburg, <miquels@drinkel.ow.org>
*
* This file is part of the sysvinit suite,
* Copyright 1991-1995 Miquel van Smoorenburg.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#define INITLVL "/etc/initrunlvl" /* New runlevel for init */
#define CONSOLE "/dev/console" /* Logical system console */
#define SYSTTY "/dev/systty" /* Physical system console */
#define SYSDEV 0x0400 /* to mknod() the sysdev */
#define SECURETTY "/etc/securetty" /* List of root terminals */
#define SDALLOW "/etc/shutdown.allow" /* Users allowed to shutdown */
#define INITTAB "/etc/inittab" /* Location of inittab */
#define PWRSTAT "/etc/powerstatus" /* SIGPWR reason (OK/BAD) */
#define INIT "/sbin/init" /* Location of init itself. */
#define NOLOGIN "/etc/nologin" /* Stop user logging in. */
#define FASTBOOT "/etc/fastboot" /* Enable fast boot. */
#define SDPID "/etc/shutdownpid" /* PID of shutdown program */
#define IOSAVE "/etc/ioctl.save" /* termios settings for SU */
#define SHELL "/bin/sh" /* Default shell */
#define INITSCRIPT "/etc/initscript" /* Initscript. */
#define HALTSCRIPT "/etc/rc.d/rc.halt" /* Called by "fast" shutdown */
#define REBOOTSCRIPT "/etc/rc.d/rc.reboot" /* Ditto. */

----------------------- path.h --------------- end (不含此行)
在組譯之後
upscheck.c: In function `main':
upscheck.c:72: `strerro' undeclared (first use in this function)
upscheck.c:72: (Each undeclared identifier is reported only once
upscheck.c:72: for each function it appears in.)
是否表示strerror只能被呼叫一次丫?
該值要如何去定義丫@@
果然偷用別人程式不太好
目前只能做到斷電時會自動關機
可是復電後,strerror沒有做用
會變成shutdown -c後
又繼續關機@@

螢火飛

  • 酷!學園 學長們
  • 活潑的大學生
  • ***
  • 文章數: 400
    • 檢視個人資料
    • http://firefly.idv.tw
問個會被揍的問題>_<
« 回覆 #1 於: 2003-08-06 08:20 »
你把
strerro[errno]
改成
strerror(errno)
試試看。

James Wu

  • 鑽研的研究生
  • *****
  • 文章數: 683
    • 檢視個人資料
問個會被揍的問題>_<
« 回覆 #2 於: 2003-08-06 11:29 »
/tmp/ccPwowcB.o(.text+0x119): In function `main':
: undefined reference to `strerro'
collect2: ld returned 1 exit status
改了以後變成這樣囉
感謝飛大的幫忙

螢火飛

  • 酷!學園 學長們
  • 活潑的大學生
  • ***
  • 文章數: 400
    • 檢視個人資料
    • http://firefly.idv.tw
問個會被揍的問題>_<
« 回覆 #3 於: 2003-08-06 13:04 »
引述: "James Wu"
/tmp/ccPwowcB.o(.text+0x119): In function `main':
: undefined reference to `strerro'
collect2: ld returned 1 exit status
改了以後變成這樣囉
感謝飛大的幫忙


不可能吧!你是如何編譯的?(e.g. # gcc xxxx.c -o xxxx)?

James Wu

  • 鑽研的研究生
  • *****
  • 文章數: 683
    • 檢視個人資料
問個會被揍的問題>_<
« 回覆 #4 於: 2003-08-06 13:05 »
報告飛大:
gcc -o upscheck upscheck.c
後來我發現....
我少打了一個r..
改了之後就好了,對不起@@

octapult

  • 可愛的小學生
  • *
  • 文章數: 27
    • 檢視個人資料
問個會被揍的問題>_<
« 回覆 #5 於: 2003-08-06 13:08 »
引述: "James Wu"
/tmp/ccPwowcB.o(.text+0x119): In function `main':
: undefined reference to `strerro'
collect2: ld returned 1 exit status
改了以後變成這樣囉
感謝飛大的幫忙

假如想要使用 strerror 的話,需要 #include <string.h>
-----BEGIN GEEK CODE BLOCK------
Version: 3.12
G! d- s+:+ a? C++(+++) UBL>++++ P L++ E+ W++ N+ o+ K- w(--) O?
M? V PS+ PE+ Y+ PGP- t 5? X++ R tv b+ DI- D+ G e? h! r-- z?
-------END GEEK CODE BLOCK-------

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
問個會被揍的問題>_<
« 回覆 #6 於: 2003-08-06 13:25 »
: undefined reference to `strerro'
strerror

James Wu

  • 鑽研的研究生
  • *****
  • 文章數: 683
    • 檢視個人資料
問個會被揍的問題>_<
« 回覆 #7 於: 2003-08-06 13:26 »
引述: "abelyang"
: undefined reference to `strerro'
strerror

謝謝學長,我下次不敢這麼豬頭了

James Wu

  • 鑽研的研究生
  • *****
  • 文章數: 683
    • 檢視個人資料
問個會被揍的問題>_<
« 回覆 #8 於: 2003-08-06 13:27 »
引述: "octapult"
引述: "James Wu"
/tmp/ccPwowcB.o(.text+0x119): In function `main':
: undefined reference to `strerro'
collect2: ld returned 1 exit status
改了以後變成這樣囉
感謝飛大的幫忙

假如想要使用 strerror 的話,需要 #include <string.h>

感謝您

James Wu

  • 鑽研的研究生
  • *****
  • 文章數: 683
    • 檢視個人資料
問個會被揍的問題>_<
« 回覆 #9 於: 2003-08-06 20:45 »
我又來麻煩大家了
程式改好了迷有問題
當modem關掉時
會在五分鐘後自己闗機
在五分鐘之內把數據機打開
會把關機取消掉,可是馬上又繼續關機了..
我的/etc/inittab內容如下
# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +5 "Power Failure; System Shutting Down"
                                                                               
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
# If power comes back in single user mode, return to multi user mode.
ps:S:powerokwait:/sbin/init 5
是否還有那裡需要修改呢?