mcabber/mcabber/modules.c
author Myhailo Danylenko <isbear@ukrpost.net>
Sat, 13 Mar 2010 10:29:18 +0100
changeset 1749 7ee390513463
parent 1736 15e1f3957786
child 1755 84487d78d0ea
permissions -rw-r--r--
Use api version for module checks * Change module structures * Check for supported api versions at loading time * Add info command, description and module version fields
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
/*
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
 * modules.c   -- modules handling
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
 *
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
 * Copyright (C) 2010 Myhailo Danylenko <isbear@ukrpost.net>
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
 *
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     6
 * This program is free software; you can redistribute it and/or modify
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     7
 * it under the terms of the GNU General Public License as published by
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     8
 * the Free Software Foundation; either version 2 of the License, or (at
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
 * your option) any later version.
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    10
 *
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    11
 * This program is distributed in the hope that it will be useful, but
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    12
 * WITHOUT ANY WARRANTY; without even the implied warranty of
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
 * General Public License for more details.
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    15
 *
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    17
 * along with this program; if not, write to the Free Software
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
 * USA
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
 */
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
#include <glib.h>
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
#include <gmodule.h>
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    24
#include <string.h>
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    26
#include "settings.h"
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    27
#include "config.h"
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    28
#include "modules.h"
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    29
#include "logprint.h"
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    30
#include "utils.h"
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    31
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
    32
// Registry of loaded modules
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
    33
GSList *loaded_modules = NULL;
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    34
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
    35
const gchar *mcabber_branch = MCABBER_BRANCH;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
    36
