]> jfr.im git - irc/quakenet/newserv.git/blob - miscreply/rping.c
LUA: Add servername and servernumeric nickpushers.
[irc/quakenet/newserv.git] / miscreply / rping.c
1 /* rping.c */
2
3 #include "miscreply.h"
4 #include "../irc/irc.h"
5 #include "../core/error.h"
6
7 #include <stdio.h>
8 #include <string.h>
9 #include <sys/time.h>
10
11
12
13 /* handle remote rping request
14 *
15 * RPING from requesting user to start server:
16 * <user numeric> RPING/RI <server> <target server numeric> :<comment>
17 *
18 * cargv[0] = server
19 * server(mask) as given by user
20 * a * indicates the request is for all servers (future snircd extension?)
21 * cargv[1] = target server numeric
22 * cargv[2] = comment
23 *
24 *
25 * RPING from start server to destination server:
26 * <start server numeric> RPING/RI <target server numeric> <requesting user numeric> <start seconds> <start milliseconds> :<comment>
27 *
28 * cargv[0] = target server numeric
29 * can be a * in which case the request is for all servers (future snircd extension?)
30 * cargv[1] = requesting user numeric
31 * cargv[2] = start time in seconds
32 * cargv[3] = start time in milliseconds
33 * cargv[4] = comment
34 *
35 */
36 int handlerpingmsg(void *source, int cargc, char **cargv) {
37
38 nick *snick; /* struct nick for source nick */
39 long i; /* index for serverlist[] */
40 char *sourcenum = (char *)source; /* source numeric */
41 char *server; /* target server parameter */
42 char *destserver; /* destination server mask */
43 char *destnum; /* destination server numeric */
44 char *sourceoper; /* requesting operator numeric */
45 char *time_s; /* time in seconds */
46 char *time_us; /* time in milliseconds */
47 char *comment; /* comment by client */
48 struct timeval tv; /* get start time in seconds and milliseconds */
49
50 /* from server */
51 if (strlen(sourcenum) == 2) {
52
53 /* check parameters */
54 if (cargc < 5) {
55 miscreply_needmoreparams(sourcenum, "RPING");
56 return CMD_OK;
57 }
58
59 /* get the parameters */
60 server = cargv[0];
61 sourceoper = cargv[1];
62 time_s = cargv[2];
63 time_us = cargv[3];
64 comment = cargv[4];
65
66 /* find source server */
67 if (miscreply_findserver(sourcenum, "RPING") == -1)
68 return CMD_OK;
69
70 /* find source user */
71 if (!(snick = miscreply_finduser(sourceoper, "RPING")))
72 return CMD_OK;
73
74 /* send RPONG to operator */
75 irc_send("%s RO %s %s %s %s :%s", getmynumeric(), sourcenum,
76 sourceoper, time_s, time_us, comment);
77 }
78
79 /* from user */
80 else if (strlen(sourcenum) == 5) {
81
82 /* check parameters */
83 if (cargc < 3) {
84 miscreply_needmoreparams(sourcenum, "RPING");
85 return CMD_OK;
86 }
87
88 /* get the parameters */
89 destserver = cargv[0];
90 server = cargv[1];
91 comment = cargv[2];
92
93 /* find source user */
94 if (!(snick = miscreply_finduser(sourcenum, "RPING")))
95 return CMD_OK;
96
97 /* request is for * (all servers) */
98 if ((destserver[0] == '*' && destserver[1] == '\0'))
99 destnum = "*";
100
101 /* find destination server */
102 else if ((i = miscreply_findservermatch(sourcenum, destserver)) == -1)
103 return CMD_OK;
104
105 /* destination is me
106 * do the same as ircu in this case, nothing
107 */
108 else if (i == mylongnum)
109 return CMD_OK;
110
111 /* found valid destination server */
112 else
113 destnum = longtonumeric(i, 2);
114
115 /* get starttime */
116 gettimeofday(&tv, NULL);
117
118 /* send RPING to server */
119 irc_send("%s RI %s %s %lu %lu :%s", getmynumeric(), destnum,
120 sourcenum, tv.tv_sec, tv.tv_usec, comment);
121 }
122
123 return CMD_OK;
124 }