Only in freeradius.new: freeradius-cvs-failed-accounting.diff
diff -ur freeradius.orig/man/man5/rlm_sql.5 freeradius.new/man/man5/rlm_sql.5
--- freeradius.orig/man/man5/rlm_sql.5	2004-03-25 12:31:17.000000000 +0100
+++ freeradius.new/man/man5/rlm_sql.5	2006-12-12 23:58:11.000000000 +0100
@@ -106,6 +106,8 @@
 .IP accounting_stop_query_alt
 The query to be run when receiving an Accounting Stop packet.  If the
 primary query fails, the alt query is run.
+.IP accounting_failed_query
+The query to be run when receiving an Failed packet.
 .IP simul_count_query
 The query to be run to return the number simultaneous sessions for the
 purposes of limiting Simultaneous Use.
diff -ur freeradius.orig/raddb/mssql.conf freeradius.new/raddb/mssql.conf
--- freeradius.orig/raddb/mssql.conf	2006-02-04 15:53:44.000000000 +0100
+++ freeradius.new/raddb/mssql.conf	2006-12-12 23:58:11.000000000 +0100
@@ -109,6 +109,7 @@
 	# accounting_stop_query_alt	- query for Accounting start packets
 	#                               (alternate in case first query doesn't
 	#                                affect any existing rows in the table)
+	# accounting_failed_query	- query for Accounting failed packets 
 	#######################################################################
 	accounting_onoff_query = "UPDATE ${acct_table1} SET AcctStopTime='%S', AcctSessionTime=unix_timestamp('%S') - unix_timestamp(AcctStartTime), AcctTerminateCause='%{Acct-Terminate-Cause}', AcctStopDelay = %{Acct-Delay-Time} WHERE AcctSessionTime=0 AND AcctStopTime=0 AND NASIPAddress= '%{NAS-IP-Address}' AND AcctStartTime <= '%S'"
 
@@ -128,4 +129,8 @@
 	# removed. These fields are processing by a database
 	accounting_stop_query_alt = "INSERT into ${acct_table2} (AcctSessionId, AcctUniqueId, UserName, Realm, NASIPAddress, NASPort, NASPortType, AcctStopTime, AcctSessionTime, AcctAuthentic, ConnectInfo_start, ConnectInfo_stop, AcctInputOctets, AcctOutputOctets, CalledStationId, CallingStationId, AcctTerminateCause, ServiceType, ENUMtld, FramedIPAddress, AcctStartDelay, AcctStopDelay) values('%{Acct-Session-Id}', '%{Acct-Unique-Session-Id}', '%{SQL-User-Name}', '%{Realm}', '%{NAS-IP-Address}', '%{NAS-Port-Id}', '%{NAS-Port-Type}', '%S', '%{Acct-Session-Time}', '%{Acct-Authentic}', '', '%{Connect-Info}', '%{Acct-Input-Octets}', '%{Acct-Output-Octets}', '%{Called-Station-Id}', '%{Calling-Station-Id}', '%{Acct-Terminate-Cause}', '%{Service-Type}', '%{ENUMtld}', '%{Framed-IP-Address}', '0', '%{Acct-Delay-Time}')"
 
+	# accounting_failed_query: Inserting of RadAcctId and AcctStopTime was 
+	# removed. These fields are processing by a database
+	accounting_failed_query = "INSERT into ${acct_table1} (AcctSessionId, AcctUniqueId, UserName, Realm, NASIPAddress, NASPort, NASPortType, AcctStartTime, AcctSessionTime, AcctAuthentic, ConnectInfo_start, ConnectInfo_stop, AcctInputOctets, AcctOutputOctets, CalledStationId, CallingStationId, AcctTerminateCause, ServiceType, ENUMtld, FramedIPAddress, AcctStartDelay, AcctStopDelay) values('%{Acct-Session-Id}', '%{Acct-Unique-Session-Id}', '%{SQL-User-Name}', '%{Realm}', '%{NAS-IP-Address}', '%{NAS-Port-Id}', '%{NAS-Port-Type}', '%S', '0', '%{Acct-Authentic}', '%{Connect-Info}', '', '0', '0', '%{Called-Station-Id}', '%{Calling-Station-Id}', '', '%{Service-Type}', '%{ENUMtld}', '%{Framed-IP-Address}', '%{Acct-Delay-Time}', '0')"
+
 }