const guint mcabber_api_version = MCABBER_API_VERSION;
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    37
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    38
static gint module_list_comparator(gconstpointer arg1, gconstpointer arg2)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    39
{
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    40
  const loaded_module_t *module = arg1;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    41
  const char *name = arg2;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    42
  return g_strcmp0(module->name, name);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    43
}
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    44
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    45
//  module_load(modulename, manual, force)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    46
// Tries to load specified module and any modules, that this module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    47
// depends on. Returns NULL on success or constant error string in a
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    48
// case of error. Error message not necessarily indicates error.
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    49
const gchar *module_load(const gchar *arg, gboolean manual, gboolean force)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    50
{
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    51
  GModule       *mod;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    52
  module_info_t *info;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    53
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    54
  if (!arg || !*arg)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    55
    return "Missing module name";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    56
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    57
  { // Check if module is already loaded
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
    58
    GSList *lmod = g_slist_find_custom(loaded_modules, arg,
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
    59
                                       module_list_comparator);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    60
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    61
    if (lmod) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    62
      loaded_module_t *module = lmod->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    63
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    64
      if (manual) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    65
        if (!module->locked) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    66
          module->locked = TRUE;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    67
          module->refcount += 1;
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
    68
          return force ? NULL : "Module is already automatically loaded, "
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
    69
                                "marked as manually loaded";
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    70
        } else
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    71
          return force ? NULL : "Module is already loaded";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    72
      } else {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    73
        module->refcount += 1;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    74
        return NULL;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    75
      }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    76
    }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    77
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    78
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    79
  { // Load module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    80
    gchar *mdir = expand_filename(settings_opt_get("modules_dir"));
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    81
    gchar *path = g_module_build_path(mdir ? mdir : PKGLIB_DIR, arg);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    82
    g_free(mdir);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    83
    mod = g_module_open(path, G_MODULE_BIND_LAZY);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    84
    g_free(path);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    85
    if (!mod)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    86
      return g_module_error();
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    87
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    88
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
    89
  { // Obtain module information structures list
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    90
    gchar *varname = g_strdup_printf("info_%s", arg);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    91
    gpointer var = NULL;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    92
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    93
    // convert to a valid symbol name
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    94
    g_strcanon(varname, "abcdefghijklmnopqrstuvwxyz0123456789", '_');
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    95
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    96
    if (!g_module_symbol(mod, varname, &var)) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    97
      if (!force) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    98
        g_free(varname);
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
    99
        if(!g_module_close(mod))
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   100
          scr_LogPrint(LPRINT_LOGNORM, "Error closing module: %s.",
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   101
                       g_module_error());
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   102
        return "Module provides no information structure";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   103
      }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   104
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   105
      scr_LogPrint(LPRINT_LOGNORM, "Forced to ignore error: "
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   106
                                 "Module provides no information structure.");
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   107
    }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   108
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   109
    g_free(varname);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   110
    info = var;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   111
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   112
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   113
  // Find appropriate info struct
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   114
  if (info) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   115
    while (info) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   116
      if (!info->branch || !*(info->branch)) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   117
        scr_LogPrint(LPRINT_DEBUG, "No branch name, "
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   118
                     "skipping info chunk.");
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   119
      } else if (strcmp(info->branch, mcabber_branch)) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   120
        scr_LogPrint(LPRINT_DEBUG, "Unhandled branch %s, "
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   121
                     "skipping info chunk.", info->branch);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   122
      } else if (info->api > mcabber_api_version ||
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   123
                 info->api < MCABBER_API_MIN) { // XXX force?
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   124
        if(!g_module_close(mod))
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   125
          scr_LogPrint(LPRINT_LOGNORM, "Error closing module: %s.",
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   126
                       g_module_error());
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   127
        return "Incompatible mcabber api version";
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   128
      } else
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   129
        break;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   130
      info = info->next;
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   131
    }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   132
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   133
    if (!info) { // XXX force?
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   134
      if(!g_module_close(mod))
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   135
        scr_LogPrint(LPRINT_LOGNORM, "Error closing module: %s.",
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   136
                     g_module_error());
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   137
      return "No supported mcabber branch description found";
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   138
    }
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   139
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   140
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   141
  // Load dependencies
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   142
  if (info && info->requires) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   143
    const gchar **dep;
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   144
    GSList *deps = NULL;
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   145
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   146
    for (dep = info->requires; *dep; ++dep) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   147
      const gchar *err = module_load(*dep, FALSE, FALSE);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   148
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   149
      if (err) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   150
        GSList *mel;
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   151
        scr_LogPrint(LPRINT_LOGNORM, "Error loading dependency module %s: %s.",
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   152
                     *dep, err);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   153
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   154
        // Unload already loaded dependencies
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   155
        for (mel = deps; mel; mel = mel->next) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   156
          gchar *ldmname = mel->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   157
          err = module_unload(ldmname, FALSE, FALSE);
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   158
          scr_LogPrint(LPRINT_LOGNORM,
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   159
                       "Error unloading dependency module %s: %s.",
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   160
                       ldmname, err);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   161
          g_free(ldmname);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   162
        }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   163
        g_slist_free(deps);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   164
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   165
        // Unload module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   166
        if (!g_module_close(mod))
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   167
          scr_LogPrint(LPRINT_LOGNORM, "Error unloading module %s: %s.",
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   168
                       arg, g_module_error());
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   169
        return "Dependency problems";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   170
      }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   171
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   172
      deps = g_slist_append(deps, (gpointer) *dep);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   173
    }
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   174
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   175
    g_slist_free(deps);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   176
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   177
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   178
  { // Register module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   179
    loaded_module_t *module = g_new(loaded_module_t, 1);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   180
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   181
    module->refcount     = 1;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   182
    module->locked       = manual;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   183
    module->name         = g_strdup(arg);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   184
    module->module       = mod;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   185
    module->info         = info;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   186
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   187
    loaded_modules = g_slist_prepend(loaded_modules, module);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   188
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   189
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   190
  // Run initialization routine
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   191
  if (info && info->init)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   192
    info->init();
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   193
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   194
  // XXX Run hk_loaded_module hook (and move this line there)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   195
  scr_LogPrint(LPRINT_LOGNORM, "Loaded module %s.", arg);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   196
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   197
  return NULL;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   198
}
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   199
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   200
//  module_unload(modulename, manual, force)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   201
// Unload specified module and any automatically loaded modules
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   202
// that are no more required.
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   203
const gchar *module_unload(const gchar *arg, gboolean manual, gboolean force)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   204
{
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   205
  GSList          *lmod;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   206
  loaded_module_t *module;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   207
  module_info_t   *info;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   208
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   209
  if (!arg || !*arg)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   210
    return "Missing module name";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   211
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   212
  lmod = g_slist_find_custom(loaded_modules, arg, module_list_comparator);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   213
  if (!lmod)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   214
    return "Module not found";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   215
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   216
  module = lmod->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   217
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   218
  // Check if user can unload this module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   219
  if (manual) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   220
    if (!module->locked) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   221
      if (force)
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   222
        scr_LogPrint(LPRINT_LOGNORM, "Forced to ignore error: "
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   223
                     "Manually unloading automatically loaded module.");
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   224
      else
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   225
        return "Module is not loaded manually";
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   226
    }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   227
    module->locked = FALSE;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   228
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   229
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   230
  // Check refcount
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   231
  module->refcount -= 1;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   232
  if (module->refcount > 0) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   233
    if (force)
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   234
      scr_LogPrint(LPRINT_LOGNORM, "Forced to ignore error: "
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   235
                   "Refcount is not zero (%u).", module->refcount);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   236
    else
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   237
      return manual ? "Module is required by some other modules" : NULL;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   238
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   239
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   240
  info = module->info;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   241
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   242
  // Run uninitialization routine
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   243
  if (info && info->uninit)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   244
    info->uninit();
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   245
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   246
  // Unload dependencies
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   247
  if (info && info->requires) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   248
    const gchar **dep;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   249
    for (dep = info->requires; *dep; ++dep) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   250
      const gchar *err = module_unload(*dep, FALSE, FALSE);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   251
      if (err) // XXX
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   252
        scr_LogPrint(LPRINT_LOGNORM,
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   253
                     "Error unloading automatically loaded module %s: %s.",
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   254
                     *dep, err);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   255
    }
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   256
  }
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   257
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   258
  // XXX Prevent uninitialization routine and dep unloading to be performed again
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   259
  module->info = NULL;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   260
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   261
  // Unload module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   262
  if (!g_module_close(module->module))
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   263
    return g_module_error(); // XXX destroy structure?
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   264
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   265
  // Destroy structure
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   266
  loaded_modules = g_slist_delete_link(loaded_modules, lmod);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   267
  g_free(module->name);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   268
  g_free(module);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   269
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   270
  scr_LogPrint(LPRINT_LOGNORM, "Unloaded module %s.", arg);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   271
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   272
  return NULL;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   273
}
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   274
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   275
//  module_list_print(void)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   276
// Prints into status buffer and log list of the currently loaded
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   277
// modules.
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   278
void module_list_print(void)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   279
{
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   280
  GSList *mel;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   281
  gsize maxlen = 0;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   282
  gchar *format;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   283
  GString *message;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   284
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   285
  if (!loaded_modules) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   286
    scr_LogPrint(LPRINT_LOGNORM, "No modules loaded.");
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   287
    return;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   288
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   289
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   290
  // Count maximum module name length
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   291
  for (mel = loaded_modules; mel; mel = mel -> next) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   292
    loaded_module_t *module = mel->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   293
    gsize len = strlen(module->name);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   294
    if (len > maxlen)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   295
      maxlen = len;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   296
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   297
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   298
  // Create format string
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   299
  format = g_strdup_printf("%%-%us  %%2u (%%c)", maxlen);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   300
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   301
  // Fill the message to be printed
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   302
  message = g_string_new("Loaded modules:\n");
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   303
  for (mel = loaded_modules; mel; mel = mel -> next) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   304
    loaded_module_t *module = mel->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   305
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   306
    g_string_append_printf(message, format, module->name, module->refcount,
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   307
                           module->locked ? 'M' : 'A');
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   308
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   309
    if (module->info) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   310
      module_info_t *info = module->info;
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   311
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   312
      // Module version
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   313
      if (info->version) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   314
        g_string_append(message, " version: ");
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   315
        g_string_append(message, info->version);
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   316
      }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   317
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   318
      // Module dependencies
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   319
      if (info->requires && *(info->requires)) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   320
        const gchar **dep;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   321
        g_string_append(message, " depends: ");
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   322
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   323
        for (dep = info->requires; *dep; ++dep) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   324
          g_string_append(message, *dep);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   325
          g_string_append(message, ", ");
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   326
        }
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   327
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   328
        // Chop extra ", "
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   329
        g_string_truncate(message, message->len - 2);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   330
      }
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   331
    }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   332
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   333
    g_string_append_c(message, '\n');
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   334
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   335
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   336
  // Chop extra "\n"
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   337
  g_string_truncate(message, message->len - 1);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   338
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   339
  scr_LogPrint(LPRINT_LOGNORM, "%s", message->str);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   340
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   341
  g_string_free(message, TRUE);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   342
  g_free(format);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   343
}
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   344
1749
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   345
//  module_info_print(name)
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   346
// Prints info about specific module
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   347
void module_info_print(const gchar *name)
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   348
{
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   349
  GSList *lmod;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   350
  loaded_module_t *module;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   351
  module_info_t *info;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   352
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   353
  lmod = g_slist_find_custom(loaded_modules, name, module_list_comparator);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   354
  if (!lmod) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   355
    scr_LogPrint(LPRINT_NORMAL, "Module %s not found.", name);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   356
    return;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   357
  }
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   358
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   359
  module = lmod->data;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   360
  info = module->info;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   361
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   362
  scr_LogPrint(LPRINT_NORMAL, "Name: %s", module->name);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   363
  scr_LogPrint(LPRINT_NORMAL, "Location: %s", g_module_name(module->module));
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   364
  scr_LogPrint(LPRINT_NORMAL, "Loaded: %s",
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   365
               module->locked ? "Manually" : "Automatically");
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   366
  scr_LogPrint(LPRINT_NORMAL, "Reference count: %u", module->refcount);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   367
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   368
  if (info) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   369
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   370
    if (info->version)
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   371
      scr_LogPrint(LPRINT_NORMAL, "Version: %s", info->version);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   372
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   373
    if (info->requires && *(info->requires)) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   374
      GString *message = g_string_new("Depends on: ");
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   375
      const gchar **dep;
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   376
      for (dep = info->requires; *dep; ++dep) {
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   377
        g_string_append(message, *dep);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   378
        g_string_append(message, ", ");
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   379
      }
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   380
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   381
      // Chop last ", "
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   382
      g_string_truncate(message, message->len - 2);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   383
      scr_LogPrint(LPRINT_NORMAL, "%s", message->str);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   384
      g_string_free(message, TRUE);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   385
    }
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   386
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   387
    if (info->description)
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   388
      scr_LogPrint(LPRINT_NORMAL, "Description: %s", info->description);
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   389
  }
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   390
}
7ee390513463 Use api version for module checks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1736
diff changeset
   391
