Merge in fix for Ubuntu
[m6w6/libmemcached] / libtest / server.h
index c209881e3de25c3cf2b23ab97b87b44012de5235..00f29cd837b19c9c21630c7fbbf0be835d942b04 100644 (file)
 #include <netinet/in.h>
 #include <string>
 #include <unistd.h>
+#include <vector>
 
 #define SERVERS_TO_CREATE 5
 
+struct server_st;
+
+typedef pid_t (test_server_getpid)(server_st &);
+typedef bool (test_server_ping)(server_st &);
+
 struct server_st {
 private:
   bool _used;
   pid_t _pid;
   in_port_t _port;
   char pid_file[FILENAME_MAX]; // Did we start it, or was it just sitting there?
+  std::string _command;
+  test_server_getpid *__get_pid;
+  test_server_ping *__ping;
+  std::string _hostname;
+
 public:
+  server_st(in_port_t port_arg, test_server_getpid *, test_server_ping *);
+
+  server_st(const std::string &socket_file, test_server_getpid *, test_server_ping *);
+
+  void set_methods(test_server_getpid *get_pid_arg, test_server_ping *ping_arg)
+  {
+    __get_pid= get_pid_arg;
+    __ping= ping_arg;
+  }
+
+  const char *hostname() const
+  {
+    if (_hostname.empty())
+      return "";
+
+    return _hostname.c_str();
+  }
+
+  bool ping()
+  {
+    if (__ping)
+      return __ping(*this);
 
-  char hostname[NI_MAXHOST];
+    return false;
+  }
 
-  server_st() :
-    _used(false),
-    _pid(-1),
-    _port(0)
+  pid_t get_pid()
   {
-    pid_file[0]= 0;
-    strncpy(hostname, "localhost", sizeof(hostname));
+    if (__get_pid)
+      return _pid= __get_pid(*this);
+
+    return -1;
   }
 
   void set_port(in_port_t arg)
@@ -48,23 +81,20 @@ public:
 
   bool has_port() const
   {
-    return not _port == 0;
+    return (_port != 0);
   }
 
-  void set_used()
+  void set_command(const char *arg)
   {
-    _used= true;
+    _command= arg;
   }
 
-  void set_pid(pid_t arg)
+  void set_used()
   {
-    _pid= arg;
+    _used= true;
   }
 
-  pid_t pid() const
-  {
-    return _pid;
-  }
+  pid_t pid();
 
   bool is_used() const
   {
@@ -75,20 +105,16 @@ public:
 
   bool has_pid()
   {
-    return _pid > 0;
+    return (_pid > 1);
   }
 
   bool is_socket() const
   {
-    return hostname[0] == '/';
-  }
-
-  void set_hostname(const char *arg)
-  {
-    strncpy(hostname, arg, sizeof(hostname));
+    return _hostname[0] == '/';
   }
 
   bool kill();
+  bool start();
 
 private:
   void reset_pid();
@@ -98,18 +124,20 @@ std::ostream& operator<<(std::ostream& output, const server_st &arg);
 
 struct server_startup_st
 {
-  uint8_t count;
+  uint32_t count;
   uint8_t udp;
   std::string server_list;
-  server_st server[SERVERS_TO_CREATE];
+  std::vector<server_st *> servers;
 
   server_startup_st() :
     count(SERVERS_TO_CREATE),
     udp(0)
   { }
 
-  ~server_startup_st()
-  { }
+  void shutdown();
+  void push_server(server_st *);
+
+  ~server_startup_st();
 };
 
 #ifdef __cplusplus