zoukankan      html  css  js  c++  java
  • 为Unrealircd添加一个model,并加入自定义命令,且操作你的mysql

          前面几章谈到了mysql方方面面的操作,但没有涉及到对mysql的测试,如果要测试,一般需要自已写一个新的测试命令,如果是普通的测试而已,你可以把命令放到原本的相关文件中去。但是我们如果需要扩展原有的协议,增加新的命令,最好的办法就是将所有的自定义命令写到一个model中去,这样也便于系统加载,如果model中的命令有修改,也不会影响到整个系统的运行,只需要对修改后的model进行重新装载即可。

          下面我将提供一个写好的模块,里面包含了对mysql的操作,你可以直接编译,但直得注意的是,因为你新增了文件,所以还需要修改Makefile来编译它。

          一、m2d_commands.c,存于unrealircd/src/models下,模块文件源码
     1 
     2 #include "config.h"
     3 #include "struct.h"
     4 #include "common.h"
     5 #include "sys.h"
     6 #include "numeric.h"
     7 #include "msg.h"
     8 #include "proto.h"
     9 #include "channel.h"
    10 #include <time.h>
    11 #include <sys/stat.h>
    12 #include <stdio.h>
    13 #include <stdlib.h>
    14 #include <string.h>
    15 #ifdef _WIN32
    16 #include <io.h>
    17 #endif
    18 #include <fcntl.h>
    19 #include "h.h"
    20 #ifdef STRIPBADWORDS
    21 #include "badwords.h"
    22 #endif
    23 #ifdef _WIN32
    24 #include "version.h"
    25 #endif
    26 
    27 DLLFUNC CMD_FUNC(m2d_testcmd);
    28 
    29 #define MSG_TESTCMD         "TESTCMD"    
    30 #define TOK_TESTCMD         "2d_a"    
    31 
    32 ModuleHeader MOD_HEADER(m2d_testcmd)
    33   = {
    34     "m2d_commands",
    35     "$Id: m2d_commands.c,v 1.0.0.0 2007/03/02 by OldHawk $",
    36     "Wrapper library for m2d_ commands",
    37     "3.2-b8-1",
    38     NULL
    39     };
    40 
    41 DLLFUNC int MOD_INIT(m2d_testcmd)(ModuleInfo *modinfo)
    42 {
    43     CommandAdd(modinfo->handle, MSG_TESTCMD,        TOK_TESTCMD,        m2d_testcmd,        MAXPARA, M_USER|M_SERVER);
    44 
    45     MARK_AS_OFFICIAL_MODULE(modinfo);
    46     return MOD_SUCCESS;
    47 }
    48 
    49 DLLFUNC int MOD_LOAD(m2d_testcmd)(int module_load)
    50 {
    51     return MOD_SUCCESS;
    52 }
    53 
    54 DLLFUNC int MOD_UNLOAD(m2d_testcmd)(int module_unload)
    55 {
    56     return MOD_SUCCESS;
    57 }
    58 
    59 DLLFUNC CMD_FUNC(m2d_testcmd)
    60 {
    61     if (parc<2){
    62         sendto_one (sptr, err_str (ERR_NEEDMOREPARAMS),    me.name, parv[0], "TESTCMD");
    63         return 0;
    64     }
    65     
    66     if(my_conn){
    67         char querymsg[BUFSIZE];
    68         MYSQL_RES *res;
    69         MYSQL_ROW row;
    70         int rowcount,i;
    71         snprintf(querymsg, sizeof(querymsg), "select id,question from questions");
    72         res=my_mysql_select(my_conn, querymsg);
    73         if(res){
    74             rowcount = mysql_num_rows(res);
    75             i=0;
    76             while((row=mysql_fetch_row(res))){
    77                 ircd_log (LOG_SERVER, "questions %d/%d: [%s]%s", i, rowcount, row[0], row[1]);
    78                 i++;
    79             }
    80         }        
    81         if(res) mysql_free_result(res);    
    82     }
    83     sendto_one (sptr, "u input testcmd: %s %d", parv[1], max_connection_count);
    84     return 0;
    85 }
    86 
    87 

          二、编译,打开unrealircd/src/models/Makefile,做如下修改
    R_MODULES= \
             m_sethost.so m_chghost.so m_chgident.so m_setname.so \
             m_setident.so m_sdesc.so m_svsmode.so m_swhois.so\
             m_svsmotd.so m_svsnline.so m_who.so m_mkpasswd.so \
             m_away.so m_svsnoop.so m_svso.so m_svsnick.so \
             m_adminchat.so m_akill.so m_chgname.so m_guest.so m_htm.so m_kill.so \
             m_lag.so m_message.so m_nachat.so m_oper.so m_pingpong.so \
             m_quit.so m_rakill.so m_rping.so m_sendumode.so m_sqline.so \
             m_tsctl.so m_unkline.so m_unsqline.so m_unzline.so m_whois.so \
             m_tkl.so m_vhost.so m_cycle.so m_svsjoin.so m_svspart.so \
             m_svswatch.so m_svssilence.so m_sendsno.so m_svssno.so \
             m_sajoin.so m_sapart.so m_samode.so m_kick.so m_topic.so \
             m_invite.so m_list.so m_time.so m_svskill.so m_sjoin.so \
             m_pass.so m_userhost.so m_ison.so m_silence.so m_knock.so \
             m_umode2.so m_squit.so m_protoctl.so m_addline.so m_addomotd.so \
             m_wallops.so m_admin.so m_globops.so m_locops.so m_chatops.so \
             m_trace.so m_netinfo.so m_links.so m_help.so m_rules.so \
             m_close.so m_map.so m_eos.so m_server.so m_stats.so \
             m_svsfline.so m_dccdeny.so m_undccdeny.so m_whowas.so \
             m_connect.so m_dccallow.so m_userip.so m_nick.so m_user.so \
             m_mode.so m_watch.so m_part.so m_join.so m_motd.so m_opermotd.so \
             m_botmotd.so m_lusers.so m_names.so m2d_commands.so
          在文件最后,做如下修改:
    cloak.so: cloak.c $(INCLUDES)
            $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \
                    -o cloak.so cloak.c

    m2d_commands.so: m2d_commands.c $(INCLUDES)
            $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \
                    -o m2d_commands.so m2d_commands.c

    clean:
            $(RM) -f *.o *.so *~ core
          然后重新make,就会生成m2d_command.so了(win32下是m2d_command.dll)。

          三、修改unrealircd.conf配置文件,找到include部分,修改以下内容:
    loadmodule "src/modules/commands.so";
    loadmodule "src/modules/cloak.so";
    loadmodule "src/modules/m2d_commands.so";


          现在重新起动你的系统,再输入testcmd命令时,系统会从指定的数据表里读取记录并写入日志文件了。请注意testcmd命令体内的mysql操作代码,你可能需要做一些简单的修改。
  • 相关阅读:
    超参数调试、Batch正则化和程序框架
    优化算法
    深度学习的实用层面
    深层神经网络
    浅层神经网络
    一些实用的JavaScript代码
    mysql练习题1-41
    python 练习题(16-20)
    fiddler抓取https请求
    haproxy监控页面添加及参数简介(转)
  • 原文地址:https://www.cnblogs.com/taobataoma/p/713949.html
Copyright © 2011-2022 走看看