1735
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   392
//  modules_init()
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   393
// Initializes module system.
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   394
void modules_init(void)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   395
{
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   396
}
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   397
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   398
//  modules_deinit()
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   399
// Unloads all the modules.
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   400
void modules_deinit(void)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   401
{
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   402
  GSList *mel;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   403
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   404
  // We need only manually loaded modules
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   405
  for (mel = loaded_modules; mel; mel = mel->next) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   406
    loaded_module_t *module = mel->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   407
    if (module->locked)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   408
      break;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   409
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   410
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   411
  while (mel) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   412
    loaded_module_t *module = mel->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   413
    const gchar     *err;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   414
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   415
    // Find next manually loaded module to treat
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   416
    for (mel = mel->next; mel; mel = mel->next) {
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   417
      loaded_module_t *module = mel->data;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   418
      if (module->locked)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   419
        break;
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   420
    }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   421
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   422
    // Unload module
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   423
    scr_LogPrint(LPRINT_LOGNORM, "Unloading module %s.", module->name);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   424
    err = module_unload(module->name, TRUE, FALSE);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   425
    if (err)
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   426
      scr_LogPrint(LPRINT_LOGNORM, "* Module unloading failed: %s.", err);
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   427
  }
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   428
}
5093b5ca1572 New modules loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   429
1736
15e1f3957786 Misc. small style changes
Mikael Berthe <mikael@lilotux.net>
parents: 1735
diff changeset
   430
/* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2:  For Vim users... */