+ uint32_t this_wait;
+ bool pinged= false;
+ {
+ uint32_t timeout= 20; // This number should be high enough for valgrind startup (which is slow)
+ uint32_t waited;
+ uint32_t retry;
+
+ for (waited= 0, retry= 1; ; retry++, waited+= this_wait)
+ {
+ if ((pinged= ping()) == true)
+ {
+ break;
+ }
+ else if (waited >= timeout)
+ {
+ break;
+ }
+
+ this_wait= retry * retry / 3 + 1;
+ libtest::dream(this_wait, 0);
+ }
+ }
+
+ if (pinged == false)
+ {
+ // If we happen to have a pid file, lets try to kill it
+ if (pid_file().empty() == false)
+ {
+ if (kill_file(pid_file()) == false)
+ {
+ throw libtest::fatal(LIBYATL_DEFAULT_PARAM, "Failed to kill off server after startup occurred, when pinging failed: %s", pid_file().c_str());
+ }
+ Error << "Failed to ping(), waited:" << this_wait
+ << " server started, having pid_file. exec:" << _running
+ << " error:" << _app.stderr_result();
+ }
+ else
+ {
+ Error << "Failed to ping() server started. exec:" << _running;
+ }
+ _running.clear();
+ return false;
+ }
+
+ return has_pid();
+}
+
+void Server::reset_pid()
+{
+ _running.clear();
+ _pid_file.clear();
+}
+
+pid_t Server::pid() const
+{
+ return _app.pid();
+}
+
+void Server::add_option(const std::string& arg)
+{
+ _options.push_back(std::make_pair(arg, std::string()));
+}
+
+void Server::add_option(const std::string& name, const std::string& value)
+{
+ _options.push_back(std::make_pair(name, value));
+}
+
+bool Server::set_socket_file()
+{
+ char file_buffer[FILENAME_MAX];
+ file_buffer[0]= 0;
+
+ if (broken_pid_file())
+ {
+ snprintf(file_buffer, sizeof(file_buffer), "/tmp/%s.socketXXXXXX", name());
+ }
+ else
+ {
+ snprintf(file_buffer, sizeof(file_buffer), "var/run/%s.socketXXXXXX", name());
+ }
+
+ int fd;
+ if ((fd= mkstemp(file_buffer)) == -1)
+ {
+ perror(file_buffer);
+ return false;
+ }
+ close(fd);
+ unlink(file_buffer);
+
+ _socket= file_buffer;
+
+ return true;
+}
+
+bool Server::set_pid_file()
+{
+ char file_buffer[FILENAME_MAX];
+ file_buffer[0]= 0;
+
+ if (broken_pid_file())
+ {
+ snprintf(file_buffer, sizeof(file_buffer), "/tmp/%s.pidXXXXXX", name());