Only in freeradius.new/raddb: mssql.conf.orig
diff -ur freeradius.orig/raddb/oraclesql.conf freeradius.new/raddb/oraclesql.conf
--- freeradius.orig/raddb/oraclesql.conf	2004-08-30 21:07:18.000000000 +0200
+++ freeradius.new/raddb/oraclesql.conf	2006-12-12 23:58:11.000000000 +0100
@@ -142,6 +142,7 @@
 	# accounting_stop_query_alt	- query for Accounting start packets 
 	#                               (alternate in case first query doesn't
 	#                                affect any existing rows in the table)
+	# accounting_failed_query	- query for Accounting failed packets 
 	#######################################################################
 	accounting_onoff_query = "UPDATE ${acct_table1} SET AcctStopTime=TO_DATE('%S','yyyy-mm-dd hh24:mi:ss'), AcctSessionTime=((TO_DATE('%S','yyyy-mm-dd hh24:mi:ss') - AcctStartTime)*86400), AcctTerminateCause='%{Acct-Terminate-Cause}', AcctStopDelay = %{Acct-Delay-Time} WHERE AcctSessionTime=0 AND AcctStopTime IS NULL AND NASIPAddress = '%{NAS-IP-Address}' AND AcctStartTime <= TO_DATE('%S','yyyy-mm-dd hh24:mi:ss')"
 
@@ -166,6 +167,8 @@
 
 	accounting_stop_query_alt = "INSERT into ${acct_table2} (RadAcctId, AcctSessionId, AcctUniqueId, UserName, Realm, NASIPAddress, NASPortId, NASPortType, AcctStartTime, AcctStopTime, AcctSessionTime, AcctAuthentic, ConnectInfo_start, ConnectInfo_stop, AcctInputOctets, AcctOutputOctets, CalledStationId, CallingStationId, AcctTerminateCause, ServiceType, ENUMtld, FramedIPAddress, AcctStartDelay, AcctStopDelay) values('', '%{Acct-Session-Id}', '%{Acct-Unique-Session-Id}', '%{SQL-User-Name}', '%{Realm}', '%{NAS-IP-Address}', '%{NAS-Port-Id}', '%{NAS-Port-Type}', NULL, TO_DATE('%S','yyyy-mm-dd hh24:mi:ss'), '%{Acct-Session-Time}', '%{Acct-Authentic}', '', '%{Connect-Info}', '%{Acct-Input-Octets}', '%{Acct-Output-Octets}', '%{Called-Station-Id}', '%{Calling-Station-Id}', '%{Acct-Terminate-Cause}', '%{Service-Type}', '%{ENUMtld}', '%{Framed-IP-Address}', '0', '%{Acct-Delay-Time}')"
 
+	accounting_failed_query = "INSERT into ${acct_table1} (RadAcctId, AcctSessionId, AcctUniqueId, UserName, Realm, NASIPAddress, NASPortId, NASPortType, AcctStartTime, AcctStopTime, AcctSessionTime, AcctAuthentic, ConnectInfo_start, ConnectInfo_stop, AcctInputOctets, AcctOutputOctets, CalledStationId, CallingStationId, AcctTerminateCause, ServiceType, ENUMtld, FramedIPAddress, AcctStartDelay, AcctStopDelay) values('', '%{Acct-Session-Id}', '%{Acct-Unique-Session-Id}', '%{SQL-User-Name}', '%{Realm}', '%{NAS-IP-Address}', '%{NAS-Port-Id}', '%{NAS-Port-Type}', TO_DATE('%S','yyyy-mm-dd hh24:mi:ss'), NULL, '0', '%{Acct-Authentic}', '%{Connect-Info}', '', '0', '0', '%{Called-Station-Id}', '%{Calling-Station-Id}', '', '%{Service-Type}', '%{ENUMtld}', '%{Framed-IP-Address}', '%{Acct-Delay-Time}', '0')"
+
 	#######################################################################
 	# Simultaneous Use Checking Queries
 	#######################################################################
