本文整理汇总了C++中LOCK_CLIENT_LIST函数的典型用法代码示例。如果您正苦于以下问题:C++ LOCK_CLIENT_LIST函数的具体用法?C++ LOCK_CLIENT_LIST怎么用?C++ LOCK_CLIENT_LIST使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了LOCK_CLIENT_LIST函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ndsctl_deauth
static void
ndsctl_deauth(int fd, char *arg)
{
t_client *client;
char *ip, *mac;
debug(LOG_DEBUG, "Entering ndsctl_deauth...");
LOCK_CLIENT_LIST();
/* arg can be IP or MAC address of client */
debug(LOG_DEBUG, "Argument: %s (@%x)", arg, arg);
/* We get the client or return... */
if ((client = client_list_find_by_ip(arg)) != NULL);
else if ((client = client_list_find_by_mac(arg)) != NULL);
else if ((client = client_list_find_by_token(arg)) != NULL);
else {
debug(LOG_DEBUG, "Client not found.");
UNLOCK_CLIENT_LIST();
write(fd, "No", 2);
return;
}
/* We have the client. Get both ip and mac address and deauthenticate */
ip = safe_strdup(client->ip);
mac = safe_strdup(client->mac);
UNLOCK_CLIENT_LIST();
auth_client_action(ip, mac, AUTH_MAKE_DEAUTHENTICATED);
free(ip);
free(mac);
write(fd, "Yes", 3);
debug(LOG_DEBUG, "Exiting ndsctl_deauth...");
}
示例2: fw_init
/** Initialize the firewall rules
*/
int
fw_init(void)
{
int result = 0;
int new_fw_state;
t_client *client = NULL;
if (!init_icmp_socket()) {
return 0;
}
debug(LOG_INFO, "Initializing Firewall");
result = iptables_fw_init();
if (restart_orig_pid) {
debug(LOG_INFO, "Restoring firewall rules for clients inherited from parent");
LOCK_CLIENT_LIST();
client = client_get_first_client();
while (client) {
new_fw_state = client->fw_connection_state;
client->fw_connection_state = FW_MARK_NONE;
fw_allow(client, new_fw_state);
client = client->next;
}
UNLOCK_CLIENT_LIST();
}
return result;
}
示例3: auth_client_auth
int
auth_client_auth(const unsigned id, const char *reason)
{
t_client *client;
int rc;
LOCK_CLIENT_LIST();
client = client_list_find_by_id(id);
/* Client should already have hit the server and be on the client list */
if (client == NULL) {
debug(LOG_ERR, "Client %u to authenticate is not on client list", id);
rc = -1;
goto end;
}
rc = auth_change_state(client, FW_MARK_AUTHENTICATED, reason);
if (rc == 0) {
authenticated_since_start++;
}
end:
UNLOCK_CLIENT_LIST();
return rc;
}
示例4: ndsctl_auth
static void
ndsctl_auth(int fd, char *arg)
{
t_client *client;
char *ip, *mac;
debug(LOG_DEBUG, "Entering ndsctl_auth...");
LOCK_CLIENT_LIST();
/* arg should be IP address of client */
debug(LOG_DEBUG, "Argument: %s (@%x)", arg, arg);
/* Add client to client list... */
if ((client = client_list_add_client(arg)) == NULL) {
debug(LOG_DEBUG, "Could not add client.");
UNLOCK_CLIENT_LIST();
write(fd, "No", 2);
return;
}
/* We have a client. Get both ip and mac address and authenticate */
ip = safe_strdup(client->ip);
mac = safe_strdup(client->mac);
UNLOCK_CLIENT_LIST();
auth_client_action(ip, mac, AUTH_MAKE_AUTHENTICATED);
free(ip);
free(mac);
write(fd, "Yes", 3);
debug(LOG_DEBUG, "Exiting ndsctl_auth...");
}
示例5: http_callback_auth
void
http_callback_auth(httpd *webserver, request *r)
{
t_client *client;
httpVar * token;
char *mac;
if ((token = httpdGetVariableByName(r, "token"))) {
/* They supplied variable "token" */
if (!(mac = arp_get(r->clientAddr))) {
/* We could not get their MAC address */
debug(LOG_ERR, "Failed to retrieve MAC address for ip %s", r->clientAddr);
send_http_page(r, "WiFiDog Error", "Failed to retrieve your MAC address");
} else {
/* We have their MAC address */
LOCK_CLIENT_LIST();
if ((client = client_list_find(r->clientAddr, mac)) == NULL) {
debug(LOG_DEBUG, "New client for %s", r->clientAddr);
client_list_append(r->clientAddr, mac, token->value);
} else {
debug(LOG_DEBUG, "Client for %s is already in the client list", client->ip);
}
UNLOCK_CLIENT_LIST();
authenticate_client(r);
free(mac);
}
} else {
/* They did not supply variable "token" */
send_http_page(r, "WiFiDog error", "Invalid token");
}
}
示例6: wdctl_reset
static void
wdctl_reset(int fd, char *arg)
{
t_client *node;
debug(LOG_DEBUG, "Entering wdctl_reset...");
LOCK_CLIENT_LIST();
debug(LOG_DEBUG, "Argument: %s (@%x)", arg, arg);
/* We get the node or return... */
if ((node = client_list_find_by_ip(arg)) != NULL);
else if ((node = client_list_find_by_mac(arg)) != NULL);
else {
debug(LOG_DEBUG, "Client not found.");
UNLOCK_CLIENT_LIST();
write(fd, "No", 2);
return;
}
debug(LOG_DEBUG, "Got node %x.", node);
/* deny.... */
/* TODO: maybe just deleting the connection is not best... But this
* is a manual command, I don't anticipate it'll be that useful. */
fw_deny(node->ip, node->mac, node->fw_connection_state);
client_list_delete(node);
UNLOCK_CLIENT_LIST();
write(fd, "Yes", 3);
debug(LOG_DEBUG, "Exiting wdctl_reset...");
}
示例7: http_nodogsplash_add_client
/**
* Add client making a request to client list.
* Return pointer to the client list entry for this client.
*
* N.B.: This does not authenticate the client; it only makes
* their information available on the client list.
*/
t_client *
http_nodogsplash_add_client(request *r)
{
t_client *client;
LOCK_CLIENT_LIST();
client = client_list_add_client(r->clientAddr);
UNLOCK_CLIENT_LIST();
return client;
}
示例8: fw_refresh_client_list
/** See if they are still active,
* refresh their traffic counters,
* remove and deny them if timed out
*/
static void
fw_refresh_client_list(void)
{
t_client *cp1, *cp2;
s_config *config = config_get_config();
const int preauth_idle_timeout_secs = 60 * config->preauth_idle_timeout;
const int auth_idle_timeout_secs = 60 * config->auth_idle_timeout;
const time_t now = time(NULL);
/* Update all the counters */
if (-1 == iptables_fw_counters_update()) {
debug(LOG_ERR, "Could not get counters from firewall!");
return;
}
LOCK_CLIENT_LIST();
for (cp1 = cp2 = client_get_first_client(); NULL != cp1; cp1 = cp2) {
cp2 = cp1->next;
if (!(cp1 = client_list_find_by_id(cp1->id))) {
debug(LOG_ERR, "Client was freed while being re-validated!");
continue;
}
int conn_state = cp1->fw_connection_state;
int last_updated = cp1->counters.last_updated;
if (cp1->session_end > 0 && cp1->session_end <= now) {
/* Session ended (only > 0 for FW_MARK_AUTHENTICATED by binauth) */
debug(LOG_NOTICE, "Force out user: %s %s, connected: %ds, in: %llukB, out: %llukB",
cp1->ip, cp1->mac, now - cp1->session_end,
cp1->counters.incoming / 1000, cp1->counters.outgoing / 1000);
auth_change_state(cp1, FW_MARK_PREAUTHENTICATED, "timeout_deauth");
} else if (preauth_idle_timeout_secs > 0
&& conn_state == FW_MARK_PREAUTHENTICATED
&& (last_updated + preauth_idle_timeout_secs) <= now) {
/* Timeout inactive preauthenticated user */
debug(LOG_NOTICE, "Timeout preauthenticated idle user: %s %s, inactive: %ds, in: %llukB, out: %llukB",
cp1->ip, cp1->mac, now - last_updated,
cp1->counters.incoming / 1000, cp1->counters.outgoing / 1000);
client_list_delete(cp1);
} else if (auth_idle_timeout_secs > 0
&& conn_state == FW_MARK_AUTHENTICATED
&& (last_updated + auth_idle_timeout_secs) <= now) {
/* Timeout inactive user */
debug(LOG_NOTICE, "Timeout authenticated idle user: %s %s, inactive: %ds, in: %llukB, out: %llukB",
cp1->ip, cp1->mac, now - last_updated,
cp1->counters.incoming / 1000, cp1->counters.outgoing / 1000);
auth_change_state(cp1, FW_MARK_PREAUTHENTICATED, "idle_deauth");
}
}
UNLOCK_CLIENT_LIST();
}
示例9: http_callback_logout
void http_callback_logout(httpd *webserver, request *r)
{
t_client *client;
s_config *config = config_get_config();
LOCK_CLIENT_LIST();
client = client_list_find_by_ip(r->clientAddr);
/* Send logout to auth server if client is logged in */
if (client != NULL) {
t_authresponse authresponse;
char *ip = strdup(client->ip);
char *mac = strdup(client->mac);
char *token = strdup(client->token);
unsigned long long incoming = client->counters.incoming;
unsigned long long outgoing = client->counters.outgoing;
debug(LOG_INFO, "Got manual logout from client ip %s, mac %s, token %s",
client->ip, client->mac, client->token);
fw_deny(client->ip, client->mac, client->fw_connection_state);
client_list_delete(client);
/* Unlock client list here since auth_server_request may take a while */
UNLOCK_CLIENT_LIST();
/* Advertise the logout if we have an auth server */
if (config->auth_servers != NULL) {
auth_server_request(&authresponse, REQUEST_TYPE_LOGOUT, ip,
mac, token, incoming, outgoing);
}
free(ip);
free(mac);
free(token);
} else {
/* Do nothing if the client is not in the client list (i.e. not logged in) */
debug(LOG_INFO, "Got manual logout from client %s, but client not in list", r->clientAddr);
UNLOCK_CLIENT_LIST();
}
if (config->auth_servers != NULL) {
/* Re-direct them to auth server */
char *urlFragment = NULL;
t_auth_serv *auth_server = get_auth_server();
safe_asprintf(&urlFragment, "%smessage=%s",
auth_server->authserv_msg_script_path_fragment,
GATEWAY_MESSAGE_ACCOUNT_LOGGED_OUT
);
http_send_redirect_to_auth(r, urlFragment, "Redirect to logout message");
free(urlFragment);
}
}
示例10: ndsctl_json
void
ndsctl_json(int fd)
{
t_client *client;
int indx;
unsigned long int now, durationsecs = 0;
unsigned long long int download_bytes, upload_bytes;
now = time(NULL);
/* Update the client's counters so info is current */
iptables_fw_counters_update();
LOCK_CLIENT_LIST();
cprintf(fd, "{\n\"client_length\": %d,\n", get_client_list_length());
client = client_get_first_client();
indx = 0;
cprintf(fd, "\"clients\":{\n");
while (client != NULL) {
cprintf(fd, "\"%s\":{\n", client->mac);
cprintf(fd, "\"client_id\":%d,\n", indx);
cprintf(fd, "\"ip\":\"%s\",\n\"mac\":\"%s\",\n", client->ip, client->mac);
cprintf(fd, "\"added\":%lld,\n", (long long) client->added_time);
cprintf(fd, "\"active\":%lld,\n", (long long) client->counters.last_updated);
cprintf(fd, "\"duration\":%lu,\n", now - client->added_time);
cprintf(fd, "\"token\":\"%s\",\n", client->token ? client->token : "none");
cprintf(fd, "\"state\":\"%s\",\n", fw_connection_state_as_string(client->fw_connection_state));
durationsecs = now - client->added_time;
download_bytes = client->counters.incoming;
upload_bytes = client->counters.outgoing;
cprintf(fd, "\"downloaded\":\"%llu\",\n\"avg_down_speed\":\"%.6g\",\n\"uploaded\":\"%llu\",\n\"avg_up_speed\":\"%.6g\"\n",
download_bytes/1000, ((double)download_bytes)/125/durationsecs,
upload_bytes/1000, ((double)upload_bytes)/125/durationsecs);
indx++;
client = client->next;
cprintf(fd, "}");
if(client) {
cprintf(fd, ",\n");
}
}
cprintf(fd, "}}" );
UNLOCK_CLIENT_LIST();
}
示例11: http_callback_auth
void
http_callback_auth(httpd * webserver, request * r)
{
t_client *client;
httpVar *token;
char *mac;
httpVar *logout = httpdGetVariableByName(r, "logout");
const s_config *config = config_get_config();
if ((token = httpdGetVariableByName(r, "token"))) {
/* They supplied variable "token" */
if (!(mac = arp_get(r->clientAddr))) {
/* We could not get their MAC address */
debug(LOG_ERR, "Failed to retrieve MAC address for ip %s", r->clientAddr);
send_http_page(r, "WiFiDog Error", "Failed to retrieve your MAC address");
} else {
t_redir_node *node;
int index = 0;
LOCK_REDIR();
node = redir_list_find(mac);
if (node) {
index = node->wlindex;
}
UNLOCK_REDIR();
/* We have their MAC address */
LOCK_CLIENT_LIST();
if ((client = client_list_find(r->clientAddr, mac)) == NULL) {
debug(LOG_DEBUG, "New client for %s", r->clientAddr);
client = client_list_add(r->clientAddr, mac, token->value);
client->fw_connection_state = FW_MARK_REDIR;
client->counters.active_duration = config->sessiontimeout[index-1];
} else if (logout) {
logout_client(client);
} else {
debug(LOG_DEBUG, "Client for %s is already in the client list", client->ip);
}
UNLOCK_CLIENT_LIST();
if (!logout) { /* applies for case 1 and 3 from above if */
authenticate_client(r);
}
free(mac);
}
} else {
/* They did not supply variable "token" */
send_http_page(r, "WiFiDog error", "Invalid token");
}
}
示例12: fw_refresh_client_list
/** Ping clients to see if they are still active,
* refresh their traffic counters,
* remove and deny them if timed out
*/
void
fw_refresh_client_list(void)
{
t_client *cp1, *cp2;
time_t now, added_time, last_updated;
s_config *config = config_get_config();
/* Update all the counters */
if (-1 == iptables_fw_counters_update()) {
debug(LOG_ERR, "Could not get counters from firewall!");
return;
}
LOCK_CLIENT_LIST();
for (cp1 = cp2 = client_get_first_client(); NULL != cp1; cp1 = cp2) {
cp2 = cp1->next;
if (!(cp1 = client_list_find(cp1->ip, cp1->mac))) {
debug(LOG_ERR, "Node %s was freed while being re-validated!", cp1->ip);
} else {
now = time(NULL);
last_updated = cp1->counters.last_updated;
added_time = cp1->added_time;
if (last_updated + (config->checkinterval * config->clienttimeout) <= now) {
/* Timing out inactive user */
debug(LOG_NOTICE, "%s %s inactive %d secs. kB in: %llu kB out: %llu",
cp1->ip, cp1->mac, config->checkinterval * config->clienttimeout,
cp1->counters.incoming/1000, cp1->counters.outgoing/1000);
if (cp1->fw_connection_state == FW_MARK_AUTHENTICATED) {
iptables_fw_access(AUTH_MAKE_DEAUTHENTICATED, cp1);
}
client_list_delete(cp1);
} else if (added_time + (config->checkinterval * config->clientforceout) <= now) {
/* Forcing out user */
debug(LOG_NOTICE, "%s %s connected %d secs. kB in: %llu kB out: %llu",
cp1->ip, cp1->mac, config->checkinterval * config->clientforceout,
cp1->counters.incoming/1000, cp1->counters.outgoing/1000);
if (cp1->fw_connection_state == FW_MARK_AUTHENTICATED) {
iptables_fw_access(AUTH_MAKE_DEAUTHENTICATED, cp1);
}
client_list_delete(cp1);
}
}
}
UNLOCK_CLIENT_LIST();
}
示例13: ndsctl_clients
void
ndsctl_clients(int fd)
{
t_client *client;
int indx;
unsigned long int now, durationsecs = 0;
unsigned long long int download_bytes, upload_bytes;
now = time(NULL);
/* Update the client's counters so info is current */
iptables_fw_counters_update();
LOCK_CLIENT_LIST();
cprintf(fd, "%d\n", get_client_list_length());
client = client_get_first_client();
if(client) {
cprintf(fd, "\n");
}
indx = 0;
while (client != NULL) {
cprintf(fd, "client_id=%d\n", indx);
cprintf(fd, "ip=%s\nmac=%s\n", client->ip, client->mac);
cprintf(fd, "added=%lld\n", (long long) client->added_time);
cprintf(fd, "active=%lld\n", (long long) client->counters.last_updated);
cprintf(fd, "duration=%lu\n", now - client->added_time);
cprintf(fd, "token=%s\n", client->token ? client->token : "none");
cprintf(fd, "state=%s\n", fw_connection_state_as_string(client->fw_connection_state));
durationsecs = now - client->added_time;
download_bytes = client->counters.incoming;
upload_bytes = client->counters.outgoing;
cprintf(fd, "downloaded=%llu\navg_down_speed=%.6g\nuploaded=%llu\navg_up_speed=%.6g\n\n",
download_bytes/1000, ((double)download_bytes)/125/durationsecs,
upload_bytes/1000, ((double)upload_bytes)/125/durationsecs);
indx++;
client = client->next;
}
UNLOCK_CLIENT_LIST();
}
示例14: auth_client_action
/** Take action on a client.
* Alter the firewall rules and client list accordingly.
*/
void
auth_client_action(const char ip[], const char mac[], t_authaction action)
{
t_client *client;
LOCK_CLIENT_LIST();
client = client_list_find(ip,mac);
/* Client should already have hit the server and be on the client list */
if (client == NULL) {
debug(LOG_ERR, "Client %s %s action %d is not on client list",
ip, mac, action);
UNLOCK_CLIENT_LIST();
return;
}
switch(action) {
case AUTH_MAKE_AUTHENTICATED:
if(client->fw_connection_state != FW_MARK_AUTHENTICATED) {
client->fw_connection_state = FW_MARK_AUTHENTICATED;
iptables_fw_access(AUTH_MAKE_AUTHENTICATED, client);
authenticated_since_start++;
} else {
debug(LOG_INFO, "Nothing to do, %s %s already authenticated", client->ip, client->mac);
}
break;
case AUTH_MAKE_DEAUTHENTICATED:
if(client->fw_connection_state == FW_MARK_AUTHENTICATED) {
iptables_fw_access(AUTH_MAKE_DEAUTHENTICATED, client);
}
client_list_delete(client);
break;
default:
debug(LOG_ERR, "Unknown auth action: %d",action);
}
UNLOCK_CLIENT_LIST();
return;
}
示例15: auth_client_deauth_all
void
auth_client_deauth_all()
{
t_client *cp1, *cp2;
LOCK_CLIENT_LIST();
for (cp1 = cp2 = client_get_first_client(); NULL != cp1; cp1 = cp2) {
cp2 = cp1->next;
if (!(cp1 = client_list_find_by_id(cp1->id))) {
debug(LOG_ERR, "Client was freed while being re-validated!");
continue;
}
auth_change_state(cp1, FW_MARK_PREAUTHENTICATED, "shutdown_deauth");
}
UNLOCK_CLIENT_LIST();
}