1e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifndef HEADER_CURL_MEMDEBUG_H 2e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define HEADER_CURL_MEMDEBUG_H 35ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef CURLDEBUG 45ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/*************************************************************************** 55ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * _ _ ____ _ 65ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Project ___| | | | _ \| | 75ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * / __| | | | |_) | | 85ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * | (__| |_| | _ <| |___ 95ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * \___|\___/|_| \_\_____| 105ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 118f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. 125ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 135ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * This software is licensed as described in the file COPYING, which 145ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * you should have received as part of this distribution. The terms 158f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo * are also available at https://curl.haxx.se/docs/copyright.html. 165ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 175ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * You may opt to use, copy, modify, merge, publish, distribute and/or sell 185ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * copies of the Software, and permit persons to whom the Software is 195ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * furnished to do so, under the terms of the COPYING file. 205ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 215ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 225ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * KIND, either express or implied. 235ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 245ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ***************************************************************************/ 255ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 265ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* 275ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * CAUTION: this header is designed to work when included by the app-side 285ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * as well as the library. Do not mix with library internals! 295ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen */ 305ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 31e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define CURL_MT_LOGFNAME_BUFSIZE 512 325ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 335ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define logfile curl_debuglogfile 345ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 355ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenextern FILE *logfile; 365ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 375ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* memory functions */ 385ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURL_EXTERN void *curl_domalloc(size_t size, int line, const char *source); 39e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETCURL_EXTERN void *curl_docalloc(size_t elements, size_t size, int line, 40e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET const char *source); 41e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETCURL_EXTERN void *curl_dorealloc(void *ptr, size_t size, int line, 42e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET const char *source); 435ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURL_EXTERN void curl_dofree(void *ptr, int line, const char *source); 445ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURL_EXTERN char *curl_dostrdup(const char *str, int line, const char *source); 45e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#if defined(WIN32) && defined(UNICODE) 46e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETCURL_EXTERN wchar_t *curl_dowcsdup(const wchar_t *str, int line, 47e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET const char *source); 48e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif 49e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 505ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURL_EXTERN void curl_memdebug(const char *logname); 515ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURL_EXTERN void curl_memlimit(long limit); 525ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURL_EXTERN void curl_memlog(const char *format, ...); 535ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 545ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* file descriptor manipulators */ 555ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURL_EXTERN curl_socket_t curl_socket(int domain, int type, int protocol, 568f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo int line, const char *source); 575ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURL_EXTERN void curl_mark_sclose(curl_socket_t sockfd, 588f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo int line, const char *source); 595ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURL_EXTERN int curl_sclose(curl_socket_t sockfd, 608f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo int line, const char *source); 615ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURL_EXTERN curl_socket_t curl_accept(curl_socket_t s, void *a, void *alen, 625ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int line, const char *source); 63e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifdef HAVE_SOCKETPAIR 64e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETCURL_EXTERN int curl_socketpair(int domain, int type, int protocol, 65e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_socket_t socket_vector[2], 668f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo int line, const char *source); 67e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif 685ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 695ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* FILE functions */ 705ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURL_EXTERN FILE *curl_fopen(const char *file, const char *mode, int line, 715ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen const char *source); 725ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef HAVE_FDOPEN 735ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURL_EXTERN FILE *curl_fdopen(int filedes, const char *mode, int line, 745ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen const char *source); 755ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 765ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURL_EXTERN int curl_fclose(FILE *file, int line, const char *source); 775ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 785ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifndef MEMDEBUG_NODEFINES 795ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 805ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* Set this symbol on the command-line, recompile all lib-sources */ 815ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#undef strdup 825ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define strdup(ptr) curl_dostrdup(ptr, __LINE__, __FILE__) 835ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define malloc(size) curl_domalloc(size, __LINE__, __FILE__) 845ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define calloc(nbelem,size) curl_docalloc(nbelem, size, __LINE__, __FILE__) 855ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define realloc(ptr,size) curl_dorealloc(ptr, size, __LINE__, __FILE__) 865ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define free(ptr) curl_dofree(ptr, __LINE__, __FILE__) 875ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 88e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifdef WIN32 89e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# ifdef UNICODE 90e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# undef wcsdup 91e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# define wcsdup(ptr) curl_dowcsdup(ptr, __LINE__, __FILE__) 92e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# undef _wcsdup 93e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# define _wcsdup(ptr) curl_dowcsdup(ptr, __LINE__, __FILE__) 94e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# undef _tcsdup 95e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# define _tcsdup(ptr) curl_dowcsdup(ptr, __LINE__, __FILE__) 96e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# else 97e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# undef _tcsdup 98e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# define _tcsdup(ptr) curl_dostrdup(ptr, __LINE__, __FILE__) 99e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# endif 100e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif 101e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 1028f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo#undef socket 1035ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define socket(domain,type,protocol)\ 104e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_socket(domain, type, protocol, __LINE__, __FILE__) 1055ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#undef accept /* for those with accept as a macro */ 1065ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define accept(sock,addr,len)\ 107e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_accept(sock, addr, len, __LINE__, __FILE__) 108e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifdef HAVE_SOCKETPAIR 109e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define socketpair(domain,type,protocol,socket_vector)\ 110e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_socketpair(domain, type, protocol, socket_vector, __LINE__, __FILE__) 111e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif 1125ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1135ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef HAVE_GETADDRINFO 1145ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#if defined(getaddrinfo) && defined(__osf__) 1155ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* OSF/1 and Tru64 have getaddrinfo as a define already, so we cannot define 1165ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen our macro as for other platforms. Instead, we redefine the new name they 1175ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen define getaddrinfo to become! */ 1185ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define ogetaddrinfo(host,serv,hint,res) \ 119e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_dogetaddrinfo(host, serv, hint, res, __LINE__, __FILE__) 1205ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#else 1215ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#undef getaddrinfo 1225ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define getaddrinfo(host,serv,hint,res) \ 123e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_dogetaddrinfo(host, serv, hint, res, __LINE__, __FILE__) 1245ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 1255ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif /* HAVE_GETADDRINFO */ 1265ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1275ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef HAVE_GETNAMEINFO 1285ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#undef getnameinfo 1295ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define getnameinfo(sa,salen,host,hostlen,serv,servlen,flags) \ 130e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_dogetnameinfo(sa, salen, host, hostlen, serv, servlen, flags, \ 131e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET __LINE__, __FILE__) 1325ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif /* HAVE_GETNAMEINFO */ 1335ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1345ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef HAVE_FREEADDRINFO 1355ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#undef freeaddrinfo 1365ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define freeaddrinfo(data) \ 137e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_dofreeaddrinfo(data, __LINE__, __FILE__) 1385ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif /* HAVE_FREEADDRINFO */ 1395ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1405ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* sclose is probably already defined, redefine it! */ 1415ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#undef sclose 1425ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define sclose(sockfd) curl_sclose(sockfd,__LINE__,__FILE__) 1435ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1445ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define fake_sclose(sockfd) curl_mark_sclose(sockfd,__LINE__,__FILE__) 1455ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1465ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#undef fopen 1475ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define fopen(file,mode) curl_fopen(file,mode,__LINE__,__FILE__) 1485ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#undef fdopen 1495ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define fdopen(file,mode) curl_fdopen(file,mode,__LINE__,__FILE__) 1505ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define fclose(file) curl_fclose(file,__LINE__,__FILE__) 1515ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1525ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif /* MEMDEBUG_NODEFINES */ 1535ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1545ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif /* CURLDEBUG */ 1555ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 156e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* 157e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET** Following section applies even when CURLDEBUG is not defined. 158e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET*/ 159e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 1605ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifndef fake_sclose 161e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define fake_sclose(x) Curl_nop_stmt 1625ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 163e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 164e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* 165e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Curl_safefree defined as a macro to allow MemoryTracking feature 166e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * to log free() calls at same location where Curl_safefree is used. 167e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * This macro also assigns NULL to given pointer when free'd. 168e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET */ 169e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 170e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define Curl_safefree(ptr) \ 171e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET do { free((ptr)); (ptr) = NULL;} WHILE_FALSE 172e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 173e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif /* HEADER_CURL_MEMDEBUG_H */ 174