You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
qps-packaging/src/command.cpp

290 lines
7.6 KiB

// command.C
//
// This program is free software. See the file COPYING for details.
// Author: Mattias Engdeg?rd, 1997-1999
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <QMessageBox>
#include "command.h"
#include "commandutils.h"
#include "checkboxdelegate.h"
#include "watchcond.h"
#include "execwindow.h"
#include "listmodel.h"
#include "watchdogdialog.h"
#include "qps.h"
#include "proc.h"
#include "uidstr.h"
#include "dialogs.h"
extern Qps *qps;
extern ControlBar *controlbar;
extern QList<Command *> commands;
Command::Command(QString n, QString cmd, bool flag)
{
// printf("Command init\n");
name = n;
cmdline = cmd;
toolbar = false;
popup = false;
// toolbutton=new CommandButton(controlbar,name);
// toolbutton->hide();
////toolbutton->setTextLabel (name) ;
////toolbutton->setUsesTextLabel ( true );
/// toolbutton->setAutoRaise(true);
// QObject::connect(toolbutton, SIGNAL(clicked()),toolbutton,
// SLOT(exec_command()));
}
Command::~Command()
{
// toolbutton->hide();
// delete toolbutton;
}
QString Command::getString()
{
QString str;
str.append(name);
str.append(",");
str.append(cmdline);
return str;
}
void Command::putString(QString str)
{
int idx = str.indexOf(",");
// idx=str.indexOf(",",idx);
name = str.mid(0, idx);
cmdline = str.mid(idx + 1, str.size());
}
// dirty code...
// Description : this command need "select process"
bool Command::IsNeedProc()
{
int i, len;
len = cmdline.length();
for (i = 0; i < len;)
{
int v = cmdline.indexOf('%', i);
if (v < 0)
break;
if (++v >= len)
break;
char c = cmdline[v].cell(); //.toLatin1().data();
switch (c)
{
case 'p':
case 'c':
case 'C':
case 'u':
if (cmdline.indexOf("update", v) == v)
{
v += 5;
break;
}
// printf("true\n");
return true;
default:
;
}
i = v + 1;
}
return false;
}
QString substString(QString str, Procinfo *p)
{
QString s;
int len = str.length();
for (int i = 0;;)
{
int v = str.indexOf('%', i);
if (v < 0)
{
s.append(str.right(len - i));
break;
}
else
{
s.append(str.mid(i, v - i));
if (++v >= len)
break;
QString subst;
// need change to LOCALE(by fasthyun@magicn.com)
char c = str[v].cell();
switch (c)
{
case 'p':
subst.setNum(p->pid);
break;
case 'c':
subst = p->command;
break;
case 'C':
subst = p->cmdline;
break;
case 'u':
subst = Uidstr::userName(p->uid);
break;
case '%':
subst = "%";
break;
}
s.append(subst);
i = v + 1;
}
}
return s;
}
// execute command
void Command::call(Procinfo *p)
{
QString s;
QString msg;
printf("called !\n");
int len = cmdline.length();
if (p == NULL)
{
if (cmdline == "%update")
{
qps->refresh();
return;
}
s = cmdline;
}
else
s = substString(cmdline, p);
int ret = system(s.toLatin1().data()); ///
/*
pr=new QProcess; // leak?
if(!wc->command.isEmpty()) //conflict pid's command
{
pr->start(wc->command); // thread run, if
null then
segfault occurs. ?
}
connect(pr, SIGNAL(started()), this, SLOT(cmd_started()));
connect(pr, SIGNAL(finished ( int , QProcess::ExitStatus
)),this,SLOT(cmd_finished ( int , QProcess::ExitStatus )));
connect(pr, SIGNAL(error ( QProcess::ProcessError )),this,
SLOT(cmd_error(QProcess::ProcessError)));
*/
if (ret)
{
msg = "The command:\n\n";
msg.append(s);
if (ret == -1)
{
msg.append("\n\nfailed with the error:\n\n");
const char *e =
(errno == EAGAIN) ? "Too many processes" : strerror(errno);
msg.append(e ? e : "Unknown error");
}
else if (ret & 0xff)
{
msg.append("\n\nwas terminated by signal ");
msg.append(QString().setNum(ret & 0xff));
msg.append(".");
}
else if (ret == 0x7f00)
{
msg.append("\n\ncould not be executed because it was not "
"found,\nor you did not have execute permission.");
}
else
{
msg.append("\n\nexited with status ");
msg.append(QString().setNum(ret >> 8));
msg.append(".");
}
QMessageBox::warning(0, "Command Failed", msg);
}
}
//----------------------------------------------------------------
QList<watchCond *> watchlist;
extern WatchdogDialog *watchdogDialog;
// except threads, already running process
void watchdog_check_if_start(QString cmd, Procinfo *pi)
{
/// printf("cmd=%s\n", cmd.toLatin1().data());
for (int i = 0; i < watchlist.size(); ++i)
{
watchCond *wc = watchlist.at(i);
if (wc->enable == false)
continue;
if (wc->cond == WATCH_PROCESS_START)
if (wc->procname == cmd)
{
// printf("Watchdog: start\n");
if (!pi->isThread())
// ExecWindow *mw=new
// ExecWindow(wc->message,wc->command,pi->pid,pi->command);
// // leak
ExecWindow *mw =
new ExecWindow(wc, pi->pid, pi->command); // leak
// note :
// 1.system("./loop"); //block !!
// 2.pr.setEnvironment(QProcess::systemEnvironment
//());
}
}
}
void watchdog_check_if_finish(QString cmd, Procinfo *pi)
{
for (int i = 0; i < watchlist.size(); ++i)
{
watchCond *w = watchlist.at(i);
if (w->enable == false)
continue;
if (w->cond == WATCH_PROCESS_FINISH)
{
if (w->procname == cmd)
{
// printf("Watchdog: finish\n");
if (!pi->isThread())
// if(pi->pid==pi->tgid) // not a thread
// !
ExecWindow *mw =
new ExecWindow(w, pi->pid, pi->command); // leak
// ExecWindow *mw=new
// ExecWindow(w->message,w->command,pi->pid,pi->command);
}
}
}
}
// NOTYET
void watchdog_syscpu(int cpu)
{
// printf("Watchdog: watchdog_syscpu\n");
// if(watchdogDialog->flag_ifsyscpu)
{
// if(cpu> watchdogDialog->syscpu_over)
// printf("Watchdog: event %d%\n",cpu);
// QMessageBox::warning(0, "Watchdog", "aaaaa"); //blocking
}
}