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; }
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); } }