Comming work until I get a chance to work on it again
authormmachado <mmachado>
Wed, 18 Aug 1999 21:15:54 +0000 (21:15 +0000)
committermmachado <mmachado>
Wed, 18 Aug 1999 21:15:54 +0000 (21:15 +0000)
src/modules/rlm_sql/Makefile
src/modules/rlm_sql/rlm_mysql.h
src/modules/rlm_sql/rlm_sql.c
src/modules/rlm_sql/rlm_sql.h
src/modules/rlm_sql/sql.c

index dd0a7a6..eb24cb5 100644 (file)
@@ -1,9 +1,9 @@
 # must be first
 include config.mak
 
-TARGET         = rlm_mysql
-SRCS           = rlm_mysql.c mysql.c
-HEADERS                = rlm_mysql.h
+TARGET         = rlm_sql
+SRCS           = rlm_sql.c sql.c
+HEADERS                = rlm_sql.h
 RLM_CFLAGS     =
 LIBS           = -lmysqlclient
 
index 0a993be..0635f10 100644 (file)
@@ -1,69 +1,9 @@
-/* cistron mysql module
+/* mysql part of sql module for freeradius (www.freeradius.org)
 *          Mike Machado
 *          InnerCite
 *          mike@innercite.com
 */
 
-
-#define        SQLBIGREC       32
-#define        SQLLILREC       16
-#define QUERYLOG        "/var/log/radacct/radius.sql"
-#define MYSQLCONFIG     "radius.conf"
-#define MYSQLBACKUP     "/var/log/radacct/sqlbackup.dat"
-
-#define PW_VP_USERDATA 1
-#define PW_VP_GROUPDATA        2
-
-typedef struct mysqlrec {
-       char                            AcctSessionId[SQLBIGREC];
-        char                            UserName[SQLBIGREC];
-        char                            Realm[SQLBIGREC];
-        char                            NASIPAddress[SQLLILREC];
-        unsigned long                   NASPortId;
-        char                            NASPortType[SQLBIGREC];
-        char                            AcctStatusType[SQLBIGREC];
-        unsigned int                    AcctStatusTypeId;
-        char                            AcctTimeStamp[20];
-        unsigned long                   AcctSessionTime;
-        char                            AcctAuthentic[SQLBIGREC];
-        char                            ConnectInfo[SQLBIGREC];
-        unsigned long                   AcctInputOctets;
-        unsigned long                   AcctOutputOctets;
-        char                            CalledStationId[SQLLILREC];
-        char                            CallingStationId[SQLLILREC];
-        char                            AcctTerminateCause[SQLBIGREC];
-        char                            ServiceType[SQLBIGREC];
-        char                            FramedProtocol[SQLBIGREC];
-        char                            FramedIPAddress[SQLLILREC];
-        unsigned long                   AcctDelayTime;
-} MYSQLREC; 
-
-#define SQL_LOCK_LEN sizeof(MYSQLREC)
-#define MAX_TABLE_LEN 20
-#define MAX_AUTH_QUERY_LEN 256
-char mysql_server[40];
-char mysql_login[20];
-char mysql_password[20];
-char mysql_db[20];
-char mysql_acct_table[MAX_TABLE_LEN];
-char mysql_authcheck_table[MAX_TABLE_LEN];
-char mysql_authreply_table[MAX_TABLE_LEN];
-char mysql_groupcheck_table[MAX_TABLE_LEN];
-char mysql_groupreply_table[MAX_TABLE_LEN];
-char mysql_usergroup_table[MAX_TABLE_LEN];
-char mysql_realm_table[MAX_TABLE_LEN];
-char mysql_realmgroup_table[MAX_TABLE_LEN];
-char mysql_nas_table[MAX_TABLE_LEN];
-char mysql_dict_table[MAX_TABLE_LEN];
-int  mysql_keepopen;
-int  sqltrace; 
-MYSQL *MyAuthSock;
-MYSQL *MyAcctSock;
-MYSQL MyAuthConn;
-MYSQL MyAcctConn;
-int            mysql_start();
-int            mysql_save_acct(MYSQLREC *sqlrecord);
-int            mysql_userparse(VALUE_PAIR **first_pair, MYSQL_ROW row);
-int            mysql_checksocket(const char *facility);
-int            mysql_getvpdata(char *table, VALUE_PAIR **vp, char *user, int mode);
-int            mysql_check_multi(char *name, VALUE_PAIR *request, int maxsimul);
+typedef SQLSOCK         MYSQL;
+typedef SQL_ROW         MYSQL_ROW;
+typedef SQL_RES         MYSQL_RES;
index 0757b7f..e3c458f 100644 (file)
@@ -39,7 +39,7 @@ static int ascend_port_number(int nas_port)
  * start of main routines
  ***********************************************************************/
 
