// // aegis - project change supervisor // Copyright (C) 2004-2006, 2008 Peter Miller // // 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 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see // . // #include #include #include #include int server_execute(server_ty *sp, string_ty *cmd) { // // Run the command. // trace(("server_execute()\n{\n")); os_become_orig(); int flags = OS_EXEC_FLAG_SILENT; string_ty *dir = os_curdir(); nstring s1(os_edit_filename(0)); trace_nstring(s1); nstring s2 = nstring::format("( %s ) > %s 2>&1", cmd->str_text, s1.c_str()); int result = os_execute_retcode(s2.get_ref(), flags, dir); s2 = read_whole_file(s1); os_unlink(s1); trace_nstring(s2); os_become_undo(); // // If there was any output, send suitable diagnostic messages to // the client. // if (result) { server_error ( sp, "%s\n%s\nexit status: %d", cmd->str_text, s2.c_str(), result ); } else if (!s2.empty()) { server_e(sp, "%s\n%s", cmd->str_text, s2.c_str()); } // // Report the exit status to the caller: // false (zero) on failure, true (non-zero) on success. // trace(("return %d;\n", (result == 0))); trace(("}\n")); return (result == 0); }