X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=lib%2Fxmalloc.c;h=9563391ec688535f110d919772184b90831b5aec;hp=ce1888d8254ce1bd24056f2ec47114c9f550f354;hb=4c85542894f7fca823b119b05e07179deb24229a;hpb=3d218a31145cf6a4c625ed287cdf3f99e4fd9a03 diff --git a/lib/xmalloc.c b/lib/xmalloc.c index ce1888d8..9563391e 100644 --- a/lib/xmalloc.c +++ b/lib/xmalloc.c @@ -11,15 +11,19 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., Foundation, + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #if HAVE_CONFIG_H # include #endif #include +#include +#include +#include +#include #if STDC_HEADERS # include @@ -30,15 +34,6 @@ void *realloc (); void free (); #endif -#if ENABLE_NLS -# include -# define _(Text) gettext (Text) -#else -# define textdomain(Domain) -# define _(Text) Text -#endif -#define N_(Text) Text - #include "xalloc.h" #ifndef EXIT_FAILURE @@ -52,20 +47,12 @@ void *xcalloc (size_t n, size_t s); void *xrealloc (void *p, size_t n); #endif -#ifndef HAVE_DONE_WORKING_MALLOC_CHECK -#error you must run the autoconf test for a properly working malloc -- see malloc.m4 -#endif - -#ifndef HAVE_DONE_WORKING_REALLOC_CHECK -#error you must run the autoconf test for a properly working realloc -- see realloc.m4 -#endif - /* Exit value when the requested amount of memory is not available. The caller may set it to some other value. */ int xalloc_exit_failure = EXIT_FAILURE; /* FIXME: describe */ -char *const xalloc_msg_memory_exhausted = N_("Memory exhausted"); +char *const xalloc_msg_memory_exhausted = "Memory exhausted"; /* FIXME: describe */ void (*xalloc_fail_func) (int) = 0; @@ -86,8 +73,6 @@ xmalloc (n) size_t n; { void *p; - extern char*cp_file; - extern int cp_line; p = malloc (n); if (p == 0) @@ -95,6 +80,21 @@ xmalloc (n) return p; } +/* Allocate N bytes of memory dynamically, and set it all to zero. */ + +void * +xmalloc_and_zero (n) + size_t n; +{ + void *p; + + p = malloc (n); + if (p == 0) + xalloc_fail ((int)n); + memset (p, '\0', n); + return p; +} + /* Change the size of an allocated block of memory P to N bytes, with error checking. If P is NULL, run xmalloc. */ @@ -110,6 +110,18 @@ xrealloc (p, n) return p; } +/* Duplicate a string */ + +char *xstrdup(const char *s) +{ + char *p; + + p = strdup(s); + if(!p) + xalloc_fail ((int)strlen(s)); + return p; +} + #ifdef NOT_USED /* Allocate memory for N elements of S bytes, with error checking. */ @@ -127,3 +139,21 @@ xcalloc (n, s) } #endif /* NOT_USED */ + +int xasprintf(char **strp, const char *fmt, ...) { + int result; + va_list ap; + va_start(ap, fmt); + result = xvasprintf(strp, fmt, ap); + va_end(ap); + return result; +} + +int xvasprintf(char **strp, const char *fmt, va_list ap) { + int result = vasprintf(strp, fmt, ap); + if(result < 0) { + fprintf(stderr, "vasprintf() failed: %s\n", strerror(errno)); + exit(xalloc_exit_failure); + } + return result; +}