Exemplo n.º 1
0
gboolean
s_callback (GIOChannel *s, GIOCondition cond, gpointer data)
{
	xmonitor_t *mon = data;
	xevent_t event;

	while (monitor_process (mon, &event)) {
		switch (event.code) {
			case MON_DIR_CHANGED:
				DBG ("got changed signal for %s", event.filename);
				handle_file_changed (mon, event.filename);
				break;
			case MON_DIR_DELETED:
				handle_file_del (mon, event.filename);
				break;
			case MON_DIR_CREATED:
				handle_file_add (mon, event.filename);
				break;
			default:
				break;
		}
	}

	return TRUE;
}
Exemplo n.º 2
0
static void *thr_monitor(void *p)
{
	cJSON *conf = p;
	char *admin_ip;
	socklen_t addr_len;
	int sd, client, is_admin, val = 1;
	char client_ip[CLIENT_HOST_STR];
	struct sockaddr_in local_addr, client_addr;

	if (conf_get_int("MonitorPort", conf)==-1) {
		mylog(L_WARNING, "MonitorPort not defined, monitor thread not created!");
		pthread_exit(NULL);
	}
	admin_ip = conf_get_str("MonitorAdminIp", conf);
	if (admin_ip == NULL) {
		admin_ip = DEFAULT_ADMIN;
	}

	sd = socket(AF_INET, SOCK_STREAM, 0);
	
	if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val))<0) {
		mylog(L_ERR, "Can't set SO_REUSEADDR to admin_socket.");
		close(sd);
		abort();
	} 

	local_addr.sin_family = AF_INET;
	local_addr.sin_port = htons((uint16_t)conf_get_int("MonitorPort", conf));
	inet_pton(AF_INET, "0.0.0.0", &local_addr.sin_addr);
	if (bind(sd, &local_addr, sizeof(local_addr))<0) {
		mylog(L_ERR, "Monitor bind failed: %m");
		close(sd);
		abort();
	}

	if (listen(sd, 1)<0) {
		mylog(L_ERR, "Monitor listen failed: %m");
		close(sd);
		abort();
	}

	while (1) {
		client = accept(sd, NULL, NULL);
		if (client < 0) {
			mylog(L_WARNING, "Monitor accept failed: %m");
			continue;
		}

		is_admin = 0;

		addr_len = sizeof(struct sockaddr);
		getpeername(client, (struct sockaddr *)&client_addr, &addr_len);
		inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, (socklen_t)CLIENT_HOST_STR);
		if (!strcmp(client_ip, admin_ip) || !strcmp(client_ip, DEFAULT_ADMIN)) {
			is_admin = 1;
		}

		monitor_process(client, conf, is_admin);
	
		//result = cJSON_CreateObject();
		//cJSON_fdPrint(client, result);
		//cJSON_Delete(result);
		//close(client);
	}
}