-static int icradius_init(int rehup) {
+static int rlm_sql_init(int rehup) {
 
        FILE    *sqlfd;
         char    dummystr[64];
@@ -47,28 +47,34 @@ static int icradius_init(int rehup) {
         int     line_no;
         char    buffer[256];
         char    sqlfile[256];
+       SQL     *sql;
+
+       if ((sql = malloc(sizeof(SQL))) == NULL) {
+               log(L_ERR|L_CONS, "no memory");
+               exit(1);        
+       }
        
-       strcpy(sql_server,"localhost");
-       strcpy(sql_login,"");
-       strcpy(sql_password,"");
-       strcpy(sql_db,"radius");
-       strcpy(sql_authcheck_table,"radcheck");
-       strcpy(sql_authreply_table,"radreply");
-       strcpy(sql_groupcheck_table,"radgroupcheck");
-       strcpy(sql_groupreply_table,"radgroupreply");
-       strcpy(sql_usergroup_table,"usergroup");
-       strcpy(sql_realmgroup_table,"realmgroup");
-       strcpy(sql_acct_table,"radacct");
-       strcpy(sql_nas_table,"nas");
-       strcpy(sql_realm_table, "realms");
-       strcpy(sql_dict_table,"dictionary");
-       sqltrace = 0;
-       sql_keepopen = 0;
-
-       sprintf(sqlfile, "%s/%s", radius_dir, MYSQLCONFIG);
+       strcpy(sql->config.sql_server,"localhost");
+       strcpy(sql->config.sql_login,"");
+       strcpy(sql->config.sql_password,"");
+       strcpy(sql->config.sql_db,"radius");
+       strcpy(sql->config.sql_authcheck_table,"radcheck");
+       strcpy(sql->config.sql_authreply_table,"radreply");
+       strcpy(sql->config.sql_groupcheck_table,"radgroupcheck");
+       strcpy(sql->config.sql_groupreply_table,"radgroupreply");
+       strcpy(sql->config.sql_usergroup_table,"usergroup");
+       strcpy(sql->config.sql_realmgroup_table,"realmgroup");
+       strcpy(sql->config.sql_acct_table,"radacct");
+       strcpy(sql->config.sql_nas_table,"nas");
+       strcpy(sql->config.sql_realm_table, "realms");
+       strcpy(sql->config.sql_dict_table,"dictionary");
+       sql->config.sqltrace = 0;
+       sql->config.sql_keepopen = 0;
+
+       sprintf(sqlfile, "%s/%s", radius_dir, SQLCONFIGFILE);
 
         if((sqlfd = fopen(sqlfile, "r")) == (FILE *)NULL) {
-                log(L_ERR,"could not read mysql configuration file %s",sqlfile);
+                log(L_ERR,"could not read sql configuration file %s",sqlfile);
                 return(-1);
         }
 
@@ -81,12 +87,28 @@ static int icradius_init(int rehup) {
                         continue;
                 }
 
+                if(strncasecmp(buffer, "type", 4) == 0) {
+                        /* Read the SERVER line */
+                        if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
+                               log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
+                       } else {
+                         strcpy(sql->config.sql_type,namestr);
+                       }
+               }
                 if(strncasecmp(buffer, "server", 6) == 0) {
                         /* Read the SERVER line */
                         if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
                                log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
                        } else {
-                         strcpy(sql_server,namestr);
+                         strcpy(sql->config.sql_server,namestr);
+                       }
+               }
+                if(strncasecmp(buffer, "port", 4) == 0) {
+                        /* Read the SERVER line */
+                        if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
+                               log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
+                       } else {
+                         sql->config.sql_port = strtol(namestr, (char **)NULL, 10);
                        }
                }
                 if(strncasecmp(buffer, "login", 5) == 0) {
@@ -94,7 +116,7 @@ static int icradius_init(int rehup) {
                         if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
                                log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
                        } else {
-                         strcpy(sql_login,namestr);
+                         strcpy(sql->config.sql_login,namestr);
                        }
                }
                 if(strncasecmp(buffer, "password", 8) == 0) {
@@ -102,7 +124,7 @@ static int icradius_init(int rehup) {
                         if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
                                log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
                        } else {
-                         strcpy(sql_password,namestr);
+                         strcpy(sql->config.sql_password,namestr);
                        }
                }
                 if(strncasecmp(buffer, "radius_db", 9) == 0) {
@@ -110,7 +132,7 @@ static int icradius_init(int rehup) {
                         if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
                                log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
                        } else {
-                         strcpy(sql_db,namestr);
+                         strcpy(sql->config.sql_db,namestr);
                        }
                }
                 if(strncasecmp(buffer, "authcheck_table", 15) == 0) {
@@ -118,7 +140,7 @@ static int icradius_init(int rehup) {
                         if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
                                log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
                        } else {
-                         strncpy(sql_authcheck_table,namestr, MAX_TABLE_LEN);
+                         strncpy(sql->config.sql_authcheck_table,namestr, MAX_TABLE_LEN);
                        }
                }
                 if(strncasecmp(buffer, "authreply_table", 15) == 0) {
@@ -126,7 +148,7 @@ static int icradius_init(int rehup) {
                         if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
                                log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
                        } else {
-                         strncpy(sql_authreply_table,namestr, MAX_TABLE_LEN);
+                         strncpy(sql->config.sql_authreply_table,namestr, MAX_TABLE_LEN);
                        }
                }
                 if(strncasecmp(buffer, "groupcheck_table", 16) == 0) {
@@ -134,7 +156,7 @@ static int icradius_init(int rehup) {
                         if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
                                log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
                        } else {
-                         strncpy(sql_groupcheck_table,namestr, MAX_TABLE_LEN);
+                         strncpy(sql->config.sql_groupcheck_table,namestr, MAX_TABLE_LEN);
                        }
                }
                 if(strncasecmp(buffer, "groupreply_table", 16) == 0) {
@@ -142,7 +164,7 @@ static int icradius_init(int rehup) {
                         if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
                                log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
                        } else {
-                         strncpy(sql_groupreply_table,namestr, MAX_TABLE_LEN);
+                         strncpy(sql->config.sql_groupreply_table,namestr, MAX_TABLE_LEN);
                        }
                }
                 if(strncasecmp(buffer, "usergroup_table", 15) == 0) {
@@ -150,7 +172,7 @@ static int icradius_init(int rehup) {
                         if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
                                log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
                        } else {
-                         strncpy(sql_usergroup_table,namestr, MAX_TABLE_LEN);
+                         strncpy(sql->config.sql_usergroup_table,namestr, MAX_TABLE_LEN);
                        }
                }
                 if(strncasecmp(buffer, "realmgroup_table", 16) == 0) {
@@ -158,7 +180,7 @@ static int icradius_init(int rehup) {
                         if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
                                log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
                        } else {
-                         strncpy(sql_realmgroup_table,namestr, MAX_TABLE_LEN);
+                         strncpy(sql->config.sql_realmgroup_table,namestr, MAX_TABLE_LEN);
                        }
                }
                 if(strncasecmp(buffer, "acct_table", 10) == 0) {
@@ -166,7 +188,7 @@ static int icradius_init(int rehup) {
                         if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
                                log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
                        } else {
-                         strncpy(sql_acct_table,namestr, MAX_TABLE_LEN);
+                         strncpy(sql->config.sql_acct_table,namestr, MAX_TABLE_LEN);
                        }
                }
                 if(strncasecmp(buffer, "nas_table", 9) == 0) {
@@ -174,7 +196,7 @@ static int icradius_init(int rehup) {
                         if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
                                log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
                        } else {
-                         strncpy(sql_nas_table,namestr, MAX_TABLE_LEN);
+                         strncpy(sql->config.sql_nas_table,namestr, MAX_TABLE_LEN);
                        }
                }
                 if(strncasecmp(buffer, "realm_table", 9) == 0) {
@@ -182,7 +204,7 @@ static int icradius_init(int rehup) {
                        if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
                                log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
                       } else {
-                         strncpy(sql_realm_table,namestr, MAX_TABLE_LEN);
+                         strncpy(sql->config.sql_realm_table,namestr, MAX_TABLE_LEN);
                       }
                }
                 if(strncasecmp(buffer, "dict_table", 9) == 0) {
@@ -190,7 +212,7 @@ static int icradius_init(int rehup) {
                         if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
                                log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
                        } else {
-                         strncpy(sql_dict_table,namestr, MAX_TABLE_LEN);
+                         strncpy(sql->config.sql_dict_table,namestr, MAX_TABLE_LEN);
                        }
                }
                 if(strncasecmp(buffer, "sqltrace", 8) == 0) {
@@ -199,9 +221,9 @@ static int icradius_init(int rehup) {
                                log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
                       } else {
                          if(strncasecmp(namestr, "on", 2) == 0) {
-                           sqltrace = 1;
+                           sql->config.sqltrace = 1;
                          } else {
-                           sqltrace = 0;
+                           sql->config.sqltrace = 0;
                          }
                        }
                }
@@ -211,9 +233,9 @@ static int icradius_init(int rehup) {
                                log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
                        } else {
                          if(strncasecmp(namestr, "yes", 3) == 0) {
-                           sql_keepopen = 1;
+                           sql->config.sql_keepopen = 1;
                         } else {
-                           sql_keepopen = 0;
+                           sql->config.sql_keepopen = 0;
                         }
                        }
                }
@@ -222,24 +244,13 @@ static int icradius_init(int rehup) {
        fclose(sqlfd);
        
        log(L_INFO,"SQL: Attempting to connect to %s@%s:%s",
-       sql_login,
-       sql_server,
-       sql_db);
+       sql->config.sql_login,
+       sql->config.sql_server,
+       sql->config.sql_db);
 
        if (sql_keepopen) {
 
-           /* Connect to the database server */
-           mysql_init(&MyAuthConn);
-           if (!(MyAuthSock = mysql_real_connect(&MyAuthConn, mysql_server, mysql_login, mysql_password, mysql_db, 0, NULL, 0))) {
-                log(L_ERR, "Init: Couldn't connect authentication socket to MySQL server on %s as %s", mysql_server, mysql_login);
-                MyAuthSock = NULL;
-           }
-           mysql_init(&MyAcctConn);
-           if (!(MyAcctSock = mysql_real_connect(&MyAcctConn, mysql_server, mysql_login, mysql_password, mysql_db, 0, NULL, 0))) {
-                log(L_ERR, "Init: Couldn't connect accounting socket to MySQL server on %s as %s", mysql_server, mysql_login);
-                MyAcctSock = NULL;
-           }
-       }
+          sql_connect(sql);
            
        return 0;
 }
