1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
#ifndef DETAIL_H
#define DETAIL_H
/*
* detail.h Routines to handle detail files.
*
* Version: $Id$
*
*/
RCSIDH(detail_h, "$Id$")
#ifdef __cplusplus
extern "C" {
#endif
typedef enum detail_state_t {
STATE_UNOPENED = 0,
STATE_UNLOCKED,
STATE_HEADER,
STATE_READING,
STATE_QUEUED,
STATE_RUNNING,
STATE_NO_REPLY,
STATE_REPLIED
} detail_state_t;
/*
* Allow people to revert to the old behavior if desired.
* Also, use the old code if we don't have threads.
* FIXME: delete the old (crappy) code, and enable the new
* code to work without threads. One thing at a time...
*/
#ifndef WITHOUT_DETAIL_THREAD
# ifdef HAVE_PTHREAD_H
# define WITH_DETAIL_THREAD (1)
# endif
#endif
typedef struct listen_detail_t {
fr_event_t *ev; /* has to be first entry (ugh) */
char const *name; //!< Identifier used in log messages
int delay_time;
char const *filename;
char const *filename_work;
TALLOC_CTX *ctx;
VALUE_PAIR *vps;
int work_fd;
#ifdef WITH_DETAIL_THREAD
int master_pipe[2];
int child_pipe[2];
pthread_t pthread_id;
#endif
FILE *fp;
off_t offset;
detail_state_t state;
time_t timestamp;
time_t running;
fr_ipaddr_t client_ip;
off_t last_offset;
off_t timestamp_offset;
bool done_entry; //!< Are we done reading this entry?
bool track; //!< Do we track progress through the file?
uint32_t load_factor; /* 1..100 */
uint32_t poll_interval;
uint32_t retry_interval;
int signal;
int packets;
int tries;
bool one_shot;
int outstanding;
int has_rtt;
int srtt;
int rttvar;
uint32_t counter;
struct timeval last_packet;
RADCLIENT detail_client;
} listen_detail_t;
int detail_recv(rad_listen_t *listener);
int detail_send(rad_listen_t *listener, REQUEST *request);
void detail_free(rad_listen_t *this);
int detail_print(rad_listen_t const *this, char *buffer, size_t bufsize);
int detail_encode(UNUSED rad_listen_t *this, UNUSED REQUEST *request);
int detail_decode(UNUSED rad_listen_t *this, UNUSED REQUEST *request);
int detail_parse(CONF_SECTION *cs, rad_listen_t *this);
#ifdef __cplusplus
}
#endif
#endif /* DETAIL_H */
|