00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "stdinc.h"
00026 #include "handlers.h"
00027 #include "client.h"
00028 #include "ircd.h"
00029 #include "numeric.h"
00030 #include "s_conf.h"
00031 #include "s_serv.h"
00032 #include "send.h"
00033 #include "msg.h"
00034 #include "parse.h"
00035 #include "hook.h"
00036 #include "modules.h"
00037 #include "irc_string.h"
00038
00039 static void m_admin(struct Client *, struct Client *, int, char *[]);
00040 static void mr_admin(struct Client *, struct Client *, int, char *[]);
00041 static void ms_admin(struct Client *, struct Client *, int, char *[]);
00042 static void do_admin(struct Client *);
00043
00044 struct Message admin_msgtab = {
00045 "ADMIN", 0, 0, 0, 0, MFLG_SLOW | MFLG_UNREG, 0,
00046 {mr_admin, m_admin, ms_admin, m_ignore, ms_admin, m_ignore}
00047 };
00048
00049 #ifndef STATIC_MODULES
00050 static struct Callback *admin_cb;
00051 const char *_version = "$Revision: 589 $";
00052
00053 static void *
00054 va_admin(va_list args)
00055 {
00056 do_admin(va_arg(args, struct Client *));
00057 return NULL;
00058 }
00059
00060 void
00061 _modinit(void)
00062 {
00063 admin_cb = register_callback("doing_admin", va_admin);
00064 mod_add_cmd(&admin_msgtab);
00065 }
00066
00067 void
00068 _moddeinit(void)
00069 {
00070 mod_del_cmd(&admin_msgtab);
00071 uninstall_hook(admin_cb, va_admin);
00072 }
00073 #endif
00074
00075
00076
00077
00078
00079
00080 static void
00081 mr_admin(struct Client *client_p, struct Client *source_p,
00082 int parc, char *parv[])
00083 {
00084 static time_t last_used = 0;
00085
00086 ClearCap(client_p, CAP_TS6);
00087
00088 if ((last_used + ConfigFileEntry.pace_wait_simple) > CurrentTime)
00089 {
00090 sendto_one(source_p, form_str(RPL_LOAD2HI),
00091 me.name, EmptyString(parv[0]) ? "*" : parv[0]);
00092 return;
00093 }
00094
00095 last_used = CurrentTime;
00096
00097 #ifdef STATIC_MODULES
00098 do_admin(client_p);
00099 #else
00100 execute_callback(admin_cb, source_p, parc, parv);
00101 #endif
00102 }
00103
00104
00105
00106
00107
00108
00109 static void
00110 m_admin(struct Client *client_p, struct Client *source_p,
00111 int parc, char *parv[])
00112 {
00113 static time_t last_used = 0;
00114
00115 if ((last_used + ConfigFileEntry.pace_wait_simple) > CurrentTime)
00116 {
00117 sendto_one(source_p,form_str(RPL_LOAD2HI),
00118 me.name, source_p->name);
00119 return;
00120 }
00121
00122 last_used = CurrentTime;
00123
00124 if (!ConfigFileEntry.disable_remote)
00125 if (hunt_server(client_p, source_p, ":%s ADMIN :%s", 1,
00126 parc, parv) != HUNTED_ISME)
00127 return;
00128
00129 #ifdef STATIC_MODULES
00130 do_admin(client_p);
00131 #else
00132 execute_callback(admin_cb, source_p, parc, parv);
00133 #endif
00134 }
00135
00136
00137
00138
00139
00140
00141 static void
00142 ms_admin(struct Client *client_p, struct Client *source_p,
00143 int parc, char *parv[])
00144 {
00145 if (hunt_server(client_p, source_p, ":%s ADMIN :%s", 1, parc, parv)
00146 != HUNTED_ISME)
00147 return;
00148
00149 if (IsClient(source_p))
00150 #ifdef STATIC_MODULES
00151 do_admin(source_p);
00152 #else
00153 execute_callback(admin_cb, source_p, parc, parv);
00154 #endif
00155 }
00156
00157
00158
00159
00160
00161
00162
00163 static void
00164 do_admin(struct Client *source_p)
00165 {
00166 const char *me_name;
00167 const char *nick;
00168
00169 me_name = ID_or_name(&me, source_p->from);
00170 nick = ID_or_name(source_p, source_p->from);
00171
00172 sendto_one(source_p, form_str(RPL_ADMINME),
00173 me_name, nick, me.name);
00174 if (AdminInfo.name != NULL)
00175 sendto_one(source_p, form_str(RPL_ADMINLOC1),
00176 me_name, nick, AdminInfo.name);
00177 if (AdminInfo.description != NULL)
00178 sendto_one(source_p, form_str(RPL_ADMINLOC2),
00179 me_name, nick, AdminInfo.description);
00180 if (AdminInfo.email != NULL)
00181 sendto_one(source_p, form_str(RPL_ADMINEMAIL),
00182 me_name, nick, AdminInfo.email);
00183 }