summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2019-08-29 21:43:47 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2019-08-29 21:43:47 (GMT)
commitfa40856e942a7e1bd1cb2729645182c1fa717468 (patch)
tree954db169d2b734e661d904e502cd1c803f51c6ea /src/common
parent7f973e015eb59b626edc584a19a1ad3ffddf4867 (diff)
Defined a new way to launch updates share servers.
Diffstat (limited to 'src/common')
-rw-r--r--src/common/io.c78
-rw-r--r--src/common/io.h6
2 files changed, 49 insertions, 35 deletions
diff --git a/src/common/io.c b/src/common/io.c
index 2a68649..754b8a9 100644
--- a/src/common/io.c
+++ b/src/common/io.c
@@ -25,6 +25,7 @@
#include <errno.h>
+#include <fcntl.h>
#include <libgen.h>
#include <malloc.h>
#include <stdint.h>
@@ -387,60 +388,75 @@ int make_tmp_file(const char *prefix, const char *suffix, char **filename)
/******************************************************************************
* *
-* Paramètres : base = préfixe du nom du fichier temporaire à créer. *
-* addr = adresse UNIX constituée. [OUT] *
+* Paramètres : dest = fichier de destination de la copie. *
+* src = fichier source à copier. *
* *
-* Description : Met en place un canal UNIX temporaire. *
+* Description : Copie un fichier. *
* *
-* Retour : Bilan de la définition. *
+* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
-bool build_tmp_socket(const char *base, struct sockaddr_un *addr)
+bool copy_file(const char *dest, const char *src)
{
bool result; /* Bilan à retourner */
- const char *tmpdir; /* Répertoire d'accueil */
- bool status; /* Bilan d'un consultation */
- char *path; /* Chemin d'accès au canal */
- int ret; /* Bilan intermédiaire */
- size_t length; /* Taille du chemin complet */
-
- status = g_generic_config_get_value(get_main_configuration(), MPK_TMPDIR, &tmpdir);
- if (!status) return false;
+ int fd; /* Descripteur du fichier */
+ struct stat info; /* Informations sur le fichier */
+ int ret; /* Bilan d'un appel */
+ void *data; /* Quantité de données traitées*/
+ bool status; /* Bilan de la lecture */
result = false;
- asprintf(&path, "%s" G_DIR_SEPARATOR_S "%s-%d", tmpdir, base, getpid());
+ /* Côté source */
- ret = ensure_path_exists(path);
- if (ret != 0) goto mts_exit;
+ fd = open(src, O_RDONLY);
+ if (fd == -1)
+ {
+ LOG_ERROR_N("open");
+ goto exit;
+ }
- length = strlen(path) + 1;
+ ret = fstat(fd, &info);
+ if (ret == -1)
+ {
+ LOG_ERROR_N("fstat");
+ goto done;
+ }
-#ifndef UNIX_PATH_MAX
-# define UNIX_PATH_MAX 108
-#endif
+ data = malloc(info.st_size);
- if (length > UNIX_PATH_MAX)
+ status = safe_read(fd, data, info.st_size);
+ if (!status) goto clean;
+
+ close(fd);
+
+ /* Côté destination */
+
+ fd = open(dest, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
+ if (fd == -1)
{
- log_variadic_message(LMT_ERROR,
- _("Impossible to use '%s' as UNIX socket path: string is too long ! (%zu vs %u)\n"),
- path, length, UNIX_PATH_MAX);
- goto mts_exit;
+ LOG_ERROR_N("open");
+ free(data);
+ goto exit;
}
- memset(addr, 0, sizeof(struct sockaddr_un));
-
- addr->sun_family = AF_UNIX;
- strncpy(addr->sun_path, path, UNIX_PATH_MAX - 1);
+ status = safe_write(fd, data, info.st_size);
+ if (!status) goto clean;
result = true;
- mts_exit:
+ clean:
+
+ free(data);
+
+ done:
+
+ close(fd);
- free(path);
+ exit:
return result;
diff --git a/src/common/io.h b/src/common/io.h
index 3639d98..b67359b 100644
--- a/src/common/io.h
+++ b/src/common/io.h
@@ -27,8 +27,6 @@
#include <stdbool.h>
#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/un.h>
@@ -53,8 +51,8 @@ int ensure_path_exists(const char *);
/* Met en place un fichier temporaire. */
int make_tmp_file(const char *, const char *, char **);
-/* Met en place un canal UNIX temporaire. */
-bool build_tmp_socket(const char *, struct sockaddr_un *);
+/* Copie un fichier. */
+bool copy_file(const char *, const char *);