// On success
td_command_success_callback on_success;
void* on_success_data;
+
+ // On failure
+ td_command_failure_callback on_failure;
+ void* on_failure_data;
} callbacks;
// Events
self->callbacks.on_success_data = data;
}
+void td_command_on_failure(td_command* self,
+ td_command_failure_callback callback, void* data) {
+ self->callbacks.on_failure = callback;
+ self->callbacks.on_failure_data = data;
+}
+
// Capabilities
static int td_command_require_cap(td_command* self, const cap_value_t cap) {
// Check if we have space
}
}
+ // Open stdout as a file
+ r = td_file_open_buffer(&stdout, self->ctx, self->stdout.buffer);
+ if (r < 0)
+ goto ERROR;
+
+ // Open a file handle
+ r = td_file_open_buffer(&stderr, self->ctx, self->stderr.buffer);
+ if (r < 0)
+ goto ERROR;
+
switch (si->si_code) {
case CLD_EXITED:
DEBUG(self->ctx, "Process has exited with status code %d\n", si->si_status);
// Log stderr
if (rc) {
- // Open a file handle
- r = td_file_open_buffer(&stderr, self->ctx, self->stderr.buffer);
- if (r < 0)
- goto ERROR;
-
// Log all lines
r = td_file_walk(stderr, td_command_log_stderr, self);
if (r < 0)
break;
}
- // Skip any further processing if the command did not succeed
- if (rc)
- goto ERROR;
-
- // Call the callback
- if (self->callbacks.on_success) {
- // Open stdout as a file
- r = td_file_open_buffer(&stdout, self->ctx, self->stdout.buffer);
- if (r < 0)
- goto ERROR;
+ // Call any callbacks
+ switch (rc) {
+ // Success
+ case 0:
+ if (self->callbacks.on_success) {
+ r = self->callbacks.on_success(self->ctx,
+ rc, stdout, self->callbacks.on_success_data);
+ }
+ break;
- // Call the callback
- r = self->callbacks.on_success(self->ctx,
- rc, stdout, self->callbacks.on_success_data);
+ // Failure
+ default:
+ if (self->callbacks.on_failure) {
+ r = self->callbacks.on_failure(self->ctx,
+ rc, stderr, self->callbacks.on_failure_data);
+ }
+ break;
}
ERROR:
typedef int (*td_command_success_callback)
(td_ctx* ctx, int rc, td_file* stdout, void* data);
+typedef int (*td_command_failure_callback)
+ (td_ctx* ctx, int rc, td_file* stderr, void* data);
#include "daemon.h"
void td_command_on_success(td_command* self,
td_command_success_callback callback, void* data);
+// Called if the command has failed
+void td_command_on_failure(td_command* self,
+ td_command_failure_callback callback, void* data);
+
// Capabilities
int td_command_require_caps(td_command* self, const cap_value_t* caps);