source: MondoRescue/branches/2.2.10/mondo/src/lib/mr_mem.c@ 2421

Last change on this file since 2421 was 2421, checked in by Bruno Cornec, 15 years ago
  • Remove some compiler warnings on main
  • Adds function mr_chomp and mr_strip_char and use them in mr_date and call_program_and_get_last_line_of_output
  • Fix call_program_and_get_last_line_of_output to return the right result using a temp file instead of popen
  • Fix an issue in mr_getline_int in case of eof (returns now an empty string)
  • Sequencing of Init of bkpinfo reviewed
  • Property svn:eol-style set to native
File size: 3.9 KB
Line 
1/*
2 * $Id$
3 *
4 * Code (c)2006 Bruno Cornec <bruno@mondorescue.org>
5 *
6 * Main file of mr_mem : a very small and simple
7 * library for memory management
8 *
9 * Provided under the GPLv2
10 */
11
12#ifndef _GNU_SOURCE
13#define _GNU_SOURCE
14#endif
15
16#include <stdio.h>
17#include <stdlib.h>
18
19#include "mr_err.h"
20#include "mr_msg.h"
21
22/*
23 * Function that frees memory if necessary
24 * A pointer to the memory pointed is passed to it.
25 * *allocated variable points then to the original content
26 * pointed to by the caller
27 * In case of NULL pointer it just logs it
28 */
29void mr_free_int(void **allocated, int line, const char *file) {
30
31 /* free man pages says that if allocated is NULL
32 * nothing happens
33 */
34 if (*allocated != NULL) {
35 free(*allocated);
36 *allocated = NULL;
37 } else {
38 mr_msg_int(8,line,file,"Attempt to free NULL pointer");
39 }
40}
41
42/* encapsulation function for malloc */
43void *mr_malloc_int(size_t size, int line, const char *file) {
44
45 void *ret;
46
47 ret = malloc(size);
48 if (ret == NULL) {
49 mr_msg_int(1,line,file,"Unable to alloc memory in mr_malloc\nExiting...");
50 mr_exit(-1,"Unable to alloc memory in mr_malloc");
51 }
52 return(ret);
53}
54
55/* encapsulation function for asprintf */
56void mr_asprintf_int(char **strp, int line, const char *file, const char *fmt, ...) {
57
58 int res = 0;
59 va_list args;
60
61 va_start(args,fmt);
62 res = vasprintf(strp, fmt, args);
63 if (res == -1) {
64 mr_msg_int(1,line,file,"Unable to alloc memory in mr_asprintf\nExiting...");
65 mr_exit(-1,"Unable to alloc memory in mr_asprintf");
66 }
67 va_end(args);
68}
69
70/* encapsulation function for getline */
71void mr_getline_int(char **lineptr, FILE *fd, int line, const char *file) {
72
73 ssize_t ret;
74 size_t n = 0;
75
76 ret = getline(lineptr,&n,fd);
77 if ((ret == -1) && (! feof(fd))) {
78 mr_msg_int(1,line,file,"Unable to alloc memory in mr_getline\nExiting...");
79 mr_exit(-1,"Unable to alloc memory in mr_getline");
80 }
81 /* We reached end of file, allocating empty string */
82 if (ret == -1) {
83 mr_asprintf_int(lineptr, line, file, "");
84 }
85}
86
87/*
88 * Function that properly allocates a string from another one
89 * freeing it before in any case
90 */
91void mr_allocstr_int(char *alloc, const char *orig, int line, const char *file) {
92
93 if (alloc != NULL) {
94 mr_free_int((void **)&alloc, line, file);
95 }
96 mr_asprintf_int(&alloc, line, file, orig);
97}
98
99/*
100 * Function that properly put a variable in the environment
101 */
102void mr_setenv_int(const char *name, const char *value, int line, char *file) {
103
104 if (name == NULL) {
105 mr_msg_int(1,line,file,"Unable to setenv a NULL variable\nExiting...");
106 mr_exit(-1, "Unable to setenv a NULL variable");
107 }
108 if (value == NULL) {
109 mr_msg_int(1,line,file,"Unable to affect NULL to %s\nExiting...", name);
110 mr_exit(-1, "Unable to affect a NULL variable");
111 }
112 if (setenv(name, value, 1) != 0) {
113 mr_msg_int(1,line,file,"Unable to put %s in environment", name);
114 mr_exit(-1,"Unable to put in environment");
115 }
116}
117
118/*
119 * Equivalent function of strcat but safe
120 * from memory allocation point of view
121 * and richer from an interface point of view
122 */
123void mr_strcat_int(char **in, int line, const char *file, const char *fmt, ...) {
124 char *fmt2 = NULL;
125 va_list args;
126 int res = 0;
127
128 if (fmt == NULL) {
129 return;
130 }
131 if (in == NULL) {
132 mr_msg_int(1,line,file,"Unable to add to NULL pointer\nExiting...");
133 mr_exit(-1, "Unable to add to a NULL pointer");
134 }
135 va_start(args,fmt);
136 if (*in == NULL) {
137 res = vasprintf(in, fmt, args);
138 if (res == -1) {
139 mr_msg_int(1,line,file,"Unable to alloc memory in mr_strcat\nExiting...");
140 mr_exit(-1,"Unable to alloc memory in mr_strcat");
141 }
142 } else {
143 mr_asprintf_int(&fmt2, line, file, "%s%s", *in, fmt);
144 mr_free_int((void **)in,line,file);
145 res = vasprintf(in, fmt2, args);
146 if (res == -1) {
147 mr_msg_int(1,line,file,"Unable to alloc memory in mr_strcat\nExiting...");
148 mr_exit(-1,"Unable to alloc memory in mr_strcat");
149 }
150 mr_free_int((void **)&fmt2,line,file);
151 }
152 va_end(args);
153}
154
155
Note: See TracBrowser for help on using the repository browser.