diff -ur freeradius.orig/raddb/pgsql-voip.conf freeradius.new/raddb/pgsql-voip.conf
--- freeradius.orig/raddb/pgsql-voip.conf	2005-07-01 16:58:14.000000000 +0200
+++ freeradius.new/raddb/pgsql-voip.conf	2006-12-12 23:58:11.000000000 +0100
@@ -78,6 +78,7 @@
 	# accounting_stop_query_alt	- query for Accounting start packets 
 	#                               (alternate in case first query doesn't
 	#                                affect any existing rows in the table)
+	# accounting_failed_query	- query for Accounting failed packets 
 	#######################################################################
 
 	# Note: The VoIP accouting does not need Alternate queries in the shipped
@@ -106,4 +107,13 @@
 		strip_dot('%{h323-disconnect-time}'), '%{h323-gw-id}', strip_dot('%{h323-setup-time}'))"
  
 
+	accounting_failed_query = "INSERT into ${acct_table1}%{h323-call-type} \
+		(RadiusServerName, UserName, NASIPAddress, AcctTime, CalledStationId, \
+		CallingStationId, AcctDelayTime, h323gwid, h323callorigin, h323setuptime, H323ConnectTime, callid) \
+		values('${radius_server_name}', '%{SQL-User-Name}', \
+		'%{NAS-IP-Address}', now(), '%{Called-Station-Id}', \
+		'%{Calling-Station-Id}', '%{Acct-Delay-Time:-0}', '%{h323-gw-id}', \
+		'%{h323-call-origin}', strip_dot('%{h323-setup-time}'), strip_dot('%{h323-connect-time}'), pick_id('%{h323-conf-id}', '%{call-id}'))"
+
+
 }
diff -ur freeradius.orig/raddb/postgresql.conf freeradius.new/raddb/postgresql.conf
--- freeradius.orig/raddb/postgresql.conf	2006-08-18 12:50:30.000000000 +0200
+++ freeradius.new/raddb/postgresql.conf	2006-12-12 23:58:11.000000000 +0100
@@ -184,6 +184,7 @@
 	# accounting_stop_query_alt	- query for Accounting start packets
 	#                               (alternate in case first query doesn't
 	#                                affect any existing rows in the table)
+	# accounting_failed_query	- query for Accounting failed packets 
 	#######################################################################
 
 	accounting_onoff_query = "UPDATE ${acct_table1} \
@@ -248,6 +249,14 @@
 		'%{Calling-Station-Id}', '%{Acct-Terminate-Cause}', '%{Service-Type}', '%{ENUMtld}', \
 		NULLIF('%{Framed-IP-Address}', '')::inet, '%{Acct-Delay-Time:-0}', '%{X-Ascend-Session-Svr-Key}')"
 
+	accounting_failed_query = "INSERT into ${acct_table1} \
+		(AcctSessionId, AcctUniqueId, UserName, Realm, NASIPAddress, NASPortId, NASPortType, AcctStartTime, AcctAuthentic, \
+		ConnectInfo_start, CalledStationId, CallingStationId, ServiceType, ENUMtld, FramedIPAddress, AcctStartDelay) \
+		values('%{Acct-Session-Id}', '%{Acct-Unique-Session-Id}', '%{SQL-User-Name}', '%{Realm}', '%{NAS-IP-Address}', \
+		'%{NAS-Port}', '%{NAS-Port-Type}', (now() - '%{Acct-Delay-Time:-0}'::interval), '%{Acct-Authentic}', '%{Connect-Info}', \
+		'%{Called-Station-Id}', '%{Calling-Station-Id}', '%{Service-Type}', '%{ENUMtld}', \
+		NULLIF('%{Framed-IP-Address}', '')::inet, '%{Acct-Delay-Time:-0}')"
+
 	#######################################################################
 	# Group Membership Queries
 	#######################################################################
Only in freeradius.new/raddb: postgresql.conf.orig
diff -ur freeradius.orig/raddb/sql.conf freeradius.new/raddb/sql.conf
--- freeradius.orig/raddb/sql.conf	2006-02-04 15:13:03.000000000 +0100
+++ freeradius.new/raddb/sql.conf	2006-12-12 23:58:11.000000000 +0100
@@ -168,6 +168,7 @@
 	# accounting_stop_query_alt	- query for Accounting start packets
 	#                               (alternate in case first query doesn't
 	#                                affect any existing rows in the table)
