]> jfr.im git - irc/quakenet/newserv.git/blob - miscreply/rpong.c
CHANSERV: better batcher error handling for expired accounts/accounts with no email.
[irc/quakenet/newserv.git] / miscreply / rpong.c
1 /* rpong.c */
2
3 #include "miscreply.h"
4 #include "../irc/irc.h"
5 #include "../core/error.h"
6 #include "../server/server.h"
7
8 #include <stdio.h>
9 #include <sys/time.h>
10
11
12
13 /* handle remote rpong request
14 *
15 * RPONG from destination server to start server:
16 * <destination server numeric> RPONG/RO <start server name> <requesting user numeric> <start seconds> <start milliseconds> :<comment>
17 *
18 * cargv[0] = start server name (not numeric!)
19 * cargv[1] = request user numeric
20 * cargv[2] = start time in seconds
21 * cargv[3] = start time in milliseconds
22 * cargv[4] = comment
23 *
24 *
25 * RPONG from start server to requesting user:
26 * <start server numeric> RPONG/RO <requesting user numeric> <destination server name> <ping time> :<comment>
27 *
28 * cargv[0] = requesting user numeric
29 * cargv[1] = destination server name (the pinged server, not numeric!)
30 * cargv[2] = ping time in milliseconds
31 * cargv[3] = comment
32 *
33 */
34 int handlerpongmsg(void *source, int cargc, char **cargv) {
35
36 nick *snick; /* struct nick for source oper nick */
37 long i; /* index for serverlist[] */
38 char *sourcenum = (char *)source; /* source numeric */
39 char *sourceoper; /* requesting operator numeric */
40 char *time_s; /* time in seconds */
41 char *time_us; /* time in milliseconds */
42 char *comment; /* comment by client */
43 char *servername; /* name of source server */
44 struct timeval tv; /* get time */
45 static char ping[18]; /* elapsed time */
46
47 /* check parameters */
48 if (cargc < 4) {
49 miscreply_needmoreparams(sourcenum, "RPONG");
50 return CMD_OK;
51 }
52
53 /* from pinged server to source server */
54 if (cargc > 4) {
55
56 /* get the parameters */
57 sourceoper = cargv[1];
58 time_s = cargv[2];
59 time_us = cargv[3];
60 comment = cargv[4];
61
62 /* find source server */
63 if ((i = miscreply_findserver(sourcenum, "RPING")) == -1)
64 return CMD_OK;
65 servername = serverlist[i].name->content;
66
67 /* find requesting oper */
68 if (!(snick = miscreply_finduser(sourceoper, "RPONG")))
69 return CMD_OK;
70
71 /* get time */
72 gettimeofday(&tv, NULL);
73
74 /* calc ping */
75 sprintf(ping, "%ld", (tv.tv_sec - atoi(time_s)) * 1000 + (tv.tv_usec - atoi(time_us)) / 1000);
76
77 /* send */
78 irc_send("%s RO %s %s %s :%s", getmynumeric(), sourceoper,
79 servername, ping, comment);
80 }
81
82 return CMD_OK;
83 }