summaryrefslogtreecommitdiffstats
path: root/nserver/src/ncmd.c
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/ncmd.c
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/ncmd.c')
-rw-r--r--nserver/src/ncmd.c102
1 files changed, 102 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;
+}