+/* Executes all of the actions specified in ARGV[]
+ up to the null pointer sentinel. */
+static void
+run_actions (char **argv)
+{
+ /* An action. */
+ struct action
+ {
+ char *name; /* Action name. */
+ int argc; /* # of args, including action name. */
+ void (*function) (char **argv); /* Function to execute action. */
+ };
+
+ /* Table of supported actions. */
+ static const struct action actions[] =
+ {
+ {"run", 2, run_task},
+#ifdef FILESYS
+ {"ls", 1, fsutil_ls},
+ {"cat", 2, fsutil_cat},
+ {"rm", 2, fsutil_rm},
+ {"put", 2, fsutil_put},
+ {"get", 2, fsutil_get},
+#endif
+ {NULL, 0, NULL},
+ };
+
+ while (*argv != NULL)
+ {
+ const struct action *a;
+ int i;
+
+ /* Find action name. */
+ for (a = actions; ; a++)
+ if (a->name == NULL)
+ PANIC ("unknown action `%s' (use -h for help)", *argv);
+ else if (!strcmp (*argv, a->name))
+ break;
+
+ /* Check for required arguments. */
+ for (i = 1; i < a->argc; i++)
+ if (argv[i] == NULL)
+ PANIC ("action `%s' requires %d argument(s)", *argv, a->argc - 1);