Browse Source
* Allow ';' as a separator for multi-command lines. Not recognized by
* Allow ';' as a separator for multi-command lines. Not recognized by
the string parser, so it must be preceeded by whitespace. * Allow escaping of newlines in the resource file. * Cleanup of the parse_command_* commands. git-svn-id: svn://rakshasa.no/libtorrent/trunk/rtorrent@936 e378c898-3ddf-0310-93e7-cc216c733640pull/30/head
18 changed files with 368 additions and 136 deletions
-
21rak/functional_fun.h
-
90src/command_download.cc
-
15src/command_events.cc
-
2src/command_local.cc
-
8src/command_network.cc
-
17src/command_ui.cc
-
2src/control.cc
-
6src/core/manager.cc
-
4src/core/manager.h
-
2src/rpc/Makefile.am
-
117src/rpc/exec_file.cc
-
57src/rpc/exec_file.h
-
10src/rpc/parse.cc
-
7src/rpc/parse.h
-
121src/rpc/parse_commands.cc
-
21src/rpc/parse_commands.h
-
2src/ui/download_list.cc
-
2src/ui/element_download_list.cc
@ -0,0 +1,117 @@ |
|||
// rTorrent - BitTorrent client
|
|||
// Copyright (C) 2006, Jari Sundell
|
|||
//
|
|||
// 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 2 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, write to the Free Software
|
|||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|||
//
|
|||
// In addition, as a special exception, the copyright holders give
|
|||
// permission to link the code of portions of this program with the
|
|||
// OpenSSL library under certain conditions as described in each
|
|||
// individual source file, and distribute linked combinations
|
|||
// including the two.
|
|||
//
|
|||
// You must obey the GNU General Public License in all respects for
|
|||
// all of the code used other than OpenSSL. If you modify file(s)
|
|||
// with this exception, you may extend this exception to your version
|
|||
// of the file(s), but you are not obligated to do so. If you do not
|
|||
// wish to do so, delete this exception statement from your version.
|
|||
// If you delete this exception statement from all source files in the
|
|||
// program, then also delete it here.
|
|||
//
|
|||
// Contact: Jari Sundell <jaris@ifi.uio.no>
|
|||
//
|
|||
// Skomakerveien 33
|
|||
// 3185 Skoppum, NORWAY
|
|||
|
|||
#include "config.h"
|
|||
|
|||
#include <unistd.h>
|
|||
|
|||
#include "exec_file.h"
|
|||
|
|||
namespace rpc { |
|||
|
|||
int |
|||
ExecFile::execute(const char* file, char* const* argv) { |
|||
pid_t childPid = fork(); |
|||
|
|||
if (childPid == -1) |
|||
throw torrent::input_error("ExecFile::execute(...) Fork failed."); |
|||
|
|||
if (childPid == 0) { |
|||
// Close all fd's.
|
|||
for (int i = 0, last = sysconf(_SC_OPEN_MAX); i != last; i++) |
|||
::close(i); |
|||
|
|||
int result = execvp(file, argv); |
|||
|
|||
_exit(result); |
|||
|
|||
} else { |
|||
int status; |
|||
|
|||
if (waitpid(childPid, &status, 0) != childPid) |
|||
throw torrent::internal_error("ExecFile::execute(...) waitpid failed."); |
|||
|
|||
// Check return value?
|
|||
|
|||
return status; |
|||
} |
|||
} |
|||
|
|||
torrent::Object |
|||
ExecFile::execute_object(const torrent::Object& rawArgs) { |
|||
char* argsBuffer[128]; |
|||
char** argsCurrent = argsBuffer; |
|||
|
|||
// Size of strings are less than 24.
|
|||
char valueBuffer[3072]; |
|||
char* valueCurrent = valueBuffer; |
|||
|
|||
const torrent::Object::list_type& args = rawArgs.as_list(); |
|||
|
|||
if (args.empty()) |
|||
throw torrent::input_error("Too few arguments."); |
|||
|
|||
for (torrent::Object::list_type::const_iterator itr = args.begin(), last = args.end(); itr != last; itr++, argsCurrent++) { |
|||
if (argsCurrent == argsBuffer + 128 - 1) |
|||
throw torrent::input_error("Too many arguments."); |
|||
|
|||
switch (itr->type()) { |
|||
case torrent::Object::TYPE_STRING: |
|||
*argsCurrent = const_cast<char*>(itr->as_string().c_str()); |
|||
break; |
|||
|
|||
case torrent::Object::TYPE_VALUE: |
|||
*argsCurrent = valueCurrent; |
|||
|
|||
valueCurrent += std::max(snprintf(valueCurrent, valueBuffer + 3072 - valueCurrent, "%lli", itr->as_value()), 0); |
|||
break; |
|||
|
|||
default: |
|||
throw torrent::input_error("Invalid type."); |
|||
} |
|||
} |
|||
|
|||
*argsCurrent = NULL; |
|||
|
|||
int status = execute(argsBuffer[0], argsBuffer); |
|||
|
|||
if (status != 0) |
|||
throw torrent::input_error("ExecFile::execute_object(...) status != 0."); |
|||
|
|||
return torrent::Object(); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,57 @@ |
|||
// rTorrent - BitTorrent client |
|||
// Copyright (C) 2006, Jari Sundell |
|||
// |
|||
// 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 2 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, write to the Free Software |
|||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|||
// |
|||
// In addition, as a special exception, the copyright holders give |
|||
// permission to link the code of portions of this program with the |
|||
// OpenSSL library under certain conditions as described in each |
|||
// individual source file, and distribute linked combinations |
|||
// including the two. |
|||
// |
|||
// You must obey the GNU General Public License in all respects for |
|||
// all of the code used other than OpenSSL. If you modify file(s) |
|||
// with this exception, you may extend this exception to your version |
|||
// of the file(s), but you are not obligated to do so. If you do not |
|||
// wish to do so, delete this exception statement from your version. |
|||
// If you delete this exception statement from all source files in the |
|||
// program, then also delete it here. |
|||
// |
|||
// Contact: Jari Sundell <jaris@ifi.uio.no> |
|||
// |
|||
// Skomakerveien 33 |
|||
// 3185 Skoppum, NORWAY |
|||
|
|||
#ifndef RTORRENT_RPC_EXEC_FILE_H |
|||
#define RTORRENT_RPC_EXEC_FILE_H |
|||
|
|||
#include <torrent/object.h> |
|||
|
|||
namespace rpc { |
|||
|
|||
class ExecFile { |
|||
public: |
|||
|
|||
int execute(const char* file, char* const* argv); |
|||
|
|||
torrent::Object execute_object(const torrent::Object& rawArgs); |
|||
|
|||
private: |
|||
|
|||
}; |
|||
|
|||
} |
|||
|
|||
#endif |
Write
Preview
Loading…
Cancel
Save
Reference in new issue