1 /*****************************************************************************
2 * RRDtool 1.2.23 Copyright by Tobi Oetiker, 1997-2007
3 *****************************************************************************
4 * rrd_tool.h Common Header File
5 *****************************************************************************/
6 #ifdef __cplusplus
7 extern "C" {
8 #endif
11 #ifndef _RRD_TOOL_H
12 #define _RRD_TOOL_H
14 #ifdef HAVE_CONFIG_H
15 #include "../rrd_config.h"
16 #elif defined(_WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__)
17 #include "../win32/config.h"
18 #endif
20 #ifdef MUST_DISABLE_SIGFPE
21 #include <signal.h>
22 #endif
24 #ifdef MUST_DISABLE_FPMASK
25 #include <floatingpoint.h>
26 #endif
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <errno.h>
31 #include <string.h>
32 #include <ctype.h>
34 #if HAVE_SYS_PARAM_H
35 # include <sys/param.h>
36 #endif
38 #ifndef MAXPATH
39 # define MAXPATH 1024
40 #endif
42 #if HAVE_MATH_H
43 # include <math.h>
44 #endif
45 /* Sorry: don't know autoconf as well how to check the exist of
46 dirent.h ans sys/stat.h
47 */
49 #if HAVE_DIRENT_H
50 # include <dirent.h>
51 # define NAMLEN(dirent) strlen((dirent)->d_name)
52 #else
53 # define dirent direct
54 # define NAMLEN(dirent) (dirent)->d_namlen
55 # if HAVE_SYS_NDIR_H
56 # include <sys/ndir.h>
57 # endif
58 # if HAVE_SYS_DIR_H
59 # include <sys/dir.h>
60 # endif
61 # if HAVE_NDIR_H
62 # include <ndir.h>
63 # endif
64 #endif
66 #if HAVE_SYS_TYPES_H
67 # include <sys/types.h>
68 #endif
70 #if HAVE_SYS_STAT_H
71 # include <sys/stat.h>
72 #endif
74 #if HAVE_UNISTD_H
75 # include <unistd.h>
76 #endif
78 #if TIME_WITH_SYS_TIME
79 # include <sys/time.h>
80 # include <time.h>
81 #else
82 # if HAVE_SYS_TIME_H
83 # include <sys/time.h>
84 # else
85 # include <time.h>
86 # endif
87 #endif
89 #if HAVE_SYS_TIMES_H
90 # include <sys/times.h>
91 #endif
94 #if HAVE_SYS_RESOURCE_H
95 # include <sys/resource.h>
96 #if (defined(__svr4__) && defined(__sun__))
97 /* Solaris headers (pre 2.6) don't have a getrusage prototype.
98 Use this instead. */
99 extern int getrusage(int, struct rusage *);
100 #endif /* __svr4__ && __sun__ */
101 #endif
103 #include "rrd.h"
105 #if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__)
107 /* Win32 only includes */
109 #include <float.h> /* for _isnan */
110 #include <io.h> /* for chdir */
112 struct tm* localtime_r(const time_t *timep, struct tm* result);
113 char* ctime_r(const time_t *timep, char* result);
114 struct tm* gmtime_r(const time_t *timep, struct tm* result);
115 char *strtok_r(char *str, const char *sep, char **last);
117 #else
119 /* unix-only includes */
120 #if !defined isnan && !defined HAVE_ISNAN
121 int isnan(double value);
122 #endif
124 #endif
126 /* local include files -- need to be after the system ones */
127 #include "rrd_getopt.h"
128 #include "rrd_format.h"
130 #ifndef max
131 #define max(a,b) ((a) > (b) ? (a) : (b))
132 #endif
134 #ifndef min
135 #define min(a,b) ((a) < (b) ? (a) : (b))
136 #endif
138 #define DIM(x) (sizeof(x)/sizeof(x[0]))
140 /* rrd info interface */
141 enum info_type { RD_I_VAL=0,
142 RD_I_CNT,
143 RD_I_STR,
144 RD_I_INT };
146 typedef union infoval {
147 unsigned long u_cnt;
148 rrd_value_t u_val;
149 char *u_str;
150 int u_int;
151 } infoval;
153 typedef struct info_t {
154 char *key;
155 enum info_type type;
156 union infoval value;
157 struct info_t *next;
158 } info_t;
160 info_t *rrd_info(int, char **);
161 int rrd_lastupdate(int argc, char **argv, time_t *last_update,
162 unsigned long *ds_cnt, char ***ds_namv, char ***last_ds);
163 info_t *rrd_update_v(int, char **);
164 char * sprintf_alloc(char *, ...);
165 info_t *info_push(info_t *, char *, enum info_type, infoval);
167 /* HELPER FUNCTIONS */
169 int PngSize(FILE *, long *, long *);
171 int rrd_create_fn(const char *file_name, rrd_t *rrd);
172 int rrd_fetch_fn(const char *filename, enum cf_en cf_idx,
173 time_t *start,time_t *end,
174 unsigned long *step,
175 unsigned long *ds_cnt,
176 char ***ds_namv,
177 rrd_value_t **data);
179 void rrd_free(rrd_t *rrd);
180 void rrd_freemem(void *mem);
181 void rrd_init(rrd_t *rrd);
183 int rrd_open(const char *file_name, FILE **in_file, rrd_t *rrd, int rdwr);
184 int readfile(const char *file, char **buffer, int skipfirst);
186 #define RRD_READONLY 0
187 #define RRD_READWRITE 1
189 enum cf_en cf_conv(const char *string);
190 enum dst_en dst_conv(char *string);
191 long ds_match(rrd_t *rrd,char *ds_nam);
192 double rrd_diff(char *a, char *b);
194 /* rrd_strerror is thread safe, but still it uses a global buffer
195 (but one per thread), thus subsequent calls within a single
196 thread overwrite the same buffer */
197 const char *rrd_strerror(int err);
199 #endif
201 #ifdef __cplusplus
202 }
203 #endif