+	# accounting_failed_query	- query for Accounting failed packets 
 	#######################################################################
 	accounting_onoff_query = "UPDATE ${acct_table1} SET AcctStopTime='%S', AcctSessionTime=unix_timestamp('%S') - unix_timestamp(AcctStartTime), AcctTerminateCause='%{Acct-Terminate-Cause}', AcctStopDelay = '%{Acct-Delay-Time}' WHERE AcctSessionTime=0 AND AcctStopTime=0 AND NASIPAddress= '%{NAS-IP-Address}' AND AcctStartTime <= '%S'"
 
@@ -190,6 +191,8 @@
 
 	accounting_stop_query_alt = "INSERT into ${acct_table2} (AcctSessionId, AcctUniqueId, UserName, Realm, NASIPAddress, NASPortId, NASPortType, AcctStartTime, AcctStopTime, AcctSessionTime, AcctAuthentic, ConnectInfo_start, ConnectInfo_stop, AcctInputOctets, AcctOutputOctets, CalledStationId, CallingStationId, AcctTerminateCause, ServiceType, ENUMtld, FramedIPAddress, AcctStartDelay, AcctStopDelay) values('%{Acct-Session-Id}', '%{Acct-Unique-Session-Id}', '%{SQL-User-Name}', '%{Realm}', '%{NAS-IP-Address}', '%{NAS-Port}', '%{NAS-Port-Type}', DATE_SUB('%S', INTERVAL (%{Acct-Session-Time:-0} + %{Acct-Delay-Time:-0}) SECOND), '%S', '%{Acct-Session-Time}', '%{Acct-Authentic}', '', '%{Connect-Info}', '%{Acct-Input-Octets}', '%{Acct-Output-Octets}', '%{Called-Station-Id}', '%{Calling-Station-Id}', '%{Acct-Terminate-Cause}', '%{Service-Type}', '%{ENUMtld}', '%{Framed-IP-Address}', '0', '%{Acct-Delay-Time}')"
 
+	accounting_failed_query = "INSERT into ${acct_table1} (AcctSessionId, AcctUniqueId, UserName, Realm, NASIPAddress, NASPortId, NASPortType, AcctStartTime, AcctStopTime, AcctSessionTime, AcctAuthentic, ConnectInfo_start, ConnectInfo_stop, AcctInputOctets, AcctOutputOctets, CalledStationId, CallingStationId, AcctTerminateCause, ServiceType, ENUMtld, FramedIPAddress, AcctStartDelay, AcctStopDelay) values('%{Acct-Session-Id}', '%{Acct-Unique-Session-Id}', '%{SQL-User-Name}', '%{Realm}', '%{NAS-IP-Address}', '%{NAS-Port}', '%{NAS-Port-Type}', '%S', '0', '0', '%{Acct-Authentic}', '%{Connect-Info}', '', '0', '0', '%{Called-Station-Id}', '%{Calling-Station-Id}', '', '%{Service-Type}', '%{ENUMtld}', '%{Framed-IP-Address}', '%{Acct-Delay-Time}', '0')"
+
 	#######################################################################
 	# Simultaneous Use Checking Queries
 	#######################################################################
Only in freeradius.new/raddb: sql.conf.orig
diff -ur freeradius.orig/src/include/radius.h freeradius.new/src/include/radius.h
--- freeradius.orig/src/include/radius.h	2006-03-07 19:10:08.000000000 +0100
+++ freeradius.new/src/include/radius.h	2006-12-12 23:58:11.000000000 +0100
@@ -267,6 +267,7 @@
 #define PW_STATUS_ALIVE			3
 #define PW_STATUS_ACCOUNTING_ON		7
 #define PW_STATUS_ACCOUNTING_OFF	8
+#define PW_STATUS_FAILED		15
 
 /*
  *  Vendor Private Enterprise Codes
Only in freeradius.new/src/include: radius.h.orig
diff -ur freeradius.orig/src/modules/rlm_sql/conf.h freeradius.new/src/modules/rlm_sql/conf.h
--- freeradius.orig/src/modules/rlm_sql/conf.h	2006-05-20 14:44:37.000000000 +0200
+++ freeradius.new/src/modules/rlm_sql/conf.h	2006-12-13 00:00:11.000000000 +0100
@@ -29,6 +29,7 @@
 	char   *accounting_start_query_alt;
 	char   *accounting_stop_query;
 	char   *accounting_stop_query_alt;
+	char   *accounting_failed_query;
 	char   *simul_count_query;
 	char   *simul_verify_query;
 	char   *groupmemb_query;
@@ -71,7 +72,7 @@
 
 #define ASCEND_PORT_HACK
 #define ASCEND_CHANNELS_PER_LINE        23
-#define CISCO_ACCOUNTING_HACK
+/* #define CISCO_ACCOUNTING_HACK */
 
 /* SQL defines */
 #define MAX_QUERY_LEN			4096
