*/
int detail_send(rad_listen_t *listener, REQUEST *request)
{
-#ifdef WITH_DETAIL_THREAD
char c = 0;
-#endif
listen_detail_t *data = listener->data;
rad_assert(request->listener == listener);
data->counter++;
}
-#ifdef WITH_DETAIL_THREAD
if (write(data->child_pipe[1], &c, 1) < 0) {
RERROR("detail (%s): Failed writing ack to reader thread: %s", data->name, fr_syserror(errno));
}
-#else
- radius_signal_self(RADIUS_SIGNAL_SELF_DETAIL);
-#endif
return 0;
}
* t_rtt + t_delay wait for signal that the server is idle.
*
*/
-#ifndef WITH_DETAIL_THREAD
-static RADIUS_PACKET *detail_poll(rad_listen_t *listener);
-
-int detail_recv(rad_listen_t *listener)
-{
- RADIUS_PACKET *packet;
- listen_detail_t *data = listener->data;
- RAD_REQUEST_FUNP fun = NULL;
-
- /*
- * We may be in the main thread. It needs to update the
- * timers before we try to read from the file again.
- */
- if (data->signal) return 0;
-
- packet = detail_poll(listener);
- if (!packet) return -1;
-
- if (DEBUG_ENABLED2) {
- VALUE_PAIR *vp;
- vp_cursor_t cursor;
-
- DEBUG2("detail (%s): Read packet from %s", data->name, data->filename_work);
-
- for (vp = fr_cursor_init(&cursor, &packet->vps);
- vp;
- vp = fr_cursor_next(&cursor)) {
- debug_pair(vp);
- }
- }
-
- switch (packet->code) {
- case PW_CODE_ACCOUNTING_REQUEST:
- fun = rad_accounting;
- break;
-
- case PW_CODE_COA_REQUEST:
- case PW_CODE_DISCONNECT_REQUEST:
- fun = rad_coa_recv;
- break;
-
- default:
- rad_free(&packet);
- data->state = STATE_REPLIED;
- return 0;
- }
-
- /*
- * Don't bother doing limit checks, etc.
- */
- if (!request_receive(NULL, listener, packet, &data->detail_client, fun)) {
- rad_free(&packet);
- data->state = STATE_NO_REPLY; /* try again later */
- return 0;
- }
-
- return 1;
-}
-#else
int detail_recv(rad_listen_t *listener)
{
char c = 0;
*/
return 0;
}
-#endif
static RADIUS_PACKET *detail_poll(rad_listen_t *listener)
{
{
listen_detail_t *data = this->data;
-#ifdef WITH_DETAIL_THREAD
if (!check_config) {
ssize_t ret;
void *arg = NULL;
if (arg) pthread_join(data->pthread_id, &arg);
}
-#endif
if (data->fp != NULL) {
fclose(data->fp);
*/
int detail_encode(UNUSED rad_listen_t *this, UNUSED REQUEST *request)
{
-#ifdef WITH_DETAIL_THREAD
return 0;
-#else
- listen_detail_t *data = this->data;
-
- /*
- * We haven't sent a packet... delay things a bit.
- */
- if (!data->signal) return detail_delay(data);
-
- data->signal = 0;
-
- DEBUG2("detail (%s): Detail listener state %s signalled %d waiting %d.%06d sec",
- data->name,
- fr_int2str(state_names, data->state, "?"),
- data->signal,
- data->delay_time / USEC,
- data->delay_time % USEC);
-
- return data->delay_time;
-#endif
}
/*
*/
int detail_decode(UNUSED rad_listen_t *this, UNUSED REQUEST *request)
{
-#ifdef WITH_DETAIL_THREAD
return 0;
-#else
- listen_detail_t *data = this->data;
-
- return data->signal;
-#endif
}
-#ifdef WITH_DETAIL_THREAD
static void *detail_handler_thread(void *arg)
{
char c;
return NULL;
}
-#endif
static const CONF_PARSER detail_config[] = {
*/
if (check_config) return 0;
-#ifdef WITH_DETAIL_THREAD
/*
* Create the communication pipes.
*/
pthread_create(&data->pthread_id, NULL, detail_handler_thread, this);
this->fd = data->master_pipe[0];
-#endif
return 0;
}