~ubuntu-branches/ubuntu/vivid/samba/vivid

« back to all changes in this revision

Viewing changes to lib/tevent/tevent.h

  • Committer: Package Import Robot
  • Author(s): Chuck Short
  • Date: 2011-12-21 13:18:04 UTC
  • mfrom: (0.39.21 sid)
  • Revision ID: package-import@ubuntu.com-20111221131804-xtlr39wx6njehxxr
Tags: 2:3.6.1-3ubuntu1
* Merge from Debian testing.  Remaining changes:
  + debian/patches/VERSION.patch:
    - set SAMBA_VERSION_SUFFIX to Ubuntu.
  + debian/patches/error-trans.fix-276472:
    - Add the translation of Unix Error code -ENOTSUP to NT Error Code
    - NT_STATUS_NOT_SUPPORTED to prevent the Permission denied error.
  + debian/smb.conf:
    - add "(Samba, Ubuntu)" to server string.
    - comment out the default [homes] share, and add a comment about
      "valid users = %S" to show users how to restrict access to
      \\server\username to only username.
    - Set 'usershare allow guests', so that usershare admins are 
      allowed to create public shares in addition to authenticated
      ones.
    - add map to guest = Bad user, maps bad username to guest access.
  + debian/samba-common.config:
    - Do not change priority to high if dhclient3 is installed.
    - Use priority medium instead of high for the workgroup question.
  + debian/control:
    - Don't build against or suggest ctdb.
    - Add dependency on samba-common-bin to samba.
  + Add ufw integration:
    - Created debian/samba.ufw.profile
    - debian/rules, debian/samba.dirs, debian/samba.files: install
      profile
    - debian/control: have samba suggest ufw
  + Add apport hook:
    - Created debian/source_samba.py.
    - debian/rules, debian/samba.dirs, debian/samba-common-bin.files: install
  + Switch to upstart:
    - Add debian/samba.{nmbd,smbd}.upstart.
  + debian/samba.logrotate, debian/samba-common.dhcp, debian/samba.if-up:
    - Make them upstart compatible
  + debian/samba.postinst: 
    - Avoid scary pdbedit warnings on first import.
  + debian/samba-common.postinst: Add more informative error message for
    the case where smb.conf was manually deleted
  + debian/patches/fix-debuglevel-name-conflict.patch: don't use 'debug_level'
    as a global variable name in an NSS module 
  + Dropped:
    - debian/patches/error-trans.fix-276472
    - debian/patches/fix-debuglevel-name-conflict.patch

Show diffs side-by-side

added added

removed removed

Lines of Context:
40
40
struct tevent_immediate;
41
41
struct tevent_signal;
42
42
 
 
43
/**
 
44
 * @defgroup tevent The tevent API
 
45
 *
 
46
 * The tevent low-level API
 
47
 *
 
48
 * This API provides the public interface to manage events in the tevent
 
49
 * mainloop. Functions are provided for managing low-level events such
 
50
 * as timer events, fd events and signal handling.
 
51
 *
 
52
 * @{
 
53
 */
 
54
 
43
55
/* event handler types */
 
56
/**
 
57
 * Called when a file descriptor monitored by tevent has
 
58
 * data to be read or written on it.
 
59
 */
44
60
typedef void (*tevent_fd_handler_t)(struct tevent_context *ev,
45
61
                                    struct tevent_fd *fde,
46
62
                                    uint16_t flags,
47
63
                                    void *private_data);
 
64
 
 
65
/**
 
66
 * Called when tevent is ceasing the monitoring of a file descriptor.
 
67
 */
48
68
typedef void (*tevent_fd_close_fn_t)(struct tevent_context *ev,
49
69
                                     struct tevent_fd *fde,
50
70
                                     int fd,
51
71
                                     void *private_data);
 
72
 
 
73
/**
 
74
 * Called when a tevent timer has fired.
 
75
 */
52
76
typedef void (*tevent_timer_handler_t)(struct tevent_context *ev,
53
77
                                       struct tevent_timer *te,
54
78
                                       struct timeval current_time,
55
79
                                       void *private_data);
 
80
 
 
81
/**
 
82
 * Called when a tevent immediate event is invoked.
 
83
 */
56
84
typedef void (*tevent_immediate_handler_t)(struct tevent_context *ctx,
57
85
                                           struct tevent_immediate *im,
58
86
                                           void *private_data);
 
87
 
 
88
/**
 
89
 * Called after tevent detects the specified signal.
 
90
 */
59
91
typedef void (*tevent_signal_handler_t)(struct tevent_context *ev,
60
92
                                        struct tevent_signal *se,
61
93
                                        int signum,
63
95
                                        void *siginfo,
64
96
                                        void *private_data);
65
97
 
 
98
/**
 
99
 * @brief Create a event_context structure.
 
100
 *
 
101
 * This must be the first events call, and all subsequent calls pass this
 
102
 * event_context as the first element. Event handlers also receive this as
 
103
 * their first argument.
 
104
 *
 
105
 * @param[in]  mem_ctx  The memory context to use.
 
106
 *
 
107
 * @return              An allocated tevent context, NULL on error.
 
108
 *
 
109
 * @see tevent_context_init()
 
110
 */
66
111
struct tevent_context *tevent_context_init(TALLOC_CTX *mem_ctx);
 
112
 
 
113
/**
 
114
 * @brief Create a event_context structure and name it.
 
115
 *
 
116
 * This must be the first events call, and all subsequent calls pass this
 
117
 * event_context as the first element. Event handlers also receive this as
 
118
 * their first argument.
 
119
 *
 
120
 * @param[in]  mem_ctx  The memory context to use.
 
121
 *
 
122
 * @param[in]  name     The name for the tevent context.
 
123
 *
 
124
 * @return              An allocated tevent context, NULL on error.
 
125
 */
67
126
struct tevent_context *tevent_context_init_byname(TALLOC_CTX *mem_ctx, const char *name);
 
127
 
 
128
/**
 
129
 * @brief List available backends.
 
130
 *
 
131
 * @param[in]  mem_ctx  The memory context to use.
 
132
 *
 
133
 * @return              A string vector with a terminating NULL element, NULL
 
134
 *                      on error.
 
135
 */
68
136
const char **tevent_backend_list(TALLOC_CTX *mem_ctx);
 
137
 
 
138
/**
 
139
 * @brief Set the default tevent backent.
 
140
 *
 
141
 * @param[in]  backend  The name of the backend to set.
 
142
 */
69
143
void tevent_set_default_backend(const char *backend);
70
144
 
 
145
#ifdef DOXYGEN
 
146
/**
 
147
 * @brief Add a file descriptor based event.
 
148
 *
 
149
 * @param[in]  ev       The event context to work on.
 
150
 *
 
151
 * @param[in]  mem_ctx  The talloc memory context to use.
 
152
 *
 
153
 * @param[in]  fd       The file descriptor to base the event on.
 
154
 *
 
155
 * @param[in]  flags    #TEVENT_FD_READ or #TEVENT_FD_WRITE
 
156
 *
 
157
 * @param[in]  handler  The callback handler for the event.
 
158
 *
 
159
 * @param[in]  private_data  The private data passed to the callback handler.
 
160
 *
 
161
 * @return              The file descriptor based event, NULL on error.
 
162
 *
 
163
 * @note To cancel the monitoring of a file descriptor, call talloc_free()
 
164
 * on the object returned by this function.
 
165
 */
 
166
struct tevent_fd *tevent_add_fd(struct tevent_context *ev,
 
167
                                TALLOC_CTX *mem_ctx,
 
168
                                int fd,
 
169
                                uint16_t flags,
 
170
                                tevent_fd_handler_t handler,
 
171
                                void *private_data);
 
