chiark / gitweb /
journal: add sd_journal_open_files
[elogind.git] / src / systemd / sd-journal.h
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 #ifndef foojournalhfoo
4 #define foojournalhfoo
5
6 /***
7   This file is part of systemd.
8
9   Copyright 2011 Lennart Poettering
10
11   systemd is free software; you can redistribute it and/or modify it
12   under the terms of the GNU Lesser General Public License as published by
13   the Free Software Foundation; either version 2.1 of the License, or
14   (at your option) any later version.
15
16   systemd is distributed in the hope that it will be useful, but
17   WITHOUT ANY WARRANTY; without even the implied warranty of
18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19   Lesser General Public License for more details.
20
21   You should have received a copy of the GNU Lesser General Public License
22   along with systemd; If not, see <http://www.gnu.org/licenses/>.
23 ***/
24
25 #include <inttypes.h>
26 #include <sys/types.h>
27 #include <stdarg.h>
28 #include <sys/uio.h>
29 #include <syslog.h>
30
31 #include <systemd/sd-id128.h>
32
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36
37 #ifndef _sd_printf_attr_
38 #  if __GNUC__ >= 4
39 #    define _sd_printf_attr_(a,b) __attribute__ ((format (printf, a, b)))
40 #  else
41 #    define _sd_printf_attr_(a,b)
42 #  endif
43 #endif
44
45 #ifndef _sd_sentinel_attr_
46 #  define _sd_sentinel_attr_ __attribute__((sentinel))
47 #endif
48
49 /* Journal APIs. See sd-journal(3) for more information. */
50
51 /* Write to daemon */
52 int sd_journal_print(int priority, const char *format, ...) _sd_printf_attr_(2, 3);
53 int sd_journal_printv(int priority, const char *format, va_list ap) _sd_printf_attr_(2, 0);
54 int sd_journal_send(const char *format, ...) _sd_printf_attr_(1, 0) _sd_sentinel_attr_;
55 int sd_journal_sendv(const struct iovec *iov, int n);
56 int sd_journal_perror(const char *message);
57
58 /* Used by the macros below. Don't call this directly. */
59 int sd_journal_print_with_location(int priority, const char *file, const char *line, const char *func, const char *format, ...) _sd_printf_attr_(5, 6);
60 int sd_journal_printv_with_location(int priority, const char *file, const char *line, const char *func, const char *format, va_list ap) _sd_printf_attr_(5, 0);
61 int sd_journal_send_with_location(const char *file, const char *line, const char *func, const char *format, ...) _sd_printf_attr_(4, 0) _sd_sentinel_attr_;
62 int sd_journal_sendv_with_location(const char *file, const char *line, const char *func, const struct iovec *iov, int n);
63 int sd_journal_perror_with_location(const char *file, const char *line, const char *func, const char *message);
64
65 /* implicitly add code location to messages sent, if this is enabled */
66 #ifndef SD_JOURNAL_SUPPRESS_LOCATION
67
68 #define _sd_XSTRINGIFY(x) #x
69 #define _sd_STRINGIFY(x) _sd_XSTRINGIFY(x)
70
71 #define sd_journal_print(priority, ...) sd_journal_print_with_location(priority, "CODE_FILE=" __FILE__, "CODE_LINE=" _sd_STRINGIFY(__LINE__), __func__, __VA_ARGS__)
72 #define sd_journal_printv(priority, format, ap) sd_journal_printv_with_location(priority, "CODE_FILE=" __FILE__, "CODE_LINE=" _sd_STRINGIFY(__LINE__), __func__, format, ap)
73 #define sd_journal_send(...) sd_journal_send_with_location("CODE_FILE=" __FILE__, "CODE_LINE=" _sd_STRINGIFY(__LINE__), __func__, __VA_ARGS__)
74 #define sd_journal_sendv(iovec, n) sd_journal_sendv_with_location("CODE_FILE=" __FILE__, "CODE_LINE=" _sd_STRINGIFY(__LINE__), __func__, iovec, n)
75 #define sd_journal_perror(message) sd_journal_perror_with_location("CODE_FILE=" __FILE__, "CODE_LINE=" _sd_STRINGIFY(__LINE__), __func__, message)
76
77 #endif
78
79 int sd_journal_stream_fd(const char *identifier, int priority, int level_prefix);
80
81 /* Browse journal stream */
82
83 typedef struct sd_journal sd_journal;
84
85 /* Open flags */
86 enum {
87         SD_JOURNAL_LOCAL_ONLY = 1,
88         SD_JOURNAL_RUNTIME_ONLY = 2,
89         SD_JOURNAL_SYSTEM = 4,
90         SD_JOURNAL_SYSTEM_ONLY = SD_JOURNAL_SYSTEM, /* deprecated */
91         SD_JOURNAL_CURRENT_USER = 8,
92 };
93
94 /* Wakeup event types */
95 enum {
96         SD_JOURNAL_NOP,
97         SD_JOURNAL_APPEND,
98         SD_JOURNAL_INVALIDATE
99 };
100
101 int sd_journal_open(sd_journal **ret, int flags);
102 int sd_journal_open_directory(sd_journal **ret, const char *path, int flags);
103 int sd_journal_open_files(sd_journal **ret, const char **paths, int flags);
104 void sd_journal_close(sd_journal *j);
105
106 int sd_journal_previous(sd_journal *j);
107 int sd_journal_next(sd_journal *j);
108
109 int sd_journal_previous_skip(sd_journal *j, uint64_t skip);
110 int sd_journal_next_skip(sd_journal *j, uint64_t skip);
111
112 int sd_journal_get_realtime_usec(sd_journal *j, uint64_t *ret);
113 int sd_journal_get_monotonic_usec(sd_journal *j, uint64_t *ret, sd_id128_t *ret_boot_id);
114
115 int sd_journal_set_data_threshold(sd_journal *j, size_t sz);
116 int sd_journal_get_data_threshold(sd_journal *j, size_t *sz);
117
118 int sd_journal_get_data(sd_journal *j, const char *field, const void **data, size_t *l);
119 int sd_journal_enumerate_data(sd_journal *j, const void **data, size_t *l);
120 void sd_journal_restart_data(sd_journal *j);
121
122 int sd_journal_add_match(sd_journal *j, const void *data, size_t size);
123 int sd_journal_add_disjunction(sd_journal *j);
124 int sd_journal_add_conjunction(sd_journal *j);
125 void sd_journal_flush_matches(sd_journal *j);
126
127 int sd_journal_seek_head(sd_journal *j);
128 int sd_journal_seek_tail(sd_journal *j);
129 int sd_journal_seek_monotonic_usec(sd_journal *j, sd_id128_t boot_id, uint64_t usec);
130 int sd_journal_seek_realtime_usec(sd_journal *j, uint64_t usec);
131 int sd_journal_seek_cursor(sd_journal *j, const char *cursor);
132
133 int sd_journal_get_cursor(sd_journal *j, char **cursor);
134 int sd_journal_test_cursor(sd_journal *j, const char *cursor);
135
136 int sd_journal_get_cutoff_realtime_usec(sd_journal *j, uint64_t *from, uint64_t *to);
137 int sd_journal_get_cutoff_monotonic_usec(sd_journal *j, const sd_id128_t boot_id, uint64_t *from, uint64_t *to);
138
139 int sd_journal_get_usage(sd_journal *j, uint64_t *bytes);
140
141 int sd_journal_query_unique(sd_journal *j, const char *field);
142 int sd_journal_enumerate_unique(sd_journal *j, const void **data, size_t *l);
143 void sd_journal_restart_unique(sd_journal *j);
144
145 int sd_journal_get_fd(sd_journal *j);
146 int sd_journal_get_events(sd_journal *j);
147 int sd_journal_get_timeout(sd_journal *j, uint64_t *timeout_usec);
148 int sd_journal_process(sd_journal *j);
149 int sd_journal_wait(sd_journal *j, uint64_t timeout_usec);
150 int sd_journal_reliable_fd(sd_journal *j);
151
152 int sd_journal_get_catalog(sd_journal *j, char **text);
153 int sd_journal_get_catalog_for_message_id(sd_id128_t id, char **ret);
154
155 #define SD_JOURNAL_FOREACH(j)                                           \
156         if (sd_journal_seek_head(j) >= 0)                               \
157                 while (sd_journal_next(j) > 0)
158
159 #define SD_JOURNAL_FOREACH_BACKWARDS(j)                                 \
160         if (sd_journal_seek_tail(j) >= 0)                               \
161                 while (sd_journal_previous(j) > 0)
162
163 #define SD_JOURNAL_FOREACH_DATA(j, data, l)                             \
164         for (sd_journal_restart_data(j); sd_journal_enumerate_data((j), &(data), &(l)) > 0; )
165
166 #define SD_JOURNAL_FOREACH_UNIQUE(j, data, l)                           \
167         for (sd_journal_restart_unique(j); sd_journal_enumerate_unique((j), &(data), &(l)) > 0; )
168
169 #ifdef __cplusplus
170 }
171 #endif
172
173 #endif