1 /** Fichier util.c
2 **
3 ** Diverses routines utilitaires pour calife.
4 **
5 ** Copyright (c) 1991-2010 by Ollivier ROBERT
6 ** A distribuer selon les regles de la GNU GPL General Public Licence
7 ** Voir le fichier COPYING fourni.
8 **/
9
10 #ifndef lint
11 static const char * rcsid = "@(#) $Id$";
12 #endif
13
14 #include "config.h" /* configure */
15 #include "conf.h"
16
17 /** Renvoie la derniere composante (le nom du fichier) d'un nom complet
18 **
19 ** Parametre : filename char * nom a analyser
20 **
21 ** Retourne : p char * le nom de fichier
22 **/
23
24 #ifndef HAVE_BASENAME /* linux as already one it seems */
25 char *
basename(char * filename)26 basename (char * filename)
27 {
28 char * p;
29 p = filename + (strlen (filename) * sizeof (char));
30 while (*p != '/')
31 {
32 if (p == filename)
33 return (filename);
34 p--;
35 }
36 return (char *) (p + 1);
37 }
38 #endif /* HAVE_BASENAME */
39
40 /** Efface la mémoire de manière sécurisée
41 **
42 ** cf. http://www.daemonology.net/blog/2014-09-04-how-to-zero-a-buffer.html
43 **
44 ** Parametres: buf void * pointeur vers la zone à effacer
45 ** size size_t longueur à effacer
46 **
47 ** Retourne : rien
48 **/
49
50 static void * (* const volatile memset_ptr)(void *, int, size_t) = memset;
51
52 static void
secure_memzero(void * buf,size_t size)53 secure_memzero (void * buf, size_t size)
54 {
55 (memset_ptr)(buf, '\0', size);
56 }
57
58 /** Alloue de la mémoire par malloc, la met à zéro et renvoie le pointeur.
59 ** Sort si plus de mémoire.
60 **
61 ** Parametres: num size_t nombre de blocs à allouer
62 ** size size_t taille d'un bloc
63 **
64 ** Retourne : ptr void * un pointeur sur la zone
65 **/
66
67 void *
xalloc(size_t size)68 xalloc (size_t size)
69 {
70 void * ptr;
71
72 ptr = (void *) malloc (size);
73 if (ptr == NULL)
74 die (1, "No more memory.");
75 secure_memzero ((char *) ptr, size);
76 return ptr;
77 }
78
79 /** Sort du programme avec le message et le code de retour spécifiés.
80 **
81 ** Contribué par Nat Makarévitch <nat@nataa.frmug.fr.net>
82 ** Modifiée pour se conformer à mes usages :-)
83 **
84 ** Paramètres: err code d'erreur de exit(3)
85 ** fmt format du message
86 ** ... les arguments
87 **
88 ** Retourne: rien
89 */
90
91 #ifdef HAVE_STDARG_H
92 #include <stdarg.h>
93
94 void
die(int err,const char * fmt,...)95 die (int err, const char * fmt, ...)
96 {
97 va_list ap;
98
99 fflush (stdout);
100
101 closelog ();
102 va_start (ap, fmt);
103 vfprintf (stderr, fmt, ap);
104 va_end (ap);
105 fprintf (stderr, "\n");
106 exit (err);
107 }
108
109 #elif defined(HAVE_VARARGS_H)
110
111 void
die(int err,const char * fmt,...)112 die (int err, const char * fmt, ...)
113 {
114 va_list ap;
115
116 fflush (stdout);
117
118 closelog ();
119 va_start (ap);
120 vfprintf (stderr, fmt, ap);
121 va_end (ap);
122 fprintf (stderr, "\n");
123 exit (err);
124 }
125
126 #else
127 #error You should have at least one of stdarg/varargs
128 #endif /* neither */
129
130