]>
Commit | Line | Data |
---|---|---|
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 *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 */ | |
48 | ||
49 | /* from server */ | |
50 | if (strlen(sourcenum) == 2) { | |
51 | ||
52 | /* check parameters */ | |
53 | if (cargc < 5) { | |
54 | miscreply_needmoreparams(sourcenum, "RPING"); | |
55 | return CMD_OK; | |
56 | } | |
57 | ||
58 | /* get the parameters */ | |
59 | /*server = cargv[0];*/ | |
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 | ||
73 | /* send RPONG to operator */ | |
74 | irc_send("%s RO %s %s %s %s :%s", getmynumeric(), sourcenum, | |
75 | sourceoper, time_s, time_us, comment); | |
76 | } | |
77 | ||
78 | /* from user */ | |
79 | else if (strlen(sourcenum) == 5) { | |
80 | ||
81 | /* check parameters */ | |
82 | if (cargc < 3) { | |
83 | miscreply_needmoreparams(sourcenum, "RPING"); | |
84 | return CMD_OK; | |
85 | } | |
86 | ||
87 | /* get the parameters */ | |
88 | destserver = cargv[0]; | |
89 | /*server = cargv[1];*/ | |
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 | ||
104 | /* destination is me | |
105 | * do the same as ircu in this case, nothing | |
106 | */ | |
107 | else if (i == mylongnum) | |
108 | return CMD_OK; | |
109 | ||
110 | /* found valid destination server */ | |
111 | else | |
112 | destnum = longtonumeric(i, 2); | |
113 | ||
114 | /* get starttime */ | |
115 | gettimeofday(&tv, NULL); | |
116 | ||
117 | /* send RPING to server */ | |
118 | irc_send("%s RI %s %s %lu %lu :%s", getmynumeric(), destnum, | |
119 | sourcenum, tv.tv_sec, tv.tv_usec, comment); | |
120 | } | |
121 | ||
122 | return CMD_OK; | |
123 | } |