chiark / gitweb /
copy: adjust directory times after writing to the directory
[elogind.git] / src / basic / alloc-util.c
1 /***
2   This file is part of systemd.
3
4   Copyright 2010 Lennart Poettering
5
6   systemd is free software; you can redistribute it and/or modify it
7   under the terms of the GNU Lesser General Public License as published by
8   the Free Software Foundation; either version 2.1 of the License, or
9   (at your option) any later version.
10
11   systemd is distributed in the hope that it will be useful, but
12   WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14   Lesser General Public License for more details.
15
16   You should have received a copy of the GNU Lesser General Public License
17   along with systemd; If not, see <http://www.gnu.org/licenses/>.
18 ***/
19
20 #include "alloc-util.h"
21 #include "util.h"
22
23 void* memdup(const void *p, size_t l) {
24         void *r;
25
26         assert(p);
27
28         r = malloc(l);
29         if (!r)
30                 return NULL;
31
32         memcpy(r, p, l);
33         return r;
34 }
35
36 void* greedy_realloc(void **p, size_t *allocated, size_t need, size_t size) {
37         size_t a, newalloc;
38         void *q;
39
40         assert(p);
41         assert(allocated);
42
43         if (*allocated >= need)
44                 return *p;
45
46         newalloc = MAX(need * 2, 64u / size);
47         a = newalloc * size;
48
49         /* check for overflows */
50         if (a < size * need)
51                 return NULL;
52
53         q = realloc(*p, a);
54         if (!q)
55                 return NULL;
56
57         *p = q;
58         *allocated = newalloc;
59         return q;
60 }
61
62 void* greedy_realloc0(void **p, size_t *allocated, size_t need, size_t size) {
63         size_t prev;
64         uint8_t *q;
65
66         assert(p);
67         assert(allocated);
68
69         prev = *allocated;
70
71         q = greedy_realloc(p, allocated, need, size);
72         if (!q)
73                 return NULL;
74
75         if (*allocated > prev)
76                 memzero(q + prev * size, (*allocated - prev) * size);
77
78         return q;
79 }