PATCH: allow detail listeners to write to other files
John Morrissey
jwm at horde.net
Wed Oct 21 22:01:09 CEST 2009
On Thu, Oct 08, 2009 at 12:52:37PM -0400, John Morrissey wrote:
> I noticed[1] that detail listeners refuse to write detail entries to files,
> even if the destination filename is different from the source filename.
>
> The attached patch fixes that. It also centralizes the listen_detail_t
> definition, removing the 'stub' definition in src/main/event.c.
I've updated this patch to apply after
aafb547572e28f14cbe27d84f2346b93a07265f5.
john
diff --git a/src/include/detail.h b/src/include/detail.h
index 699b1be..4c164d7 100644
--- a/src/include/detail.h
+++ b/src/include/detail.h
@@ -10,6 +10,40 @@
#include <freeradius-devel/ident.h>
RCSIDH(detail_h, "$Id$")
+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;
+
+typedef struct listen_detail_t {
+ fr_event_t *ev; /* has to be first entry (ugh) */
+ int delay_time;
+ char *filename;
+ char *filename_work;
+ VALUE_PAIR *vps;
+ FILE *fp;
+ detail_state_t state;
+ time_t timestamp;
+ time_t running;
+ fr_ipaddr_t client_ip;
+ int load_factor; /* 1..100 */
+ int signal;
+ int poll_interval;
+ int retry_interval;
+
+ int has_rtt;
+ int srtt;
+ int rttvar;
+ struct timeval last_packet;
+ RADCLIENT detail_client;
+} listen_detail_t;
+
int detail_recv(rad_listen_t *listener,
RAD_REQUEST_FUNP *pfun, REQUEST **prequest);
int detail_send(rad_listen_t *listener, REQUEST *request);
diff --git a/src/main/detail.c b/src/main/detail.c
index 89804cd..6e8e2db 100644
--- a/src/main/detail.c
+++ b/src/main/detail.c
@@ -43,17 +43,6 @@ RCSID("$Id$")
#define USEC (1000000)
-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;
-
static FR_NAME_NUMBER state_names[] = {
{ "unopened", STATE_UNOPENED },
{ "unlocked", STATE_UNLOCKED },
@@ -67,29 +56,6 @@ static FR_NAME_NUMBER state_names[] = {
{ NULL, 0 }
};
-typedef struct listen_detail_t {
- fr_event_t *ev; /* has to be first entry (ugh) */
- int delay_time;
- char *filename;
- char *filename_work;
- VALUE_PAIR *vps;
- FILE *fp;
- detail_state_t state;
- time_t timestamp;
- time_t running;
- fr_ipaddr_t client_ip;
- int load_factor; /* 1..100 */
- int signal;
- int poll_interval;
- int retry_interval;
-
- int has_rtt;
- int srtt;
- int rttvar;
- struct timeval last_packet;
- RADCLIENT detail_client;
-} listen_detail_t;
-
/*
* If we're limiting outstanding packets, then mark the response
diff --git a/src/main/event.c b/src/main/event.c
index 51e6c9c..ad2ca32 100644
--- a/src/main/event.c
+++ b/src/main/event.c
@@ -3797,10 +3797,6 @@ static void event_socket_handler(fr_event_list_t *xel, UNUSED int fd,
}
}
-typedef struct listen_detail_t {
- fr_event_t *ev;
-} listen_detail_t;
-
/*
* This function is called periodically to see if this detail
* file is available for reading.
diff --git a/src/modules/rlm_detail/rlm_detail.c b/src/modules/rlm_detail/rlm_detail.c
index 56681fb..fba5e9d 100644
--- a/src/modules/rlm_detail/rlm_detail.c
+++ b/src/modules/rlm_detail/rlm_detail.c
@@ -26,6 +26,7 @@ RCSID("$Id$")
#include <freeradius-devel/radiusd.h>
#include <freeradius-devel/modules.h>
#include <freeradius-devel/rad_assert.h>
+#include <freeradius-devel/detail.h>
#include <sys/stat.h>
#include <ctype.h>
@@ -475,7 +476,9 @@ static int do_detail(void *instance, REQUEST *request, RADIUS_PACKET *packet,
*/
static int detail_accounting(void *instance, REQUEST *request)
{
- if (request->listener->type == RAD_LISTEN_DETAIL) {
+ if (request->listener->type == RAD_LISTEN_DETAIL &&
+ strcmp(((struct detail_instance *)instance)->detailfile,
+ ((listen_detail_t *)request->listener->data)->filename) == 0) {
RDEBUG("Suppressing writes to detail file as the request was just read from a detail file.");
return RLM_MODULE_NOOP;
}
--
John Morrissey _o /\ ---- __o
jwm at horde.net _-< \_ / \ ---- < \,
www.horde.net/ __(_)/_(_)________/ \_______(_) /_(_)__
More information about the Freeradius-Devel
mailing list