[Ocfs2-tools-commits] mfasheh commits r594 - trunk/libo2dlm

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Wed Jan 26 13:51:58 CST 2005


Author: mfasheh
Date: 2005-01-26 13:51:56 -0600 (Wed, 26 Jan 2005)
New Revision: 594

Added:
   trunk/libo2dlm/o2dlm_test.c
Modified:
   trunk/libo2dlm/Makefile
Log:
* add a simple test driver program for libo2dlm.



Modified: trunk/libo2dlm/Makefile
===================================================================
--- trunk/libo2dlm/Makefile	2005-01-26 07:55:25 UTC (rev 593)
+++ trunk/libo2dlm/Makefile	2005-01-26 19:51:56 UTC (rev 594)
@@ -38,6 +38,8 @@
 
 CFILES = o2dlm.c
 
+TESTING_CFILES = o2dlm_test.c
+
 HFILES = 			\
 	include/kernel-list.h	\
 	include/o2dlm.h 
@@ -50,6 +52,8 @@
 OBJS = $(subst .c,.o,$(CFILES)) \
 	o2dlm_err.o
 
+TESTING_OBJS = $(subst .c,.o,$(TESTING_CFILES))
+
 o2dlm_err.et: o2dlm_err.et.in
 	cd $(TOPDIR) && ./config.status
 
@@ -64,6 +68,9 @@
 	$(AR) r $@ $^
 	$(RANLIB) $@
 
+o2dlm_test: $(TESTING_OBJS) $(LIBRARIES) $(COM_ERR_LIBS)
+	$(LINK)
+
 DIST_FILES = $(CFILES) $(HFILES) o2dlm_err.et.in
 
 DIST_RULES = dist-subdircreate
@@ -71,9 +78,12 @@
 dist-subdircreate:
 	$(TOPDIR)/mkinstalldirs $(DIST_DIR)/include
 
-CLEAN_RULES = clean-err
+CLEAN_RULES = clean-err clean-test
 
 clean-err:
 	rm -f o2dlm_err.c o2dlm_err.h include/o2dlm_err.h
 
+clean-test:
+	rm -f o2dlm_test
+
 include $(TOPDIR)/Postamble.make

