Index: cmd.c
===================================================================
--- cmd.c	(revision 34509d514dfa9ee441febffc6d61e108962d1507)
+++ cmd.c	(revision c4ba74dbb881fe02a8e19d2936144c033c7bb68f)
@@ -67,4 +67,17 @@
 }
 
+char *_owl_cmddict_execute(owl_cmddict *cd, owl_context *ctx, char **argv, int argc, char *buff) {
+  char *retval = NULL;
+  owl_cmd *cmd;
+
+  if (!strcmp(argv[0], "")) {
+  } else if (NULL != (cmd = (owl_cmd*)owl_dict_find_element(cd, argv[0]))) {
+    retval = owl_cmd_execute(cmd, cd, ctx, argc, argv, buff);
+  } else {
+    owl_function_makemsg("Unknown command '%s'.", buff);
+  }
+  return retval;
+}
+
 char *owl_cmddict_execute(owl_cmddict *cd, owl_context *ctx, char *cmdbuff) {
   char **argv;
@@ -72,5 +85,4 @@
   char *tmpbuff;
   char *retval = NULL;
-  owl_cmd *cmd;
 
   tmpbuff=owl_strdup(cmdbuff);
@@ -85,13 +97,33 @@
   if (argc < 1) return(NULL);
 
-  if (!strcmp(argv[0], "")) {
-  } else if (NULL != (cmd = (owl_cmd*)owl_dict_find_element(cd, argv[0]))) {
-    retval = owl_cmd_execute(cmd, cd, ctx, argc, argv, cmdbuff);
-  } else {
-    owl_function_makemsg("Unknown command '%s'.", cmdbuff);
-  }
+  retval = _owl_cmddict_execute(cd, ctx, argv, argc, cmdbuff);
+
   owl_parsefree(argv, argc);
   owl_free(tmpbuff);
   sepbar(NULL);
+  return retval;
+}
+
+char *owl_cmddict_execute_argv(owl_cmddict *cd, owl_context *ctx, char **argv, int argc) {
+  char *buff, *ptr;
+  int len = 0, i;
+  char *retval = NULL;
+
+  for(i = 0; i < argc; i++) {
+    len += strlen(argv[i]) + 1;
+  }
+
+  ptr = buff = owl_malloc(len);
+
+  for(i = 0; i < argc; i++) {
+    strcpy(ptr, argv[i]);
+    ptr += strlen(argv[i]);
+    *(ptr++) = ' ';
+  }
+  *(ptr - 1) = 0;
+
+  retval = _owl_cmddict_execute(cd, ctx, argv, argc, buff);
+
+  owl_free(buff);
   return retval;
 }
Index: functions.c
===================================================================
--- functions.c	(revision 0504f6318cdf8fe825d6783bd0909a68afded8bb)
+++ functions.c	(revision c4ba74dbb881fe02a8e19d2936144c033c7bb68f)
@@ -25,4 +25,11 @@
   return owl_cmddict_execute(owl_global_get_cmddict(&g), 
 			     owl_global_get_context(&g), cmdbuff);
+}
+
+char *owl_function_command_argv(char **argv, int argc)
+{
+  return owl_cmddict_execute_argv(owl_global_get_cmddict(&g),
+                                  owl_global_get_context(&g),
+                                  argv, argc);
 }
 
Index: perlconfig.c
===================================================================
--- perlconfig.c	(revision 0f9eca713cabc1c99564eae997508358d47c9aeb)
+++ perlconfig.c	(revision c4ba74dbb881fe02a8e19d2936144c033c7bb68f)
@@ -181,5 +181,6 @@
 {
   dSP ;
-  int count, len;
+  int count;
+  unsigned int len;
   SV *msgref, *srv;
   char *out, *preout;
@@ -457,5 +458,5 @@
   if(SvTRUE(ERRSV)) {
     owl_function_error("%s", SvPV(ERRSV, n_a));
-    POPs;
+    (void)POPs;
   } else {
     if(count != 1)
Index: perlglue.xs
===================================================================
--- perlglue.xs	(revision acb13bb6eade373818e5fae1dbbd8b4f654015fa)
+++ perlglue.xs	(revision c4ba74dbb881fe02a8e19d2936144c033c7bb68f)
@@ -17,5 +17,5 @@
 	 *************************************************************
 	 * These functions, when they are intended to be user-visible,
-	 * are document in perlwrap.pm. If you add functions to this
+	 * are documented in perlwrap.pm. If you add functions to this
 	 * file, add the appropriate documentation there!
 	 *
@@ -33,11 +33,25 @@
 
 char *
-command(cmd)
+command(cmd, ...)
 	char *cmd
 	PREINIT:
 		char *rv = NULL;
-	CODE:
-		rv = owl_function_command(cmd);
-		RETVAL = rv;	
+		char **argv;
+		int i;
+	CODE:
+	{
+		if (items == 1) {
+			rv = owl_function_command(cmd);
+		} else {
+			argv = owl_malloc((items + 1) * sizeof *argv);
+			argv[0] = cmd;
+			for(i = 1; i < items; i++) {
+				argv[i] = SvPV_nolen(ST(i));
+			}
+			rv = owl_function_command_argv(argv, items);
+			owl_free(argv);
+		}
+		RETVAL = rv;
+	}
 	OUTPUT:
 		RETVAL
