diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2019-08-29 21:43:47 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2019-08-29 21:43:47 (GMT) |
commit | fa40856e942a7e1bd1cb2729645182c1fa717468 (patch) | |
tree | 954db169d2b734e661d904e502cd1c803f51c6ea /src/common | |
parent | 7f973e015eb59b626edc584a19a1ad3ffddf4867 (diff) |
Defined a new way to launch updates share servers.
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/io.c | 78 | ||||
-rw-r--r-- | src/common/io.h | 6 |
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 *); |