summaryrefslogtreecommitdiffstats
path: root/nserver/src
diff options
context:
space:
mode:
authorrsiddharth <s@ricketyspace.net>2019-12-02 20:58:50 -0500
committerrsiddharth <s@ricketyspace.net>2020-04-17 20:56:35 -0400
commitb20d3221befacb0cfd04829fb9bfd9f1276f7ea4 (patch)
tree3b5c5a65bebfa956d33ac9bd960ff4350dc223ec /nserver/src
parentc98f28485e5848701fdee76b6506f14d6e75a225 (diff)
nserver: Add call_function.
* nserver/src/ncmd.c (call_function): New function definition. Initial version. * nserver/src/ncmd.h (call_function): New function declaration. * nserver/tests/ncmd_tests.c (test_call_function): Test for call_function. (all_tests): Add test_call_function.
Diffstat (limited to 'nserver/src')
-rw-r--r--nserver/src/ncmd.c102
-rw-r--r--nserver/src/ncmd.h2
2 files changed, 104 insertions, 0 deletions
diff --git a/nserver/src/ncmd.c b/nserver/src/ncmd.c
index 0b86d32..a4fb992 100644
--- a/nserver/src/ncmd.c
+++ b/nserver/src/ncmd.c
@@ -168,3 +168,105 @@ int check_args(struct bstrList *cmd_parts, int argc)
return -1;
}
+/**
+ * TODO:
+ * - msg needs to be dynamically allocated.
+ * - error msgs need to be consistent.
+ */
+char *call_function(int func, struct bstrList *cmd_parts)
+{
+ char *msg = NULL;
+ if (func < 0 || cmd_parts == NULL || cmd_parts->qty < 1) {
+ msg = "function call failed: internal error";
+
+ return msg;
+ }
+
+ int rc = 0;
+ switch (func) {
+ case NS_CREATE:
+ if(check_args(cmd_parts, 2) != 0) {
+ msg = "create failed: command invalid\n";
+ break;
+ }
+ if (sscreate(bdata(cmd_parts->entry[1])) != 0) {
+ msg = "create failed: internal error";
+ break;
+ }
+ msg = "OK\n";
+
+ break;
+ case NS_SAMPLE:
+ if(check_args(cmd_parts, 3) != 0) {
+ msg = "sample failed: command invalid\n";
+ break;
+ }
+
+ double sample = strtod(bdata(cmd_parts->entry[2]), NULL);
+ if (sssample(bdata(cmd_parts->entry[1]), sample) != 0) {
+ msg = "sample failed: internal error";
+ break;
+ }
+ msg = "OK\n";
+
+ break;
+ case NS_MEAN:
+ if(check_args(cmd_parts, 2) != 0) {
+ msg = "mean failed: command invalid\n";
+ break;
+ }
+
+ double mean = ssmean(bdata(cmd_parts->entry[1]));
+ if (mean < 0) {
+ msg = "mean failed: internal error";
+ break;
+ }
+ msg = (char *) calloc(20, sizeof(char));
+ if (sprintf(msg, "Mean: %.2f\n", mean) < 0) {
+ msg = "mean failed: internal error";
+ }
+ break;
+ case NS_DUMP:
+ if(check_args(cmd_parts, 2) != 0) {
+ msg = "dump failed: command invalid\n";
+ break;
+ }
+
+ char *dump = ssdump(bdata(cmd_parts->entry[1]));
+ if (dump == NULL) {
+ msg = "dump failed: internal error";
+ break;
+ }
+ msg = dump;
+ break;
+ case NS_DELETE:
+ if(check_args(cmd_parts, 2) != 0) {
+ msg = "delete failed: command invalid\n";
+ break;
+ }
+
+ if (ssdelete(bdata(cmd_parts->entry[1])) != 0) {
+ msg = "delete failed: internal error";
+ break;
+ }
+ msg = "OK\n";
+
+ break;
+ case NS_LIST:
+ if(check_args(cmd_parts, 1) != 0) {
+ msg = "list failed: command invalid\n";
+ break;
+ }
+
+ msg = sslist();
+ if (msg == NULL) {
+ msg = "list failed: internal error";
+ }
+ break;
+ default:
+ msg = "error: function not found";
+ break;
+ }
+
+ return msg;
+}
diff --git a/nserver/src/ncmd.h b/nserver/src/ncmd.h
index 80ca45a..f502c07 100644
--- a/nserver/src/ncmd.h
+++ b/nserver/src/ncmd.h
@@ -5,6 +5,7 @@
#include <bstrlib.h>
#include <dbg.h>
+#include <protocol.h>
#define CMD_MIN_SIZE 5
#define CMD_MAX_SIZE 120
@@ -24,6 +25,7 @@ char *check_cmd(char *cmd);
struct bstrList *cmd_parts(char *cmd);
int find_function(struct bstrList *cmd_parts);
+char *call_function(int func, struct bstrList *cmd_parts);
#endif