#include #include #include #ifndef LUATASK_OMIT_HTTPCLIENT #include #endif #ifndef LUATASK_OMIT_COMMAND #include #endif LuaTask * LuaTask::top = 0; LuaTask::LuaTask(Lua * _L, const String & _cmd) : L(_L), cmd(_cmd), nargs(0), c(0), b(0) { if (top) { WaitFor(top); } else { SetBurst(); } top = this; stacktop = L->gettop() + 1; } LuaTask::LuaTask(Lua * _L, int _nargs) : L(_L), cmd(""), nargs(_nargs), c(0), b(0) { if (top) { WaitFor(top); } else { SetBurst(); } top = this; stacktop = L->gettop() - nargs; } LuaTask::~LuaTask() { if (top == this) { top = 0; } } String LuaTask::GetName() { return "LuaTask(" + cmd + ")"; } int LuaTask::Do() throw (GeneralException) { int nargs = 0; switch (current) { case 0: current = 1; if (cmd != "") { L->resume(cmd); } else { L->resume(nargs); } case 2: #ifndef LUATASK_OMIT_HTTPCLIENT if (task == "HttpClient") { LuaBuffer o(b); o.pushdestruct(L); nargs = 1; } #endif #ifndef LUATASK_OMIT_COMMAND if (task == "Command") { delete p; LuaBuffer o(b); o.pushdestruct(L); nargs = 1; } #endif if (!c) delete c; c = 0; L->resume(nargs); case 1: current = 2; if (L->gettop() >= 1) { task = L->tostring(1); if (task == "") { L->error("Must precise a task-type to execute."); return TASK_DONE; #ifndef LUATASK_OMIT_HTTPCLIENT } else if (task == "HttpClient") { String url = L->tostring(2); t_headers headers; b = new Buffer(true); headers.push_back("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) Gecko/20061010 Firefox/2.0"); c = new HttpClient(url, b, "", headers); WaitFor(c); Suspend(TASK_ON_HOLD); #endif #ifndef LUATASK_OMIT_COMMAND } else if (task == "Command") { pid_t pid; int i; char * cmd; char ** args, ** ptr; cmd = L->tostring(2).strdup(); args = (char **) malloc(sizeof(char *) * (L->gettop() - 1)); args[0] = cmd; for (i = 3; i <= L->gettop(); i++) { args[i - 2] = L->tostring(i).strdup(); } args[L->gettop() - 1] = 0; b = new Buffer(true); p = new InPipe(); if (!(pid = fork())) { p->Hook(); execvp(cmd, args); } c = new CopyJob(p, b); for (i = 3; i <= L->gettop(); i++) { free(args[i - 2]); } free(cmd); current = 3; WaitFor(pid); Suspend(TASK_ON_HOLD); #endif } else { L->error("Unknow requested task: " + task); return TASK_DONE; } } else { return TASK_DONE; } break; #ifndef LUATASK_OMIT_COMMAND case 3: current = 2; WaitFor(c); p->HalfClose(); return TASK_ON_HOLD; #endif } return TASK_ON_HOLD; }