1 /*  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2  *
3  *  Gearmand client and server library.
4  *
5  *  Copyright (C) 2011-2012 Data Differential, http://datadifferential.com/
6  *  Copyright (C) 2008 Brian Aker, Eric Day
7  *  All rights reserved.
8  *
9  *  Redistribution and use in source and binary forms, with or without
10  *  modification, are permitted provided that the following conditions are
11  *  met:
12  *
13  *      * Redistributions of source code must retain the above copyright
14  *  notice, this list of conditions and the following disclaimer.
15  *
16  *      * Redistributions in binary form must reproduce the above
17  *  copyright notice, this list of conditions and the following disclaimer
18  *  in the documentation and/or other materials provided with the
19  *  distribution.
20  *
21  *      * The names of its contributors may not be used to endorse or
22  *  promote products derived from this software without specific prior
23  *  written permission.
24  *
25  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  *
37  */
38 
39 /*
40   All logging facilities within the server.
41 */
42 
43 #include <stdio.h>
44 
45 #pragma once
46 
47 #ifdef __cplusplus
48 extern "C" {
49 #endif
50 
51 #ifndef __PRETTY_FUNCTION__
52 # define __PRETTY_FUNCTION__ __func__
53 #endif
54 
55 #define STRINGIFY(x) #x
56 #define TOSTRING(x) STRINGIFY(x)
57 #define GEARMAND_AT __FILE__ ":" TOSTRING(__LINE__)
58 
59 #ifndef gearman_literal_param
60 # ifdef __cplusplus
61 #  define gearman_literal_param(X) (X), (size_t(sizeof(X) - 1))
62 # else
63 #  define gearman_literal_param(X) (X), ((size_t)((sizeof(X) - 1)))
64 # endif
65 #endif
66 
67 #define GEARMAN_DEFAULT_LOG_PARAM GEARMAND_AT, __PRETTY_FUNCTION__
68 
69 GEARMAN_INTERNAL_API
70 gearmand_error_t gearmand_initialize_thread_logging(const char *identity);
71 
72 /**
73  * Log a fatal message, see gearmand_log() for argument details.
74  */
75 GEARMAN_INTERNAL_API
76 gearmand_error_t gearmand_log_fatal(const char *position, const char *func, const char *format, ...);
77 #define gearmand_fatal(_mesg) gearmand_log_fatal(GEARMAN_DEFAULT_LOG_PARAM, (_mesg))
78 
79 GEARMAN_INTERNAL_API
80 gearmand_error_t gearmand_log_fatal_perror(const char *position, const char *function, const int local_errno, const char *format, ...);
81 #define gearmand_fatal_perror(__local_errno, __mesg) gearmand_log_fatal_perror(GEARMAN_DEFAULT_LOG_PARAM, (__local_errno), (__mesg))
82 
83 
84 /**
85  * Log an error message, see gearmand_log() for argument details.
86  */
87 GEARMAN_INTERNAL_API
88 gearmand_error_t gearmand_log_error(const char *position, const char *function, const char *format, ...);
89 #define gearmand_error(_mesg) gearmand_log_error(GEARMAN_DEFAULT_LOG_PARAM, (_mesg))
90 
91 gearmand_error_t gearmand_log_perror(const char *position, const char *function, const int local_errno, const char *format, ...);
92 #define gearmand_perror(__local_errno, __mesg) gearmand_log_perror(GEARMAN_DEFAULT_LOG_PARAM, (__local_errno), (__mesg))
93 
94 gearmand_error_t gearmand_log_gerror(const char *position, const char *function, const gearmand_error_t rc, const char *format, ...);
95 #define gearmand_gerror(_mesg, _gearmand_errot_t) gearmand_log_gerror(GEARMAN_DEFAULT_LOG_PARAM, (_gearmand_errot_t), (_mesg))
96 
97 GEARMAN_INTERNAL_API
98 gearmand_error_t gearmand_log_gerror_warn(const char *position, const char *function, const gearmand_error_t rc, const char *format, ...);
99 #define gearmand_gerror_warn(_mesg, _gearmand_errot_t) gearmand_log_gerror_warn(GEARMAN_DEFAULT_LOG_PARAM, (_gearmand_errot_t), (_mesg))
100 
101 GEARMAN_INTERNAL_API
102 gearmand_error_t gearmand_log_gai_error(const char *position, const char *function, const int rc, const char *message);
103 #define gearmand_gai_error(_mesg, _gai_int) gearmand_log_gai_error(GEARMAN_DEFAULT_LOG_PARAM, (_gai_int), (_mesg))
104 
105 GEARMAN_INTERNAL_API
106 gearmand_error_t gearmand_log_memory_error(const char *position, const char *function, const char *allocator, const char *type, size_t count, size_t size);
107 #define gearmand_merror(__allocator, __object_type, __count) gearmand_log_memory_error(GEARMAN_DEFAULT_LOG_PARAM, (__allocator), (#__object_type), (__count), (sizeof(__object_type)))
108 
109 
110 GEARMAN_INTERNAL_API
111 void gearmand_log_notice(const char *position, const char *function, const char *format, ...);
112 
113 /**
114  * Log an info message, see gearmand_log() for argument details.
115  */
116 GEARMAN_INTERNAL_API
117 void gearmand_log_info(const char *position, const char *function, const char *format, ...);
118 #define gearmand_info(_mesg) gearmand_log_info(GEARMAN_DEFAULT_LOG_PARAM, (_mesg))
119 
120 /**
121  * Log an info message, see gearmand_log() for argument details.
122  */
123 GEARMAN_INTERNAL_API
124 void gearmand_log_warning(const char *position, const char *function, const char *format, ...);
125 #define gearmand_warning(_mesg) gearmand_log_warning(GEARMAN_DEFAULT_LOG_PARAM, (_mesg))
126 
127 /**
128  * Log a debug message, see gearmand_log() for argument details.
129  */
130 GEARMAN_INTERNAL_API
131 void gearmand_log_debug(const char *position, const char *function, const char *format, ...);
132 #define gearmand_debug(_mesg) gearmand_log_debug(GEARMAN_DEFAULT_LOG_PARAM, (_mesg))
133 
134 #ifdef __cplusplus
135 }
136 #endif
137