add stubs for invoke
authorFelix Fietkau <nbd@openwrt.org>
Sun, 30 Jan 2011 22:57:14 +0000 (23:57 +0100)
committerFelix Fietkau <nbd@openwrt.org>
Sun, 30 Jan 2011 22:57:14 +0000 (23:57 +0100)
cli.c
libubus.c
libubus.h
ubusd_proto.c

diff --git a/cli.c b/cli.c
index ba6f30fbf9453d0a8a4d9fdc6c2f869c06a01844..bc884cd2b346eb68d40d215e2a2e0d2097b196fd 100644 (file)
--- a/cli.c
+++ b/cli.c
@@ -32,7 +32,8 @@ static int usage(char *prog)
        fprintf(stderr,
                "Usage: %s <command> [arguments...]\n"
                "Commands:\n"
-               " - list [<path>]       List objects\n"
+               " - list [<path>]                       List objects\n"
+               " - call <path> <method> [<message>]    Call an object method\n"
                "\n", prog);
        return 1;
 }
@@ -61,13 +62,21 @@ int main(int argc, char **argv)
 
                ubus_start_request(ctx, &req, b.head, UBUS_MSG_LOOKUP, 0);
                req.data_cb = receive_lookup;
-               ret = ubus_complete_request(ctx, &req);
-               if (ret)
-                       fprintf(stderr, "Failed: %d\n", ret);
+       } else if (!strcmp(cmd, "call")) {
+               if (argc < 4 || argc > 5)
+                       return usage(argv[0]);
+
+               blob_put_string(&b, UBUS_ATTR_OBJPATH, argv[2]);
+               blob_put_string(&b, UBUS_ATTR_METHOD, argv[3]);
+               ubus_start_request(ctx, &req, b.head, UBUS_MSG_INVOKE, 0);
        } else {
                return usage(argv[0]);
        }
 
+       ret = ubus_complete_request(ctx, &req);
+       if (ret)
+               fprintf(stderr, "Failed: %s\n", ubus_strerror(ret));
+
        ubus_free(ctx);
        return 0;
 }
index 5fdde30f6baca72d8d373f86bcb2e3797730b009..9e93aede871c71c65a52793093cde209714d2ba2 100644 (file)
--- a/libubus.c
+++ b/libubus.c
@@ -314,6 +314,28 @@ skip:
        }
 }
 
+void ubus_invoke_path_async(struct ubus_context *ctx, const char *path, const char *method,
+                       struct blob_attr *msg, struct ubus_request *req)
+{
+       blob_buf_init(&b, 0);
+       blob_put_string(&b, UBUS_ATTR_OBJPATH, path);
+       blob_put_string(&b, UBUS_ATTR_METHOD, method);
+       blob_put(&b, UBUS_ATTR_DATA, blob_data(msg), blob_len(msg));
+
+       ubus_start_request(ctx, req, b.head, UBUS_MSG_INVOKE, 0);
+}
+
+int ubus_invoke_path(struct ubus_context *ctx, const char *path, const char *method,
+                struct blob_attr *msg, ubus_data_handler_t cb, void *priv)
+{
+       struct ubus_request req;
+
+       ubus_invoke_path_async(ctx, path, method, msg, &req);
+       req.data_cb = cb;
+       req.priv = priv;
+       return ubus_complete_request(ctx, &req);
+}
+
 void ubus_invoke_async(struct ubus_context *ctx, uint32_t obj, const char *method,
                        struct blob_attr *msg, struct ubus_request *req)
 {
@@ -322,7 +344,7 @@ void ubus_invoke_async(struct ubus_context *ctx, uint32_t obj, const char *metho
        blob_put_string(&b, UBUS_ATTR_METHOD, method);
        blob_put(&b, UBUS_ATTR_DATA, blob_data(msg), blob_len(msg));
 
-       ubus_start_request(ctx, req, b.head, UBUS_MSG_INVOKE, obj);
+       ubus_start_request(ctx, req, b.head, UBUS_MSG_INVOKE, 0);
 }
 
 int ubus_invoke(struct ubus_context *ctx, uint32_t obj, const char *method,
index bd3d736efd0578ab928c16d34ca259acb82b3ac2..3da5d21d6f4ce8fe63c4216fb846be78e97d7986 100644 (file)
--- a/libubus.h
+++ b/libubus.h
@@ -130,10 +130,14 @@ void ubus_abort_request(struct ubus_context *ctx, struct ubus_request *req);
 /* invoke a method on a specific object */
 int ubus_invoke(struct ubus_context *ctx, uint32_t obj, const char *method,
                 struct blob_attr *msg, ubus_data_handler_t cb, void *priv);
+int ubus_invoke_path(struct ubus_context *ctx, const char *path, const char *method,
+                struct blob_attr *msg, ubus_data_handler_t cb, void *priv);
 
 /* asynchronous version of ubus_invoke() */
 void ubus_invoke_async(struct ubus_context *ctx, uint32_t obj, const char *method,
                        struct blob_attr *msg, struct ubus_request *req);
+void ubus_invoke_path_async(struct ubus_context *ctx, const char *path, const char *method,
+                       struct blob_attr *msg, struct ubus_request *req);
 
 /* make an object visible to remote connections */
 int ubus_publish(struct ubus_context *ctx, struct ubus_object *obj);
index a202ace8edb8b67efb0cd8732787561842ad1dfb..8a69541d0a6120a6d906031fc7072fbbcf8aca8b 100644 (file)
@@ -161,10 +161,16 @@ static int ubusd_handle_lookup(struct ubus_client *cl, struct ubus_msg_buf *ub)
        return 0;
 }
 
+static int ubusd_handle_invoke(struct ubus_client *cl, struct ubus_msg_buf *ub)
+{
+       return UBUS_STATUS_NOT_FOUND;
+}
+
 static const ubus_cmd_cb handlers[__UBUS_MSG_LAST] = {
        [UBUS_MSG_PING] = ubusd_send_pong,
        [UBUS_MSG_PUBLISH] = ubusd_handle_publish,
        [UBUS_MSG_LOOKUP] = ubusd_handle_lookup,
+       [UBUS_MSG_INVOKE] = ubusd_handle_invoke,
 };
 
 void ubusd_receive_message(struct ubus_client *cl, struct ubus_msg_buf *ub)