📄 active.ec
字号:
/*=============================================================
* 运行管理(激活系统,暂停系统,运行状态)
*
* 周国祥 2001/04/27 modified
*=============================================================*/
#ifdef XENIX
#include <tinfo.h>
#else
#include <curses.h>
#endif
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <time.h>
#include "mytools.h"
#include "shmsys.h"
#include "msgsys.h"
#include "msgapi.h"
#include "tool.h"
#define MY_ROWS 4
#define MY_LINES 2
#define PAGE 15
typedef struct {
char program_name[41];
char exec_name[31];
char exec_para[31];
} ACT;
extern SHM1 *sh1;
EXEC SQL INCLUDE sqlca;
EXEC SQL WHENEVER SQLERROR CALL error_handler;
EXEC SQL WHENEVER SQLWARNING CALL warning_handler;
EXEC SQL WHENEVER NOT FOUND CALL notfound_handler;
$include "db_struct.h";
$S_sys_module ppp;
active()
{
char filename[128], buf[80], desc_name[41];
int line, pos, num, i, j;
ACT head[EXEC_NUM];
WINDOW *my_win;
PSTAT sel;
char have_fail = 0;
sprintf(filename, "/tmp/.active.%d", getpid());
scr_dump(filename);
disp_below("恢复服务");
clear_wline(stdscr, LINES-1);
h_prompt(LINES-1, 1, " < ESC 退出 > ", 0, 0);
h_prompt(LINES-1, 1, "恢复服务", 0, 0);
my_win = newwin(18, 80, 3, 0);
mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
wrefresh(my_win);
if (no_init()) {
h_winprompt(my_win, MY_LINES+PAGE, MY_ROWS, "系统未启动!", 1, 0);
delwin(my_win);
scr_restore(filename);
unlink(filename);
return(0);
}
loop:
$declare cur_6 cursor for
select * from sys_module
where start_mode not in ('0','3')
order by module_id;
if (SQLCODE) {
errcall(ERROR, "Declare cursor error!(cur_6:%d)", SQLCODE);
h_winprompt(my_win, MY_LINES+PAGE, MY_ROWS, "Declare cursor error!",
1, 0);
delwin(my_win);
scr_restore(filename);
unlink(filename);
return(-1);
}
$open cur_6;
if (SQLCODE) {
errcall(ERROR, "Open cursor error!(cur_6:%d)", SQLCODE);
h_winprompt(my_win, MY_LINES+PAGE, MY_ROWS, "Open cursor error!",
1, 0);
delwin(my_win);
scr_restore(filename);
unlink(filename);
return(-1);
}
num = 0;
while (num < EXEC_NUM) {
$fetch cur_6 into :ppp;
if (SQLCODE == 100) break;
if (SQLCODE < 0) {
errcall(ERROR, "Fetch cursor error!(cur_6:%d)", SQLCODE);
$close cur_6;
h_winprompt(my_win, MY_LINES+PAGE, MY_ROWS,
"Fetch cursor error!", 1, 0);
delwin(my_win);
scr_restore(filename);
unlink(filename);
return(-1);
}
del_st_space("sys_module", &ppp);
#ifdef zgx010427_modi
sprintf(sel.name, "%-8.8s", ppp.prog_name);
#else
strcpy(sel.name, ppp.prog_name);
#endif
if (sel_shm_pid(&sel) == 0)
if (sel.pause == ACTIVE)
if (get_pid(sel.name, &sel.pid) == 0)
continue;
strcpy(head[num].program_name, ppp.prog_desc);
strcpy(head[num].exec_name, ppp.prog_name);
strcpy(head[num].exec_para, ppp.prog_param);
num++;
}
$close cur_6;
if (num == 0) {
h_winprompt(my_win, MY_LINES+PAGE, MY_ROWS, "进程全部处于活动状态!",
1, 0);
delwin(my_win);
scr_restore(filename);
unlink(filename);
return(0);
}
/* display and select */
pos = 0;
while (1) {
line = MY_LINES;
for (i = line; i < 17; i++) clear_wline(my_win, i);
for (i = 0; ((pos + i) < num) && (i < 14); i++) {
sprintf(buf, "%x %-15.15s\t\t%s", i, head[pos+i].exec_name, head[pos + i].program_name);
h_winprompt(my_win, line++, MY_ROWS, buf, 0, 0);
}
line = (pos + i) < num;
sprintf(buf, "以上进程处于非激活状态, 请选择其一激活(Ctrl + P 激活全部)%s%s%s%s",
(pos || line) ? " (" : "", pos ? " PgUp 上页" : "",
line ? " PgDn 下页" : "", (pos || line) ? " )" : "");
h_winprompt(my_win, MY_LINES+PAGE, MY_ROWS, buf, 0, 0);
wrefresh(my_win);
do {
switch (line = getkey(my_win)) {
case PGUP:
if (pos) {
pos -= 14;
line = 0;
}
break;
case PGDN:
if ((pos + i) < num) {
pos += 14;
line = 0;
}
break;
case CTRL_L:
wrefresh(curscr);
break;
case ESCAPE:
delwin(my_win);
scr_restore(filename);
unlink(filename);
return(0);
case CTRL_P:
/* 恢复所有暂停的模块 */
have_fail = 0;
for (j = 0; j < num; j++) {
strcpy(desc_name, head[j].program_name);
DelSpace(desc_name);
sprintf(buf, "激活 %s ...", desc_name);
clear_wline(my_win, MY_LINES+PAGE);
h_winprompt(my_win, MY_LINES+PAGE, MY_ROWS, buf, 0, 0);
sprintf(buf, "%s %s &", head[j].exec_name, head[j].exec_para);
strcpy(sel.name, head[j].exec_name);
if (get_pid(sel.name, &sel.pid) < 0) {
if (fork() == 0) {
sqldetach();
system(buf);
exit(0);
}
wait(0);
} else
upd_shm_pid(sel.name, sel.pid, ACTIVE);
sleep(4);
if (sel_shm_pid(&sel) == 0) {
if (sel.pause == ACTIVE) {
clear_wline(my_win, MY_LINES+PAGE);
sprintf(buf, "%s 激活成功!...", desc_name);
mvwprintw(my_win, MY_LINES+PAGE, MY_ROWS, buf);
wrefresh(my_win);
continue;
}
}
clear_wline(my_win, MY_LINES+PAGE);
sprintf(buf, "%s 激活失败! ...", desc_name);
mvwprintw(my_win, MY_LINES+PAGE, MY_ROWS, buf);
wrefresh(my_win);
have_fail++;
continue;
}
if (have_fail == 0) {
sprintf(buf, "所有模块激活成功! 任意键继续...");
} else {
sprintf(buf, "有%d个模块激活失败! 任意键继续...", have_fail);
}
clear_wline(my_win, MY_LINES+PAGE);
h_winprompt(my_win, MY_LINES+PAGE, MY_ROWS, buf,
1, 0);
goto loop;
default:
if (0x30 <= line && line <= 0x39)
line -= 0x30;
else
if ('a' <= line && line <= 'f')
line += 10 - 'a';
else
if ('A' <= line && line <= 'F')
line += 10 - 'A';
else {
line = 1;
break;
}
if (line >= i) break;
line += pos;
strcpy(desc_name, head[line].program_name);
DelSpace(desc_name);
sprintf(buf, "激活 %s ...", desc_name);
clear_wline(my_win, MY_LINES+PAGE);
h_winprompt(my_win, MY_LINES+PAGE, MY_ROWS, buf,
0, 0);
sprintf(buf, "%s %s &", head[line].exec_name,
head[line].exec_para);
#ifdef zgx010507_modi
sprintf(sel.name, "%-8.8s",
head[line].exec_name);
#else
strcpy(sel.name, head[line].exec_name);
#endif
if (get_pid(sel.name, &sel.pid) < 0) {
if (fork() == 0) {
sqldetach();
system(buf);
exit(0);
}
wait(0);
} else
upd_shm_pid(sel.name, sel.pid, ACTIVE);
sleep(4);
if (sel_shm_pid(&sel) == 0) {
if (sel.pause == ACTIVE) {
clear_wline(my_win, MY_LINES+PAGE);
sprintf(buf, "%s 激活成功! 任意键继续...",
desc_name);
h_winprompt(my_win, MY_LINES+PAGE,
MY_ROWS, buf, 1, 0);
#ifdef zgx010520_modi
delwin(my_win);
scr_restore(filename);
unlink(filename);
return(0);
#else
goto loop;
#endif
}
}
clear_wline(my_win, MY_LINES+PAGE);
sprintf(buf, "%s 激活失败! 任意键继续...", desc_name);
h_winprompt(my_win, MY_LINES+PAGE, MY_ROWS, buf,
1, 0);
#ifdef zgx010520_modi
delwin(my_win);
scr_restore(filename);
unlink(filename);
return(0);
#else
goto loop;
#endif
}
} while (line);
}
}
pausesys()
{
char filename[128], buf[80];
ACT head[EXEC_NUM];
int line, pos, num, i;
int di[EXEC_NUM];
WINDOW *my_win;
sprintf(filename, "/tmp/.pausesys.%d", getpid());
scr_dump(filename);
disp_below("暂停服务");
clear_wline(stdscr, LINES-1);
h_prompt(LINES-1, 1, " < ESC 退出 > ", 0, 0);
h_prompt(LINES-1, 1, "暂停服务", 0, 0);
my_win = newwin(18, 80, 3, 0);
mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
wrefresh(my_win);
if (no_init()) {
h_winprompt(my_win, MY_LINES+PAGE, MY_ROWS, "系统未启动!", 1, 0);
delwin(my_win);
scr_restore(filename);
unlink(filename);
return(0);
}
#ifdef zgx010427
if ((sh1 = (SHM1 *)gshm1()) == NULL) {
h_winprompt(my_win, MY_LINES+PAGE, MY_ROWS, "Get share memory error!",
1, 0);
delwin(my_win);
scr_restore(filename);
unlink(filename);
return(0);
}
#else
if (getipc() < 0) {
h_winprompt(my_win, MY_LINES+PAGE, MY_ROWS, "Get share memory error!",
1, 0);
delwin(my_win);
scr_restore(filename);
unlink(filename);
return(0);
}
#endif
loop:
num = 0;
for (i = 0; i < EXEC_NUM; i++) {
if (is_null(sh1->pst[i].name))
break;
if (sh1->pst[i].pause != ACTIVE && sh1->pst[i].pause != SETTIME)
continue;
#ifdef zgx010528_modi
/* 已修改incl/shmsys.h中PSTAT结构的name[9]为name[20] */
/*
* 查找模块名,可能8字符后面已被截断,需用%匹配
*/
sprintf(ppp.prog_name, "%s%%", sh1->pst[i].name);
$select * into :ppp from sys_module
where prog_name like :ppp.prog_name;
#else
sprintf(ppp.prog_name, "%s", sh1->pst[i].name);
$select * into :ppp from sys_module
where prog_name = :ppp.prog_name;
#endif
if (SQLCODE) {
errcall(ERROR, "Select program_mode error![%s][%d]",
sh1->pst[i].name, SQLCODE);
sprintf(head[num].program_name, "异常进程 %d %s", sh1->pst[i].pid, sh1->pst[i].name);
sprintf(head[num].exec_name, "%s", sh1->pst[i].name);
di[num++] = -1;
} else {
del_st_space("sys_module", &ppp);
strcpy(head[num].program_name, ppp.prog_desc);
strcpy(head[num].exec_name, ppp.prog_name);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -