Add the database session backups task
authorNeutron Soutmun <neo.neutron@gmail.com>
Thu, 9 Oct 2008 20:26:19 +0000 (03:26 +0700)
committerNeutron Soutmun <neo.neutron@gmail.com>
Sun, 2 Nov 2008 19:43:11 +0000 (02:43 +0700)
2008-10-10  Neutron Soutmun <neo.neutron@gmail.com>

* configure.ac:
  - Add the module checking for libgda which require to build the new
    database session backups (sqlite3).
  - Add the major, minor and micro variables to easy handle the future
    version bump.
  - Add VERSION and PROGRAM variables which will be used in the core program.
  - Add data/Makefile.
- Add src/include/linux/netfilter_ipv4/Makefile to include it in the
  distribution. (make dist-*)
* src/rahunasd.{h,c}: Update the code which using VERSION and PROGRAM
  corresponding to the build config.
* +data/Makefile.am, +data/rahunas.db, Makefile.am:
  Add data dir which now contains sqlite3 db file and update makefile.
* +src/rh-task-dbset.{h,c}:
  Add the database session backups task.
* src/Makefile.am:
  - Update corresponding to the new database session backups task.
  - Add missing header files to rahunasd_SOURCES which they are not included
  in the distribution. (make dist-*)
* src/rh-config.h: Define DB_NAME which using by task-dbset.
* src/rh-task-ipset.c:
  - Update taskprio from 1 to 2 for the appropriate
    point of working which now the ipset is the middle priority task.
  - Update the positions of the logmsg. (Debuging purpose)
* src/rh-task-memset.c:
  - Update taskprio from 2 to 3 for the appropriate
    point of working which now the memset is the most priority task.
  - Update the positions of the logmsg. (Debuging purpose)
