]>
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 */ | |
a7697869 | 41 | char *destserver; /* destination server mask */ |
42 | char *destnum; /* destination server numeric */ | |
43 | char *sourceoper; /* requesting operator numeric */ | |
44 | char *time_s; /* time in seconds */ | |
45 | char *time_us; /* time in milliseconds */ | |
46 | char *comment; /* comment by client */ | |
47 | struct timeval tv; /* get start time in seconds and milliseconds */ | |
7bec4aeb | 48 | |
49 | /* from server */ | |
a7697869 | 50 | if (strlen(sourcenum) == 2) { |
7bec4aeb | 51 | |
52 | /* check parameters */ | |
53 | if (cargc < 5) { | |
54 | miscreply_needmoreparams(sourcenum, "RPING"); | |
55 | return CMD_OK; | |
56 | } | |
57 | ||
a7697869 | 58 | /* get the parameters */ |
e7817034 | 59 | /*server = cargv[0];*/ |
7bec4aeb | 60 | sourceoper = cargv[1]; |
61 | time_s = cargv[2]; | |
62 | time_us = cargv[3]; | |
63 | comment = cargv[4]; | |
64 | ||
65 | /* find source server */ | |
66 | if (miscreply_findserver(sourcenum, "RPING") == -1) | |
67 | return CMD_OK; | |
68 | ||
69 | /* find source user */ | |
70 | if (!(snick = miscreply_finduser(sourceoper, "RPING"))) | |
71 | return CMD_OK; | |
72 | ||
a7697869 | 73 | /* send RPONG to operator */ |
74 | irc_send("%s RO %s %s %s %s :%s", getmynumeric(), sourcenum, | |
7bec4aeb | 75 | sourceoper, time_s, time_us, comment); |
76 | } | |
77 | ||
78 | /* from user */ | |
a7697869 | 79 | else if (strlen(sourcenum) == 5) { |
7bec4aeb | 80 | |
81 | /* check parameters */ | |
82 | if (cargc < 3) { | |
83 | miscreply_needmoreparams(sourcenum, "RPING"); | |
84 | return CMD_OK; | |
85 | } | |
86 | ||
a7697869 | 87 | /* get the parameters */ |
7bec4aeb | 88 | destserver = cargv[0]; |
e7817034 | 89 | /*server = cargv[1];*/ |
7bec4aeb | 90 | comment = cargv[2]; |
91 | ||
92 | /* find source user */ | |
93 | if (!(snick = miscreply_finduser(sourcenum, "RPING"))) | |
94 | return CMD_OK; | |
95 | ||
96 | /* request is for * (all servers) */ | |
97 | if ((destserver[0] == '*' && destserver[1] == '\0')) | |
98 | destnum = "*"; | |
99 | ||
100 | /* find destination server */ | |
101 | else if ((i = miscreply_findservermatch(sourcenum, destserver)) == -1) | |
102 | return CMD_OK; | |
103 | ||
a7697869 | 104 | /* destination is me |
105 | * do the same as ircu in this case, nothing | |
106 | */ | |
107 | else if (i == mylongnum) | |
7bec4aeb | 108 | return CMD_OK; |
7bec4aeb | 109 | |
110 | /* found valid destination server */ | |
111 | else | |
112 | destnum = longtonumeric(i, 2); | |
113 | ||
114 | /* get starttime */ | |
115 | gettimeofday(&tv, NULL); | |
116 | ||
a7697869 | 117 | /* send RPING to server */ |
118 | irc_send("%s RI %s %s %lu %lu :%s", getmynumeric(), destnum, | |
7bec4aeb | 119 | sourcenum, tv.tv_sec, tv.tv_usec, comment); |
120 | } | |
121 | ||
7bec4aeb | 122 | return CMD_OK; |
123 | } |