[2/2] testbot/testagentd: Add a GetCwd RPC.

Francois Gouget fgouget at codeweavers.com
Mon Jul 21 16:24:14 CDT 2014


---
 testbot/lib/WineTestBot/TestAgent.pm | 18 ++++++++++++++++++
 testbot/scripts/TestAgent            | 12 +++++++++++-
 testbot/src/testagentd/testagentd.c  | 18 +++++++++++++++++-
 3 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/testbot/lib/WineTestBot/TestAgent.pm b/testbot/lib/WineTestBot/TestAgent.pm
index 2aa8373..c26d047 100644
--- a/testbot/lib/WineTestBot/TestAgent.pm
+++ b/testbot/lib/WineTestBot/TestAgent.pm
@@ -40,6 +40,7 @@ my $RPC_SETTIME = 7;
 my $RPC_GETPROPERTIES = 8;
 my $RPC_UPGRADE = 9;
 my $RPC_RMCHILDPROC = 10;
+my $RPC_GETCWD = 11;
 
 my %RpcNames=(
     $RPC_PING => 'ping',
@@ -53,6 +54,7 @@ my %RpcNames=(
     $RPC_GETPROPERTIES => 'getproperties',
     $RPC_UPGRADE => 'upgrade',
     $RPC_RMCHILDPROC => 'rmchildproc',
+    $RPC_GETCWD => 'getcwd',
 );
 
 my $Debug = 0;
@@ -1400,4 +1402,20 @@ sub RemoveChildProcess($$)
   return $self->_RecvList('');
 }
 
+sub GetCwd($)
+{
+  my ($self) = @_;
+  debug("GetCwd\n");
+
+  # Send the command
+  if (!$self->_StartRPC($RPC_GETCWD) or
+      !$self->_SendListSize('ArgC', 0))
+  {
+    return undef;
+  }
+
+  # Get the reply
+  return $self->_RecvList('s');
+}
+
 1;
diff --git a/testbot/scripts/TestAgent b/testbot/scripts/TestAgent
index ec4504f..ced1165 100755
--- a/testbot/scripts/TestAgent
+++ b/testbot/scripts/TestAgent
@@ -198,6 +198,10 @@ while (@ARGV)
         @Rm = @ARGV;
         last;
     }
+    elsif ($arg eq "getcwd")
+    {
+        $Cmd = $arg;
+    }
     elsif ($arg eq "getversion")
     {
         set_cmd($arg);
@@ -296,7 +300,7 @@ if (defined $Usage)
     print "or     $name0 [options] <hostname> wait <pid>\n";
     print "or     $name0 [options] <hostname> settime\n";
     print "or     $name0 [options] <hostname> rm <serverfiles>\n";
-    print "or     $name0 [options] <hostname> [ping|version]\n";
+    print "or     $name0 [options] <hostname> [getcwd|ping|version]\n";
     print "\n";
     print "This is a testagentd client. It can be used to send/receive files and to run commands on the server.\n";
     print "\n";
@@ -323,6 +327,7 @@ if (defined $Usage)
     print "  getproperty <name> Retrieves and prints the specified server property, for\n";
     print "                instance its architecture, 'server.arch'. One can print all the\n";
     print "                properties at once by omitting the name or setting it to '*'.\n";
+    print "  getcwd        Returns the server's current working directory.\n";
     print "  ping          Makes sure the server is still alive.\n";
     print "  upgrade       Replaces the server executable with the specified file and\n";
     print "                restarts it.\n";
@@ -440,6 +445,11 @@ elsif ($Cmd eq "upgrade")
 {
     $Result = $TA->Upgrade($LocalFilename);
 }
+elsif ($Cmd eq "getcwd")
+{
+    $Result = $TA->GetCwd();
+    print "Current directory: $Result\n" if (defined $Result);
+}
 elsif ($Cmd eq "getversion")
 {
     $Result = $TA->GetVersion();
diff --git a/testbot/src/testagentd/testagentd.c b/testbot/src/testagentd/testagentd.c
index dc181a6..e776cc7 100644
--- a/testbot/src/testagentd/testagentd.c
+++ b/testbot/src/testagentd/testagentd.c
@@ -37,7 +37,7 @@
  * 1.3:  Fix the zero / infinite timeouts in the wait2 RPC.
  * 1.4:  Add the settime RPC.
  * 1.5:  Add support for upgrading the server.
- * 1.6:  Add support for the rmchildproc RPC.
+ * 1.6:  Add support for the rmchildproc and getcwd RPC.
  */
 #define PROTOCOL_VERSION "testagentd 1.6"
 
@@ -90,6 +90,7 @@ enum rpc_ids_t
     RPCID_GETPROPERTIES,
     RPCID_UPGRADE,
     RPCID_RMCHILDPROC,
+    RPCID_GETCWD,
 };
 
 /* This is the RPC currently being processed */
@@ -111,6 +112,7 @@ static const char* rpc_name(uint32_t id)
         "getproperties",
         "upgrade",
         "rmchildproc",
+        "getcwd",
     };
 
     if (id < sizeof(names) / sizeof(*names))
@@ -1037,7 +1039,19 @@ static void do_upgrade(SOCKET client)
     }
     else
         send_error(client);
+}
+
+static void do_getcwd(SOCKET client)
+{
+    char curdir[261];
 
+    if (expect_list_size(client, 0))
+    {
+        send_list_size(client, 1);
+        send_string(client, getcwd(curdir, sizeof(curdir)));
+    }
+    else
+        send_error(client);
 }
 
 static void do_unknown(SOCKET client, uint32_t id)
@@ -1109,6 +1123,8 @@ static void process_rpc(SOCKET client)
         break;
     case RPCID_UPGRADE:
         do_upgrade(client);
+    case RPCID_GETCWD:
+        do_getcwd(client);
         break;
     case RPCID_RMCHILDPROC:
         do_rmchildproc(client);
-- 
2.0.1



More information about the wine-patches mailing list