/*
- * Copyright (c) 2009, 2010, 2011 Nicira Networks.
+ * Copyright (c) 2009, 2010, 2011, 2012 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
static void jsonrpc_received(struct jsonrpc *);
static void jsonrpc_cleanup(struct jsonrpc *);
+static void jsonrpc_error(struct jsonrpc *, int error);
/* This is just the same as stream_open() except that it uses the default
* JSONRPC ports if none is specified. */
rpc->received = msg;
}
-void
+static void
jsonrpc_error(struct jsonrpc *rpc, int error)
{
assert(error);
/*
- * Copyright (c) 2009, 2010 Nicira Networks.
+ * Copyright (c) 2009, 2010, 2012 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
void jsonrpc_run(struct jsonrpc *);
void jsonrpc_wait(struct jsonrpc *);
-void jsonrpc_error(struct jsonrpc *, int error);
int jsonrpc_get_status(const struct jsonrpc *);
size_t jsonrpc_get_backlog(const struct jsonrpc *);
const char *jsonrpc_get_name(const struct jsonrpc *);
/*
- * Copyright (c) 2009, 2010, 2011 Nicira Networks.
+ * Copyright (c) 2009, 2010, 2011, 2012 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
\f
/* Command implementations. */
-static void
+static int
handle_rpc(struct jsonrpc *rpc, struct jsonrpc_msg *msg, bool *done)
{
- struct jsonrpc_msg *reply = NULL;
if (msg->type == JSONRPC_REQUEST) {
+ struct jsonrpc_msg *reply = NULL;
if (!strcmp(msg->method, "echo")) {
reply = jsonrpc_create_reply(json_clone(msg->params), msg->id);
} else {
reply = jsonrpc_create_error(error, msg->id);
ovs_error(0, "unknown request %s", msg->method);
}
-
+ jsonrpc_send(rpc, reply);
+ return 0;
} else if (msg->type == JSONRPC_NOTIFY) {
if (!strcmp(msg->method, "shutdown")) {
*done = true;
+ return 0;
} else {
- jsonrpc_error(rpc, ENOTTY);
ovs_error(0, "unknown notification %s", msg->method);
+ return ENOTTY;
}
} else {
- jsonrpc_error(rpc, EPROTO);
ovs_error(0, "unsolicited JSON-RPC reply or error");
- }
-
- if (reply) {
- jsonrpc_send(rpc, reply);
+ return EPROTO;
}
}
if (!jsonrpc_get_backlog(rpc)) {
error = jsonrpc_recv(rpc, &msg);
if (!error) {
- handle_rpc(rpc, msg, &done);
+ error = handle_rpc(rpc, msg, &done);
jsonrpc_msg_destroy(msg);
+ } else if (error == EAGAIN) {
+ error = 0;
}
}
- error = jsonrpc_get_status(rpc);
+ if (!error) {
+ error = jsonrpc_get_status(rpc);
+ }
if (error) {
jsonrpc_close(rpc);
ovs_error(error, "connection closed");