summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/io.c114
-rw-r--r--src/common/io.h7
2 files changed, 116 insertions, 5 deletions
diff --git a/src/common/io.c b/src/common/io.c
index 8e56379..85be44c 100644
--- a/src/common/io.c
+++ b/src/common/io.c
@@ -28,10 +28,17 @@
#include <libgen.h>
#include <malloc.h>
#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/stat.h>
+#include <sys/un.h>
+
+
+#include "../core/logs.h"
+#include "../core/params.h"
@@ -284,11 +291,6 @@ bool safe_send(int sockfd, const void *buf, size_t len, int flags)
}
-
-
-
-
-
/******************************************************************************
* *
* Paramètres : path = chemin d'accès à valider. *
@@ -326,3 +328,105 @@ int ensure_path_exists(const char *path)
return result;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : base = préfixe du nom du fichier temporaire à créer. *
+* filename = chemin d'accès complet au nouveau fichier. [OUT] *
+* *
+* Description : Met en place un fichier temporaire. *
+* *
+* Retour : Flux ouvert en lecture et écriture, ou -1 en cas d'erreur. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+int make_tmp_file(const char *base, char **filename)
+{
+ int result; /* Flux ou code à retourner */
+ const char *tmpdir; /* Répertoire d'accueil */
+ bool status; /* Bilan d'un consultation */
+
+ status = g_generic_config_get_value(get_main_configuration(), MPK_TMPDIR, &tmpdir);
+ if (!status) return -1;
+
+ asprintf(filename, "%s" G_DIR_SEPARATOR_S "%s-%d.XXXXXX", tmpdir, base, getpid());
+
+ result = ensure_path_exists(*filename);
+
+ if (result == 0)
+ {
+ result = mkstemp(*filename);
+ if (result == -1) perror("mkstemp");
+ }
+
+ if (result == -1)
+ free(*filename);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : base = préfixe du nom du fichier temporaire à créer. *
+* addr = adresse UNIX constituée. [OUT] *
+* *
+* Description : Met en place un canal UNIX temporaire. *
+* *
+* Retour : Bilan de la définition. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool build_tmp_socket(const char *base, struct sockaddr_un *addr)
+{
+ 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;
+
+ result = false;
+
+ asprintf(&path, "%s" G_DIR_SEPARATOR_S "%s-%d", tmpdir, base, getpid());
+
+ ret = ensure_path_exists(path);
+ if (ret != 0) goto mts_exit;
+
+ length = strlen(path) + 1;
+
+#ifndef UNIX_PATH_MAX
+# define UNIX_PATH_MAX 108
+#endif
+
+ if (length > UNIX_PATH_MAX)
+ {
+ 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;
+ }
+
+ memset(addr, 0, sizeof(struct sockaddr_un));
+
+ addr->sun_family = AF_UNIX;
+ strncpy(addr->sun_path, path, UNIX_PATH_MAX - 1);
+
+ result = true;
+
+ mts_exit:
+
+ free(path);
+
+ return result;
+
+}
diff --git a/src/common/io.h b/src/common/io.h
index 0ada366..d70c64a 100644
--- a/src/common/io.h
+++ b/src/common/io.h
@@ -28,6 +28,7 @@
#include <stdbool.h>
#include <sys/types.h>
#include <sys/socket.h>
+#include <sys/un.h>
@@ -49,6 +50,12 @@ bool safe_send(int, const void *, size_t, int);
/* S'assure qu'un chemin donné existe dans le système. */
int ensure_path_exists(const char *);
+/* Met en place un fichier temporaire. */
+int make_tmp_file(const char *, char **);
+
+/* Met en place un canal UNIX temporaire. */
+bool build_tmp_socket(const char *, struct sockaddr_un *);
+
#endif /* _COMMON_IO_H */