New version 1.2.16
[sahlberg/ctdb.git] / libctdb / control.c
index 928729050323d1dea66471c134cdc88a6d4d3d7f..07185dbb41bad23a8e29b03a9508c91aa8441d37 100644 (file)
@@ -16,6 +16,7 @@
    You should have received a copy of the GNU General Public License
    along with this program; if not, see <http://www.gnu.org/licenses/>.
 */
+#include <string.h>
 #include <ctdb.h>
 #include <ctdb_protocol.h>
 #include "libctdb_private.h"
 /* Remove type-safety macros. */
 #undef ctdb_getrecmaster_send
 #undef ctdb_getpnn_send
+#undef ctdb_getnodemap_send
+#undef ctdb_getpublicips_send
 
-int ctdb_getrecmaster_recv(struct ctdb_request *req, uint32_t *recmaster)
+bool ctdb_getrecmaster_recv(struct ctdb_connection *ctdb,
+                          struct ctdb_request *req, uint32_t *recmaster)
 {
        struct ctdb_reply_control *reply;
 
-       reply = unpack_reply_control(req, CTDB_CONTROL_GET_RECMASTER);
-       if (!reply || reply->status == -1)
-               return -1;
+       reply = unpack_reply_control(ctdb, req, CTDB_CONTROL_GET_RECMASTER);
+       if (!reply) {
+               return false;
+       }
+       if (reply->status == -1) {
+               DEBUG(ctdb, LOG_ERR, "ctdb_getrecmaster_recv: status -1");
+               return false;
+       }
        *recmaster = reply->status;
-       return 0;
+       return true;
 }
 
 struct ctdb_request *ctdb_getrecmaster_send(struct ctdb_connection *ctdb,
@@ -45,15 +54,21 @@ struct ctdb_request *ctdb_getrecmaster_send(struct ctdb_connection *ctdb,
                                        callback, private_data);
 }
 
-int ctdb_getpnn_recv(struct ctdb_request *req, uint32_t *pnn)
+bool ctdb_getpnn_recv(struct ctdb_connection *ctdb,
+                    struct ctdb_request *req, uint32_t *pnn)
 {
        struct ctdb_reply_control *reply;
 
-       reply = unpack_reply_control(req, CTDB_CONTROL_GET_PNN);
-       if (!reply || reply->status == -1)
-               return -1;
+       reply = unpack_reply_control(ctdb, req, CTDB_CONTROL_GET_PNN);
+       if (!reply) {
+               return false;
+       }
+       if (reply->status == -1) {
+               DEBUG(ctdb, LOG_ERR, "ctdb_getpnn_recv: status -1");
+               return false;
+       }
        *pnn = reply->status;
-       return 0;
+       return true;
 }
 
 struct ctdb_request *ctdb_getpnn_send(struct ctdb_connection *ctdb,
@@ -64,3 +79,96 @@ struct ctdb_request *ctdb_getpnn_send(struct ctdb_connection *ctdb,
        return new_ctdb_control_request(ctdb, CTDB_CONTROL_GET_PNN, destnode,
                                        NULL, 0, callback, private_data);
 }
+
+bool ctdb_getnodemap_recv(struct ctdb_connection *ctdb,
+                     struct ctdb_request *req, struct ctdb_node_map **nodemap)
+{
+       struct ctdb_reply_control *reply;
+
+       *nodemap = NULL;
+       reply = unpack_reply_control(ctdb, req, CTDB_CONTROL_GET_NODEMAP);
+       if (!reply) {
+               return false;
+       }
+       if (reply->status == -1) {
+               DEBUG(ctdb, LOG_ERR, "ctdb_getnodemap_recv: status -1");
+               return false;
+       }
+       if (reply->datalen == 0) {
+               DEBUG(ctdb, LOG_ERR, "ctdb_getnodemap_recv: returned data is 0 bytes");
+               return false;
+       }
+
+       *nodemap = malloc(reply->datalen);
+       if (*nodemap == NULL) {
+               DEBUG(ctdb, LOG_ERR, "ctdb_getnodemap_recv: failed to malloc buffer");
+               return false;
+       }
+       memcpy(*nodemap, reply->data, reply->datalen);
+
+       return true;
+}
+struct ctdb_request *ctdb_getnodemap_send(struct ctdb_connection *ctdb,
+                                         uint32_t destnode,
+                                         ctdb_callback_t callback,
+                                         void *private_data)
+{
+       return new_ctdb_control_request(ctdb, CTDB_CONTROL_GET_NODEMAP,
+                                       destnode,
+                                       NULL, 0, callback, private_data);
+}
+
+void ctdb_free_nodemap(struct ctdb_node_map *nodemap)
+{
+       if (nodemap == NULL) {
+               return;
+       }
+       free(nodemap);
+}
+
+bool ctdb_getpublicips_recv(struct ctdb_connection *ctdb,
+                           struct ctdb_request *req,
+                           struct ctdb_all_public_ips **ips)
+{
+       struct ctdb_reply_control *reply;
+
+       *ips = NULL;
+       reply = unpack_reply_control(ctdb, req, CTDB_CONTROL_GET_PUBLIC_IPS);
+       if (!reply) {
+               return false;
+       }
+       if (reply->status == -1) {
+               DEBUG(ctdb, LOG_ERR, "ctdb_getpublicips_recv: status -1");
+               return false;
+       }
+       if (reply->datalen == 0) {
+               DEBUG(ctdb, LOG_ERR, "ctdb_getpublicips_recv: returned data is 0 bytes");
+               return false;
+       }
+
+       *ips = malloc(reply->datalen);
+       if (*ips == NULL) {
+               DEBUG(ctdb, LOG_ERR, "ctdb_getpublicips_recv: failed to malloc buffer");
+               return false;
+       }
+       memcpy(*ips, reply->data, reply->datalen);
+
+       return true;
+}
+struct ctdb_request *ctdb_getpublicips_send(struct ctdb_connection *ctdb,
+                                           uint32_t destnode,
+                                           ctdb_callback_t callback,
+                                           void *private_data)
+{
+       return new_ctdb_control_request(ctdb, CTDB_CONTROL_GET_PUBLIC_IPS,
+                                       destnode,
+                                       NULL, 0, callback, private_data);
+}
+
+void ctdb_free_publicips(struct ctdb_all_public_ips *ips)
+{
+       if (ips == NULL) {
+               return;
+       }
+       free(ips);
+}