aboutsummaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c122
1 files changed, 2 insertions, 120 deletions
diff --git a/src/main.c b/src/main.c
index 547e96e..2976931 100644
--- a/src/main.c
+++ b/src/main.c
@@ -6,12 +6,12 @@
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
-#include <sys/sendfile.h>
#include <sys/stat.h>
-#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
+#include "system.h"
+
#ifndef FTAG_REMOTE_HOST
#define FTAG_REMOTE_HOST "localhost"
#endif
@@ -23,13 +23,6 @@
#define DATABASE_PATH FTAG_CACHE_DIR "/ftag.sqlite3"
-/* Used when encrypting or decrpyting a file, see the copy_encrypted_file
- * function. */
-enum encrypt {
- ENCRYPT,
- DECRYPT,
-};
-
/* TODO: read the configuration from a file
This would allow working with different databases with the same ftag
@@ -69,21 +62,6 @@ static void __sqlite3_check(int rc, sqlite3 *db, const char *file, int line, con
#define sqlite3_check(RC, DB) \
__sqlite3_check(RC, DB, __FILE__, __LINE__, __func__)
-/* Return whether PATH exists in the file system. Exit if any non-"file not
- * fount" error occurs. */
-static int file_exists(const char *path)
-{
- struct stat statbuf __attribute__((unused));
- int rc = stat(path, &statbuf);
- if (rc == 0)
- return 1;
- else if ((rc == -1) && (errno == ENOENT))
- return 0;
- fprintf(stderr, "stat: \"%s\": ", path);
- perror("");
- exit(EXIT_FAILURE);
-}
-
static void assert_db_exists(void)
{
if (file_exists(DATABASE_PATH))
@@ -101,102 +79,6 @@ static void assert_db_exists(void)
exit(EXIT_FAILURE);
}
-/* Execute command in a child process, then wait for the child to exit before
- * returning. If any error occurs, including in the child process, then if EXIT
- * is non-zero, exit, else return -1. Return 0 on success. */
-static int ftag_execvp(char *const *cmd, int can_exit)
-{
- int status = 0;
- int rc = fork();
- if (rc == 0) {
- execvp(cmd[0], cmd);
- fprintf(stderr, "exec: %s: ", cmd[0]);
- perror("");
- }
- else if (rc > 0) {
- int status;
- wait(&status);
- if (!(WIFEXITED(status) && WEXITSTATUS(status) == 0)) {
- fprintf(stderr,
- "ftag: child process exited abnormally\n");
- if (can_exit)
- exit(EXIT_FAILURE);
- else
- status = -1;
- }
- }
- else {
- perror("fork");
- if (can_exit)
- exit(EXIT_FAILURE);
- else
- status = -1;
- }
- return status;
-}
-
-/* Copy the file whose path is IN at path OUT. OUT is created or overwritten if
- * needed. */
-static void copy_file(const char *in, const char *out)
-{
- int in_fd;
- int out_fd;
- int rc;
- ssize_t written_bytes;
- in_fd = open(in, O_RDONLY);
- if (in_fd == -1) {
- fprintf(stderr, "open: %s:", in);
- perror("");
- exit(EXIT_FAILURE);
- }
- out_fd = open(out, O_WRONLY | O_CREAT | O_TRUNC, 0600);
- if (out_fd == -1) {
- fprintf(stderr, "open: %s:", out);
- perror("");
- exit(EXIT_FAILURE);
- }
- while ((written_bytes = sendfile(out_fd, in_fd, NULL, 4096)) == 4096)
- ;
- if (written_bytes == -1) {
- perror("sendfile");
- exit(EXIT_FAILURE);
- }
- rc = fchmod(out_fd, 0400);
- if (rc == -1) {
- fprintf(stderr, "chmod: %s: ", out);
- perror("");
- exit(EXIT_FAILURE);
- }
- close(in_fd);
- close(out_fd);
-}
-
-/* Like copy_file, but OUT is an encrypted version of IN. Encryption is done
- * using GPG. */
-static void
-copy_file_with_encryption(const char *in, const char *out, enum encrypt encrypt)
-{
- char *crypt_param;
- assert(encrypt == ENCRYPT || encrypt == DECRYPT);
- if (encrypt == ENCRYPT)
- crypt_param = "--encrypt";
- else
- crypt_param = "--decrypt";
- /* use dups to suppress "discards const qualifier" warnings */
- char *in_dup = strdup(in);
- char *out_dup = strdup(out);
- char *cmd[] = {
- "gpg",
- "--output", out_dup,
- "--yes",
- crypt_param, in_dup,
- NULL
- };
- ftag_execvp(cmd, 1);
- free(in_dup);
- free(out_dup);
-}
-
/* Prompt the user for yes or no (default is yes). Before calling, a prompt
* should be printed to stdout, eventually not with an ending newline. */
static int prompt_yes_no(void)