Only in freeradius.new/src/modules/rlm_sql: conf.h~
Only in freeradius.new/src/modules/rlm_sql: conf.h.orig
diff -ur freeradius.orig/src/modules/rlm_sql/drivers/rlm_sql_mysql/sql_mysql.c freeradius.new/src/modules/rlm_sql/drivers/rlm_sql_mysql/sql_mysql.c
--- freeradius.orig/src/modules/rlm_sql/drivers/rlm_sql_mysql/sql_mysql.c	2005-12-09 17:10:08.000000000 +0100
+++ freeradius.new/src/modules/rlm_sql/drivers/rlm_sql_mysql/sql_mysql.c	2006-12-12 23:59:11.000000000 +0100
@@ -82,7 +82,7 @@
 						    config->sql_db,
 						    atoi(config->sql_port),
 						    NULL,
-						    CLIENT_FOUND_ROWS))) {
+						    CLIENT_FOUND_ROWS|CLIENT_MULTI_RESULTS))) {
 		radlog(L_ERR, "rlm_sql_mysql: Couldn't connect socket to MySQL server %s@%s:%s", config->sql_login, config->sql_server, config->sql_db);
 		radlog(L_ERR, "rlm_sql_mysql: Mysql error '%s'", mysql_error(&mysql_sock->conn));
 		mysql_sock->sock = NULL;
Only in freeradius.new/src/modules/rlm_sql/drivers/rlm_sql_mysql: sql_mysql.c~
diff -ur freeradius.orig/src/modules/rlm_sql/rlm_sql.c freeradius.new/src/modules/rlm_sql/rlm_sql.c
--- freeradius.orig/src/modules/rlm_sql/rlm_sql.c	2006-05-20 14:44:37.000000000 +0200
+++ freeradius.new/src/modules/rlm_sql/rlm_sql.c	2006-12-12 23:58:11.000000000 +0100
@@ -103,6 +103,8 @@
 	 offsetof(SQL_CONFIG,accounting_stop_query), NULL, ""},
 	{"accounting_stop_query_alt", PW_TYPE_STRING_PTR,
 	 offsetof(SQL_CONFIG,accounting_stop_query_alt), NULL, ""},
+	{"accounting_failed_query", PW_TYPE_STRING_PTR,
+	 offsetof(SQL_CONFIG,accounting_failed_query), NULL, ""},
 	{"group_membership_query", PW_TYPE_STRING_PTR,
 	 offsetof(SQL_CONFIG,groupmemb_query), NULL, ""},
 	{"connect_failure_retry_delay", PW_TYPE_INTEGER,
@@ -1095,6 +1097,33 @@
 			break;
 
 			/*
+			 * Got accounting failed packet
+			 */
+		case PW_STATUS_FAILED:
+
+			/*
+			 * Set, escape, and check the user attr here
+			 */
+			sql_set_user(inst, request, sqlusername, NULL);
+
+			radius_xlat(querystr, sizeof(querystr), inst->config->accounting_failed_query, request, sql_escape_func);
+			query_log(request, inst, querystr);
+
+			sqlsocket = sql_get_socket(inst);
+			if (sqlsocket == NULL)
+				return(RLM_MODULE_FAIL);
+			if (*querystr) { /* non-empty query */
+				if (rlm_sql_query(sqlsocket, inst, querystr)) {
+					radlog(L_ERR, "rlm_sql (%s): Couldn't insert SQL accounting FAILED record - %s",
+					       inst->config->xlat_name,
+					       (char *)(inst->module->sql_error)(sqlsocket, inst->config));
+					ret = RLM_MODULE_FAIL;
+				}
+				(inst->module->sql_finish_query)(sqlsocket, inst->config);
+			}
+			break;
+
+			/*
 			 *	Anything else is ignored.
 			 */
 		default:
Only in freeradius.new/src/modules/rlm_sql: rlm_sql.c.orig
