| | 116 | static void * |
| | 117 | service (void *args) |
| | 118 | { |
| | 119 | HelperOpts *opts = (HelperOpts *) args; |
| | 120 | GList *vs; |
| | 121 | struct in_addr ip_addr; |
| | 122 | guint32 src_ip; |
| | 123 | guint vserver_id; |
| | 124 | gchar query[32]; |
| | 125 | gchar *reply; |
| | 126 | GNetXmlRpcClient *client; |
| | 127 | gint port = 8123; |
| | 128 | |
| | 129 | if (inet_aton (opts->ip, &ip_addr) == 0) |
| | 130 | { |
| | 131 | /* ERR: Invalid source IP address */ |
| | 132 | pthread_mutex_lock (&helper_mtx); |
| | 133 | printf ("%sOK user=%s\n", opts->ch_tag, opts->ip); |
| | 134 | fflush (stdout); |
| | 135 | pthread_mutex_unlock (&helper_mtx); |
| | 136 | goto out; |
| | 137 | } |
| | 138 | src_ip = ntohl (ip_addr.s_addr); |
| | 139 | |
| | 140 | vserver_id = ~0; |
| | 141 | for (vs = vservers; vs; vs = vs->next) |
| | 142 | { |
| | 143 | struct vserver_info *info = (struct vserver_info *) vs->data; |
| | 144 | if ((src_ip & (~0 << (32 - info->mask))) == info->net_ip) |
| | 145 | { |
| | 146 | vserver_id = info->id; |
| | 147 | break; |
| | 148 | } |
| | 149 | } |
| | 150 | |
| | 151 | if (vserver_id == ~0) |
| | 152 | { |
| | 153 | /* ERR: vserver_id not found */ |
| | 154 | pthread_mutex_lock (&helper_mtx); |
| | 155 | printf ("%sOK user=%s\n", opts->ch_tag, opts->ip); |
| | 156 | fflush (stdout); |
| | 157 | pthread_mutex_unlock (&helper_mtx); |
| | 158 | goto out; |
| | 159 | } |
| | 160 | |
| | 161 | /* query RahuNAS daemon for user name via xmlrpc */ |
| | 162 | client = gnet_xmlrpc_client_new ("localhost", "/RPC2", port); |
| | 163 | if (!client) |
| | 164 | { |
| | 165 | /* ERR: Failed to connect to localhost XMLRPC */ |
| | 166 | pthread_mutex_lock (&helper_mtx); |
| | 167 | printf ("%sOK user=%s\n", opts->ch_tag, opts->ip); |
| | 168 | fflush (stdout); |
| | 169 | pthread_mutex_unlock (&helper_mtx); |
| | 170 | goto out; |
| | 171 | } |
| | 172 | |
| | 173 | snprintf (query, sizeof query, "%s|%d", opts->ip, vserver_id); |
| | 174 | if (gnet_xmlrpc_client_call (client, |
| | 175 | "getsessioninfo", |
| | 176 | query, |
| | 177 | /* output */ |
| | 178 | &reply) == 0) |
| | 179 | { |
| | 180 | gchar *tok; |
| | 181 | /* reply format: id|user|sess-id|sess-start|mac|sess-timeout */ |
| | 182 | tok = strtok (reply, "|"); /* id */ |
| | 183 | tok = strtok (NULL, "|"); /* user */ |
| | 184 | pthread_mutex_lock (&helper_mtx); |
| | 185 | printf ("%sOK user=%s\n", opts->ch_tag, tok); |
| | 186 | fflush (stdout); |
| | 187 | pthread_mutex_unlock (&helper_mtx); |
| | 188 | g_free (reply); |
| | 189 | } |
| | 190 | else |
| | 191 | { |
| | 192 | /* ERR: Error calling 'getsessioninfo' XMLRPC */ |
| | 193 | pthread_mutex_lock (&helper_mtx); |
| | 194 | printf ("%sOK user=%s\n", opts->ch_tag, opts->ip); |
| | 195 | fflush (stdout); |
| | 196 | pthread_mutex_unlock (&helper_mtx); |
| | 197 | } |
| | 198 | |
| | 199 | gnet_xmlrpc_client_delete (client); |
| | 200 | |
| | 201 | out: |
| | 202 | sem_post (&helper_sem); |
| | 203 | pthread_exit (NULL); |
| | 204 | } |
| | 205 | |
| 127 | | if (line[len] == '\n') |
| 128 | | line[len--] = '\0'; |
| 129 | | |
| 130 | | if (inet_aton (line, &ip_addr) == 0) |
| 131 | | { |
| 132 | | /* ERR: Invalid source IP address */ |
| 133 | | printf ("OK user=%s\n", line); |
| | 235 | if (line[len - 1] == '\n') |
| | 236 | line[--len] = '\0'; |
| | 237 | |
| | 238 | sep = strchr (line, ' '); |
| | 239 | if (sep) |
| | 240 | { |
| | 241 | *sep = '\0'; |
| | 242 | strncpy (&rr_opts[rr_idx].ch_tag, line, |
| | 243 | sizeof (rr_opts[rr_idx].ch_tag) - 2); |
| | 244 | strcat (&rr_opts[rr_idx].ch_tag, " "); |
| | 245 | |
| | 246 | /* Strip white-space */ |
| | 247 | sep++; |
| | 248 | while (*sep == ' ' && (sep - line) < sizeof (line)) |
| | 249 | sep++; |
| | 250 | |
| | 251 | if ((sep - line) < sizeof (line)) |
| | 252 | { |
| | 253 | strncpy (&rr_opts[rr_idx].ip, sep, |
| | 254 | sizeof (rr_opts[rr_idx].ip) - 1); |
| | 255 | } |
| | 256 | else |
| | 257 | { |
| | 258 | rr_opts[rr_idx].ip[0] = '\0'; |
| | 259 | } |
| | 260 | } |
| | 261 | else |
| | 262 | { |
| | 263 | rr_opts[rr_idx].ch_tag[0] = '\0'; |
| | 264 | strncpy (&rr_opts[rr_idx].ip, line, sizeof (rr_opts[rr_idx].ip) - 1); |
| | 265 | } |
| | 266 | |
| | 267 | sem_wait (&helper_sem); |
| | 268 | |
| | 269 | if (pthread_create (&p, NULL, (void *(*)(void *))service, |
| | 270 | (void *)&rr_opts[rr_idx]) != 0) |
| | 271 | { |
| | 272 | pthread_mutex_lock (&helper_mtx); |
| | 273 | printf ("%sOK user=%s\n", rr_opts[rr_idx].ch_tag, rr_opts[rr_idx].ip); |
| 135 | | continue; |
| 136 | | } |
| 137 | | src_ip = ntohl (ip_addr.s_addr); |
| 138 | | |
| 139 | | vserver_id = ~0; |
| 140 | | for (vs = vservers; vs; vs = vs->next) |
| 141 | | { |
| 142 | | struct vserver_info *info = (struct vserver_info *) vs->data; |
| 143 | | if ((src_ip & (~0 << (32 - info->mask))) == info->net_ip) |
| 144 | | { |
| 145 | | vserver_id = info->id; |
| 146 | | break; |
| 147 | | } |
| 148 | | } |
| 149 | | |
| 150 | | if (vserver_id == ~0) |
| 151 | | { |
| 152 | | /* ERR: vserver_id not found */ |
| 153 | | printf ("OK user=%s\n", line); |
| 154 | | fflush (stdout); |
| 155 | | continue; |
| 156 | | } |
| 157 | | |
| 158 | | /* query RahuNAS daemon for user name via xmlrpc */ |
| 159 | | client = gnet_xmlrpc_client_new ("localhost", "/RPC2", port); |
| 160 | | if (!client) |
| 161 | | { |
| 162 | | /* ERR: Failed to connect to localhost XMLRPC */ |
| 163 | | printf ("OK user=%s\n", line); |
| 164 | | fflush (stdout); |
| 165 | | continue; |
| 166 | | } |
| 167 | | |
| 168 | | snprintf (query, sizeof query, "%s|%d", line, vserver_id); |
| 169 | | if (gnet_xmlrpc_client_call (client, |
| 170 | | "getsessioninfo", |
| 171 | | query, |
| 172 | | /* output */ |
| 173 | | &reply) == 0) |
| 174 | | { |
| 175 | | gchar *tok; |
| 176 | | /* reply format: id|user|sess-id|sess-start|mac|sess-timeout */ |
| 177 | | tok = strtok (reply, "|"); /* id */ |
| 178 | | tok = strtok (NULL, "|"); /* user */ |
| 179 | | printf ("OK user=%s\n", tok); |
| 180 | | fflush (stdout); |
| 181 | | g_free (reply); |
| | 275 | pthread_mutex_unlock (&helper_mtx); |