Reduce duplicate code 48/218148/4
authorJusung Son <jusung07.son@samsung.com>
Wed, 20 Nov 2019 04:23:48 +0000 (13:23 +0900)
committerjusung son <jusung07.son@samsung.com>
Thu, 21 Nov 2019 08:00:33 +0000 (08:00 +0000)
Change-Id: I8dcc6296cf75575ed61e75443ffef9877e107cf6
Signed-off-by: Jusung Son <jusung07.son@samsung.com>
lib/buxton2.c

index 7bde41ce5cf55fe4ac1a6d5f711e267176fe1878..19edb6579ea04b475cfc302370ba907ccff23412 100644 (file)
@@ -43,6 +43,9 @@
 #  define EXPORT __attribute__((visibility("default")))
 #endif
 
+#define SET_SECURITY_MODE "set_security_mode"
+#define UPDATE_CLIENT_LABEL "update_client_label"
+
 struct bxt_req {
        guint32 msgid;
        struct buxton_layer *layer;
@@ -993,21 +996,37 @@ static void free_req(struct bxt_req *req)
        free(req);
 }
 
-static int send_req(struct buxton_client *client, const struct request *rqst)
+static int get_response(struct buxton_client *client, guint32 msgid,
+                       struct response *resp)
+{
+       int ret;
+
+       ret = wait_msg(client, msgid);
+       if (ret != BUXTON_ERROR_NONE)
+               return ret;
+
+       return resp->res;
+}
+static int send_req(struct buxton_client *client, const struct request *rqst,
+                       struct bxt_req *req, struct bxt_req **new_req)
 {
        int r;
        uint8_t *data;
        int len;
 
+       pthread_mutex_lock(&client->lock);
+       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
+
        if (client->fd < 0) {
                bxt_err("Invalid parameter(%d)", client->fd);
-               return BUXTON_ERROR_INVALID_PARAMETER;
+               r = BUXTON_ERROR_INVALID_PARAMETER;
+               goto out;
        }
 
        r = serialz_request(rqst, &data, &len);
        if (r != BUXTON_ERROR_NONE) {
                bxt_err("send req: serialize errno %d", r);
-               return r;
+               goto out;
        }
 
        r = proto_send(client->fd, rqst->type, data, len);
@@ -1016,9 +1035,31 @@ static int send_req(struct buxton_client *client, const struct request *rqst)
 
        free(data);
 
+out:
+       if (r == BUXTON_ERROR_NONE)
+               *new_req = req;
+       else
+               g_hash_table_remove(client->req_cbs, GUINT_TO_POINTER(req->msgid));
+
+       pthread_mutex_unlock(&client->lock);
+
        return r;
 }
 