@@ -554,11 +565,11 @@ static int icradius_accounting(REQUEST *request) {
 
 /* globally exported name */
 module_t rlm_module = {
-  "icradius",
-  0,                           /* type: reserved */
-  icradius_init,               /* initialization */
-  icradius_authorize,          /* authorization */
-  icradius_authenticate,       /* authentication */
-  icradius_accounting,         /* accounting */
-  icradius_detach,             /* detach */
+  "rlm_sql",
+  0,                   /* type: reserved */
+  rlm_sql_init,                /* initialization */
+  rlm_sql_authorize,   /* authorization */
+  rlm_sql_authenticate,        /* authentication */
+  rlm_sql_accounting,  /* accounting */
+  rlm_sql_detach,      /* detach */
 };
index d5d7c18..a532eff 100644 (file)
@@ -1,20 +1,22 @@
-/* cistron mysql module
+/* freeradius sql module
 *          Mike Machado
 *          InnerCite
 *          mike@innercite.com
 */
 
-
-#define        SQLBIGREC       32
-#define        SQLLILREC       16
 #define QUERYLOG       "/var/log/radacct/radius.sql"
 #define SQLCONFIGFILE  "radius.conf"
 #define SQLBACKUP      "/var/log/radacct/sqlbackup.dat"
 
+#define        SQLBIGREC       32
+#define        SQLLILREC       16
 #define PW_VP_USERDATA 1
 #define PW_VP_GROUPDATA        2
 
-typedef struct mysqlrec {
+#define MAX_TABLE_LEN 20
+#define MAX_AUTH_QUERY_LEN 256
+
+typedef struct sqlrec {
        char            AcctSessionId[SQLBIGREC];
         char            UserName[SQLBIGREC];
         char            Realm[SQLBIGREC];
@@ -36,14 +38,12 @@ typedef struct mysqlrec {
         char            FramedProtocol[SQLBIGREC];
         char            FramedIPAddress[SQLLILREC];
         unsigned long  AcctDelayTime;
-} MYSQLREC; 
-
-#define SQL_LOCK_LEN sizeof(MYSQLREC)
-#define MAX_TABLE_LEN 20
-#define MAX_AUTH_QUERY_LEN 256
+} SQLREC; 
 
 typedef struct sqlconfig {
+       char            sql_type[40];
        char            sql_server[40];
+       int             sql_port;
        char            sql_login[20];
        char            sql_password[20];
        char            sql_db[20];
@@ -61,10 +61,14 @@ typedef struct sqlconfig {
        int             sqltrace;
 } SQLCONFIG;
 
-MYSQL *MyAuthSock;
-MYSQL *MyAcctSock;
-MYSQL MyAuthConn;
-MYSQL MyAcctConn;
+typedef struct sql {
+       SQLSOCK         *AuthSock;
+       SQLSOCK         *AcctSock;
+       SQLREC          sqlrecord;
+       SQLCONFIG       config;
+} SQL;
+       
+#define SQL_LOCK_LEN sizeof(SQLREC)
 
 int            sql_start();
 int            sql_save_acct(MYSQLREC *sqlrecord);
index 228e46f..928080f 100644 (file)
 #include       <errno.h>
 #include       <sys/wait.h>
 
-#include       "rlm_mysql.h"
+#include       "rlm_sql.h"
 #include       "radiusd.h"
 
 
 
+
 /*************************************************************************
  *
- *     Function: mysql_start
+ *     Function: sql_connect
  *
- *     Purpose: Reads in MySQL Config Fil
+ *     Purpose: Connect to the SQL dataas
  *
  *************************************************************************/
+int sql_conenct(SQL *sql) {
 
-int mysql_start ()
-{
-       FILE    *sqlfd;
-        char    dummystr[64];
-        char    namestr[64];
-        int     line_no;
-        char    buffer[256];
-        char    sqlfile[256];
-       MyAuthSock = NULL;
-       MyAcctSock = NULL;
-       
-       strcpy(mysql_server,"localhost");
-       strcpy(mysql_login,"");
-       strcpy(mysql_password,"");
-       strcpy(mysql_db,"radius");
-       strcpy(mysql_authcheck_table,"radcheck");
-       strcpy(mysql_authreply_table,"radreply");
-       strcpy(mysql_groupcheck_table,"radgroupcheck");
-       strcpy(mysql_groupreply_table,"radgroupreply");
-       strcpy(mysql_usergroup_table,"usergroup");
-       strcpy(mysql_realmgroup_table,"realmgroup");
-       strcpy(mysql_acct_table,"radacct");
-       strcpy(mysql_nas_table,"nas");
-       strcpy(mysql_realm_table, "realms");
-       strcpy(mysql_dict_table,"dictionary");
-       sqltrace = 0;
-       mysql_keepopen = 0;
-
-        sprintf(sqlfile, "%s/%s", radius_dir, MYSQLCONFIG);
-        if((sqlfd = fopen(sqlfile, "r")) == (FILE *)NULL) {
-                log(L_ERR,"could not read mysql configuration file %s",sqlfile);
-                return(-1);
-        }
-
-        line_no = 0;
-        while(fgets(buffer, sizeof(buffer), sqlfd) != (char *)NULL) {
-                line_no++;
-
-                /* Skip empty space */
-                if(*buffer == '#' || *buffer == '\0' || *buffer == '\n') {
-                        continue;
-                }
+       MYSQL MyAuthConn;
+       MYSQL MyAcctConn;
+       
+       /* Connect to the database server */
+       mysql_init(&MyAuthConn);
+       if (!(sql->AuthSock = mysql_real_connect(&MyAuthConn, sql->config.sql_server, sql->config.sql_login, sql->config.sql_password, sql->config.sql_db, 0, NULL, 0))) {
+               log(L_ERR, "Init: Couldn't connect authentication socket to SQL server %s@%s", sql->config.sql_login, sql->config.sql_server);
+               sql->AuthSock = NULL;
+               return 0;
+       }
+       mysql_init(&MyAcctConn);
 
-                if(strncasecmp(buffer, "server", 6) == 0) {
-                        /* Read the SERVER line */
-                        if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
-                               log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
-                       } else {
-                         strcpy(mysql_server,namestr);
-                       }
-               }
-                if(strncasecmp(buffer, "login", 5) == 0) {
-                        /* Read the LOGIN line */
-                        if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
-                               log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
-                       } else {
-                         strcpy(mysql_login,namestr);
-                       }
-               }
-                if(strncasecmp(buffer, "password", 8) == 0) {
-                        /* Read the PASSWORD line */
-                        if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
-                               log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
-                       } else {
-                         strcpy(mysql_password,namestr);
-                       }
-               }
-                if(strncasecmp(buffer, "radius_db", 9) == 0) {
-                        /* Read the RADIUS_DB line */
-                        if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
-                               log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
-                       } else {
-                         strcpy(mysql_db,namestr);
-                       }
-               }
-                if(strncasecmp(buffer, "authcheck_table", 15) == 0) {
-                        /* Read the AUTHCHECK_TABLE line */
-                        if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
-                               log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
-                       } else {
-                         strncpy(mysql_authcheck_table,namestr, MAX_TABLE_LEN);
-                       }
-               }
-                if(strncasecmp(buffer, "authreply_table", 15) == 0) {
-                        /* Read the AUTHREPLY_TABLE line */
-                        if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
-                               log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
-                       } else {
-                         strncpy(mysql_authreply_table,namestr, MAX_TABLE_LEN);
-                       }
-               }
-                if(strncasecmp(buffer, "groupcheck_table", 16) == 0) {
-                        /* Read the GROUPCHECK_TABLE line */
-                        if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
-                               log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
-                       } else {
-                         strncpy(mysql_groupcheck_table,namestr, MAX_TABLE_LEN);
-                       }
-               }
-                if(strncasecmp(buffer, "groupreply_table", 16) == 0) {
-                        /* Read the GROUP_REPLY_TABLE line */
-                        if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
-                               log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
-                       } else {
-                         strncpy(mysql_groupreply_table,namestr, MAX_TABLE_LEN);
-                       }
-               }
-                if(strncasecmp(buffer, "usergroup_table", 15) == 0) {
-                        /* Read the USERGROUP_TABLE line */
-                        if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
-                               log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
-                       } else {
-                         strncpy(mysql_usergroup_table,namestr, MAX_TABLE_LEN);
-                       }
-               }
-                if(strncasecmp(buffer, "realmgroup_table", 16) == 0) {
-                        /* Read the REALMGROUP_TABLE line */
-                        if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
-                               log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
-                       } else {
-                         strncpy(mysql_realmgroup_table,namestr, MAX_TABLE_LEN);
-                       }
-               }
-                if(strncasecmp(buffer, "acct_table", 10) == 0) {
-                        /* Read the ACCT_TABLE line */
-                        if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
-                               log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
-                       } else {
-                         strncpy(mysql_acct_table,namestr, MAX_TABLE_LEN);
-                       }
-               }
-                if(strncasecmp(buffer, "nas_table", 9) == 0) {
-                        /* Read the NAS_TABLE line */
-                        if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
-                               log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
-                       } else {
-                         strncpy(mysql_nas_table,namestr, MAX_TABLE_LEN);
-                       }
-               }
-                if(strncasecmp(buffer, "realm_table", 9) == 0) {
-                       /* Read the REALM_TABLE line */
-                       if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
-                               log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
-                      } else {
-                         strncpy(mysql_realm_table,namestr, MAX_TABLE_LEN);
-                      }
-               }
-                if(strncasecmp(buffer, "dict_table", 9) == 0) {
-                        /* Read the DICT_TABLE line */
-                        if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
-                               log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
-                       } else {
-                         strncpy(mysql_dict_table,namestr, MAX_TABLE_LEN);
-                       }
-               }
-                if(strncasecmp(buffer, "sqltrace", 8) == 0) {
-                        /* Read the SQLTRACE line */
-                        if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
-                               log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
-                      } else {
-                         if(strncasecmp(namestr, "on", 2) == 0) {
-                           sqltrace = 1;
-                         } else {
-                           sqltrace = 0;
-                         }
-                       }
-               }
-               if(strncasecmp(buffer, "keepopen", 8) == 0) {
-                        /* Read the KEEPOPEN line */
-                        if(sscanf(buffer, "%s%s", dummystr, namestr) != 2) {
-                               log(L_ERR,"invalid attribute on line %d of sqlserver file %s", line_no,sqlfile);
-                       } else {
-                         if(strncasecmp(namestr, "yes", 3) == 0) {
-                           mysql_keepopen = 1;
-                        } else {
-                           mysql_keepopen = 0;
-                        }
-                       }
-               }
-
-       }
-       fclose(sqlfd);
-       
-       log(L_INFO,"MYSQL: Attempting to connect to %s:%s as %s",
-       mysql_server,
-       mysql_db,
-       mysql_login);
-
-       if (mysql_keepopen) {
-           /* Connect to the database server */
-           mysql_init(&MyAuthConn);
-           if (!(MyAuthSock = mysql_real_connect(&MyAuthConn, mysql_server, mysql_login, mysql_password, mysql_db, 0, NULL, 0))) {
-                log(L_ERR, "Init: Couldn't connect authentication socket to MySQL server on %s as %s", mysql_server, mysql_login);
-                MyAuthSock = NULL;
-           }
-           mysql_init(&MyAcctConn);
-           if (!(MyAcctSock = mysql_real_connect(&MyAcctConn, mysql_server, mysql_login, mysql_password, mysql_db, 0, NULL, 0))) {
-                log(L_ERR, "Init: Couldn't connect accounting socket to MySQL server on %s as %s", mysql_server, mysql_login);
-                MyAcctSock = NULL;
-           }
-       }
-           
-       return 0;
+       if (!(sql->AcctSock = mysql_real_connect(&MyAcctConn, sql->config.sql_server, sql->config.sql_login, sql->config.sql_password, sql->config.sql_db, 0, NULL, 0))) {
+               log(L_ERR, "Init: Couldn't connect accounting socket to SQL server %s@%s", sql->config.sql_login, sql->config.sql_server);
+               sql->AcctSock = NULL;
+               return 0;
+       }
 }
 
+
 /*************************************************************************
  *
- *     Function: mysql_save_acct
+ *     Function: sql_save_acct
  *
  *     Purpose: Write data from the sqlrecord structure to the database
  *
  *************************************************************************/
 
-int mysql_save_acct(MYSQLREC *sqlrecord) {
+int sql_save_acct(SQL *sql) {
 
        char            querystr[2048];
        FILE            *mysqlfile;
        FILE            *backupfile;
        int             num = 0;
-       MYSQL_RES       *result;
+       SQL_RES         *result;
 #ifdef NT_DOMAIN_HACK
        char            *ptr;
        char            newname[AUTH_STRING_LEN];
@@ -286,7 +102,7 @@ int mysql_save_acct(MYSQLREC *sqlrecord) {
        }
 #endif /* NT_DOMAIN_HACK */
 
- if (mysql_checksocket("Acct")) {
+ if (sql_checksocket("Acct")) {
 
      if (sqlrecord->AcctStatusTypeId == PW_STATUS_ACCOUNTING_ON || sqlrecord->AcctStatusTypeId == PW_STATUS_ACCOUNTING_OFF) {
         log(L_INFO, "Portmaster %s rebooted at %s", sqlrecord->NASIPAddress, sqlrecord->AcctTimeStamp);