172
#else
71
173
struct tevent_fd *_tevent_add_fd(struct tevent_context *ev,
72
174
                                 TALLOC_CTX *mem_ctx,
73
175
                                 int fd,
79
181
#define tevent_add_fd(ev, mem_ctx, fd, flags, handler, private_data) \
80
182
        _tevent_add_fd(ev, mem_ctx, fd, flags, handler, private_data, \
81
183
                       #handler, __location__)
 
184
#endif
82
185
 
 
186
#ifdef DOXYGEN
 
187
/**
 
188
 * @brief Add a timed event
 
189
 *
 
190
 * @param[in]  ev       The event context to work on.
 
191
 *
 
192
 * @param[in]  mem_ctx  The talloc memory context to use.
 
193
 *
 
194
 * @param[in]  next_event  Timeval specifying the absolute time to fire this
 
195
 * event. This is not an offset.
 
196
 *
 
197
 * @param[in]  handler  The callback handler for the event.
 
198
 *
 
199
 * @param[in]  private_data  The private data passed to the callback handler.
 
200
 *
 
201
 * @return The newly-created timer event, or NULL on error.
 
202
 *
 
203
 * @note To cancel a timer event before it fires, call talloc_free() on the
 
204
 * event returned from this function. This event is automatically
 
205
 * talloc_free()-ed after its event handler files, if it hasn't been freed yet.
 
206
 *
 
207
 * @note Unlike some mainloops, tevent timers are one-time events. To set up
 
208
 * a recurring event, it is necessary to call tevent_add_timer() again during
 
209
 * the handler processing.
 
210
 *
 
211
 * @note Due to the internal mainloop processing, a timer set to run
 
212
 * immediately will do so after any other pending timers fire, but before
 
213
 * any further file descriptor or signal handling events fire. Callers should
 
214
 * not rely on this behavior!
 
215
 */
 
216
struct tevent_timer *tevent_add_timer(struct tevent_context *ev,
 
217
                                      TALLOC_CTX *mem_ctx,
 
218
                                      struct timeval next_event,
 
219
                                      tevent_timer_handler_t handler,
 
220
                                      void *private_data);
 
221
#else
83
222
struct tevent_timer *_tevent_add_timer(struct tevent_context *ev,
84
223
                                       TALLOC_CTX *mem_ctx,
85
224
                                       struct timeval next_event,
90
229
#define tevent_add_timer(ev, mem_ctx, next_event, handler, private_data) \
91
230
        _tevent_add_timer(ev, mem_ctx, next_event, handler, private_data, \
92
231
                          #handler, __location__)
 
232
#endif
93
233
 
 
234
#ifdef DOXYGEN
 
235
/**
 
236
 * Initialize an immediate event object
 
237
 *
 
238
 * This object can be used to trigger an event to occur immediately after
 
239
 * returning from the current event (before any other event occurs)
 
240
 *
 
241
 * @param[in] mem_ctx  The talloc memory context to use as the parent
 
242
 *
 
243
 * @return An empty tevent_immediate object. Use tevent_schedule_immediate
 
244
 * to populate and use it.
 
245
 *
 
246
 * @note Available as of tevent 0.9.8
 
247
 */
 
248
struct tevent_immediate *tevent_create_immediate(TALLOC_CTX *mem_ctx);
 
249
#else
94
250
struct tevent_immediate *_tevent_create_immediate(TALLOC_CTX *mem_ctx,
95
251
                                                  const char *location);
96
252
#define tevent_create_immediate(mem_ctx) \
97
253
        _tevent_create_immediate(mem_ctx, __location__)
98
 
 
 
254
#endif
 
255
 
 
256
#ifdef DOXYGEN
 
257
 
 
258
/**
 
259
 * Schedule an event for immediate execution. This event will occur
 
260
 * immediately after returning from the current event (before any other
 
261
 * event occurs)
 
262
 *
 
263
 * @param[in] im       The tevent_immediate object to populate and use
 
264
 * @param[in] ctx      The tevent_context to run this event
 
265
 * @param[in] handler  The event handler to run when this event fires
 
266
 * @param[in] private_data  Data to pass to the event handler
 
267
 */
 
268
void tevent_schedule_immediate(struct tevent_immediate *im,
 
269
                struct tevent_context *ctx,
 
270
                tevent_immediate_handler_t handler,
 
271
                void *private_data);
 
272
#else
99
273
void _tevent_schedule_immediate(struct tevent_immediate *im,
100
274
                                struct tevent_context *ctx,
101
275
                                tevent_immediate_handler_t handler,
105
279
#define tevent_schedule_immediate(im, ctx, handler, private_data) \
106
280
        _tevent_schedule_immediate(im, ctx, handler, private_data, \
107
281
                                   #handler, __location__);
 
282
#endif
108
283
 
 
284
#ifdef DOXYGEN
 
285
/**
 
286
 * @brief Add a tevent signal handler
 
287
 *
 
288
 * tevent_add_signal() creates a new event for handling a signal the next
 
289
 * time through the mainloop. It implements a very simple traditional signal
 
290
 * handler whose only purpose is to add the handler event into the mainloop.
 
291
 *
 
292
 * @param[in]  ev       The event context to work on.
 
293
 *
 
294
 * @param[in]  mem_ctx  The talloc memory context to use.
 
295
 *
 
296
 * @param[in]  signum   The signal to trap
 
297
 *
 
298
 * @param[in]  handler  The callback handler for the signal.
 
299
 *
 
300
 * @param[in]  sa_flags sigaction flags for this signal handler.
 
301
 *
 
302
 * @param[in]  private_data  The private data passed to the callback handler.
 
303
 *
 
304
 * @return The newly-created signal handler event, or NULL on error.
 
305
 *
 
306
 * @note To cancel a signal handler, call talloc_free() on the event returned
 
307
 * from this function.
 
308
 */
 
309
struct tevent_signal *tevent_add_signal(struct tevent_context *ev,
 
310
                     TALLOC_CTX *mem_ctx,
 
311
                     int signum,
 
312
                     int sa_flags,
 
313
                     tevent_signal_handler_t handler,
 
314
                     void *private_data);
 
315
#else
109
316
struct tevent_signal *_tevent_add_signal(struct tevent_context *ev,
110
317
                                         TALLOC_CTX *mem_ctx,
111
318
                                         int signum,
117
324
#define tevent_add_signal(ev, mem_ctx, signum, sa_flags, handler, private_data) \
118
325
        _tevent_add_signal(ev, mem_ctx, signum, sa_flags, handler, private_data, \
119
326
                           #handler, __location__)
 
327
#endif
120
328
 
 
329
#ifdef DOXYGEN
 
330
/**
 
331
 * @brief Pass a single time through the mainloop
 
332
 *
 
333
 * This will process any appropriate signal, immediate, fd and timer events
 
334
 *
 
335
 * @param[in]  ev The event context to process
 
336
 *
 
337
 * @return Zero on success, nonzero if an internal error occurred
 
338
 */
 
339
int tevent_loop_once(struct tevent_context *ev);
 
340
#else
121
341
int _tevent_loop_once(struct tevent_context *ev, const char *location);
122
342
#define tevent_loop_once(ev) \
123
 
        _tevent_loop_once(ev, __location__) \
 
343
        _tevent_loop_once(ev, __location__)
 
344
#endif
124
345
 
 
346
#ifdef DOXYGEN
 
347
/**
 
348
 * @brief Run the mainloop
 
349
 *
 
350
 * The mainloop will run until there are no events remaining to be processed
 
351
 *
 
352
 * @param[in]  ev The event context to process
 
353
 *
 
354
 * @return Zero if all events have been processed. Nonzero if an internal
 
355
 * error occurred.
 
356
 */
 
357
int tevent_loop_wait(struct tevent_context *ev);
 
358
#else
125
359
int _tevent_loop_wait(struct tevent_context *ev, const char *location);
126
360
#define tevent_loop_wait(ev) \
127
 
        _tevent_loop_wait(ev, __location__) \
128
 
 
 
361
        _tevent_loop_wait(ev, __location__)
 
362
#endif
 
363
 
 
364
 
 
365
/**
 
366
 * Assign a function to run when a tevent_fd is freed
 
367
 *
 
368
 * This function is a destructor for the tevent_fd. It does not automatically
 
369
 * close the file descriptor. If this is the desired behavior, then it must be
 
370
 * performed by the close_fn.
 
371
 *
 
372
 * @param[in] fde       File descriptor event on which to set the destructor
 
373
 * @param[in] close_fn  Destructor to execute when fde is freed
 
374
 */
129
375
void tevent_fd_set_close_fn(struct tevent_fd *fde,
130
376
                            tevent_fd_close_fn_t close_fn);
 
377
 
 
378
/**
 
379
 * Automatically close the file descriptor when the tevent_fd is freed
 
380
 *
 
381
 * This function calls close(fd) internally.
 
382
 *
 
383
 * @param[in] fde  File descriptor event to auto-close
 
384
 */
131
385
void tevent_fd_set_auto_close(struct tevent_fd *fde);
 
386
 
 
387
/**
 
388
 * Return the flags set on this file descriptor event
 
389
 *
 
390
 * @param[in] fde  File descriptor event to query
 
391
 *
 
392
 * @return The flags set on the event. See #TEVENT_FD_READ and
 
393
 * #TEVENT_FD_WRITE
 
394
 */
132
395
uint16_t tevent_fd_get_flags(struct tevent_fd *fde);
 
396
 
 
397
/**
 
398
 * Set flags on a file descriptor event
 
399
 *
 
400
 * @param[in] fde    File descriptor event to set
 
401
 * @param[in] flags  Flags to set on the event. See #TEVENT_FD_READ and
 
402
 * #TEVENT_FD_WRITE
 
403
 */
133
404
void tevent_fd_set_flags(struct tevent_fd *fde, uint16_t flags);
134
405
 
 
406
/**
 
407
 * Query whether tevent supports signal handling
 
408
 *
 
409
 * @param[in] ev  An initialized tevent context
 
410
 *
 
411
 * @return True if this platform and tevent context support signal handling
 
412
 */
135
413
bool tevent_signal_support(struct tevent_context *ev);
136
414
 
137
415
void tevent_set_abort_fn(void (*abort_fn)(const char *reason));
138
416
 
139
417
/* bits for file descriptor event flags */
 
418
 
 
419
/**
 
420
 * Monitor a file descriptor for write availability
 
421
 */
140
422
#define TEVENT_FD_READ 1
 
423
/**
 
424
 * Monitor a file descriptor for data to be read
 
425
 */
141
426
#define TEVENT_FD_WRITE 2
142
427
 
 
428
/**
 
429
 * Convenience function for declaring a tevent_fd writable
 
430
 */
143
431
#define TEVENT_FD_WRITEABLE(fde) \
144
432
        tevent_fd_set_flags(fde, tevent_fd_get_flags(fde) | TEVENT_FD_WRITE)
 
433
 
 
434
/**
 
435
 * Convenience function for declaring a tevent_fd readable
 
436
 */
145
437
#define TEVENT_FD_READABLE(fde) \
146
438
        tevent_fd_set_flags(fde, tevent_fd_get_flags(fde) | TEVENT_FD_READ)
147
439
 
 
440
/**
 
441
 * Convenience function for declaring a tevent_fd non-writable
 
442
 */
148
443
#define TEVENT_FD_NOT_WRITEABLE(fde) \
149
444
        tevent_fd_set_flags(fde, tevent_fd_get_flags(fde) & ~TEVENT_FD_WRITE)
 
445
 
 
446
/**
 
447
 * Convenience function for declaring a tevent_fd non-readable
 
448
 */
150
449
#define TEVENT_FD_NOT_READABLE(fde) \
151
450
        tevent_fd_set_flags(fde, tevent_fd_get_flags(fde) & ~TEVENT_FD_READ)
152
451
 
153
 
/* DEBUG */
 
452
/**
 
453
 * Debug level of tevent
 
454
 */
154
455
enum tevent_debug_level {
155
456
        TEVENT_DEBUG_FATAL,
156
457
        TEVENT_DEBUG_ERROR,
158
459
        TEVENT_DEBUG_TRACE
159
460
};
160
461
 
 
462
/**
 
463
 * @brief The tevent debug callbac.
 
464
 *
 
465
 * @param[in]  context  The memory context to use.
 
466
 *
 
467
 * @param[in]  level    The debug level.
 
468
 *
 
469
 * @param[in]  fmt      The format string.
 
470
 *
 
471
 * @param[in]  ap       The arguments for the format string.
 
472
 */
 
473
typedef void (*tevent_debug_fn)(void *context,
 
474
                                enum tevent_debug_level level,
 
475
                                const char *fmt,
 
476
                                va_list ap) PRINTF_ATTRIBUTE(3,0);
 
477
 
 
478
/**
 
479
 * Set destination for tevent debug messages
 
480
 *
 
481
 * @param[in] ev        Event context to debug
 
482
 * @param[in] debug     Function to handle output printing
 
483
 * @param[in] context   The context to pass to the debug function.
 
484
 *
 
485
 * @return Always returns 0 as of version 0.9.8
 
486
 *
 
487
 * @note Default is to emit no debug messages
 
488
 */
161
489
int tevent_set_debug(struct tevent_context *ev,
162
 
                     void (*debug)(void *context,
163
 
                                   enum tevent_debug_level level,
164
 
                                   const char *fmt,
165
 
                                   va_list ap) PRINTF_ATTRIBUTE(3,0),
 
490
                     tevent_debug_fn debug,
166
491
                     void *context);
 
492
 
 
493
/**
 
494
 * Designate stderr for debug message output
 
495
 *
 
496
 * @param[in] ev     Event context to debug
 
497
 *
 
498
 * @note This function will only output TEVENT_DEBUG_FATAL, TEVENT_DEBUG_ERROR
 
499
 * and TEVENT_DEBUG_WARNING messages. For TEVENT_DEBUG_TRACE, please define a
 
500
 * function for tevent_set_debug()
 
501
 */
167
502
int tevent_set_debug_stderr(struct tevent_context *ev);
168
503
 
169
504
/**
170
 
 * An async request moves between the following 4 states:
 
505
 * @}
 
506
 */
 
507
 
 
508
/**
 
509
 * @defgroup tevent_request The tevent request functions.
 
510
 * @ingroup tevent
 
511
 *
 
512
 * A tevent_req represents an asynchronous computation.
 
513
 *
 
514
 * The tevent_req group of API calls is the recommended way of
 
515
 * programming async computations within tevent. In particular the
 
516
 * file descriptor (tevent_add_fd) and timer (tevent_add_timed) events
 
517
 * are considered too low-level to be used in larger computations. To
 
518
 * read and write from and to sockets, Samba provides two calls on top
 
519
 * of tevent_add_fd: read_packet_send/recv and writev_send/recv. These
 
520
 * requests are much easier to compose than the low-level event
 
521
 * handlers called from tevent_add_fd.
 
522
 *
 
523
 * A lot of the simplicity tevent_req has brought to the notoriously
 
524
 * hairy async programming came via a set of conventions that every
 
525
 * async computation programmed should follow. One central piece of
 
526
 * these conventions is the naming of routines and variables.
 
527
 *
 
528
 * Every async computation needs a name (sensibly called "computation"
 
529
 * down from here). From this name quite a few naming conventions are
 
530
 * derived.
 
531
 *
 
532
 * Every computation that requires local state needs a
 
533
 * @code
 
534
 * struct computation_state {
 
535
 *     int local_var;
 
536
 * };
 
537
 * @endcode
 
538
 * Even if no local variables are required, such a state struct should
 
539
 * be created containing a dummy variable. Quite a few helper
 
540
 * functions and macros (for example tevent_req_create()) assume such
 
541
 * a state struct.
 
542
 *
 
543
 * An async computation is started by a computation_send
 
544
 * function. When it is finished, its result can be received by a
 
545
 * computation_recv function. For an example how to set up an async
 
546
 * computation, see the code example in the documentation for
 
547
 * tevent_req_create() and tevent_req_post(). The prototypes for _send
 
548
 * and _recv functions should follow some conventions:
 
549
 *
 
550
 * @code
 
551
 * struct tevent_req *computation_send(TALLOC_CTX *mem_ctx,
 
552
 *                                     struct tevent_req *ev,
 
553
 *                                     ... further args);
 
554
 * int computation_recv(struct tevent_req *req, ... further output args);
 
555
 * @endcode
 
556
 *
 
557
 * The "int" result of computation_recv() depends on the result the
 
558
 * sync version of the function would have, "int" is just an example
 
559
 * here.
 
560
 *
 
561
 * Another important piece of the conventions is that the program flow
 
562
 * is interrupted as little as possible. Because a blocking
 
563
 * sub-computation requires that the flow needs to continue in a
 
564
 * separate function that is the logical sequel of some computation,
 
565
 * it should lexically follow sending off the blocking
 
566
 * sub-computation. Setting the callback function via
 
567
 * tevent_req_set_callback() requires referencing a function lexically
 
568
 * below the call to tevent_req_set_callback(), forward declarations
 
569
 * are required. A lot of the async computations thus begin with a
 
570
 * sequence of declarations such as
 
571
 *
 
572
 * @code
 
573
 * static void computation_step1_done(struct tevent_req *subreq);
 
574
 * static void computation_step2_done(struct tevent_req *subreq);
 
575
 * static void computation_step3_done(struct tevent_req *subreq);
 
576
 * @endcode
 
577
 *
 
578
 * It really helps readability a lot to do these forward declarations,
 
579
 * because the lexically sequential program flow makes the async
 
580
 * computations almost as clear to read as a normal, sync program
 
581
 * flow.
 
582
 *
 
583
 * It is up to the user of the async computation to talloc_free it
 
584
 * after it has finished. If an async computation should be aborted,
 
585
 * the tevent_req structure can be talloc_free'ed. After it has
 
586
 * finished, it should talloc_free'ed by the API user.
 
587
 *
 
588
 * @{
 
589
 */
 
590
 
 
591
/**
 
592
 * An async request moves from TEVENT_REQ_INIT to
 
593
 * TEVENT_REQ_IN_PROGRESS. All other states are valid after a request
 
594
 * has finished.
171
595
 */
172
596
enum tevent_req_state {
173
597
        /**
174
 
         * we are creating the request
 
598
         * We are creating the request
175
599
         */
176
600
        TEVENT_REQ_INIT,
177
601
        /**
178
 
         * we are waiting the request to complete
 
602
         * We are waiting the request to complete
179
603
         */
180
604
        TEVENT_REQ_IN_PROGRESS,
181
605
        /**
182
 
         * the request is finished
 
606
         * The request is finished successfully
183
607
         */
184
608
        TEVENT_REQ_DONE,
185
609
        /**
186
 
         * A user error has occured
 
610
         * A user error has occurred. The user error has been
 
611
         * indicated by tevent_req_error(), it can be retrieved via
 
612
         * tevent_req_is_error().
187
613
         */
188
614
        TEVENT_REQ_USER_ERROR,
189
615
        /**
190
 
         * Request timed out
 
616
         * Request timed out after the timeout set by tevent_req_set_endtime.
191
617
         */
192
618
        TEVENT_REQ_TIMED_OUT,
193
619
        /**
194
 
         * No memory in between
 
620
         * An internal allocation has failed, or tevent_req_nomem has
 
621
         * been given a NULL pointer as the first argument.
195
622
         */
196
623
        TEVENT_REQ_NO_MEMORY,
197
624
        /**
198
 
         * the request is already received by the caller
 
625
         * The request has been received by the caller. No further
 
626
         * action is valid.
199
627
         */
200
628
        TEVENT_REQ_RECEIVED
201
629
};
202
630
 
203
631
/**
204
632
 * @brief An async request
205
 
 *
206
 
 * This represents an async request being processed by callbacks via an event
207
 
 * context. A user can issue for example a write request to a socket, giving
208
 
 * an implementation function the fd, the buffer and the number of bytes to
209
 
 * transfer. The function issuing the request will immediately return without
210
 
 * blocking most likely without having sent anything. The API user then fills
211
 
 * in req->async.fn and req->async.private_data, functions that are called
212
 
 * when the request is finished.
213
 
 *
214
 
 * It is up to the user of the async request to talloc_free it after it has
215
 
 * finished. This can happen while the completion function is called.
216
633
 */
217
 
 
218
634
struct tevent_req;
219
635
 
220
 
typedef void (*tevent_req_fn)(struct tevent_req *);
 
636
/**
 
637
 * @brief A tevent request callback function.
 
638
 *
 
639
 * @param[in]  req      The tevent async request which executed this callback.
 
640
 */
 
641
typedef void (*tevent_req_fn)(struct tevent_req *req);
221
642
 
 
643
/**
 
644
 * @brief Set an async request callback.
 
645
 *
 
646
 * See the documentation of tevent_req_post() for an example how this
 
647
 * is supposed to be used.
 
648
 *
 
649
 * @param[in]  req      The async request to set the callback.
 
650
 *
 
651
 * @param[in]  fn       The callback function to set.
 
652
 *
 
653
 * @param[in]  pvt      A pointer to private data to pass to the async request
 
654
 *                      callback.
 
655
 */
222
656
void tevent_req_set_callback(struct tevent_req *req, tevent_req_fn fn, void *pvt);
 
657
 
 
658
#ifdef DOXYGEN
 
659
/**
 
660
 * @brief Get the private data cast to the given type for a callback from
 
661
 *        a tevent request structure.
 
662
 *
 
663
 * @code
 
664
 * static void computation_done(struct tevent_req *subreq) {
 
665
 *     struct tevent_req *req = tevent_req_callback_data(subreq, struct tevent_req);
 
666
 *     struct computation_state *state = tevent_req_data(req, struct computation_state);
 
667
 *     .... more things, eventually maybe call tevent_req_done(req);
 
668
 * }
 
669
 * @endcode
 
670
 *
 
671
 * @param[in]  req      The structure to get the callback data from.
 
672
 *
 
673
 * @param[in]  type     The type of the private callback data to get.
 
674
 *
 
675
 * @return              The type casted private data set NULL if not set.
 
676
 */
 
677
void *tevent_req_callback_data(struct tevent_req *req, #type);
 
678
#else
223
679
void *_tevent_req_callback_data(struct tevent_req *req);
224
 
void *_tevent_req_data(struct tevent_req *req);
225
 
 
226
680
#define tevent_req_callback_data(_req, _type) \
227
681
        talloc_get_type_abort(_tevent_req_callback_data(_req), _type)
 
682
#endif
 
683
 
 
684
#ifdef DOXYGEN
 
685
/**
 
686
 * @brief Get the private data for a callback from a tevent request structure.
 
687
 *
 
688
 * @param[in]  req      The structure to get the callback data from.
 
689
 *
 
690
 * @param[in]  req      The structure to get the data from.
 
691
 *
 
692
 * @return              The private data or NULL if not set.
 
693
 */
 
694
void *tevent_req_callback_data_void(struct tevent_req *req);
 
695
#else
228
696
#define tevent_req_callback_data_void(_req) \
229
697
        _tevent_req_callback_data(_req)
 
698
#endif
 
699
 
 
700
#ifdef DOXYGEN
 
701
/**
 
702
 * @brief Get the private data from a tevent request structure.
 
703
 *
 
704
 * When the tevent_req has been created by tevent_req_create, the
 
705
 * result of tevent_req_data() is the state variable created by
 
706
 * tevent_req_create() as a child of the req.
 
707
 *
 
708
 * @param[in]  req      The structure to get the private data from.
 
709
 *
 
710
 * @param[in]  type     The type of the private data
 
711
 *
 
712
 * @return              The private data or NULL if not set.
 
713
 */
 
714
void *tevent_req_data(struct tevent_req *req, #type);
 
715
#else
 
716
void *_tevent_req_data(struct tevent_req *req);
230
717
#define tevent_req_data(_req, _type) \
231
718
        talloc_get_type_abort(_tevent_req_data(_req), _type)
232
 
 
233
 
typedef char *(*tevent_req_print_fn)(struct tevent_req *, TALLOC_CTX *);
234
 
 
 
719
#endif
 
720
 
 
721
/**
 
722
 * @brief The print function which can be set for a tevent async request.
 
723
 *
 
724
 * @param[in]  req      The tevent async request.
 
725
 *
 
726
 * @param[in]  ctx      A talloc memory context which can be uses to allocate
 
727
 *                      memory.
 
728
 *
 
729
 * @return              An allocated string buffer to print.
 
730
 *
 
731
 * Example:
 
732
 * @code
 
733
 *   static char *my_print(struct tevent_req *req, TALLOC_CTX *mem_ctx)
 
734
 *   {
 
735
 *     struct my_data *data = tevent_req_data(req, struct my_data);
 
736
 *     char *result;
 
737
 *
 
738
 *     result = tevent_req_default_print(mem_ctx, req);
 
739
 *     if (result == NULL) {
 
740
 *       return NULL;
 
741
 *     }
 
742
 *
 
743
 *     return talloc_asprintf_append_buffer(result, "foo=%d, bar=%d",
 
744
 *       data->foo, data->bar);
 
745
 *   }
 
746
 * @endcode
 
747
 */
 
748
typedef char *(*tevent_req_print_fn)(struct tevent_req *req, TALLOC_CTX *ctx);
 
749
 
 
750
/**
 
751
 * @brief This function sets a print function for the given request.
 
752
 *
 
753
 * This function can be used to setup a print function for the given request.
 
754
 * This will be triggered if the tevent_req_print() function was
 
755
 * called on the given request.
 
756
 *
 
757
 * @param[in]  req      The request to use.
 
758
 *
 
759
 * @param[in]  fn       A pointer to the print function
 
760
 *
 
761
 * @note This function should only be used for debugging.
 
762
 */
235
763
void tevent_req_set_print_fn(struct tevent_req *req, tevent_req_print_fn fn);
236
764
 
 
765
/**
 
766
 * @brief The default print function for creating debug messages.
 
767
 *
 
768
 * The function should not be used by users of the async API,
 
769
 * but custom print function can use it and append custom text
 
770
 * to the string.
 
771
 *
 
772
 * @param[in]  req      The request to be printed.
 
773
 *
 
774
 * @param[in]  mem_ctx  The memory context for the result.
 
775
 *
 
776
 * @return              Text representation of request.
 
777
 *
 
778
 */
237
779
char *tevent_req_default_print(struct tevent_req *req, TALLOC_CTX *mem_ctx);
238
780
 
 
781
/**
 
782
 * @brief Print an tevent_req structure in debug messages.
 
783
 *
 
784
 * This function should be used by callers of the async API.
 
785
 *
 
786
 * @param[in]  mem_ctx  The memory context for the result.
 
787
 *
 
788
 * @param[in] req       The request to be printed.
 
789
 *
 
790
 * @return              Text representation of request.
 
791
 */
239
792
char *tevent_req_print(TALLOC_CTX *mem_ctx, struct tevent_req *req);
240
793
 
241
 
typedef bool (*tevent_req_cancel_fn)(struct tevent_req *);
 
794
/**
 
795
 * @brief A typedef for a cancel function for a tevent request.
 
796
 *
 
797
 * @param[in]  req      The tevent request calling this function.
 
798
 *
 
799
 * @return              True if the request could be canceled, false if not.
 
800
 */
 
801
typedef bool (*tevent_req_cancel_fn)(struct tevent_req *req);
242
802
 
 
803
/**
 
804
 * @brief This function sets a cancel function for the given tevent request.
 
805
 *
 
806
 * This function can be used to setup a cancel function for the given request.
 
807
 * This will be triggered if the tevent_req_cancel() function was
 
808
 * called on the given request.
 
809
 *
 
810
 * @param[in]  req      The request to use.
 
811
 *
 
812
 * @param[in]  fn       A pointer to the cancel function.
 
813
 */
243
814
void tevent_req_set_cancel_fn(struct tevent_req *req, tevent_req_cancel_fn fn);
244
815
 
 
816
#ifdef DOXYGEN
 
817
/**
 
818
 * @brief Try to cancel the given tevent request.
 
819
 *
 
820
 * This function can be used to cancel the given request.
 
821
 *
 
822
 * It is only possible to cancel a request when the implementation
 
823
 * has registered a cancel function via the tevent_req_set_cancel_fn().
 
824
 *
 
825
 * @param[in]  req      The request to use.
 
826
 *
 
827
 * @return              This function returns true is the request is cancelable,
 
828
 *                      othererwise false is returned.
 
829
 *
 
830
 * @note Even if the function returns true, the caller need to wait
 
831
 *       for the function to complete normally.
 
832
 *       Only the _recv() function of the given request indicates
 
833
 *       if the request was really canceled.
 
834
 */
 
835
bool tevent_req_cancel(struct tevent_req *req);
 
836
#else
245
837
bool _tevent_req_cancel(struct tevent_req *req, const char *location);
246
838
#define tevent_req_cancel(req) \
247
839
        _tevent_req_cancel(req, __location__)
 
840
#endif
248
841
 
 
842
#ifdef DOXYGEN
 
843
/**
 
844
 * @brief Create an async tevent request.
 
845
 *
 
846
 * The new async request will be initialized in state TEVENT_REQ_IN_PROGRESS.
 
847
 *
 
848
 * @code
 
849
 * struct tevent_req *req;
 
850
 * struct computation_state *state;
 
851
 * req = tevent_req_create(mem_ctx, &state, struct computation_state);
 
852
 * @endcode
 
853
 *
 
854
 * Tevent_req_create() creates the state variable as a talloc child of
 
855
 * its result. The state variable should be used as the talloc parent
 
856
 * for all temporary variables that are allocated during the async
 
857
 * computation. This way, when the user of the async computation frees
 
858
 * the request, the state as a talloc child will be free'd along with
 
859
 * all the temporary variables hanging off the state.
 
860
 *
 
861
 * @param[in] mem_ctx   The memory context for the result.
 
862
 * @param[in] pstate    Pointer to the private request state.
 
863
 * @param[in] type      The name of the request.
 
864
 *
 
865
 * @return              A new async request. NULL on error.
 
866
 */
 
867
struct tevent_req *tevent_req_create(TALLOC_CTX *mem_ctx,
 
868
                                     void **pstate, #type);
 
869
#else
249
870
struct tevent_req *_tevent_req_create(TALLOC_CTX *mem_ctx,
250
871
                                      void *pstate,
251
872
                                      size_t state_size,
255
876
#define tevent_req_create(_mem_ctx, _pstate, _type) \
256
877
        _tevent_req_create((_mem_ctx), (_pstate), sizeof(_type), \
257
878
                           #_type, __location__)
 
879
#endif
258
880
 
 
881
/**
 
882
 * @brief Set a timeout for an async request.
 
883
 *
 
884
 * @param[in]  req      The request to set the timeout for.
 
885
 *
 
886
 * @param[in]  ev       The event context to use for the timer.
 
887
 *
 
888
 * @param[in]  endtime  The endtime of the request.
 
889
 *
 
890
 * @return              True if succeeded, false if not.
 
891
 */
259
892
bool tevent_req_set_endtime(struct tevent_req *req,
260
893
                            struct tevent_context *ev,
261
894
                            struct timeval endtime);
262
895
 
 
896
#ifdef DOXYGEN
 
897
/**
 
898
 * @brief Call the notify callback of the given tevent request manually.
 
899
 *
 
900
 * @param[in]  req      The tevent request to call the notify function from.
 
901
 *
 
902
 * @see tevent_req_set_callback()
 
903
 */
 
904
void tevent_req_notify_callback(struct tevent_req *req);
 
905
#else
263
906
void _tevent_req_notify_callback(struct tevent_req *req, const char *location);
264
907
#define tevent_req_notify_callback(req)         \
265
908
        _tevent_req_notify_callback(req, __location__)
 
909
#endif
266
910
 
 
911
#ifdef DOXYGEN
 
912
/**
 
913
 * @brief An async request has successfully finished.
 
914
 *
 
915
 * This function is to be used by implementors of async requests. When a
 
916
 * request is successfully finished, this function calls the user's completion
 
917
 * function.
 
918
 *
 
919
 * @param[in]  req       The finished request.
 
920
 */
 
921
void tevent_req_done(struct tevent_req *req);
 
922
#else
267
923
void _tevent_req_done(struct tevent_req *req,
268
924
                      const char *location);
269
925
#define tevent_req_done(req) \
270
926
        _tevent_req_done(req, __location__)
 
927
#endif
271
928
 
 
929
#ifdef DOXYGEN
 
930
/**
 
931
 * @brief An async request has seen an error.
 
932
 *
 
933
 * This function is to be used by implementors of async requests. When a
 
934
 * request can not successfully completed, the implementation should call this
 
935
 * function with the appropriate status code.
 
936
 *
 
937
 * If error is 0 the function returns false and does nothing more.
 
938
 *
 
939
 * @param[in]  req      The request with an error.
 
940
 *
 
941
 * @param[in]  error    The error code.
 
942
 *
 
943
 * @return              On success true is returned, false if error is 0.
 
944
 *
 
945
 * @code
 
946
 * int error = first_function();
 
947
 * if (tevent_req_error(req, error)) {
 
948
 *      return;
 
949
 * }
 
950
 *
 
951
 * error = second_function();
 
952
 * if (tevent_req_error(req, error)) {
 
953
 *      return;
 
954
 * }
 
955
 *
 
956
 * tevent_req_done(req);
 
957
 * return;
 
958
 * @endcode
 
959
 */
 
960
bool tevent_req_error(struct tevent_req *req,
 
961
                      uint64_t error);
 
962
#else
272
963
bool _tevent_req_error(struct tevent_req *req,
273
964
                       uint64_t error,
274
965
                       const char *location);
275
966
#define tevent_req_error(req, error) \
276
967
        _tevent_req_error(req, error, __location__)
 
968
#endif
277
969
 
 
970
#ifdef DOXYGEN
 
971
/**
 
972
 * @brief Helper function for nomem check.
 
973
 *
 
974
 * Convenience helper to easily check alloc failure within a callback
 
975
 * implementing the next step of an async request.
 
976
 *
 
977
 * @param[in]  p        The pointer to be checked.
 
978
 *
 
979
 * @param[in]  req      The request being processed.
 
980
 *
 
981
 * @code
 
982
 * p = talloc(mem_ctx, bla);
 
983
 * if (tevent_req_nomem(p, req)) {
 
984
 *      return;
 
985
 * }
 
986
 * @endcode
 
987
 */
 
988
bool tevent_req_nomem(const void *p,
 
989
                      struct tevent_req *req);
 
990
#else
278
991
bool _tevent_req_nomem(const void *p,
279
992
                       struct tevent_req *req,
280
993
                       const char *location);
281
994
#define tevent_req_nomem(p, req) \
282
995
        _tevent_req_nomem(p, req, __location__)
 
996
#endif
283
997
 
 
998
/**
 
999
 * @brief Finish a request before the caller had the change to set the callback.
 
1000
 *
 
1001
 * An implementation of an async request might find that it can either finish
 
1002
 * the request without waiting for an external event, or it can not even start
 
1003
 * the engine. To present the illusion of a callback to the user of the API,
 
1004
 * the implementation can call this helper function which triggers an
 
1005
 * immediate timed event. This way the caller can use the same calling
 
1006
 * conventions, independent of whether the request was actually deferred.
 
1007
 *
 
1008
 * @code
 
1009
 * struct tevent_req *computation_send(TALLOC_CTX *mem_ctx,
 
1010
 *                                     struct tevent_context *ev)
 
1011
 * {
 
1012
 *     struct tevent_req *req, *subreq;
 
1013
 *     struct computation_state *state;
 
1014
 *     req = tevent_req_create(mem_ctx, &state, struct computation_state);
 
1015
 *     if (req == NULL) {
 
1016
 *         return NULL;
 
1017
 *     }
 
1018
 *     subreq = subcomputation_send(state, ev);
 
1019
 *     if (tevent_req_nomem(subreq, req)) {
 
1020
 *         return tevent_req_post(req, ev);
 
1021
 *     }
 
1022
 *     tevent_req_set_callback(subreq, computation_done, req);
 
1023
 *     return req;
 
1024
 * }
 
1025
 * @endcode
 
1026
 *
 
1027
 * @param[in]  req      The finished request.
 
1028
 *
 
1029
 * @param[in]  ev       The tevent_context for the timed event.
 
1030
 *
 
1031
 * @return              The given request will be returned.
 
1032
 */
284
1033
struct tevent_req *tevent_req_post(struct tevent_req *req,
285
1034
                                   struct tevent_context *ev);
286
1035
 
 
1036
/**
 
1037
 * @brief Check if the given request is still in progress.
 
1038
 *
 
1039
 * It is typically used by sync wrapper functions.
 
1040
 *
 
1041
 * @param[in]  req      The request to poll.
 
1042
 *
 
1043
 * @return              The boolean form of "is in progress".
 
1044
 */
287
1045
bool tevent_req_is_in_progress(struct tevent_req *req);
288
1046
 
 
1047
/**
 
1048
 * @brief Actively poll for the given request to finish.
 
1049
 *
 
1050
 * This function is typically used by sync wrapper functions.
 
1051
 *
 
1052
 * @param[in]  req      The request to poll.
 
1053
 *
 
1054
 * @param[in]  ev       The tevent_context to be used.
 
1055
 *
 
1056
 * @return              On success true is returned. If a critical error has
 
1057
 *                      happened in the tevent loop layer false is returned.
 
1058
 *                      This is not the return value of the given request!
 
1059
 *
 
1060
 * @note This should only be used if the given tevent context was created by the
 
1061
 * caller, to avoid event loop nesting.
 
1062
 *
 
1063
 * @code
 
1064
 * req = tstream_writev_queue_send(mem_ctx,
 
1065
 *                                 ev_ctx,
 
1066
 *                                 tstream,
 
1067
 *                                 send_queue,
 
1068
 *                                 iov, 2);
 
1069
 * ok = tevent_req_poll(req, tctx->ev);
 
1070
 * rc = tstream_writev_queue_recv(req, &sys_errno);
 
1071
 * TALLOC_FREE(req);
 
1072
 * @endcode
 
1073
 */
289
1074
bool tevent_req_poll(struct tevent_req *req,
290
1075
                     struct tevent_context *ev);
291
1076
 
 
1077
/**
 
1078
 * @brief Get the tevent request state and the actual error set by
 
1079
 * tevent_req_error.
 
1080
 *
 
1081
 * @code
 
1082
 * int computation_recv(struct tevent_req *req, uint64_t *perr)
 
1083
 * {
 
1084
 *     enum tevent_req_state state;
 
1085
 *     uint64_t err;
 
1086
 *     if (tevent_req_is_error(req, &state, &err)) {
 
1087
 *         *perr = err;
 
1088
 *         return -1;
 
1089
 *     }
 
1090
 *     return 0;
 
1091
 * }
 
1092
 * @endcode
 
1093
 *
 
1094
 * @param[in]  req      The tevent request to get the error from.
 
1095
 *
 
1096
 * @param[out] state    A pointer to store the tevent request error state.
 
1097
 *
 
1098
 * @param[out] error    A pointer to store the error set by tevent_req_error().
 
1099
 *
 
1100
 * @return              True if the function could set error and state, false
 
1101
 *                      otherwise.
 
1102
 *
 
1103
 * @see tevent_req_error()
 
1104
 */
292
1105
bool tevent_req_is_error(struct tevent_req *req,
293
1106
                         enum tevent_req_state *state,
294
1107
                         uint64_t *error);
295
1108
 
 
1109
/**
 
1110
 * @brief Use as the last action of a _recv() function.
 
1111
 *
 
1112
 * This function destroys the attached private data.
 
1113
 *
 
1114
 * @param[in]  req      The finished request.
 
1115
 */
296
1116
void tevent_req_received(struct tevent_req *req);
297
1117
 
 
1118
/**
 
1119
 * @brief Create a tevent subrequest at a given time.
 
1120
 *
 
1121
 * The idea is that always the same syntax for tevent requests.
 
1122
 *
 
1123
 * @param[in]  mem_ctx  The talloc memory context to use.
 
1124
 *
 
1125
 * @param[in]  ev       The event handle to setup the request.
 
1126
 *
 
1127
 * @param[in]  wakeup_time The time to wakeup and execute the request.
 
1128
 *
 
1129
 * @return              The new subrequest, NULL on error.
 
1130
 *
 
1131
 * Example:
 
1132
 * @code
 
1133
 *   static void my_callback_wakeup_done(tevent_req *subreq)
 
1134
 *   {
 
1135
 *     struct tevent_req *req = tevent_req_callback_data(subreq,
 
1136
 *                              struct tevent_req);
 
1137
 *     bool ok;
 
1138
 *
 
1139
 *     ok = tevent_wakeup_recv(subreq);
 
1140
 *     TALLOC_FREE(subreq);
 
1141
 *     if (!ok) {
 
1142
 *         tevent_req_error(req, -1);
 
1143
 *         return;
 
1144
 *     }
 
1145
 *     ...
 
1146
 *   }
 
1147
 * @endcode
 
1148
 *
 
1149
 * @code
 
1150
 *   subreq = tevent_wakeup_send(mem_ctx, ev, wakeup_time);
 
1151
 *   if (tevent_req_nomem(subreq, req)) {
 
1152
 *     return false;
 
1153
 *   }
 
1154
 *   tevent_set_callback(subreq, my_callback_wakeup_done, req);
 
1155
 * @endcode
 
1156
 *
 
1157
 * @see tevent_wakeup_recv()
 
1158
 */
298
1159
struct tevent_req *tevent_wakeup_send(TALLOC_CTX *mem_ctx,
299
1160
                                      struct tevent_context *ev,
300
1161
                                      struct timeval wakeup_time);
 
1162
 
 
1163
/**
 
1164
 * @brief Check if the wakeup has been correctly executed.
 
1165
 *
 
1166
 * This function needs to be called in the callback function set after calling
 
1167
 * tevent_wakeup_send().
 
1168
 *
 
1169
 * @param[in]  req      The tevent request to check.
 
1170
 *
 
1171
 * @return              True on success, false otherwise.
 
1172
 *
 
1173
 * @see tevent_wakeup_recv()
 
1174
 */
301
1175
bool tevent_wakeup_recv(struct tevent_req *req);
302
1176
 
 
1177
/* @} */
 
1178
 
 
1179
/**
 
1180
 * @defgroup tevent_helpers The tevent helper functiions
 
1181
 * @ingroup tevent
 
1182
 *
 
1183
 * @todo description
 
1184
 *
 
1185
 * @{
 
1186
 */
 
1187
 
 
1188
/**
 
1189
 * @brief Compare two timeval values.
 
1190
 *
 
1191
 * @param[in]  tv1      The first timeval value to compare.
 
1192
 *
 
1193
 * @param[in]  tv2      The second timeval value to compare.
 
1194
 *
 
1195
 * @return              0 if they are equal.
 
1196
 *                      1 if the first time is greater than the second.
 
1197
 *                      -1 if the first time is smaller than the second.
 
1198
 */
303
1199
int tevent_timeval_compare(const struct timeval *tv1,
304
1200
                           const struct timeval *tv2);
305
1201
 
 
1202
/**
 
1203
 * @brief Get a zero timval value.
 
1204
 *
 
1205
 * @return              A zero timval value.
 
1206
 */
306
1207
struct timeval tevent_timeval_zero(void);
307
1208
 
 
1209
/**
 
1210
 * @brief Get a timeval value for the current time.
 
1211
 *
 
1212
 * @return              A timval value with the current time.
 
1213
 */
308
1214
struct timeval tevent_timeval_current(void);
309
1215
 
 
1216
/**
 
1217
 * @brief Get a timeval structure with the given values.
 
1218
 *
 
1219
 * @param[in]  secs     The seconds to set.
 
1220
 *
 
1221
 * @param[in]  usecs    The milliseconds to set.
 
1222
 *
 
1223
 * @return              A timeval structure with the given values.
 
1224
 */
310
1225
struct timeval tevent_timeval_set(uint32_t secs, uint32_t usecs);
311
1226
 
 
1227
/**
 
1228
 * @brief Get the difference between two timeval values.
 
1229
 *
 
1230
 * @param[in]  tv1      The first timeval.
 
1231
 *
 
1232
 * @param[in]  tv2      The second timeval.
 
1233
 *
 
1234
 * @return              A timeval structure with the difference between the
 
1235
 *                      first and the second value.
 
1236
 */
312
1237
struct timeval tevent_timeval_until(const struct timeval *tv1,
313
1238
                                    const struct timeval *tv2);
314
1239
 
 
1240
/**
 
1241
 * @brief Check if a given timeval structure is zero.
 
1242
 *
 
1243
 * @param[in]  tv       The timeval to check if it is zero.
 
1244
 *
 
1245
 * @return              True if it is zero, false otherwise.
 
1246
 */
315
1247
bool tevent_timeval_is_zero(const struct timeval *tv);
316
1248
 
 
1249
/**
 
1250
 * @brief Add the given amount of time to a timeval structure.
 
1251
 *
 
1252
 * @param[in]  tv        The timeval structure to add the time.
 
1253
 *
 
1254
 * @param[in]  secs      The seconds to add to the timeval.
 
1255
 *
 
1256
 * @param[in]  usecs     The milliseconds to add to the timeval.
 
1257
 *
 
1258
 * @return               The timeval structure with the new time.
 
1259
 */
317
1260
struct timeval tevent_timeval_add(const struct timeval *tv, uint32_t secs,
318
1261
                                  uint32_t usecs);
319
1262
 
 
1263
/**
 
1264
 * @brief Get a timeval in the future with a specified offset from now.
 
1265
 *
 
1266
 * @param[in]  secs     The seconds of the offset from now.
 
1267
 *
 
1268
 * @param[in]  usecs    The milliseconds of the offset from now.
 
1269
 *
 
1270
 * @return              A timval with the given offset in the future.
 
1271
 */
320
1272
struct timeval tevent_timeval_current_ofs(uint32_t secs, uint32_t usecs);
321
1273
 
 
1274
/* @} */
 
1275
 
 
1276
 
 
1277
/**
 
1278
 * @defgroup tevent_queue The tevent queue functions
 
1279
 * @ingroup tevent
 
1280
 *
 
1281
 * A tevent_queue is used to queue up async requests that must be
 
1282
 * serialized. For example writing buffers into a socket must be
 
1283
 * serialized. Writing a large lump of data into a socket can require
 
1284
 * multiple write(2) or send(2) system calls. If more than one async
 
1285
 * request is outstanding to write large buffers into a socket, every
 
1286
 * request must individually be completed before the next one begins,
 
1287
 * even if multiple syscalls are required.
 
1288
 *
 
1289
 * Take a look at @ref tevent_queue_tutorial for more details.
 
1290
 * @{
 
1291
 */
 
1292
 
322
1293
struct tevent_queue;
323
1294
 
 
1295
#ifdef DOXYGEN
 
1296
/**
 
1297
 * @brief Create and start a tevent queue.
 
1298
 *
 
1299
 * @param[in]  mem_ctx  The talloc memory context to allocate the queue.
 
1300
 *
 
1301
 * @param[in]  name     The name to use to identify the queue.
 
1302
 *
 
1303
 * @return              An allocated tevent queue on success, NULL on error.
 
1304
 *
 
1305
 * @see tevent_start()
 
1306
 * @see tevent_stop()
 
1307
 */
 
1308
struct tevent_queue *tevent_queue_create(TALLOC_CTX *mem_ctx,
 
1309
                                         const char *name);
 
1310
#else
324
1311
struct tevent_queue *_tevent_queue_create(TALLOC_CTX *mem_ctx,
325
1312
                                          const char *name,
326
1313
                                          const char *location);
327
1314
 
328
1315
#define tevent_queue_create(_mem_ctx, _name) \
329
1316
        _tevent_queue_create((_mem_ctx), (_name), __location__)
 
1317
#endif
330
1318
 
 
1319
/**
 
1320
 * @brief A callback trigger function run by the queue.
 
1321
 *
 
1322
 * @param[in]  req      The tevent request the trigger function is executed on.
 
1323
 *
 
1324
 * @param[in]  private_data The private data pointer specified by
 
1325
 *                          tevent_queue_add().
 
1326
 *
 
1327
 * @see tevent_queue_add()
 
1328
 */
331
1329
typedef void (*tevent_queue_trigger_fn_t)(struct tevent_req *req,
332
1330
                                          void *private_data);
 
1331
 
 
1332
/**
 
1333
 * @brief Add a tevent request to the queue.
 
1334
 *
 
1335
 * @param[in]  queue    The queue to add the request.
 
1336
 *
 
1337
 * @param[in]  ev       The event handle to use for the request.
 
1338
 *
 
1339
 * @param[in]  req      The tevent request to add to the queue.
 
1340
 *
 
1341
 * @param[in]  trigger  The function triggered by the queue when the request
 
1342
 *                      is called.
 
1343
 *
 
1344
 * @param[in]  private_data The private data passed to the trigger function.
 
1345
 *
 
1346
 * @return              True if the request has been successfully added, false
 
1347
 *                      otherwise.
 
1348
 */
333
1349
bool tevent_queue_add(struct tevent_queue *queue,
334
1350
                      struct tevent_context *ev,
335
1351
                      struct tevent_req *req,
336
1352
                      tevent_queue_trigger_fn_t trigger,
337
1353
                      void *private_data);
 
1354
 
 
1355
/**
 
1356
 * @brief Start a tevent queue.
 
1357
 *
 
1358
 * The queue is started by default.
 
1359
 *
 
1360
 * @param[in]  queue    The queue to start.
 
1361
 */
338
1362
void tevent_queue_start(struct tevent_queue *queue);
 
1363
 
 
1364
/**
 
1365
 * @brief Stop a tevent queue.
 
1366
 *
 
1367
 * The queue is started by default.
 
1368
 *
 
1369
 * @param[in]  queue    The queue to stop.
 
1370
 */
339
1371
void tevent_queue_stop(struct tevent_queue *queue);
340
1372
 
 
1373
/**
 
1374
 * @brief Get the length of the queue.
 
1375
 *
 
1376
 * @param[in]  queue    The queue to get the length from.
 
1377
 *
 
1378
 * @return              The number of elements.
 
1379
 */
341
1380
size_t tevent_queue_length(struct tevent_queue *queue);
342
1381
 
343
1382
typedef int (*tevent_nesting_hook)(struct tevent_context *ev,
366
1405
        _tevent_loop_until(ev, finished, private_data, __location__)
367
1406
#endif
368
1407
 
 
1408
int tevent_re_initialise(struct tevent_context *ev);
 
1409
 
 
1410
/* @} */
369
1411
 
370
1412
/**
 
1413
 * @defgroup tevent_ops The tevent operation functions
 
1414
 * @ingroup tevent
 
1415
 *
371
1416
 * The following structure and registration functions are exclusively
372
1417
 * needed for people writing and pluggin a different event engine.
373
1418
 * There is nothing useful for normal tevent user in here.
 
1419
 * @{
374
1420
 */
375
1421
 
376
1422
struct tevent_ops {
423
1469
 
424
1470
bool tevent_register_backend(const char *name, const struct tevent_ops *ops);
425
1471
 
 
1472
/* @} */
426
1473
 
427
1474
/**
 
1475
 * @defgroup tevent_compat The tevent compatibility functions
 
1476
 * @ingroup tevent
 
1477
 *
428
1478
 * The following definitions are usueful only for compatibility with the
429
1479
 * implementation originally developed within the samba4 code and will be
430
1480
 * soon removed. Please NEVER use in new code.
 
1481
 *
 
1482
 * @todo Ignore it?
 
1483
 *
 
1484
 * @{
431
1485
 */
432
1486
 
433
1487
#ifdef TEVENT_COMPAT_DEFINES
504
1558
 
505
1559
#endif /* TEVENT_COMPAT_DEFINES */
506
1560
 
 
1561
/* @} */
 
1562
 
507
1563
#endif /* __TEVENT_H__ */