+static inline void set_rqst(enum message_type type, struct bxt_req *req,
+                       char *key, struct buxton_value *val,
+                       char *rpriv, char *wpriv,
+                       struct request *rqst)
+{
+       rqst->type = type;
+       rqst->msgid = req->msgid;
+       rqst->layer = req->layer;
+       rqst->key = key;
+       rqst->val = val;
+       rqst->rpriv = rpriv;
+       rqst->wpriv = wpriv;
+}
+
 static int set_value(struct buxton_client *client,
                const struct buxton_layer *layer, const char *key,
                const struct buxton_value *val,
@@ -1038,27 +1079,11 @@ static int set_value(struct buxton_client *client,
        if (r != BUXTON_ERROR_NONE)
                return r;
 
-       memset(&rqst, 0, sizeof(rqst));
-       rqst.type = MSG_SET;
-       rqst.msgid = req->msgid;
-       rqst.layer = req->layer;
-       rqst.key = (char *)key;
-       rqst.val = (struct buxton_value *)val;
-
-       pthread_mutex_lock(&client->lock);
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
-
-       r = send_req(client, &rqst);
-       if (r != BUXTON_ERROR_NONE) {
-               g_hash_table_remove(client->req_cbs,
-                               GUINT_TO_POINTER(req->msgid));
-               pthread_mutex_unlock(&client->lock);
-               return r;
-       }
+       set_rqst(MSG_SET, req, (char *)key, (struct buxton_value *)val,
+               NULL, NULL, &rqst);
+       r = send_req(client, &rqst, req, new_req);
 
-       *new_req = req;
-       pthread_mutex_unlock(&client->lock);
-       return BUXTON_ERROR_NONE;
+       return r;
 }
 
 EXPORT int buxton_set_value(struct buxton_client *client,
@@ -1071,14 +1096,13 @@ EXPORT int buxton_set_value(struct buxton_client *client,
 
        pthread_mutex_lock(&clients_lock);
        ret = set_value(client, layer, key, val, callback, user_data, &req);
-       if (ret != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(ret);
-               return -1;
-       }
+       if (ret != BUXTON_ERROR_NONE)
+               ret = -1;
+
+       buxton_err_set_errno(ret);
 
        pthread_mutex_unlock(&clients_lock);
-       return 0;
+       return ret;
 }
 
 static void set_value_sync_cb(int status, const struct buxton_layer *layer,
@@ -1106,27 +1130,18 @@ EXPORT int buxton_set_value_sync(struct buxton_client *client,
 
        pthread_mutex_lock(&clients_lock);
        r = set_value(client, layer, key, val, set_value_sync_cb, &resp, &req);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       if (r != BUXTON_ERROR_NONE)
+               goto out;
 
-       r = wait_msg(client, req->msgid);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       r = get_response(client, req->msgid, &resp);
 
-       if (resp.res != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(resp.res);
-               return -1;
-       }
+out:
+       buxton_err_set_errno(r);
+       if (r != BUXTON_ERROR_NONE)
+               r = -1;
 
        pthread_mutex_unlock(&clients_lock);
-       return 0;
+       return r;
 }
 
 static int get_value(struct buxton_client *client,
@@ -1147,26 +1162,11 @@ static int get_value(struct buxton_client *client,
        if (r != BUXTON_ERROR_NONE)
                return r;
 
-       memset(&rqst, 0, sizeof(rqst));
-       rqst.type = MSG_GET;
-       rqst.msgid = req->msgid;
-       rqst.layer = req->layer;
-       rqst.key = (char *)key;
+       set_rqst(MSG_GET, req, (char *)key, NULL,
+               NULL, NULL, &rqst);
+       r = send_req(client, &rqst, req, new_req);
 
-       pthread_mutex_lock(&client->lock);
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
-
-       r = send_req(client, &rqst);
-       if (r != BUXTON_ERROR_NONE) {
-               g_hash_table_remove(client->req_cbs,
-                               GUINT_TO_POINTER(req->msgid));
-               pthread_mutex_unlock(&client->lock);
-               return r;
-       }
-
-       *new_req = req;
-       pthread_mutex_unlock(&client->lock);
-       return BUXTON_ERROR_NONE;
+       return r;
 }
 
 EXPORT int buxton_get_value(struct buxton_client *client,
@@ -1222,29 +1222,20 @@ EXPORT int buxton_get_value_sync(struct buxton_client *client,
 
        pthread_mutex_lock(&clients_lock);
        r = get_value(client, layer, key, get_value_sync_cb, &resp, &req);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
-
-       r = wait_msg(client, req->msgid);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       if (r != BUXTON_ERROR_NONE)
+               goto out;
 
-       if (resp.res != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(resp.res);
-               return -1;
-       }
+       r = get_response(client, req->msgid, &resp);
 
-       *val = resp.val;
+out:
+       buxton_err_set_errno(r);
+       if (r != BUXTON_ERROR_NONE)
+               r = -1;
+       else
+               *val = resp.val;
 
        pthread_mutex_unlock(&clients_lock);
-       return 0;
+       return r;
 }
 
 static int list_keys(struct buxton_client *client,
@@ -1265,26 +1256,11 @@ static int list_keys(struct buxton_client *client,
        if (r != BUXTON_ERROR_NONE)
                return r;
 
-       memset(&rqst, 0, sizeof(rqst));
-       rqst.type = MSG_LIST;
-       rqst.msgid = req->msgid;
-       rqst.layer = req->layer;
+       set_rqst(MSG_LIST, req, NULL, NULL,
+               NULL, NULL, &rqst);
+       r = send_req(client, &rqst, req, new_req);
 
-       pthread_mutex_lock(&client->lock);
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
-
-       r = send_req(client, &rqst);
-       if (r != BUXTON_ERROR_NONE) {
-               g_hash_table_remove(client->req_cbs,
-                               GUINT_TO_POINTER(req->msgid));
-               pthread_mutex_unlock(&client->lock);
-               return r;
-       }
-
-       *new_req = req;
-       pthread_mutex_unlock(&client->lock);
-
-       return BUXTON_ERROR_NONE;
+       return r;
 }
 
 EXPORT int buxton_list_keys(struct buxton_client *client,
@@ -1360,32 +1336,24 @@ EXPORT int buxton_list_keys_sync(struct buxton_client *client,
 
        pthread_mutex_lock(&clients_lock);
        r = list_keys(client, layer, list_keys_sync_cb, &resp, &req);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       if (r != BUXTON_ERROR_NONE)
+               goto out;
+
+       r = get_response(client, req->msgid, &resp);
 
-       r = wait_msg(client, req->msgid);
+out:
+       buxton_err_set_errno(r);
        if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+               r = -1;
+       } else {
+               *names = resp.names;
 
-       if (resp.res != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(resp.res);
-               return -1;
+               if (len)
+                       *len = resp.nmlen;
        }
 
-       *names = resp.names;
-
-       if (len)
-               *len = resp.nmlen;
-
        pthread_mutex_unlock(&clients_lock);
-       return 0;
+       return r;
 }
 
 static gboolean call_resp_cb(gpointer data)
@@ -1457,27 +1425,11 @@ static int register_noti(struct buxton_client *client,
        req->notify = notify;
        req->notify_data = notify_data;
 
-       memset(&rqst, 0, sizeof(rqst));
-       rqst.type = MSG_NOTIFY;
-       rqst.msgid = req->msgid;
-       rqst.layer = req->layer;
-       rqst.key = (char *)key;
-
-       pthread_mutex_lock(&client->lock);
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
-
-       r = send_req(client, &rqst);
-       if (r != BUXTON_ERROR_NONE) {
-               g_hash_table_remove(client->req_cbs,
-                               GUINT_TO_POINTER(req->msgid));
-               pthread_mutex_unlock(&client->lock);
-               return r;
-       }
-
-       *new_req = req;
-       pthread_mutex_unlock(&client->lock);
+       set_rqst(MSG_NOTIFY, req, (char *)key, NULL,
+               NULL, NULL, &rqst);
+       r = send_req(client, &rqst, req, new_req);
 
-       return BUXTON_ERROR_NONE;
+       return r;
 }
 
 EXPORT int buxton_register_notification(struct buxton_client *client,
@@ -1577,27 +1529,19 @@ EXPORT int buxton_register_notification_sync(struct buxton_client *client,
 
        r = register_noti(client, layer, key, notify, notify_data,
                        reg_noti_sync_cb, &resp, &req);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       if (r != BUXTON_ERROR_NONE)
+               goto out;
 
-       r = wait_msg(client, req->msgid);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       r = get_response(client, req->msgid, &resp);
 
-       if (resp.res != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(resp.res);
-               return -1;
-       }
+out:
+       buxton_err_set_errno(r);
+       if (r != BUXTON_ERROR_NONE)
+               r = -1;
 
        pthread_mutex_unlock(&clients_lock);
-       return 0;
+       return r;
+
 }
 
 static int del_noticb(struct bxt_noti *noti, buxton_notify_callback notify,
@@ -1658,26 +1602,11 @@ static int unregister_noti(struct buxton_client *client,
        if (r != BUXTON_ERROR_NONE)
                return r;
 
-       memset(&rqst, 0, sizeof(rqst));
-       rqst.type = MSG_UNNOTIFY;
-       rqst.msgid = req->msgid;
-       rqst.layer = req->layer;
-       rqst.key = (char *)key;
-
-       pthread_mutex_lock(&client->lock);
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
+       set_rqst(MSG_UNNOTIFY, req, (char *)key, NULL,
+               NULL, NULL, &rqst);
+       r = send_req(client, &rqst, req, new_req);
 
-       r = send_req(client, &rqst);
-       if (r != BUXTON_ERROR_NONE) {
-               g_hash_table_remove(client->req_cbs,
-                               GUINT_TO_POINTER(req->msgid));
-               pthread_mutex_unlock(&client->lock);
-               return r;
-       }
-
-       *new_req = req;
-       pthread_mutex_unlock(&client->lock);
-       return BUXTON_ERROR_NONE;
+       return r;
 }
 
 EXPORT int buxton_unregister_notification(struct buxton_client *client,
@@ -1801,27 +1730,18 @@ EXPORT int buxton_unregister_notification_sync(struct buxton_client *client,
        memset(&resp, 0, sizeof(resp));
 
        r = unregister_noti(client, layer, key, unreg_noti_sync_cb, &resp, &req);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       if (r != BUXTON_ERROR_NONE)
+       goto out;
 
-       r = wait_msg(client, req->msgid);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       r = get_response(client, req->msgid, &resp);
 
-       if (resp.res != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(resp.res);
-               return -1;
-       }
+out:
+       buxton_err_set_errno(r);
+       if (r != BUXTON_ERROR_NONE)
+               r = -1;
 
        pthread_mutex_unlock(&clients_lock);
-       return 0;
+       return r;
 }
 
 static int create_value(struct buxton_client *client,
@@ -1846,29 +1766,11 @@ static int create_value(struct buxton_client *client,
        if (r != BUXTON_ERROR_NONE)
                return r;
 
-       memset(&rqst, 0, sizeof(rqst));
-       rqst.type = MSG_CREAT;
-       rqst.msgid = req->msgid;
-       rqst.layer = req->layer;
-       rqst.key = (char *)key;
-       rqst.rpriv = (char *)read_privilege;
-       rqst.wpriv = (char *)write_privilege;
-       rqst.val = (struct buxton_value *)val;
-
-       pthread_mutex_lock(&client->lock);
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
-
-       r = send_req(client, &rqst);
-       if (r != BUXTON_ERROR_NONE) {
-               g_hash_table_remove(client->req_cbs,
-                               GUINT_TO_POINTER(req->msgid));
-               pthread_mutex_unlock(&client->lock);
-               return r;
-       }
+       set_rqst(MSG_CREAT, req, (char *)key, (struct buxton_value *)val,
+               (char *)read_privilege, (char *)write_privilege, &rqst);
+       r = send_req(client, &rqst, req, new_req);
 
-       *new_req = req;
-       pthread_mutex_unlock(&client->lock);
-       return BUXTON_ERROR_NONE;
+       return r;
 }
 
 EXPORT int buxton_create_value(struct buxton_client *client,
@@ -1921,27 +1823,19 @@ EXPORT int buxton_create_value_sync(struct buxton_client *client,
        pthread_mutex_lock(&clients_lock);
        r = create_value(client, layer, key, read_privilege, write_privilege,
                        val, create_value_sync_cb, &resp, &req);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       if (r != BUXTON_ERROR_NONE)
+               goto out;
 
-       r = wait_msg(client, req->msgid);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       r = get_response(client, req->msgid, &resp);
 
-       if (resp.res != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(resp.res);
-               return -1;
-       }
+out:
+       buxton_err_set_errno(r);
+       if (r != BUXTON_ERROR_NONE)
+               r = -1;
 
        pthread_mutex_unlock(&clients_lock);
-       return 0;
+       return r;
+
 }
 
 static int unset_value(struct buxton_client *client,
@@ -1962,26 +1856,11 @@ static int unset_value(struct buxton_client *client,
        if (r != BUXTON_ERROR_NONE)
                return r;
 
-       memset(&rqst, 0, sizeof(rqst));
-       rqst.type = MSG_UNSET;
-       rqst.msgid = req->msgid;
-       rqst.layer = req->layer;
-       rqst.key = (char *)key;
+       set_rqst(MSG_UNSET, req, (char *)key, NULL,
+               NULL, NULL, &rqst);
+       r = send_req(client, &rqst, req, new_req);
 
-       pthread_mutex_lock(&client->lock);
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
-
-       r = send_req(client, &rqst);
-       if (r != BUXTON_ERROR_NONE) {
-               g_hash_table_remove(client->req_cbs,
-                               GUINT_TO_POINTER(req->msgid));
-               pthread_mutex_unlock(&client->lock);
-               return r;
-       }
-
-       *new_req = req;
-       pthread_mutex_unlock(&client->lock);
-       return BUXTON_ERROR_NONE;
+       return r;
 }
 
 EXPORT int buxton_unset_value(struct buxton_client *client,
@@ -2028,27 +1907,19 @@ EXPORT int buxton_unset_value_sync(struct buxton_client *client,
 
        pthread_mutex_lock(&clients_lock);
        r = unset_value(client, layer, key, unset_value_sync_cb, &resp, &req);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       if (r != BUXTON_ERROR_NONE)
+               goto out;
 
-       r = wait_msg(client, req->msgid);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       r = get_response(client, req->msgid, &resp);
 
-       if (resp.res != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(resp.res);
-               return -1;
-       }
+out:
+       buxton_err_set_errno(r);
+       if (r != BUXTON_ERROR_NONE)
+               r = -1;
 
        pthread_mutex_unlock(&clients_lock);
-       return 0;
+       return r;
+
 }
 
 static int set_priv(struct buxton_client *client,
@@ -2077,30 +1948,15 @@ static int set_priv(struct buxton_client *client,
        if (r != BUXTON_ERROR_NONE)
                return r;
 
-       memset(&rqst, 0, sizeof(rqst));
-       rqst.type = type == BUXTON_PRIV_READ ? MSG_SET_RP : MSG_SET_WP;
-       rqst.msgid = req->msgid;
-       rqst.layer = req->layer;
-       rqst.key = (char *)key;
-       rqst.val = &val;
-
        val.type = BUXTON_TYPE_PRIVILEGE;
        val.value.s = (char *)privilege;
 
-       pthread_mutex_lock(&client->lock);
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
+       set_rqst(type == BUXTON_PRIV_READ ? MSG_SET_RP : MSG_SET_WP,
+               req, (char *)key, &val,
+               NULL, NULL, &rqst);
+       r = send_req(client, &rqst, req, new_req);
 
-       r = send_req(client, &rqst);
-       if (r != BUXTON_ERROR_NONE) {
-               g_hash_table_remove(client->req_cbs,
-                               GUINT_TO_POINTER(req->msgid));
-               pthread_mutex_unlock(&client->lock);
-               return r;
-       }
-
-       *new_req = req;
-       pthread_mutex_unlock(&client->lock);
-       return BUXTON_ERROR_NONE;
+       return r;
 }
 
 EXPORT int buxton_set_privilege(struct buxton_client *client,
@@ -2153,27 +2009,18 @@ EXPORT int buxton_set_privilege_sync(struct buxton_client *client,
        pthread_mutex_lock(&clients_lock);
        r = set_priv(client, layer, key, type, privilege,
                        set_priv_sync_cb, &resp, &req);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       if (r != BUXTON_ERROR_NONE)
+               goto out;
 
-       r = wait_msg(client, req->msgid);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       r = get_response(client, req->msgid, &resp);
 
-       if (resp.res != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(resp.res);
-               return -1;
-       }
+out:
+       buxton_err_set_errno(r);
+       if (r != BUXTON_ERROR_NONE)
+               r = -1;
 
        pthread_mutex_unlock(&clients_lock);
-       return 0;
+               return r;
 }
 
 static int get_priv(struct buxton_client *client,
@@ -2200,26 +2047,12 @@ static int get_priv(struct buxton_client *client,
        if (r != BUXTON_ERROR_NONE)
                return r;
 
-       memset(&rqst, 0, sizeof(rqst));
-       rqst.type = type == BUXTON_PRIV_READ ? MSG_GET_RP : MSG_GET_WP;
-       rqst.msgid = req->msgid;
-       rqst.layer = req->layer;
-       rqst.key = (char *)key;
-
-       pthread_mutex_lock(&client->lock);
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
-
-       r = send_req(client, &rqst);
-       if (r  != BUXTON_ERROR_NONE) {
-               g_hash_table_remove(client->req_cbs,
-                               GUINT_TO_POINTER(req->msgid));
-               pthread_mutex_unlock(&client->lock);
-               return r;
-       }
+       set_rqst(type == BUXTON_PRIV_READ ? MSG_GET_RP : MSG_GET_WP,
+               req, (char *)key, NULL,
+               NULL, NULL, &rqst);
+       r = send_req(client, &rqst, req, new_req);
 
-       *new_req = req;
-       pthread_mutex_unlock(&client->lock);
-       return BUXTON_ERROR_NONE;
+       return r;
 }
 
 EXPORT int buxton_get_privilege(struct buxton_client *client,
@@ -2278,31 +2111,23 @@ EXPORT int buxton_get_privilege_sync(struct buxton_client *client,
 
        pthread_mutex_lock(&clients_lock);
        r = get_priv(client, layer, key, type, get_priv_sync_cb, &resp, &req);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       if (r != BUXTON_ERROR_NONE)
+               goto out;
 
-       r = wait_msg(client, req->msgid);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       r = get_response(client, req->msgid, &resp);
 
-       if (resp.res != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(resp.res);
-               return -1;
+out:
+       buxton_err_set_errno(r);
+       if (r != BUXTON_ERROR_NONE) {
+               r = -1;
+       } else {
+               *privilege = resp.val->value.s;
+               resp.val->value.s = NULL;
+               buxton_value_free(resp.val);
        }
 
-       *privilege = resp.val->value.s;
-       resp.val->value.s = NULL;
-       buxton_value_free(resp.val);
-
        pthread_mutex_unlock(&clients_lock);
-       return 0;
+       return r;
 }
 
 static void security_sync_cb(int status, const struct buxton_layer *layer,
@@ -2343,32 +2168,14 @@ static int security_control(struct buxton_client *client,
        if (r != BUXTON_ERROR_NONE)
                return r;
 
-       memset(&rqst, 0, sizeof(rqst));
-       rqst.type = MSG_CTRL;
-       rqst.msgid = req->msgid;
-       rqst.layer = req->layer;
-       rqst.key = strdup("set_security_mode");
-       rqst.val = &val;
-
        val.type = BUXTON_TYPE_BOOLEAN;
        val.value.b = enable;
 
-       pthread_mutex_lock(&client->lock);
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
+       set_rqst(MSG_CTRL, req, SET_SECURITY_MODE, &val,
+               NULL, NULL, &rqst);
+       r = send_req(client, &rqst, req, new_req);
 
-       r = send_req(client, &rqst);
-
-       free(rqst.key);
-       if (r != BUXTON_ERROR_NONE) {
-               g_hash_table_remove(client->req_cbs,
-                               GUINT_TO_POINTER(req->msgid));
-               pthread_mutex_unlock(&client->lock);
-               return r;
-       }
-
-       *new_req = req;
-       pthread_mutex_unlock(&client->lock);
-       return BUXTON_ERROR_NONE;
+       return r;
 }
 
 EXPORT int buxton_enable_security(struct buxton_client *client,
@@ -2399,27 +2206,18 @@ EXPORT int buxton_enable_security_sync(struct buxton_client *client)
 
        pthread_mutex_lock(&clients_lock);
        r = security_control(client, TRUE, security_sync_cb, &resp, &req);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       if (r != BUXTON_ERROR_NONE)
+               goto out;
 
-       r = wait_msg(client, req->msgid);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       r = get_response(client, req->msgid, &resp);
 
-       if (resp.res != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(resp.res);
-               return -1;
-       }
+out:
+       buxton_err_set_errno(r);
+       if (r != BUXTON_ERROR_NONE)
+               r = -1;
 
        pthread_mutex_unlock(&clients_lock);
-       return 0;
+       return r;
 }
 
 EXPORT int buxton_disable_security(struct buxton_client *client,
@@ -2450,27 +2248,18 @@ EXPORT int buxton_disable_security_sync(struct buxton_client *client)
 
        pthread_mutex_lock(&clients_lock);
        r = security_control(client, FALSE, security_sync_cb, &resp, &req);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       if (r != BUXTON_ERROR_NONE)
+               goto out;
 
-       r = wait_msg(client, req->msgid);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       r = get_response(client, req->msgid, &resp);
 
-       if (resp.res != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(resp.res);
-               return -1;
-       }
+out:
+       buxton_err_set_errno(r);
+       if (r != BUXTON_ERROR_NONE)
+               r = -1;
 
        pthread_mutex_unlock(&clients_lock);
-       return 0;
+       return r;
 }
 
 static void update_label_sync_cb(int status, const struct buxton_layer *layer,
@@ -2510,28 +2299,11 @@ static int update_client_label(struct buxton_client *client,
        if (r != BUXTON_ERROR_NONE)
                return r;
 
-       memset(&rqst, 0, sizeof(rqst));
-       rqst.type = MSG_CTRL;
-       rqst.msgid = req->msgid;
-       rqst.layer = req->layer;
-       rqst.key = strdup("update_client_label");
+       set_rqst(MSG_CTRL, req, UPDATE_CLIENT_LABEL, NULL,
+               NULL, NULL, &rqst);
+       r = send_req(client, &rqst, req, new_req);
 
-       pthread_mutex_lock(&client->lock);
-       g_hash_table_insert(client->req_cbs, GUINT_TO_POINTER(req->msgid), req);
-
-       r = send_req(client, &rqst);
-
-       free(rqst.key);
-       if (r != BUXTON_ERROR_NONE) {
-               g_hash_table_remove(client->req_cbs,
-                               GUINT_TO_POINTER(req->msgid));
-               pthread_mutex_unlock(&client->lock);
-               return r;
-       }
-
-       *new_req = req;
-       pthread_mutex_unlock(&client->lock);
-       return BUXTON_ERROR_NONE;
+       return r;
 }
 
 EXPORT int buxton_update_client_label(struct buxton_client *client,
@@ -2562,27 +2334,18 @@ EXPORT int buxton_update_client_label_sync(struct buxton_client *client)
 
        pthread_mutex_lock(&clients_lock);
        r = update_client_label(client, update_label_sync_cb, &resp, &req);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       if (r != BUXTON_ERROR_NONE)
+               goto out;
 
-       r = wait_msg(client, req->msgid);
-       if (r != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(r);
-               return -1;
-       }
+       r = get_response(client, req->msgid, &resp);
 
-       if (resp.res != BUXTON_ERROR_NONE) {
-               pthread_mutex_unlock(&clients_lock);
-               buxton_err_set_errno(resp.res);
-               return -1;
-       }
+out:
+       buxton_err_set_errno(r);
+       if (r != BUXTON_ERROR_NONE)
+               r = -1;
 
        pthread_mutex_unlock(&clients_lock);
-       return 0;
+       return r;
 }
 
 static void free_noti(struct bxt_noti *noti)