curl/lib/memdebug.c

206 lines
4.9 KiB
C
Raw Normal View History

2000-10-09 07:11:43 -04:00
#ifdef MALLOCDEBUG
/*****************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
2001-01-03 04:29:33 -05:00
* Copyright (C) 2000, Daniel Stenberg, <daniel@haxx.se>, et al.
2000-10-09 07:11:43 -04:00
*
2001-01-03 04:29:33 -05:00
* In order to be useful for every potential user, curl and libcurl are
* dual-licensed under the MPL and the MIT/X-derivate licenses.
2000-10-09 07:11:43 -04:00
*
2001-01-03 04:29:33 -05:00
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of the Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the MPL or the MIT/X-derivate
* licenses. You may pick one of these licenses.
2000-10-09 07:11:43 -04:00
*
2001-01-03 04:29:33 -05:00
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
2000-10-09 07:11:43 -04:00
*
2001-01-03 04:29:33 -05:00
* $Id$
*****************************************************************************/
2000-10-09 07:11:43 -04:00
#include "setup.h"
#include <curl/curl.h>
#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
#include <winsock.h>
#else /* some kind of unix */
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#endif
#define _MPRINTF_REPLACE
#include <curl/mprintf.h>
2000-10-09 07:11:43 -04:00
#include "urldata.h"
#include <stdio.h>
#include <string.h>
2000-11-17 09:05:43 -05:00
#include <stdlib.h>
2000-10-09 07:11:43 -04:00
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
/* DONT include memdebug.h here! */
struct memdebug {
int size;
char mem[1];
};
2000-10-09 07:11:43 -04:00
/*
* Note that these debug functions are very simple and they are meant to
* remain so. For advanced analysis, record a log file and write perl scripts
* to analyze them!
*
* Don't use these with multithreaded test programs!
*/
2000-10-25 03:41:11 -04:00
FILE *logfile;
2000-10-09 07:11:43 -04:00
/* this sets the log file name */
void curl_memdebug(const char *logname)
2000-10-09 07:11:43 -04:00
{
if(logname)
logfile = fopen(logname, "w");
else
logfile = stderr;
2000-10-09 07:11:43 -04:00
}
void *curl_domalloc(size_t wantedsize, int line, const char *source)
2000-10-09 07:11:43 -04:00
{
void *mem;
size_t size;
/* alloc at least 64 bytes */
size = wantedsize>64?wantedsize:64;
mem=(malloc)(size);
2001-11-28 18:19:17 -05:00
if(mem)
/* fill memory with junk */
memset(mem, 0xA5, size);
if(logfile && source)
fprintf(logfile, "MEM %s:%d malloc(%d) = %p\n",
source, line, wantedsize, mem);
2000-10-09 07:11:43 -04:00
return mem;
}
2001-08-14 04:31:27 -04:00
char *curl_dostrdup(const char *str, int line, const char *source)
2000-10-09 07:11:43 -04:00
{
char *mem;
size_t len;
if(NULL ==str) {
fprintf(stderr, "ILLEGAL strdup() on NULL at %s:%d\n",
source, line);
exit(2);
}
len=strlen(str)+1;
mem=curl_domalloc(len, 0, NULL); /* NULL prevents logging */
memcpy(mem, str, len);
if(logfile)
fprintf(logfile, "MEM %s:%d strdup(%p) (%d) = %p\n",
source, line, str, len, mem);
2000-10-09 07:11:43 -04:00
return mem;
}
void *curl_dorealloc(void *ptr, size_t wantedsize,
int line, const char *source)
2000-10-09 07:11:43 -04:00
{
void *mem;
size_t size = wantedsize>64?wantedsize:64;
mem=(realloc)(ptr, size);
if(logfile)
fprintf(logfile, "MEM %s:%d realloc(%p, %d) = %p\n",
source, line, ptr, wantedsize, mem);
2000-10-09 07:11:43 -04:00
return mem;
}
2001-08-14 04:31:27 -04:00
void curl_dofree(void *ptr, int line, const char *source)
2000-10-09 07:11:43 -04:00
{
if(NULL == ptr) {
fprintf(stderr, "ILLEGAL free() on NULL at %s:%d\n",
source, line);
exit(2);
}
/* we know this is least 64 bytes, destroy this much */
memset(ptr, 0x13, 64);
/* free for real */
2000-10-09 07:11:43 -04:00
(free)(ptr);
if(logfile)
fprintf(logfile, "MEM %s:%d free(%p)\n", source, line, ptr);
2000-10-09 07:11:43 -04:00
}
int curl_socket(int domain, int type, int protocol, int line, char *source)
{
int sockfd=(socket)(domain, type, protocol);
if(logfile)
fprintf(logfile, "FD %s:%d socket() = %d\n",
source, line, sockfd);
return sockfd;
}
2001-03-09 10:13:34 -05:00
int curl_accept(int s, struct sockaddr *addr, socklen_t *addrlen,
2001-08-14 04:31:27 -04:00
int line, const char *source)
2000-12-18 11:13:37 -05:00
{
int sockfd=(accept)(s, addr, addrlen);
if(logfile)
fprintf(logfile, "FD %s:%d accept() = %d\n",
source, line, sockfd);
2000-12-18 11:13:37 -05:00
return sockfd;
}
/* this is our own defined way to close sockets on *ALL* platforms */
int curl_sclose(int sockfd, int line, char *source)
{
int res=sclose(sockfd);
if(logfile)
fprintf(logfile, "FD %s:%d sclose(%d)\n",
source, line, sockfd);
return res;
}
2001-08-14 04:31:27 -04:00
FILE *curl_fopen(const char *file, const char *mode,
int line, const char *source)
{
FILE *res=(fopen)(file, mode);
if(logfile)
fprintf(logfile, "FILE %s:%d fopen(\"%s\") = %p\n",
source, line, file, res);
return res;
}
2001-08-14 04:31:27 -04:00
int curl_fclose(FILE *file, int line, const char *source)
{
int res=(fclose)(file);
if(logfile)
fprintf(logfile, "FILE %s:%d fclose(%p)\n",
source, line, file);
return res;
}
2002-02-20 08:46:53 -05:00
#else
#ifdef VMS
int VOID_VAR_MEMDEBUG;
#endif
2000-10-09 07:11:43 -04:00
#endif /* MALLOCDEBUG */
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/