~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to plugin/mysql_unix_socket_protocol/protocol.cc

  • Committer: Monty Taylor
  • Date: 2010-11-18 07:03:09 UTC
  • mto: This revision was merged to the branch mainline in revision 1946.
  • Revision ID: mordred@inaugust.com-20101118070309-pi09o1fvn89oxd5b
Fixes the issues with socket

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
#include <algorithm>
31
31
#include <iostream>
32
32
#include <boost/program_options.hpp>
 
33
#include <boost/filesystem.hpp>
33
34
#include <drizzled/module/option_map.h>
34
35
 
35
36
#include <sys/un.h>
38
39
 
39
40
#define DRIZZLE_UNIX_SOCKET_PATH "/tmp/mysql.socket"
40
41
 
41
 
static std::string unix_socket_path(DRIZZLE_UNIX_SOCKET_PATH);
42
 
 
43
42
namespace po= boost::program_options;
 
43
namespace fs= boost::filesystem;
44
44
using namespace drizzled;
45
45
using namespace std;
46
46
 
49
49
 
50
50
Protocol::~Protocol()
51
51
{
 
52
  fs::remove(unix_socket_path);
52
53
}
53
54
 
54
55
const char* Protocol::getHost(void) const
55
56
{
56
 
  return DRIZZLE_UNIX_SOCKET_PATH;
 
57
  return unix_socket_path.file_string().c_str();
57
58
}
58
59
 
59
60
in_port_t Protocol::getPort(void) const
65
66
{  
66
67
  const module::option_map &vm= context.getOptions();
67
68
 
68
 
  if (vm.count("path"))
69
 
  {
70
 
    unix_socket_path.clear();
71
 
    unix_socket_path.append(vm["path"].as<string>());
72
 
  }
73
 
 
74
 
  context.add(new Protocol("mysql_unix_socket_protocol", true));
 
69
  fs::path uds_path(vm["path"].as<fs::path>());
 
70
  if (not fs::exists(uds_path))
 
71
  {
 
72
    context.add(new Protocol("mysql_unix_socket_protocol",
 
73
                             true,
 
74
                             uds_path));
 
75
    context.registerVariable(new sys_var_fs_path("path", uds_path));
 
76
  }
 
77
  else
 
78
  {
 
79
    cerr << uds_path << _(" exists already. Do you have another Drizzle or "
 
80
                          "MySQL running? Or perhaps the file is stale and "
 
81
                          "should be removed?") << std::endl;
 
82
    return 1;
 
83
  }
75
84
 
76
85
  return 0;
77
86
}
91
100
  memset(&servAddr, 0, sizeof(servAddr));
92
101
 
93
102
  servAddr.sun_family= AF_UNIX;
94
 
  strcpy(servAddr.sun_path, unix_socket_path.c_str());
 
103
  strcpy(servAddr.sun_path, unix_socket_path.file_string().c_str());
95
104
 
96
105
  // In case we restart and find something in our way we move it aside and
97
106
  // then attempt to remove it.
98
107
  {
99
 
    std::string move_file(unix_socket_path);
100
 
    move_file.append(".old");
101
 
    std::rename(unix_socket_path.c_str(), move_file.c_str());
102
 
    unlink(move_file.c_str());
 
108
    fs::path move_file(unix_socket_path.file_string() + ".old");
 
109
    fs::rename(unix_socket_path, move_file);
 
110
    unlink(move_file.file_string().c_str());
103
111
  }
104
112
 
105
113
 
106
114
  int arg= 1;
107
115
 
108
116
  (void) setsockopt(unix_sock, SOL_SOCKET, SO_REUSEADDR, (char*)&arg, sizeof(arg));
 
117
  unlink(unix_socket_path.file_string().c_str());
109
118
 
110
119
  addrlen= sizeof(servAddr);
111
120
  if (::bind(unix_sock, reinterpret_cast<sockaddr *>(&servAddr), addrlen) < 0)
112
121
  { 
113
 
    std::cerr << "Can't start server : Bind on unix socket\n";
114
 
    std::cerr << "Do you already have another of drizzled or mysqld running on socket: " << unix_socket_path << "?\n";
115
 
    std::cerr << "Can't start server : UNIX Socket";
 
122
    std::cerr << "Can't start server : Bind on unix socket." << std::endl;
 
123
    std::cerr << "Do you already have another of drizzled or mysqld running on socket: " << unix_socket_path << "?" << std::endl;
 
124
    std::cerr << "Can't start server : UNIX Socket" << std::endl;
116
125
 
117
126
    return false;
118
127
  }
119
128
 
120
 
  if (listen(unix_sock,(int) 1000) < 0)
 
129
  if (listen(unix_sock, (int) 1000) < 0)
121
130
  {
122
131
    std::cerr << "listen() on Unix socket failed with error " << errno << "\n";
123
132
  }
124
133
  else
125
134
  {
126
 
    std::cerr << "Listening on " << unix_socket_path.c_str() << "\n";
 
135
    std::cerr << "Listening on " << unix_socket_path << "\n";
127
136
  }
128
137
  (void) unlink(unix_socket_path.c_str());
129
138
 
136
145
static void init_options(drizzled::module::option_context &context)
137
146
{
138
147
  context("path",
139
 
          po::value<string>()->default_value(unix_socket_path),
 
148
          po::value<fs::path>()->default_value(DRIZZLE_UNIX_SOCKET_PATH),
140
149
          N_("Path used for MySQL UNIX Socket Protocol."));
141
150
}
142
151
 
143
 
static drizzle_sys_var* sys_variables[]= {
144
 
  NULL
145
 
};
146
 
 
147
152
} /* namespace mysql_unix_socket_protocol */
148
153
 
149
 
DRIZZLE_PLUGIN(mysql_unix_socket_protocol::init, mysql_unix_socket_protocol::sys_variables, mysql_unix_socket_protocol::init_options);
 
154
DRIZZLE_PLUGIN(mysql_unix_socket_protocol::init, NULL, mysql_unix_socket_protocol::init_options);