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