]>
Commit | Line | Data |
---|---|---|
7bec4aeb | 1 | /* rping.c */ |
2 | ||
3 | #include "miscreply.h" | |
7bec4aeb | 4 | #include "../irc/irc.h" |
5 | #include "../core/error.h" | |
7bec4aeb | 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 | |
a7697869 | 20 | * a * indicates the request is for all servers (future snircd extension?) |
7bec4aeb | 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 | |
a7697869 | 29 | * can be a * in which case the request is for all servers (future snircd extension?) |
7bec4aeb | 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 | ||
a7697869 | 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 */ | |
7bec4aeb | 49 | |
50 | /* from server */ | |
a7697869 | 51 | if (strlen(sourcenum) == 2) { |
7bec4aeb | 52 | |
53 | /* check parameters */ | |
54 | if (cargc < 5) { | |
55 | miscreply_needmoreparams(sourcenum, "RPING"); | |
56 | return CMD_OK; | |
57 | } | |
58 | ||
a7697869 | 59 | /* get the parameters */ |
7bec4aeb | 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 | ||
a7697869 | 74 | /* send RPONG to operator */ |
75 | irc_send("%s RO %s %s %s %s :%s", getmynumeric(), sourcenum, | |
7bec4aeb | 76 | sourceoper, time_s, time_us, comment); |
77 | } | |
78 | ||
79 | /* from user */ | |
a7697869 | 80 | else if (strlen(sourcenum) == 5) { |
7bec4aeb | 81 | |
82 | /* check parameters */ | |
83 | if (cargc < 3) { | |
84 | miscreply_needmoreparams(sourcenum, "RPING"); | |
85 | return CMD_OK; | |
86 | } | |
87 | ||
a7697869 | 88 | /* get the parameters */ |
7bec4aeb | 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 | ||
a7697869 | 105 | /* destination is me |
106 | * do the same as ircu in this case, nothing | |
107 | */ | |
108 | else if (i == mylongnum) | |
7bec4aeb | 109 | return CMD_OK; |
7bec4aeb | 110 | |
111 | /* found valid destination server */ | |
112 | else | |
113 | destnum = longtonumeric(i, 2); | |
114 | ||
115 | /* get starttime */ | |
116 | gettimeofday(&tv, NULL); | |
117 | ||
a7697869 | 118 | /* send RPING to server */ |
119 | irc_send("%s RI %s %s %lu %lu :%s", getmynumeric(), destnum, | |
7bec4aeb | 120 | sourcenum, tv.tv_sec, tv.tv_usec, comment); |
121 | } | |
122 | ||
7bec4aeb | 123 | return CMD_OK; |
124 | } |