⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 active.ec

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 EC
📖 第 1 页 / 共 2 页
字号:
/*=============================================================
 *		运行管理(激活系统,暂停系统,运行状态)	
 *
 *	周国祥 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 + -