- uint32_t port_base= 0;
- for (uint32_t x= 0; x < construct->count; x++)
- {
- int status;
-
- snprintf(construct->pid_file[x], FILENAME_MAX, "/tmp/memcached.pidXXXXXX");
- int fd;
- if ((fd= mkstemp(construct->pid_file[x])) == -1)
- {
- perror("mkstemp");
- return;
- }
- close(fd);
-
- {
- char *var;
- char variable_buffer[1024];
-
- snprintf(variable_buffer, sizeof(variable_buffer), "LIBMEMCACHED_PORT_%u", x);
-
- if ((var= getenv(variable_buffer)))
- {
- construct->port[x]= (in_port_t)atoi(var);
- }
- else
- {
- do {
- construct->port[x]= (in_port_t)(x + TEST_PORT_BASE + port_base);
-
- if (libmemcached_util_ping("localhost", construct->port[x], NULL))
- {
- if (libmemcached_util_flush("localhost", construct->port[x], NULL))
- {
- fprintf(stderr, "Found server on port %d, flushed it!\n", (int)construct->port[x]);
- construct->is_used[x]= true;
- } // If we can flush it, we will just use it
- else
- {
- fprintf(stderr, "Found server on port %d, could not flush it, so trying next port.\n", (int)construct->port[x]);
- port_base++;
- construct->port[x]= 0;
- }
- }
- } while (construct->port[x] == 0);
- }
- }
-
- char buffer[FILENAME_MAX];
- if (x == 0)
- {
- snprintf(buffer, sizeof(buffer), "%s -d -P %s -t 1 -p %u -U %u -m 128",
- MEMCACHED_BINARY, construct->pid_file[x], construct->port[x], construct->port[x]);
- }
- else
- {
- snprintf(buffer, sizeof(buffer), "%s -d -P %s -t 1 -p %u -U %u",
- MEMCACHED_BINARY, construct->pid_file[x], construct->port[x], construct->port[x]);
- }
-
- if (construct->is_used[x])
- {
- fprintf(stderr, "USING SERVER: %s\n", buffer);
- }
- else
- {
- if (libmemcached_util_ping("localhost", construct->port[x], NULL))
- {
- fprintf(stderr, "Server on port %u already exists\n", construct->port[x]);
- }
- else
- {
- status= system(buffer);
- fprintf(stderr, "STARTING SERVER: %s status:%d\n", buffer, status);
- }
- }
-
- size_t remaining_length= sizeof(server_string_buffer) - (size_t)(end_ptr -server_string_buffer);
- int count= snprintf(end_ptr, remaining_length, "--server=localhost:%u ", construct->port[x]);
-
- if ((size_t)count >= remaining_length or count < 0)
- {
- fprintf(stderr, "server names grew to be larger then buffer allowed\n");
- abort();
- }
- end_ptr+= count;
- }
- *end_ptr= 0;