summaryrefslogtreecommitdiffstats
path: root/job.c
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2017-04-20 12:01:14 +0100
committerThomas Adam <thomas@xteddy.org>2017-04-20 12:01:14 +0100
commit48371216df07c588180b8e2246930a96e94de62b (patch)
treeb7fe5d01adee8885d766616fcea5ff41d773ec01 /job.c
parente30f9dc1fae848d659295a9dfab0a5e0cf4e1a46 (diff)
parent21993105e53da0f5aae583b494c83f1cbbf48b1b (diff)
Merge branch 'obsd-master'
Diffstat (limited to 'job.c')
-rw-r--r--job.c49
1 files changed, 33 insertions, 16 deletions
diff --git a/job.c b/job.c
index bf3b261a..1ed74e2a 100644
--- a/job.c
+++ b/job.c
@@ -32,8 +32,9 @@
* output.
*/
-static void job_callback(struct bufferevent *, short, void *);
+static void job_read_callback(struct bufferevent *, void *);
static void job_write_callback(struct bufferevent *, void *);
+static void job_error_callback(struct bufferevent *, short, void *);
/* All jobs list. */
struct joblist all_jobs = LIST_HEAD_INITIALIZER(all_jobs);
@@ -41,7 +42,8 @@ struct joblist all_jobs = LIST_HEAD_INITIALIZER(all_jobs);
/* Start a job running, if it isn't already. */
struct job *
job_run(const char *cmd, struct session *s, const char *cwd,
- void (*callbackfn)(struct job *), void (*freefn)(void *), void *data)
+ job_update_cb updatecb, job_complete_cb completecb, job_free_cb freecb,
+ void *data)
{
struct job *job;
struct environ *env;
@@ -103,17 +105,18 @@ job_run(const char *cmd, struct session *s, const char *cwd,
job->pid = pid;
job->status = 0;
- LIST_INSERT_HEAD(&all_jobs, job, lentry);
+ LIST_INSERT_HEAD(&all_jobs, job, entry);
- job->callbackfn = callbackfn;
- job->freefn = freefn;
+ job->updatecb = updatecb;
+ job->completecb = completecb;
+ job->freecb = freecb;
job->data = data;
job->fd = out[0];
setblocking(job->fd, 0);
- job->event = bufferevent_new(job->fd, NULL, job_write_callback,
- job_callback, job);
+ job->event = bufferevent_new(job->fd, job_read_callback,
+ job_write_callback, job_error_callback, job);
bufferevent_enable(job->event, EV_READ|EV_WRITE);
log_debug("run job %p: %s, pid %ld", job, job->cmd, (long) job->pid);
@@ -126,11 +129,11 @@ job_free(struct job *job)
{
log_debug("free job %p: %s", job, job->cmd);
- LIST_REMOVE(job, lentry);
+ LIST_REMOVE(job, entry);
free(job->cmd);
- if (job->freefn != NULL && job->data != NULL)
- job->freefn(job->data);
+ if (job->freecb != NULL && job->data != NULL)
+ job->freecb(job->data);
if (job->pid != -1)
kill(job->pid, SIGTERM);
@@ -142,7 +145,21 @@ job_free(struct job *job)
free(job);
}
-/* Called when output buffer falls below low watermark (default is 0). */
+/* Job buffer read callback. */
+static void
+job_read_callback(__unused struct bufferevent *bufev, void *data)
+{
+ struct job *job = data;
+
+ if (job->updatecb != NULL)
+ job->updatecb (job);
+}
+
+/*
+ * Job buffer write callback. Fired when the buffer falls below watermark
+ * (default is empty). If all the data has been written, disable the write
+ * event.
+ */
static void
job_write_callback(__unused struct bufferevent *bufev, void *data)
{
@@ -160,7 +177,7 @@ job_write_callback(__unused struct bufferevent *bufev, void *data)
/* Job buffer error callback. */
static void
-job_callback(__unused struct bufferevent *bufev, __unused short events,
+job_error_callback(__unused struct bufferevent *bufev, __unused short events,
void *data)
{
struct job *job = data;
@@ -168,8 +185,8 @@ job_callback(__unused struct bufferevent *bufev, __unused short events,
log_debug("job error %p: %s, pid %ld", job, job->cmd, (long) job->pid);
if (job->state == JOB_DEAD) {
- if (job->callbackfn != NULL)
- job->callbackfn(job);
+ if (job->completecb != NULL)
+ job->completecb(job);
job_free(job);
} else {
bufferevent_disable(job->event, EV_READ);
@@ -186,8 +203,8 @@ job_died(struct job *job, int status)
job->status = status;
if (job->state == JOB_CLOSED) {
- if (job->callbackfn != NULL)
- job->callbackfn(job);
+ if (job->completecb != NULL)
+ job->completecb(job);
job_free(job);
} else {
job->pid = -1;