/**********************************************************************
 * PTlink IRC Services is (C) CopyRight PTlink IRC Software 1999-2005 *
 *                     http://software.pt-link.net                    *
 * This program is distributed under GNU Public License               *
 * Please read the file COPYING for copyright information.            
 **********************************************************************

  Description: modules management module

 *  $Id: os_module.c,v 1.5 2005/10/11 16:13:06 jpinto Exp $
*/

#include "module.h"
#include "ns_group.h"
#include "nsmacros.h"
#include "lang/os_module.lh"

SVS_Module mod_info =
 /* module, version, description */
{"os_module", "2.0",  "operserv module command" };

/* Change Log
  2.0 - 0000265: remove nickserv cache system
*/

/** functions/events we require **/
/* void (*FunctionPointer)(void);*/
ServiceUser* (*operserv_suser)(void);

MOD_REQUIRES
  MOD_FUNC(operserv_suser)
  MOD_FUNC(is_sroot)
MOD_END

/** Internal functions declaration **/
/* void internal_function(void); */
void os_module(IRC_User *s, IRC_User *u);
void send_to_user(char* message);
    

/** Local variables **/
/* int my_local_variable; */
ServiceUser* osu;
IRC_User* tmp_user;
    
/** load code **/
int mod_load(void)
{
  osu = operserv_suser();
  suser_add_cmd(osu, "MODULE", (void*) os_module, MODULE_SUMMARY, MODULE_HELP);

  return 0;
}
    
/** unload code **/
void mod_unload(void)
{
  suser_del_mod_cmds(osu, &mod_info);
}
    
/** internal functions implementation starts here **/
/* s = service the command was sent to
   u = user the command was sent from */
void os_module(IRC_User *s, IRC_User *u)
{
  u_int32_t source_snid;
  char *cmd;

  CHECK_IF_IDENTIFIED_NICK

  if(is_sroot(source_snid) == 0)
  {
    send_lang(u, s, MODULE_NEED_ROOT); 
     return;
  }

  cmd = strtok(NULL, " ");
  if(IsNull(cmd))
    send_lang(u, s, INVALID_MODULE_SYNTAX);
  else if(strcasecmp(cmd, "LOAD") == 0)
    {
      char *modname = strtok(NULL, " ");
      if(IsNull(modname))
        send_lang(u, s, INVALID_MODULE_SYNTAX);
      else if(module_find(modname))
        send_lang(u, s, MODULE_ALREADY_LOADED_X, modname);
      else
        {
          tmp_user = u;
          set_log_aux(send_to_user);
          module_load(modname, 0);
          set_log_aux(NULL);
          tmp_user = NULL;
        }
    }
  else if(strcasecmp(cmd, "LIST") == 0)
    {
      int i;
      char *mask;
      mask = strtok(NULL, "");
      send_lang(u, s, MODULE_LIST_HEAD);
      for(i=0; i<modules_count; ++i) 
        {
          if(mask && !match(mask, svs_modules[i]->name)) /* check for match */
            continue;
          send_lang( u, s, MODULE_LIST_X_X_X, 
            svs_modules[i]->name, svs_modules[i]->version, svs_modules[i]->desc);
        }
      send_lang(u, s, MODULE_LIST_TAIL);
    }
  else if(strcasecmp(cmd, "UNLOAD") == 0)
    {
      char *modname;
      modname = strtok(NULL, " ");
      
      if(IsNull(modname))
        send_lang(u, s, INVALID_MODULE_SYNTAX);
      else if(strcmp(modname,"os_module") == 0)
        send_lang(u, s, CANT_UNLOAD_SELF);
      else
        {
          SVS_Module* mod; 
          char *fname;
          char *mname;
          mod = module_find(modname);
          if(mod == NULL)
            send_lang(u, s, MODULE_X_NOT_LOADED, modname);
/*            
          else if(mod_check_events(mod, &fname, &mname) != 0)
            send_lang(u, s, MODULE_EVENT_IN_USE_X_X, fname, mname);          
*/            
          else if(check_for_functions(mod, &fname, &mname) != 0)
            send_lang(u, s, MODULE_FUNC_IN_USE_X_X, fname, mname);
          else
            {
              send_lang(u, s, MODULE_UNLOADING_X, modname);
              /* it's safe to unload the module now */
              module_unload(mod);              
              send_lang(u, s, MODULE_UNLOADED);
              /*
              tmp_user = u;
              set_log_aux(send_to_user);
              set_log_aux(NULL);
              tmp_user = NULL;
              */
              }
        }
    }    
  else
    send_lang(u, s, INVALID_MODULE_SYNTAX);
}

void send_to_user(char* message)
{
  if(tmp_user)
    irc_SendNotice(tmp_user, osu->u, "%s", message);
}  

/* End of module */


syntax highlighted by Code2HTML, v. 0.9.1