Addition for memcached_light to have a pid file.
authorBrian Aker <brian@gaz>
Wed, 13 Jan 2010 17:32:58 +0000 (09:32 -0800)
committerBrian Aker <brian@gaz>
Wed, 13 Jan 2010 17:32:58 +0000 (09:32 -0800)
example/memcached_light.c

index d9e14727a6e664be4910b8d9721a7d29fd09c84d..d88e5861a97a76c80a8455b0a72d2ffc061b060c 100644 (file)
@@ -50,11 +50,20 @@ static int num_server_sockets= 0;
 static void* socket_userdata_map[1024];
 static bool verbose= false;
 
+struct options_st {
+  char *pid_file;
+  bool has_port;
+  in_port_t port;
+} global_options;
+
+typedef struct options_st options_st;
+
 /**
  * Create a socket and bind it to a specific port number
  * @param port the port number to bind to
  */
-static int server_socket(const char *port) {
+static int server_socket(const char *port)
+{
   struct addrinfo *ai;
   struct addrinfo hints= { .ai_flags= AI_PASSIVE,
                            .ai_family= AF_UNSPEC,
@@ -226,29 +235,34 @@ static void work(void);
  */
 int main(int argc, char **argv)
 {
-  bool port_specified= false;
   int cmd;
   memcached_binary_protocol_callback_st *interface= &interface_v0_impl;
 
+  memset(&global_options, 0, sizeof(global_options));
+
   /*
    * We need to initialize the handlers manually due to a bug in the
    * warnings generated by struct initialization in gcc (all the way up to 4.4)
    */
   initialize_interface_v0_handler();
 
-  while ((cmd= getopt(argc, argv, "v1p:?")) != EOF)
+  while ((cmd= getopt(argc, argv, "v1pP:?h")) != EOF)
   {
     switch (cmd) {
     case '1':
       interface= &interface_v1_impl;
       break;
+    case 'P':
+      global_options.pid_file= strdup(optarg);
+      break;
     case 'p':
-      port_specified= true;
+      global_options.has_port= true;
       (void)server_socket(optarg);
       break;
     case 'v':
       verbose= true;
       break;
+    case 'h':  /* FALLTHROUGH */
     case '?':  /* FALLTHROUGH */
     default:
       (void)fprintf(stderr, "Usage: %s [-p port] [-v] [-1]\n", argv[0]);
@@ -256,15 +270,31 @@ int main(int argc, char **argv)
     }
   }
 
-  if (!initialize_storage())
+  if (! initialize_storage())
   {
     /* Error message already printed */
     return 1;
   }
 
-  if (!port_specified)
+  if (! global_options.has_port)
     (void)server_socket("9999");
 
+  if (global_options.pid_file)
+  {
+    FILE *pid_file;
+    uint32_t pid;
+
+    pid_file= fopen(global_options.pid_file, "w+");
+    perror(strerror(errno));
+
+    if (pid_file == NULL)
+      abort();
+
+    pid= (uint32_t)getpid();
+    fprintf(pid_file, "%u\n", pid);
+    fclose(pid_file);
+  }
+
   if (num_server_sockets == 0)
   {
     fprintf(stderr, "I don't have any server sockets\n");