* src/rh-task.{h,c}:
  - Change the way to handle the tasklist from singly linked-list to the
    GList from GLib which can handle the forward and backward link. (Doubly
  linked-list), the tasks eq. stopservice, stopsess, cleanup need to start
    from the least priority first. (Prevent the most significant data in
    memset was deleted which will cause the failures of the other tasks that
depend on it.
  - Update the struct task structure by remove unneeded *next which now we
    handle the task list by the GList.
* src/rh-xmlrpc-server.c: Move the req.id and req.req_opt to the inner of
  the condition checking because of their values not even use if the
  conditions are not true.
* +src/include/linux/netfilter_ipv4/Makefile.am: Add the header files in this
  dir to EXTRA_DIST which they will be distribute in the distribution.

17 files changed:
ChangeLog
Makefile.am
configure.ac
data/Makefile.am [new file with mode: 0644]
data/rahunas.db [new file with mode: 0644]
src/Makefile.am
src/include/linux/netfilter_ipv4/Makefile.am [new file with mode: 0644]
src/rahunasd.c
src/rahunasd.h
src/rh-config.h
src/rh-task-dbset.c
src/rh-task-ipset.c
src/rh-task-memset.c
src/rh-task.c
src/rh-task.h
src/rh-xmlrpc-server.c
xmlrpc/Makefile.in [deleted file]

index 1e60ca2..7193f62 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,48 @@
+2008-10-10  Neutron Soutmun <neo.neutron@gmail.com>
+
+       * configure.ac:
+         - Add the module checking for libgda which require to build the new 
+           database session backups (sqlite3).
+         - Add the major, minor and micro variables to easy handle the future 
+           version bump.
+         - Add VERSION and PROGRAM variables which will be used in the core program.
+         - Add data/Makefile.
+               - Add src/include/linux/netfilter_ipv4/Makefile to include it in the 
+                 distribution. (make dist-*) 
+       * src/rahunasd.{h,c}: Update the code which using VERSION and PROGRAM 
+                 corresponding to the build config.
+       * +data/Makefile.am, +data/rahunas.db, Makefile.am: 
+         Add data dir which now contains sqlite3 db file and update makefile.
+       * +src/rh-task-dbset.{h,c}:     
+         Add the database session backups task.
+       * src/Makefile.am:
+         - Update corresponding to the new database session backups task.
+         - Add missing header files to rahunasd_SOURCES which they are not included
+                 in the distribution. (make dist-*)
+       * src/rh-config.h: Define DB_NAME which using by task-dbset.  
+       * src/rh-task-ipset.c: 
+         - Update taskprio from 1 to 2 for the appropriate 
+           point of working which now the ipset is the middle priority task.
+         - Update the positions of the logmsg. (Debuging purpose)
+       * src/rh-task-memset.c:
+         - Update taskprio from 2 to 3 for the appropriate 
+           point of working which now the memset is the most priority task.
+         - Update the positions of the logmsg. (Debuging purpose)
+       * src/rh-task.{h,c}: 
+         - Change the way to handle the tasklist from singly linked-list to the
+           GList from GLib which can handle the forward and backward link. (Doubly
+                 linked-list), the tasks eq. stopservice, stopsess, cleanup need to start 
+           from the least priority first. (Prevent the most significant data in 
+           memset was deleted which will cause the failures of the other tasks that 
+                       depend on it.
+         - Update the struct task structure by remove unneeded *next which now we
+           handle the task list by the GList.
+       * src/rh-xmlrpc-server.c: Move the req.id and req.req_opt to the inner of 
+         the condition checking because of their values not even use if the 
+         conditions are not true.
+       * +src/include/linux/netfilter_ipv4/Makefile.am: Add the header files in this 
+         dir to EXTRA_DIST which they will be distribute in the distribution.
+
 2008-09-12  Neutron Soutmun <neo.neutron@gmail.com>
 
        * +src/rh-task-*.{h,c}: 
index 4935283..615d8c8 100644 (file)
@@ -1 +1 @@
-SUBDIRS = xmlrpc src
+SUBDIRS = xmlrpc src data
index ee7db99..98a1068 100644 (file)
@@ -1,13 +1,21 @@
 #                                               -*- Autoconf -*-
 # Process this file with autoconf to produce a configure script.
 
+m4_define(major, 0)
+m4_define(minor, 1)
+m4_define(micro, 1)
+
 AC_PREREQ(2.61)
-AC_INIT([RahuNAS],[0.1],[neo.neutron@gmail.com] )
+RAHUNAS_VERSION=0.1.1
+AC_INIT([RahuNAS], major.minor.micro,[neo.neutron@gmail.com] )
 AM_INIT_AUTOMAKE([-Wall -Werror foreign])
 AM_MAINTAINER_MODE
 AC_CONFIG_SRCDIR([src/rahunasd.h])
 AC_CONFIG_HEADER([config.h])
 
+AC_SUBST(RAHUNAS_VERSION, major.minor.micro)
+AC_SUBST(PROGRAM, "RahuNAS")
+
 # Checks for programs.
 AC_PROG_CC
 AC_PROG_RANLIB
@@ -21,6 +29,13 @@ PKG_CHECK_MODULES(LIBGNET, [ gnet-2.0 >= $GNET_REQ ], , [ AC_MSG_ERROR([GNet is
 AC_SUBST(LIBGNET_CFLAGS)
 AC_SUBST(LIBGNET_LIBS)
 
+dnl Check for LibGDA 3.x
+LIBGDA_REQ=3.0.2
+PKG_CHECK_MODULES(LIBGDA, [ libgda-3.0 >= $LIBGDA_REQ ], , [ AC_MSG_ERROR([LibGDA is required]) ])
+
+AC_SUBST(LIBGDA_CFLAGS)
+AC_SUBST(LIBGDA_LIBS)
+
 # Checks for header files.
 AC_HEADER_STDC
 AC_HEADER_SYS_WAIT
@@ -42,6 +57,8 @@ AC_CONFIG_FILES([
        Makefile
        xmlrpc/Makefile
        src/Makefile
+       data/Makefile
+  src/include/linux/netfilter_ipv4/Makefile
 ])
 
 AC_OUTPUT
diff --git a/data/Makefile.am b/data/Makefile.am
new file mode 100644 (file)
index 0000000..2d4620f
--- /dev/null
@@ -0,0 +1,5 @@
+# Rahunas configuration and database file
+configdir = $(sysconfdir)/rahunas
+config_DATA = rahunas.db
+
+EXTRA_DIST = $(config_DATA)
diff --git a/data/rahunas.db b/data/rahunas.db
new file mode 100644 (file)
index 0000000..c5f14a6
Binary files /dev/null and b/data/rahunas.db differ
index 83118c9..2c794a0 100644 (file)
@@ -1,19 +1,41 @@
+SUBDIRS = include/linux/netfilter_ipv4
+
 bin_PROGRAMS = rahunasd
 
 IPSET_VERSION:=2.3.3
 
-AM_CFLAGS = $(LIBGNET_CFLAGS) -I$(top_builddir)/src/include/ \
-       -DIPSET_VERSION=\"$(IPSET_VERSION)\"
+AM_CFLAGS = \
+       $(LIBGNET_CFLAGS) \
+       $(LIBGDA_CFLAGS) \
+       -I$(top_builddir)/src/include/ \
+       -DRAHUNAS_VERSION=\"$(RAHUNAS_VERSION)\" \
+       -DPROGRAM=\"$(PROGRAM)\" \
+       -DIPSET_VERSION=\"$(IPSET_VERSION)\" \
+       -DRAHUNAS_CONF_DIR=\"$(sysconfdir)/rahunas/\"
 
-rahunasd_SOURCES = rahunasd.c \
+rahunasd_SOURCES = \
+       rahunasd.c \
+       rahunasd.h \
        rh-xmlrpc-server.c \
+       rh-xmlrpc-server.h \
        rh-xmlrpc-cmd.c \
+       rh-xmlrpc-cmd.h \
   rh-ipset.c \
+       rh-ipset.h \
        rh-utils.c \
+       rh-utils.h \
        rh-task.c \
+       rh-task.h \
        rh-task-ipset.c \
-       rh-task-memset.c
+       rh-task-ipset.h \
+       rh-task-memset.c \
+       rh-task-memset.h \
+       rh-task-dbset.c \
+       rh-task-dbset.h \
+  rh-radius.h \
+       rh-config.h
 
 rahunasd_LDADD =  \
        $(top_builddir)/xmlrpc/libgnetxmlrpc.a \
-       $(LIBGNET_LIBS)
+       $(LIBGNET_LIBS) \
+       $(LIBGDA_LIBS)
diff --git a/src/include/linux/netfilter_ipv4/Makefile.am b/src/include/linux/netfilter_ipv4/Makefile.am
new file mode 100644 (file)
index 0000000..f743ac5
--- /dev/null
@@ -0,0 +1,3 @@
+EXTRA_DIST= \
+       ip_set.h \
+       ip_set_rahunas.h
index af22ed7..766d2f0 100644 (file)
@@ -355,7 +355,7 @@ int main(int argc, char **argv)
 
   dup2(fd_log, STDERR_FILENO);
 
-  sprintf(version, "Starting %s - Version %s", PROGRAM, VERSION);
+  sprintf(version, "Starting %s - Version %s", PROGRAM, RAHUNAS_VERSION);
        logmsg(RH_LOG_NORMAL, version);
   syslog(LOG_INFO, version);
 
index f228f9f..6ef3da5 100644 (file)
@@ -19,8 +19,6 @@
 #include "rh-config.h"
 #include "rh-utils.h"
 
-#define PROGRAM "RahuNASd"
-#define VERSION "0.1.1"
 #define MAX_MEMBERS 0x00FFFF
 
 extern struct rahunas_map *map;
index 1bcbf3a..e2fad77 100644 (file)
@@ -24,4 +24,6 @@
 #define XMLSERVICE_PORT        8888
 #define XMLSERVICE_URL "/xmlrpc_service.php"
 
+#define DB_NAME "rahunas"
+
 #endif // __RH_CONFIG_H
index 906c1c4..abb7cd5 100644 (file)
 #include <stdlib.h>
 #include <syslog.h>
 #include <time.h>
+#include <string.h>
+#include <libgda/libgda.h>
 #include "rahunasd.h"
 #include "rh-task.h"
 #include "rh-ipset.h"
 
-/* Initialize */
-static void init (void)
+struct dbset_row {
+  gchar *session_id;
+  gchar *username;
+  gchar *ip;
+  gchar *mac;
+  time_t session_start;
+};
+
+gboolean get_errors (GdaConnection * connection)
+{
+  GList *list;
+  GList *node;
+  GdaConnectionEvent *error;
+
+  list = (GList *) gda_connection_get_events(connection);
+
+  for (node = g_list_first(list); node != NULL; node = g_list_next(node)) {
+    error = (GdaConnectionEvent *) node->data;
+    logmsg(RH_LOG_NORMAL, "DB Error no: %d", 
+             gda_connection_event_get_code(error));
+    logmsg(RH_LOG_NORMAL, "DB Desc: %s", 
+             gda_connection_event_get_description(error));
+    logmsg(RH_LOG_NORMAL, "DB Source: %s", 
+             gda_connection_event_get_source(error));
+    logmsg(RH_LOG_NORMAL, "DB SQL State: %s", 
+             gda_connection_event_get_sqlstate(error));
+  }
+}
+
+gboolean *parse_dm_to_struct(GList **data_list, GdaDataModel *dm) {
+  gint  row_id;
+  gint  column_id;
+  GValue *value;
+  gchar  *str;
+  gchar  *title;
+  GdaNumeric *num;
+  struct dbset_row *row;
+  struct tm tm;
+  time_t time;
+
+  char tmp[80];
+
+  for (row_id = 0; row_id < gda_data_model_get_n_rows(dm); row_id++) {
+    row = (struct dbset_row *)g_malloc(sizeof(struct dbset_row));
+    if (row == NULL) {
+      /* Do implement the row list cleanup */
+    }
+
+    *data_list = g_list_append(*data_list, row); 
+
+    for (column_id = 0; column_id < gda_data_model_get_n_columns(dm); 
+           column_id++) {
+
+      title = gda_data_model_get_column_title(dm, column_id);
+      value = gda_data_model_get_value_at (dm, column_id, row_id);
+      str = gda_value_stringify(value);
+               
+      if (strncmp("session_id", title, 10) == 0) {
+        row->session_id = g_strdup(str);
+      } else if (strncmp("username", title, 8) == 0) {
+        row->username = g_strdup(str);
+      } else if (strncmp("ip", title, 2) == 0) {
+        row->ip = g_strdup(str);
+      } else if (strncmp("mac", title, 3) == 0) {
+        row->mac = g_strdup(str);
+      } else if (strncmp("session_start", title, 13) == 0) {
+        strptime(str, "%s", &tm);
+        time = mktime(&tm);
+        memcpy(&row->session_start, &time, sizeof(time_t));
+      } 
+    }
+  }
+  
+  return TRUE;
+}
+
+GList *execute_sql_command(GdaConnection *connection, const gchar *buffer)
+{
+  GdaCommand *command;
+  GList *data_list = NULL;
+  GList *list;
+  GList *node;
+  GdaDataModel *dm;
+  gboolean errors = FALSE;
+
+
+  command = gda_command_new (buffer, GDA_COMMAND_TYPE_SQL,
+                             GDA_COMMAND_OPTION_STOP_ON_ERRORS);
+
+  list = gda_connection_execute_command (connection, command, NULL, NULL);
+  if (list != NULL) {
+    for (node = list; node != NULL; node = g_list_next(node)) {
+      if (GDA_IS_DATA_MODEL(node->data)) {
+        dm = (GdaDataModel *) node->data;
+        parse_dm_to_struct(&data_list, dm);
+        g_object_unref(dm);
+      } else {
+        get_errors (connection);
+        errors = TRUE;  
+      }
+    }
+  }
+
+  gda_command_free(command);
+  
+  return errors == TRUE ? NULL : data_list;
+}
+
+void execute_sql(GdaConnection *connection, const gchar *buffer)
+{
+  GdaCommand *command;
+  
+  command = gda_command_new (buffer, GDA_COMMAND_TYPE_SQL,
+                             GDA_COMMAND_OPTION_STOP_ON_ERRORS);
+  gda_connection_execute_select_command (connection, command, NULL, NULL);
+
+  gda_command_free (command);
+}
+
+void list_datasource (void)
+{
+  GList *ds_list;
+  GList *node;
+  GdaDataSourceInfo *info;
+
+  ds_list = gda_config_get_data_source_list();
+
+  for (node = g_list_first(ds_list); node != NULL; node = g_list_next(node)) {
+    info = (GdaDataSourceInfo *) node->data;
+
+    if (strncmp(info->name, PROGRAM, strlen(PROGRAM)) == 0) {
+      logmsg(RH_LOG_NORMAL, "Datasource: NAME: %s PROVIDER: %s",
+             info->name, info->provider);
+      logmsg(RH_LOG_NORMAL, "  CNC: %s", info->cnc_string);
+      logmsg(RH_LOG_NORMAL, "  DESC: %s", info->description);
+    }
+  }
+
+  gda_config_free_data_source_list(ds_list);
+}
+
+GdaConnection *get_connection(GdaClient *client)
+{
+  return gda_client_open_connection (client, PROGRAM, NULL, NULL,
+                                     GDA_CONNECTION_OPTIONS_NONE, NULL);
+}
+
+void free_data_list(GList *data_list)
 {
+  GList *node;
+  struct dbset_row *row;
+
+  for (node = g_list_first(data_list); node != NULL; 
+         node = g_list_next (node)) {
+    row = (struct dbset_row *) node->data;
+    g_free(row->session_id);
+    g_free(row->username);
+    g_free(row->ip);
+    g_free(row->mac);
+  }
+  
+  g_list_free (data_list);  
+}
+
+gboolean restore_set(GList **data_list, struct rahunas_map *map)
+{
+  GList *node;
   struct rahunas_member *members = NULL;
-  int size;
+  struct dbset_row *row = NULL;
+  uint32_t id;
+
+  if (!map)
+    return FALSE;
+
+  members = map->members;
+
+  node = g_list_first(*data_list);
+
+  if (node == NULL)
+    return TRUE;
 
-  logmsg(RH_LOG_NORMAL, "Task MEMSET init..");  
-  map = (struct rahunas_map*)(rh_malloc(sizeof(struct rahunas_map)));
+  for (node; node != NULL; node = g_list_next(node)) {
+    row = (struct dbset_row *) node->data;
 
-  map->members = NULL;
-  map->size = 0;
+    id = iptoid(map, row->ip);
+    
+    if (id < 0)
+      continue;
 
-  if (get_header_from_set(map) < 0) {
-    syslog(LOG_ERR, "Could not fetch IPSET header");
-    exit(EXIT_FAILURE);
+    // MEMSET
+    members[id].session_id = g_strdup(row->session_id);
+    members[id].username   = g_strdup(row->username);
+    parse_mac(row->mac, &members[id].mac_address); 
+    memcpy(&row->session_start, &members[id].session_start, sizeof(time_t));
+
+    // IPSET
+    set_adtip(rahunas_set, row->ip, row->mac, IP_SET_OP_ADD_IP);
   }
+  return TRUE;
+}
 
-  size = map->size == 0 ? MAX_MEMBERS : map->size;
+/* Initialize */
+static void init (void)
+{
+  char ds_name[] = PROGRAM;
+  char ds_provider[] = "SQLite";
+  char ds_cnc_string[] = "DB_DIR=" RAHUNAS_CONF_DIR ";DB_NAME=" DB_NAME; 
+  char ds_desc[] = "RahuNAS DB Set";
 
-       members = 
-    (struct rahunas_member*)(rh_malloc(sizeof(struct rahunas_member)*size));
+  logmsg(RH_LOG_NORMAL, "Task DBSET init..");  
 
-       memset(members, 0, sizeof(struct rahunas_member)*size);
+  gda_init(PROGRAM, RAHUNAS_VERSION, NULL, NULL);
 
-       map->members = members;
+  gda_config_save_data_source(ds_name, ds_provider, ds_cnc_string, ds_desc,
+                              NULL, NULL, FALSE);
+  list_datasource();
 }
 
 /* Cleanup */
 static void cleanup (void)
 {
-  struct rahunas_member *members = NULL;
-       int i;
-  int end;
-
-  if (map) {
-    if (map->members) {
-      members = map->members;
-      end = map->size;
-    } else {
-      end = 0;
-    }  
-
-         for (i=0; i < end; i++) {
-                         rh_free_member(&members[i]);
-               }
-
-               rh_free(&(map->members));
-               rh_free(&map);
-       }
-
-  logmsg(RH_LOG_NORMAL, "Task MEMSET cleanup..");  
-  return 0;
+  char ds_name[] = PROGRAM;
+
+  logmsg(RH_LOG_NORMAL, "Task DBSET cleanup..");  
+  
+  gda_config_remove_data_source (ds_name);
 }
 
 
 /* Start service task */
 static int startservice (struct rahunas_map *map)
 {
-  /* Do nothing or need to implement */
+  GdaClient *client;
+  GdaConnection *connection;
+  GList *data_list;
+  GList *node;
+  struct dbset_row *row;
+
+  logmsg(RH_LOG_NORMAL, "Task DBSET start..");  
+
+  client = gda_client_new ();
+  connection = gda_client_open_connection (client, PROGRAM, NULL, NULL,
+                 GDA_CONNECTION_OPTIONS_READ_ONLY, NULL);
+
+  data_list = execute_sql_command(connection, "SELECT * FROM dbset");
+
+  restore_set(&data_list, map);
+
+  free_data_list(data_list);
+
+  g_object_unref(G_OBJECT(client));
+
+  return 0;
 }
 
 /* Stop service task */
 static int stopservice  (struct rahunas_map *map)
 {
   /* Do nothing or need to implement */
+  logmsg(RH_LOG_NORMAL, "Task DBSET stop..");  
 }
 
 /* Start session task */
 static int startsess (struct rahunas_map *map, struct task_req *req)
 {
-       struct rahunas_member *members = map->members;
-  uint32_t id = req->id;
-
-  members[id].flags = 1;
-  if (members[id].username && members[id].username != termstring)
-    free(members[id].username);
-
-  if (members[id].session_id && members[id].username != termstring)
-    free(members[id].session_id);
+  GdaClient *client;
+  GdaConnection *connection;
+  gint res;
+  char startsess_cmd[256];
+  char time_str[32];
 
-  members[id].username   = strdup(req->username);
-  if (!members[id].username)
-    members[id].username = termstring;
+  client = gda_client_new ();
+  connection = gda_client_open_connection (client, PROGRAM, NULL, NULL,
+                 GDA_CONNECTION_OPTIONS_NONE, NULL);
+  
+  strftime(&time_str, sizeof time_str, "%s", localtime(&req->session_start));
+  sprintf(startsess_cmd, "INSERT INTO dbset"
+         "(session_id,username,ip,mac,session_start) "
+         "VALUES('%s','%s','%s','%s',%s)",
+         req->session_id, req->username, idtoip(map, req->id), 
+         mac_tostring(req->mac_address), time_str);
 
-  members[id].session_id = strdup(req->session_id);
-  if (!members[id].session_id)
-    members[id].session_id = termstring;
+  DP("SQL: %s", startsess_cmd);
 
-       time(&(members[id].session_start));
-  memcpy(&req->session_start, &members[id].session_start, sizeof(time_t));
+  execute_sql(connection, startsess_cmd);
 
-  memcpy(&members[id].mac_address, &(req->mac_address), ETH_ALEN);
+  g_object_unref(G_OBJECT(client)); 
 
-  logmsg(RH_LOG_NORMAL, "Session Start, User: %s, IP: %s, "
-                        "Session ID: %s, MAC: %s",
-                        members[id].username, 
-                        idtoip(map, id), 
-                        members[id].session_id,
-                        mac_tostring(members[id].mac_address)); 
   return 0;
 }
 
 /* Stop session task */
-static int stopsess  (struct rahunas_map *map, struct task_req *req)
+static int stopsess (struct rahunas_map *map, struct task_req *req)
 {
-       struct rahunas_member *members = map->members;
-  uint32_t id = req->id;
+  GdaClient *client;
+  GdaConnection *connection;
+  gint res;
+  char stopsess_cmd[256];
 
-  if (!members[id].username)
-    members[id].username = termstring;
+  client = gda_client_new ();
+  connection = gda_client_open_connection (client, PROGRAM, NULL, NULL,
+                 GDA_CONNECTION_OPTIONS_NONE, NULL);
 
-  if (!members[id].session_id)
-    members[id].session_id = termstring;
+  DP("Username  : %s", map->members[req->id].username);
+  DP("SessionID : %s", map->members[req->id].session_id);
 
-  logmsg(RH_LOG_NORMAL, "Session Stop, User: %s, IP: %s, "
-                        "Session ID: %s, MAC: %s",
-                        members[id].username, 
-                        idtoip(map, id), 
-                        members[id].session_id,
-                        mac_tostring(members[id].mac_address)); 
+  sprintf(stopsess_cmd, "DELETE FROM dbset WHERE "
+         "session_id='%s' AND username='%s'",
+         map->members[req->id].session_id, 
+         map->members[req->id].username);
 
-  rh_free_member(&members[id]);   
+  DP("SQL: %s", stopsess_cmd);
+
+  execute_sql(connection, stopsess_cmd);
+
+  g_object_unref(G_OBJECT(client)); 
 
   return 0;
 }
 
 /* Commit start session task */
@@ -162,9 +358,9 @@ static int rollbackstopsess  (struct rahunas_map *map, struct task_req *req)
   /* Do nothing or need to implement */
 }
 
-static struct task task_memset = {
-  .taskname = "MEMSET",
-  .taskprio = 2,
+static struct task task_dbset = {
+  .taskname = "DBSET",
+  .taskprio = 1,
   .init = &init,
   .cleanup = &cleanup,
   .startservice = &startservice,
@@ -177,6 +373,6 @@ static struct task task_memset = {
   .rollbackstopsess = &rollbackstopsess,
 };
 
-void rh_task_memset_reg(void) {
-  task_register(&task_memset);
+void rh_task_dbset_reg(void) {
+  task_register(&task_dbset);
 }
index 62ddf0a..691ad06 100644 (file)
@@ -56,10 +56,10 @@ static void init (void)
 /* Cleanup */
 static void cleanup (void)
 {
+  logmsg(RH_LOG_NORMAL, "Task IPSET cleanup..");  
   set_flush(SET_NAME);
 
   rh_free(&rahunas_set);
-  logmsg(RH_LOG_NORMAL, "Task IPSET cleanup..");  
 }
 
 /* Start service task */
@@ -72,9 +72,9 @@ static int startservice (struct rahunas_map *map)
 /* Stop service task */
 static int stopservice  (struct rahunas_map *map)
 {
+  logmsg(RH_LOG_NORMAL, "Task IPSET stop..");  
   walk_through_set(&nas_stopservice);
 
-  logmsg(RH_LOG_NORMAL, "Task IPSET stop..");  
   return 0;
 }
 
@@ -128,7 +128,7 @@ static int rollbackstopsess  (struct rahunas_map *map, struct task_req *req)
 
 static struct task task_ipset = {
   .taskname = "IPSET",
-  .taskprio = 1,
+  .taskprio = 2,
   .init = &init,
   .cleanup = &cleanup,
   .startservice = &startservice,
index 0856919..952de6c 100644 (file)
@@ -46,6 +46,8 @@ static void cleanup (void)
        int i;
   int end;
 
+  logmsg(RH_LOG_NORMAL, "Task MEMSET cleanup..");  
+
   if (map) {
     if (map->members) {
       members = map->members;
@@ -62,7 +64,6 @@ static void cleanup (void)
                rh_free(&map);
        }
 
-  logmsg(RH_LOG_NORMAL, "Task MEMSET cleanup..");  
   return 0;
 }
 
@@ -177,7 +178,7 @@ static int rollbackstopsess  (struct rahunas_map *map, struct task_req *req)
 
 static struct task task_memset = {
   .taskname = "MEMSET",
-  .taskprio = 2,
+  .taskprio = 3,
   .init = &init,
   .cleanup = &cleanup,
   .startservice = &startservice,
index ce4ea19..7c22f2f 100644 (file)
@@ -9,75 +9,59 @@
 #include "rh-task-memset.h"
 #include "rh-task-ipset.h"
 
-static struct task dummy;
-
-static struct task *task_find(const char *taskname)
-{
-  struct task *runner = get_task_list(); 
-  while(runner != NULL) {
-    if (strncmp(runner->taskname, taskname, RH_TASK_MAXNAMELEN) == 0)
-      return runner;
-    
-    runner = runner->next;
-  }
-
-  return NULL;
-}
-
-struct task *get_task_list ()
-{
-  if (task_list == NULL)
-    return NULL;
-  else
-    return task_list->next; /* start after dummy */
-}
-
 void task_register(struct task *task)
 {
-  struct task *chk, *prev = NULL;
-  struct task *runner = task_list;
+  GList *chk  = NULL;
+  GList *node = NULL;
+  struct task *ltask = NULL;
 
   if (task == NULL)
      return;
 
   DP("Registering Task: %s", task->taskname);
 
-  chk = task_find(task->taskname);
+  chk = g_list_find(task_list, task);
 
   /* Already register */
   if (chk != NULL) {
     DP("Already registered");
     return;
   }
-  while (runner->next != NULL && (task->taskprio < runner->next->taskprio)) {
-    runner = runner->next;
+
+  if (task_list == NULL) {
+    task_list = g_list_append(task_list, task);
+    return;
   }
 
-  task->next = runner->next;
-  runner->next = task;
+  for (node = g_list_first(task_list); node != NULL; node = g_list_next(node)) {
+    ltask = (struct task *)node->data;
+    if (task->taskprio >= ltask->taskprio)
+      break;  
+  }
+  
+  task_list = g_list_insert_before(task_list, node, task);
 }
 
 static void rh_task_call_init (void)
 {
-  struct task *runner = get_task_list();
-  while(runner != NULL) {
-    (*runner->init)();
-    runner = runner->next;
+  GList *runner = g_list_first(task_list);
+  struct task *ltask = NULL;
+
+  DP("Initialize...");
+
+  while (runner != NULL) {
+    ltask = (struct task *)runner->data;
+    (*ltask->init)();
+    runner = g_list_next(runner);
   }
 }
 
 void rh_task_init(void)
 {
-  strncpy(dummy.taskname, "DUMMY", 6);
-  dummy.taskprio = 999; /* ensure it always be head */
-  dummy.next = NULL;
-
-  task_list = &dummy;
-
   /* Register all tasks */
   rh_task_ipset_reg();
   rh_task_memset_reg();
+  rh_task_dbset_reg();
 
   /* Call each init */
   rh_task_call_init();
@@ -85,87 +69,82 @@ void rh_task_init(void)
 
 void rh_task_cleanup(void)
 {
-  struct task *runner = get_task_list();
+  GList *runner = g_list_last(task_list);
+  struct task *ltask = NULL;
 
   DP("Task Cleanup");
 
-  if (runner == NULL)
-    return;
-
   while (runner != NULL) {
-    (*runner->cleanup)();
-    runner = runner->next;
-  }
+    ltask = (struct task *)runner->data;
+    (*ltask->cleanup)();
+    runner = g_list_previous(runner);
+  }  
+
+  g_list_free(task_list);
 }
 
 int  rh_task_startservice(struct rahunas_map *map)
 {
-  struct task *runner = get_task_list();
+  GList *runner = g_list_first(task_list);
+  struct task *ltask = NULL;
 
   DP("Start service");
 
-  if (runner == NULL)
-    return 0;
-
   while (runner != NULL) {
-    (*runner->startservice)(map);
-    runner = runner->next;
-  }
-  
-  logmsg(RH_LOG_NORMAL, "Service start");
+    ltask = (struct task *)runner->data;
+    (*ltask->startservice)(map);
+    runner = g_list_next(runner);
+  }  
+
+  logmsg(RH_LOG_NORMAL, "Service started");
   return 0;
 }
 
 int  rh_task_stopservice(struct rahunas_map *map)
 {  
-  struct task *runner = get_task_list();
+  GList *runner = g_list_last(task_list);
+  struct task *ltask = NULL;
 
   DP("Stop service");
 
-  if (runner == NULL)
-    return 0;
-
   while (runner != NULL) {
-    (*runner->stopservice)(map);
-    runner = runner->next;
-  }
+    ltask = (struct task *)runner->data;
+    (*ltask->stopservice)(map);
+    runner = g_list_previous(runner);
+  }  
+
+  logmsg(RH_LOG_NORMAL, "Service stopped");
 }
 
 int  rh_task_startsess(struct rahunas_map *map, struct task_req *req)
 {
-  struct task *runner = get_task_list();
+  GList *runner = g_list_first(task_list);
+  struct task *ltask = NULL;
 
   DP("Start session called");
 
-  if (runner == NULL)
-    return 0;
-
   while (runner != NULL) {
-    if ((*runner->startsess)(map, req) < 0) {
-      DP("Failed, rollback");
-    }
-    runner = runner->next;
-  }
-  
+    ltask = (struct task *)runner->data;
+    (*ltask->startsess)(map, req);
+    runner = g_list_next(runner);
+  }  
+
   return 0;
 }
 
 int  rh_task_stopsess(struct rahunas_map *map, struct task_req *req)
 {
-  struct task *runner = get_task_list();
+  GList *runner = g_list_last(task_list);
+  struct task *ltask = NULL;
 
   DP("Stop session called");
 
-  if (runner == NULL)
-    return 0;
-
   while (runner != NULL) {
-    if ((*runner->stopsess)(map, req) < 0) {
-      DP("Failed, rollback");
-    }
-    runner = runner->next;
-  }
-  
+    ltask = (struct task *)runner->data;
+    (*ltask->stopsess)(map, req);
+    runner = g_list_previous(runner);
+  }  
+
   return 0;
 }
 
index e47eb2d..8911d5e 100644 (file)
@@ -7,6 +7,7 @@
 #define __RH_TASK_H
 
 #include "rahunasd.h"
+#include <glib.h>
 
 #define RH_TASK_MAXNAMELEN 64
 
@@ -20,7 +21,6 @@ struct task_req {
 };
 
 struct task {
-  struct task *next;
 
   char taskname[RH_TASK_MAXNAMELEN];
   unsigned int taskprio;
@@ -56,10 +56,9 @@ struct task {
   int (*rollbackstopsess) (struct rahunas_map *map, struct task_req *req);
 };
 
-static struct task *task_list = NULL;
+static GList *task_list = NULL;
 
 extern void task_register(struct task *task);
-struct task *get_task_list ();
 
 void rh_task_init(void);
 void rh_task_cleanup(void);
index 8238b62..d71cdb7 100644 (file)
@@ -125,13 +125,14 @@ int do_stopsession(GNetXmlRpcServer *server,
     goto cleanup;
        }
 
-  req.id = id;
   parse_mac(mac_address, &ethernet);
   memcpy(req.mac_address, &ethernet, ETH_ALEN);
-  req.req_opt = RH_RADIUS_TERM_USER_REQUEST;
 
        if (members[id].flags) {
     if (memcmp(&ethernet, &members[id].mac_address, ETH_ALEN) == 0) {
+      req.id = id;
+      req.req_opt = RH_RADIUS_TERM_USER_REQUEST;
+
       res = rh_task_stopsess(map, &req);
       if (res == 0) {
         *reply_string = g_strdup_printf("Client IP %s was removed!", 
diff --git a/xmlrpc/Makefile.in b/xmlrpc/Makefile.in
deleted file mode 100644 (file)
index 6888339..0000000
+++ /dev/null
@@ -1,448 +0,0 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-noinst_PROGRAMS = test-xmlrpc-client$(EXEEXT) \
-       test-xmlrpc-client-php$(EXEEXT) test-xmlrpc-server$(EXEEXT)
-subdir = xmlrpc
-DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-       $(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-LIBRARIES = $(noinst_LIBRARIES)
-AR = ar
-ARFLAGS = cru
-libgnetxmlrpc_a_AR = $(AR) $(ARFLAGS)
-libgnetxmlrpc_a_LIBADD =
-am_libgnetxmlrpc_a_OBJECTS = xmlrpc-client.$(OBJEXT) \
-       xmlrpc-server.$(OBJEXT)
-libgnetxmlrpc_a_OBJECTS = $(am_libgnetxmlrpc_a_OBJECTS)
-PROGRAMS = $(noinst_PROGRAMS)
-am_test_xmlrpc_client_OBJECTS = test-xmlrpc-client.$(OBJEXT)
-test_xmlrpc_client_OBJECTS = $(am_test_xmlrpc_client_OBJECTS)
-am__DEPENDENCIES_1 =
-test_xmlrpc_client_DEPENDENCIES = libgnetxmlrpc.a \
-       $(am__DEPENDENCIES_1)
-am_test_xmlrpc_client_php_OBJECTS = test-xmlrpc-client-php.$(OBJEXT)
-test_xmlrpc_client_php_OBJECTS = $(am_test_xmlrpc_client_php_OBJECTS)
-test_xmlrpc_client_php_DEPENDENCIES = libgnetxmlrpc.a \
-       $(am__DEPENDENCIES_1)
-am_test_xmlrpc_server_OBJECTS = test-xmlrpc-server.$(OBJEXT)
-test_xmlrpc_server_OBJECTS = $(am_test_xmlrpc_server_OBJECTS)
-test_xmlrpc_server_DEPENDENCIES = libgnetxmlrpc.a \
-       $(am__DEPENDENCIES_1)
-DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-SOURCES = $(libgnetxmlrpc_a_SOURCES) $(test_xmlrpc_client_SOURCES) \
-       $(test_xmlrpc_client_php_SOURCES) \
-       $(test_xmlrpc_server_SOURCES)
-DIST_SOURCES = $(libgnetxmlrpc_a_SOURCES) \
-       $(test_xmlrpc_client_SOURCES) \
-       $(test_xmlrpc_client_php_SOURCES) \
-       $(test_xmlrpc_server_SOURCES)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBGNET_CFLAGS = @LIBGNET_CFLAGS@
-LIBGNET_LIBS = @LIBGNET_LIBS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PKG_CONFIG = @PKG_CONFIG@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build_alias = @build_alias@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host_alias = @host_alias@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-noinst_LIBRARIES = libgnetxmlrpc.a
-AM_CFLAGS = $(LIBGNET_CFLAGS)
-libgnetxmlrpc_a_SOURCES = xmlrpc-client.c xmlrpc-server.c xmlrpc.h
-test_xmlrpc_client_SOURCES = test-xmlrpc-client.c xmlrpc.h
-test_xmlrpc_client_LDADD = \
-       libgnetxmlrpc.a \
-       $(LIBGNET_LIBS)
-
-test_xmlrpc_client_php_SOURCES = test-xmlrpc-client-php.c xmlrpc.h
-test_xmlrpc_client_php_LDADD = \
-       libgnetxmlrpc.a \
-       $(LIBGNET_LIBS)
-
-test_xmlrpc_server_SOURCES = test-xmlrpc-server.c xmlrpc.h
-test_xmlrpc_server_LDADD = \
-       libgnetxmlrpc.a \
-       $(LIBGNET_LIBS)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-       @for dep in $?; do \
-         case '$(am__configure_deps)' in \
-           *$$dep*) \
-             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-               && exit 0; \
-             exit 1;; \
-         esac; \
-       done; \
-       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  xmlrpc/Makefile'; \
-       cd $(top_srcdir) && \
-         $(AUTOMAKE) --foreign  xmlrpc/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-       @case '$?' in \
-         *config.status*) \
-           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-         *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-       esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-clean-noinstLIBRARIES:
-       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
-libgnetxmlrpc.a: $(libgnetxmlrpc_a_OBJECTS) $(libgnetxmlrpc_a_DEPENDENCIES) 
-       -rm -f libgnetxmlrpc.a
-       $(libgnetxmlrpc_a_AR) libgnetxmlrpc.a $(libgnetxmlrpc_a_OBJECTS) $(libgnetxmlrpc_a_LIBADD)
-       $(RANLIB) libgnetxmlrpc.a
-
-clean-noinstPROGRAMS:
-       -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
-test-xmlrpc-client$(EXEEXT): $(test_xmlrpc_client_OBJECTS) $(test_xmlrpc_client_DEPENDENCIES) 
-       @rm -f test-xmlrpc-client$(EXEEXT)
-       $(LINK) $(test_xmlrpc_client_OBJECTS) $(test_xmlrpc_client_LDADD) $(LIBS)
-test-xmlrpc-client-php$(EXEEXT): $(test_xmlrpc_client_php_OBJECTS) $(test_xmlrpc_client_php_DEPENDENCIES) 
-       @rm -f test-xmlrpc-client-php$(EXEEXT)
-       $(LINK) $(test_xmlrpc_client_php_OBJECTS) $(test_xmlrpc_client_php_LDADD) $(LIBS)
-test-xmlrpc-server$(EXEEXT): $(test_xmlrpc_server_OBJECTS) $(test_xmlrpc_server_DEPENDENCIES) 
-       @rm -f test-xmlrpc-server$(EXEEXT)
-       $(LINK) $(test_xmlrpc_server_OBJECTS) $(test_xmlrpc_server_LDADD) $(LIBS)
-
-mostlyclean-compile:
-       -rm -f *.$(OBJEXT)
-
-distclean-compile:
-       -rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-xmlrpc-client-php.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-xmlrpc-client.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-xmlrpc-server.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlrpc-client.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlrpc-server.Po@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       tags=; \
-       here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
-         test -n "$$unique" || unique=$$empty_fix; \
-         $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-           $$tags $$unique; \
-       fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       tags=; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       test -z "$(CTAGS_ARGS)$$tags$$unique" \
-         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-            $$tags $$unique
-
-GTAGS:
-       here=`$(am__cd) $(top_builddir) && pwd` \
-         && cd $(top_srcdir) \
-         && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       list='$(DISTFILES)'; \
-         dist_files=`for file in $$list; do echo $$file; done | \
-         sed -e "s|^$$srcdirstrip/||;t" \
-             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-       case $$dist_files in \
-         */*) $(MKDIR_P) `echo "$$dist_files" | \
-                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-                          sort -u` ;; \
-       esac; \
-       for file in $$dist_files; do \
-         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-         if test -d $$d/$$file; then \
-           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-           fi; \
-           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-         else \
-           test -f $(distdir)/$$file \
-           || cp -p $$d/$$file $(distdir)/$$file \
-           || exit 1; \
-         fi; \
-       done
-check-am: all-am
-check: check-am
-all-am: Makefile $(LIBRARIES) $(PROGRAMS)
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-         `test -z '$(STRIP)' || \
-           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-       @echo "This command is intended for maintainers to use"
-       @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \
-       mostlyclean-am
-
-distclean: distclean-am
-       -rm -rf ./$(DEPDIR)
-       -rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-       distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-info: install-info-am
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-ps: install-ps-am
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-       -rm -rf ./$(DEPDIR)
-       -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-       clean-noinstLIBRARIES clean-noinstPROGRAMS ctags distclean \
-       distclean-compile distclean-generic distclean-tags distdir dvi \
-       dvi-am html html-am info info-am install install-am \
-       install-data install-data-am install-dvi install-dvi-am \
-       install-exec install-exec-am install-html install-html-am \
-       install-info install-info-am install-man install-pdf \
-       install-pdf-am install-ps install-ps-am install-strip \
-       installcheck installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-compile \
-       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
-       uninstall-am
-
-
-@SET_MAKE@
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT: