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