aboutsummaryrefslogtreecommitdiffstats
path: root/src/client.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@member.fsf.org>2016-01-01 22:34:34 +0100
committerMattias Andrée <maandree@member.fsf.org>2016-01-01 22:34:34 +0100
commit4cba520a67e615b43dc22994670a904daf8643ae (patch)
tree6649c99fa94d8b7842a8ca7df7478ccf722d4c67 /src/client.c
parentremove satd-rm and satd-r and let satrm and satr do everything (not done yet) (diff)
downloadsat-4cba520a67e615b43dc22994670a904daf8643ae.tar.gz
sat-4cba520a67e615b43dc22994670a904daf8643ae.tar.bz2
sat-4cba520a67e615b43dc22994670a904daf8643ae.tar.xz
massive simpliciation and small bug fixes (not tested yet)
Signed-off-by: Mattias Andrée <maandree@member.fsf.org>
Diffstat (limited to '')
-rw-r--r--src/client.c178
1 files changed, 0 insertions, 178 deletions
diff --git a/src/client.c b/src/client.c
deleted file mode 100644
index 80cd527..0000000
--- a/src/client.c
+++ /dev/null
@@ -1,178 +0,0 @@
-/**
- * Copyright © 2015, 2016 Mattias Andrée <maandree@member.fsf.org>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-#include "client.h"
-#include <string.h>
-#include <unistd.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <sys/file.h>
-#include <sys/wait.h>
-
-
-
-/**
- * The name of the process.
- */
-extern char *argv0;
-
-
-
-/**
- * Send a command to satd. Start satd if it is not running.
- *
- * @param cmd Command type.
- * @param n The length of the message, 0 if
- * `msg` is `NULL` or NUL-terminated.
- * @param msg The message to send.
- * @return 0 on success, -1 on error.
- *
- * @throws 0 Error at the daemon-side.
- */
-int
-send_command(enum command cmd, size_t n, const char *restrict msg)
-{
- struct sockaddr_un address;
- const void *_cvoid;
- int fd = -1, start = 1, status, outfd, goterr = 0;
- const char *dir;
- pid_t pid;
- ssize_t r, wrote;
- char *buf = NULL;
- signed char cmd_ = (signed char)cmd;
- int eot = 0, saved_errno;
-
- /* Get socket address. */
- dir = getenv("XDG_RUNTIME_DIR"), dir = (dir ? dir : "/run");
- if (strlen(dir) + sizeof("/" PACKAGE "/socket") > sizeof(address.sun_path))
- t ((errno = ENAMETOOLONG));
- stpcpy(stpcpy(address.sun_path, dir), "/" PACKAGE "/lock"); /* Yes, "lock", It is temporary. */
- address.sun_family = AF_UNIX;
-
- /* Any daemon listening? */
- fd = open(address.sun_path, O_RDONLY);
- if (fd == -1) {
- t ((errno != ENOENT) && (errno != ENOTDIR));
- } else {
- if (flock(fd, LOCK_SH | LOCK_NB /* and LOCK_DRY if that was ever added... */))
- t (start = 0, errno != EWOULDBLOCK);
- else
- flock(fd, LOCK_UN);
- close(fd), fd = -1;
- }
-
- /* Start daemon if not running. */
- if (start) {
- switch ((pid = fork())) {
- case -1:
- goto fail;
- case 0:
- execl(BINDIR "/satd", BINDIR "/satd", NULL);
- perror(argv0);
- exit(1);
- default:
- t (waitpid(pid, &status, 0) != pid);
- t (errno = 0, status);
- break;
- }
- }
-
- /* Create socket. */
- stpcpy(strrchr(address.sun_path, '/'), "/socket");
- t ((fd = socket(PF_UNIX, SOCK_STREAM, 0)) == -1);
- t (connect(fd, (const struct sockaddr *)(_cvoid = &address), (socklen_t)sizeof(address)));
-
- /* Send message. */
- t (write(fd, &cmd_, sizeof(cmd_)) < (ssize_t)sizeof(cmd_));
- while (n) {
- t (r = write(fd, msg, n), r <= 0);
- msg += (size_t)r;
- n -= (size_t)r;
- }
- t (shutdown(fd, SHUT_WR)); /* Very important. */
-
- /* Receive. */
-receive_again:
- t (r = read(fd, &cmd_, sizeof(cmd_)), r < (ssize_t)sizeof(cmd_));
- if (r == 0)
- goto done;
- outfd = (int)cmd_;
- goterr |= outfd == STDERR_FILENO;
- t (r = read(fd, &n, sizeof(n)), r < (ssize_t)sizeof(n));
- eot = (outfd == 127) & !n;
- t (!(buf = malloc(n)));
- while (n) {
- t (r = read(fd, buf, n), r < 0);
- t (errno = 0, r == 0);
- n -= (size_t)r;
- for (dir = buf; r;) {
- t (wrote = write(outfd, dir, (size_t)r), wrote <= 0);
- dir += wrote, r -= wrote;
- }
- }
- free(buf), buf = NULL;
- goto receive_again;
-
-done:
- shutdown(fd, SHUT_RD), close(fd);
- return errno = 0, -goterr;
-
-fail:
- saved_errno = (goterr ? 0 : errno);
- if (fd >= 0)
- close(fd);
- free(buf);
- errno = saved_errno;
- if (eot) goto done;
- return -1;
-}
-
-
-/**
- * Return the number of bytes required to store a string array.
- *
- * @param array The string array.
- * @return The number of bytes required to store the array.
- */
-size_t
-measure_array(char *array[])
-{
- size_t rc = 0;
- while (*array) rc += strlen(*array++) + 1;
- return rc * sizeof(char);
-}
-
-
-/**
- * Store a string array.
- *
- * @param storage The buffer where the array is to be stored.
- * @param array The array to store.
- * @return Where in the buffer the array ends.
- */
-char *
-store_array(char *restrict storage, char *array[])
-{
- for (; *array; array++, storage++)
- storage = stpcpy(storage, *array);
- return storage;
-}
-