Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include <mongo_ros/message_collection.h>
00038 #include <sys/types.h>
00039 #include <signal.h>
00040 #include <unistd.h>
00041 #include <moveit/warehouse/warehouse_connector.h>
00042
00043 namespace moveit_warehouse
00044 {
00045
00046 WarehouseConnector::WarehouseConnector(const std::string &mongoexec) : mongoexec_(mongoexec), child_pid_(0)
00047 {
00048 }
00049
00050 WarehouseConnector::~WarehouseConnector()
00051 {
00052 if (child_pid_ != 0)
00053 kill(child_pid_, SIGTERM);
00054 }
00055
00056 bool WarehouseConnector::connectToDatabase(const std::string& dirname)
00057 {
00058 if(child_pid_ != 0)
00059 kill(child_pid_, SIGTERM);
00060
00061 child_pid_ = fork();
00062 if (child_pid_ == -1)
00063 {
00064 ROS_ERROR("Error forking process.");
00065 child_pid_ = 0;
00066 return false;
00067 }
00068
00069 if (child_pid_ == 0)
00070 {
00071 std::size_t exec_file_pos = mongoexec_.find_last_of("/\\");
00072 if (exec_file_pos != std::string::npos)
00073 {
00074 char** argv = new char*[4];
00075 std::size_t exec_length = 1 + mongoexec_.length() - exec_file_pos;
00076 argv[0] = new char[1 + exec_length];
00077 snprintf(argv[0], exec_length, "%s", mongoexec_.substr(exec_file_pos + 1).c_str());
00078
00079 argv[1] = new char[16];
00080 snprintf(argv[1], 15, "--dbpath");
00081
00082 argv[2] = new char[1024];
00083 snprintf(argv[2], 1023, "%s", dirname.c_str());
00084
00085 argv[3] = NULL;
00086
00087 int code = execv(mongoexec_.c_str(), argv);
00088 delete[] argv[0];
00089 delete[] argv[1];
00090 delete[] argv[2];
00091 delete[] argv;
00092 ROS_ERROR_STREAM("execv() returned " << code << ", errno=" << errno << " string errno = " << strerror(errno));
00093 }
00094 return false;
00095 }
00096 else
00097 {
00098
00099 ros::WallDuration(1.0).sleep();
00100 }
00101 return true;
00102 }
00103
00104 }