aboutsummaryrefslogtreecommitdiffstats
path: root/src/satd-add.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/satd-add.c45
1 files changed, 41 insertions, 4 deletions
diff --git a/src/satd-add.c b/src/satd-add.c
index 5afcf2d..0fec460 100644
--- a/src/satd-add.c
+++ b/src/satd-add.c
@@ -20,6 +20,8 @@
* DEALINGS IN THE SOFTWARE.
*/
#include "daemon.h"
+#include <sys/file.h>
+#include <sys/stat.h>
@@ -36,8 +38,12 @@ int
main(int argc, char *argv[])
{
size_t n = 0, elements = 0, i;
+ ssize_t r;
char *message = NULL;
int msg_argc;
+ int rc = 0;
+ struct job *job = NULL;
+ struct stat attr;
assert(argc == 3);
t (reopen(STATE_FILENO, O_RDWR));
@@ -51,13 +57,44 @@ main(int argc, char *argv[])
t ((msg_argc < 1) || !n || message[n - 1]);
for (i = n; i--; elements += !message[i]);
t (elements < (size_t)msg_argc);
- n += sizeof(int) + sizeof(clockid_t) + sizeof(struct timespec);
- /* TODO main */
- (void) argv;
+ /* Parse message. */
+ t (!(job = malloc(sizeof(*job) + n)));
+ job->argc = msg_argc;
+ job->clk = *(clockid_t *)(message + n + sizeof(int));
+ job->ts = *(struct timespec *)(message + n + sizeof(int) + sizeof(clockid_t));
+ job->n = n;
+ memcpy(job->payload, message, n);
- return 0;
+ /* Update state file. */
+ t (flock(STATE_FILENO, LOCK_EX));
+ t (fstat(STATE_FILENO, &attr));
+ r = preadn(STATE_FILENO, &(job->no), sizeof(job->no), 0);
+ t (r < 0);
+ if (r < (ssize_t)sizeof(job->no))
+ job->no = 0;
+ else
+ job->no += 1;
+ t (pwriten(STATE_FILENO, &(job->no), sizeof(job->no), 0) < (ssize_t)sizeof(job->no));
+ if (attr.st_size < (off_t)sizeof(job->no))
+ attr.st_size = (off_t)sizeof(job->no);
+ n += sizeof(*job);
+ t (pwriten(STATE_FILENO, job, n, attr.st_size) < (ssize_t)n);
+ fsync(STATE_FILENO);
+ t (flock(STATE_FILENO, LOCK_UN));
+
+done:
+ /* Cleanup. */
+ shutdown(SOCK_FILENO, SHUT_WR);
+ close(SOCK_FILENO);
+ free(message);
+ free(job);
+ return rc;
fail:
+ if (send_string(SOCK_FILENO, STDERR_FILENO, argv[0], ": ", strerror(errno), "\n", NULL))
+ perror(argv[0]);
+ rc = 1;
+ goto done;
(void) argc;
}