Added: trunk/libo2dlm/o2dlm_test.c
===================================================================
--- trunk/libo2dlm/o2dlm_test.c	2005-01-26 07:55:25 UTC (rev 593)
+++ trunk/libo2dlm/o2dlm_test.c	2005-01-26 19:51:56 UTC (rev 594)
@@ -0,0 +1,290 @@
+/*
+ * Test driver for libo2dlm.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <string.h>
+
+#include "o2dlm.h"
+
+#define COMMAND_MAX_LEN 4096
+
+char cbuf[COMMAND_MAX_LEN];
+
+char *dlmfs_path = NULL;
+char *prog;
+
+struct o2dlm_ctxt *dlm_ctxt = NULL;
+
+enum commands
+{
+	REGISTER = 0,
+	UNREGISTER,
+	LOCK,
+	TRYLOCK,
+	UNLOCK,
+	HELP,
+	NUM_COMMANDS
+};
+
+static char *command_strings[NUM_COMMANDS] = {
+        [REGISTER]   "REGISTER",
+        [UNREGISTER] "UNREGISTER",
+        [LOCK]       "LOCK",
+	[TRYLOCK]    "TRYLOCK",
+	[UNLOCK]     "UNLOCK",
+	[HELP]       "HELP",
+};
+
+#define NUM_PR_STRINGS 4
+static char *pr_strings[NUM_PR_STRINGS] = {
+	"PR",
+	"PRMODE",
+	"RO",
+	"O2DLM_LEVEL_PRMODE"
+};
+
+#define NUM_EX_STRINGS 4
+static char *ex_strings[NUM_EX_STRINGS] = {
+	"EX",
+	"EXMODE",
+	"EX",
+	"O2DLM_LEVEL_EXMODE"
+};
+
+struct command_s
+{
+	enum commands         c_type;
+	char                  c_domain[O2DLM_DOMAIN_MAX_LEN];
+	char                  c_id[O2DLM_LOCK_ID_MAX_LEN];
+	enum o2dlm_lock_level c_level;
+};
+
+static void print_commands(void)
+{
+	printf("Domain Commands:\n");
+	printf("register \"domain\'\n");
+	printf("unregister \"domain\'\n");
+	printf("Locking Commands - \"level\" is one of PR, or EX. "
+	       "Some common variations are understood\n");
+	printf("lock \"level\" \"lockid\"\n");
+	printf("trylock \"level\" \"lockid\"\n");
+	printf("unlock \"lockid\"\n");
+}
+
+static int decode_type(struct command_s *c, char *buf)
+{
+	int i;
+
+	for(i = 0; i < NUM_COMMANDS; i++) {
+		if (!strcasecmp(buf, command_strings[i])) {
+			c->c_type = i;
+			return 0;
+		}
+	}
+	return -1;
+}
+
+static void kill_return(char *buf)
+{
+	char *c;
+
+	c = strchr(buf, '\n');
+	if (c)
+		*c = '\0';
+}
+
+static int decode_lock(struct command_s *c, char *buf)
+{
+	kill_return(buf);
+
+	memset(c->c_id, 0, O2DLM_LOCK_ID_MAX_LEN);
+
+	strncpy(c->c_id, buf, O2DLM_LOCK_ID_MAX_LEN - 1);
+
+	return 0;
+}
+
+static int decode_domain(struct command_s *c, char *buf)
+{
+	kill_return(buf);
+
+	memset(c->c_domain, 0, O2DLM_DOMAIN_MAX_LEN);
+
+	strncpy(c->c_domain, buf, O2DLM_DOMAIN_MAX_LEN - 1);
+
+	return 0;
+}
+
+static int decode_level(struct command_s *c, char *buf)
+{
+	int i;
+
+	kill_return(buf);
+
+	for (i = 0; i < NUM_PR_STRINGS; i++) {
+		if (!strcasecmp(buf, pr_strings[i])) {
+			c->c_level = O2DLM_LEVEL_PRMODE;
+			return 0;
+		}
+	}
+
+	for (i = 0; i < NUM_EX_STRINGS; i++) {
+		if (!strcasecmp(buf, ex_strings[i])) {
+			c->c_level = O2DLM_LEVEL_EXMODE;
+			return 0;
+		}
+	}
+
+	return -1;
+}
+
+static void print_command(struct command_s *c)
+{
+	printf("Command: %s ", command_strings[c->c_type]);
+	switch (c->c_type) {
+	case REGISTER:
+	case UNREGISTER:
+		printf("\"%s\"\n", c->c_domain);
+		break;
+	case LOCK:
+	case TRYLOCK:
+		if (c->c_level == O2DLM_LEVEL_PRMODE)
+			printf("O2DLM_LEVEL_PRMODE ");
+		else
+			printf("O2DLM_LEVEL_EXMODE ");
+		/* fall through */
+	case UNLOCK:
+		printf("\"%s\"\n", c->c_id);
+		break;
+	case HELP:
+		printf("\n");
+		break;
+	default:
+		printf("wha?!?!?\n");
+	}
+}
+
+static int get_command(struct command_s *command)
+{
+	char *next;
+
+again:
+	if (!fgets(cbuf, COMMAND_MAX_LEN, stdin))
+		return -1;
+
+	next = strtok(cbuf, " \n");
+	if (!next) {
+		fprintf(stderr, "invalid input!\n");
+		goto again;
+	}
+
+	if (decode_type(command, next)) {
+		fprintf(stderr, "Invalid command type \"%s\"\n", next);
+		goto again;
+	}
+
+	if (command->c_type == HELP)
+		return 0;
+
+	next = strtok(NULL, " ");
+	if (!next) {
+		fprintf(stderr, "invalid input!\n");
+		goto again;
+	}
+
+	switch (command->c_type) {
+	case REGISTER:
+	case UNREGISTER:
+		if (decode_domain(command, next)) {
+			fprintf(stderr, "Invalid domain \"%s\"\n", next);
+			goto again;
+		}
+		break;
+	case LOCK:
+	case TRYLOCK:
+		if (decode_level(command, next)) {
+			fprintf(stderr, "Invalid lock level \"%s\"\n", next);
+			goto again;
+		}
+
+		next = strtok(NULL, " ");
+		if (!next) {
+			fprintf(stderr, "invalid input!\n");
+			goto again;
+		}
+
+		/* fall through */
+	case UNLOCK:
+		if (decode_lock(command, next)) {
+			fprintf(stderr, "Invalid lock \"%s\"\n", next);
+			goto again;
+		}
+		break;
+	default:
+		fprintf(stderr, "whoa, can't parse this\n");
+	}
+	return 0;
+}
+
+static void exec_command(struct command_s *c)
+{
+	errcode_t ret;
+
+	switch (c->c_type) {
+	case REGISTER:
+		ret = o2dlm_initialize(dlmfs_path, c->c_domain, &dlm_ctxt);
+		break;
+	case UNREGISTER:
+		ret = o2dlm_destroy(dlm_ctxt);
+		dlm_ctxt = NULL;
+		break;
+	case LOCK:
+		ret = o2dlm_lock(dlm_ctxt, c->c_id, 0, c->c_level);
+		break;
+	case UNLOCK:
+		ret = o2dlm_unlock(dlm_ctxt, c->c_id);
+		break;
+	case TRYLOCK:
+		ret = o2dlm_lock(dlm_ctxt, c->c_id, O2DLM_TRYLOCK, c->c_level);
+		break;
+	case HELP:
+		print_commands();
+		return;
+	default:
+		return;
+	}
+
+	if (ret)
+		com_err(prog, ret, "while executing command");
+}
+
+int main(int argc, char **argv)
+{
+	struct command_s c;
+
+	prog = argv[0];
+
+	if (argc < 2) {
+		printf("please provide a path to an ocfs2_dlmfs mount\n");
+		return 0;
+	}
+
+	dlmfs_path = argv[1];
+	printf("Using fs at %s\n", dlmfs_path);
+
+	while (!get_command(&c)) {
+		print_command(&c);
+		exec_command(&c);
+	}
+	return 0;
+}



More information about the Ocfs2-tools-commits mailing list