/*
- * Copyright (C) 1997-2013 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1997 Andre Noll <maan@tuebingen.mpg.de>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
#ifdef HAVE_READLINE
#include "interactive.h"
-#include "server_completion.h"
-#include "afs_completion.h"
+#include "server.completion.h"
+#include "afs.completion.h"
struct exec_task {
- struct task task;
+ struct task *task;
struct btr_node *btrn;
char *result_buf;
size_t result_size;
};
-static void exec_pre_select(struct sched *s, struct task *t)
+static void exec_pre_select(struct sched *s, void *context)
{
- struct exec_task *et = container_of(t, struct exec_task, task);
+ struct exec_task *et = context;
int ret = btr_node_status(et->btrn, 0, BTR_NT_LEAF);
if (ret != 0)
sched_min_delay(s);
}
-static int exec_post_select(__a_unused struct sched *s, struct task *t)
+static int exec_post_select(__a_unused struct sched *s, void *context)
{
- struct exec_task *et = container_of(t, struct exec_task, task);
+ struct exec_task *et = context;
struct btr_node *btrn = et->btrn;
char *buf;
size_t sz;
int ret;
struct sched command_sched = {.default_timeout = {.tv_sec = 1}};
struct exec_task exec_task = {
- .task = {
- .pre_select = exec_pre_select,
- .post_select = exec_post_select,
- .status = "client exec task",
- },
.result_buf = para_strdup(""),
.result_size = 1,
};
goto out;
exec_task.btrn = btr_new_node(&(struct btr_node_description)
EMBRACE(.name = "exec_collect"));
- register_task(&command_sched, &exec_task.task);
+ exec_task.task = task_register(&(struct task_info) {
+ .name = "client exec",
+ .pre_select = exec_pre_select,
+ .post_select = exec_post_select,
+ .context = &exec_task,
+ }, &command_sched);
ret = client_connect(ct, &command_sched, NULL, exec_task.btrn);
if (ret < 0)
goto out;
schedule(&command_sched);
+ sched_shutdown(&command_sched);
*result = exec_task.result_buf;
btr_remove_node(&exec_task.btrn);
- client_disconnect(ct);
ret = 1;
out:
btr_remove_node(&exec_task.btrn);
I9E_DUMMY_COMPLETER(play);
I9E_DUMMY_COMPLETER(si);
I9E_DUMMY_COMPLETER(term);
-I9E_DUMMY_COMPLETER(version);
I9E_DUMMY_COMPLETER(stop);
I9E_DUMMY_COMPLETER(addatt);
I9E_DUMMY_COMPLETER(init);
+I9E_DUMMY_COMPLETER(tasks);
static struct i9e_completer completers[];
result->matches = i9e_complete_commands(ci->word, completers);
}
+static void version_completer(struct i9e_completion_info *ci,
+ struct i9e_completion_result *cr)
+{
+ char *opts[] = {"-v", NULL};
+ i9e_complete_option(opts, ci, cr);
+}
+
static void stat_completer(struct i9e_completion_info *ci,
struct i9e_completion_result *cr)
{
struct i9e_completion_result *cr)
{
char *opts[] = {
- "--", "-l", "-ls", "-ll", "-lv", "-lp", "-lm", "-lc", "-p",
- "-a", "-r", "-d", "-sp", "-sl", "-ss", "-sn", "-sf", "-sc",
- "-si", "-sy", "-sb", "-sd", "-sa", NULL
+ "--", "-l", "-l=s", "-l=l", "-l=v", "-l=p", "-l=m", "-l=c",
+ "-p", "-a", "-r", "-d", "-s=p", "-s=l", "-s=s", "-s=n", "-s=f",
+ "-s=c", "-s=i", "-s=y", "-s=b", "-s=d", "-s=a", NULL
};
if (ci->word[0] == '-')
i9e_complete_option(opts, ci, cr);
struct i9e_completion_result *cr)
{
char *opts[] = {"-i", "-l", "-r", NULL};
-
- if (ci->word[0] == '-')
- i9e_complete_option(opts, ci, cr);
- else
- complete_attributes(ci->word, &cr->matches);
+ i9e_complete_option(opts, ci, cr);
}
static void mvatt_completer(struct i9e_completion_info *ci,
{
int ret;
- client_disconnect(ct);
PARA_DEBUG_LOG("line: %s\n", line);
ret = make_client_argv(line);
if (ret <= 0)
goto out;
para_log = i9e_log;
ret = schedule(&sched);
+ sched_shutdown(&sched);
i9e_close();
para_log = stderr_log;
out:
struct supervisor_task {
bool stdout_task_started;
- struct task task;
+ struct task *task;
};
-static int supervisor_post_select(struct sched *s, struct task *t)
+static int supervisor_post_select(struct sched *s, void *context)
{
- struct supervisor_task *svt = container_of(t, struct supervisor_task,
- task);
+ struct supervisor_task *svt = context;
+ int ret = task_status(ct->task);
- if (ct->task.error < 0)
- return ct->task.error;
+ if (ret < 0)
+ return ret;
if (!svt->stdout_task_started && ct->status == CL_EXECUTING) {
- stdout_set_defaults(&sot);
- register_task(s, &sot.task);
+ stdout_task_register(&sot, s);
svt->stdout_task_started = true;
return 1;
}
if (ct->status == CL_SENDING) {
- stdin_set_defaults(&sit);
- register_task(s, &sit.task);
+ stdin_task_register(&sit, s);
return -E_TASK_STARTED;
}
return 0;
}
-static struct supervisor_task supervisor_task = {
- .task = {
- .post_select = supervisor_post_select,
- .status = "supervisor task"
- }
-};
+static struct supervisor_task supervisor_task;
/**
* The client program to connect to para_server.
goto out;
sot.btrn = btr_new_node(&(struct btr_node_description)
EMBRACE(.name = "stdout", .parent = ct->btrn[0]));
- register_task(&sched, &supervisor_task.task);
+ supervisor_task.task = task_register(&(struct task_info) {
+ .name = "supervisor",
+ .post_select = supervisor_post_select,
+ .context = &supervisor_task,
+ }, &sched);
+
ret = schedule(&sched);
- if (ret >= 0 && ct->task.error < 0) {
- switch(ct->task.error) {
- /* these are not errors */
- case -E_SERVER_CMD_SUCCESS:
- case -E_EOF:
- case -E_SERVER_EOF:
- case -E_BTR_EOF:
- ret = 0;
- break;
- default: ret = -E_SERVER_CMD_FAILURE;
+ if (ret >= 0) {
+ ret = task_status(ct->task);
+ if (ret < 0) {
+ switch (ret) {
+ /* these are not errors */
+ case -E_SERVER_CMD_SUCCESS:
+ case -E_EOF:
+ case -E_SERVER_EOF:
+ case -E_BTR_EOF:
+ ret = 0;
+ break;
+ default: ret = -E_SERVER_CMD_FAILURE;
+ }
}
}
+ sched_shutdown(&sched);
out:
if (ret < 0)
PARA_ERROR_LOG("%s\n", para_strerror(-ret));