예제 #1
0
파일: filesystem.c 프로젝트: jucs/musicfs
static int filesystem_read(const char *path, char *buffer, size_t buffer_size, off_t offset,
                           struct fuse_file_info *file_info) {
    //int retstat = 0;

    logging_log("Filesystem", LOGGING_LEVEL_INFO,
                "filesystem_read(path=\"%s\", buf=0x%08x, size=%d, offset=%lld, fi=0x%08x)", path,
                buffer, buffer_size, offset, file_info);

    char *url;
    if(filesystem_get_url(path, &url))
        return -1;

    char *downloader_buffer;
    size_t downloader_buffer_size = downloader_file_contents_try_get(url, buffer_size, offset,
                                    FILESYSTEM_READ_TIMEOUT, (void**)&downloader_buffer);

    if(!downloader_buffer_size)
        return EOF;
    size_t to_write = downloader_buffer_size > buffer_size ? buffer_size : downloader_buffer_size;

    logging_log("Filesystem", LOGGING_LEVEL_DEBUG, "filesystem_read() - to_write: %lu...", to_write);

    memcpy(buffer, downloader_buffer, to_write);

    free(downloader_buffer);

    return to_write;
}
예제 #2
0
파일: downloader.c 프로젝트: jucs/musicfs
void downloader_url_lock(char const *url) {
	pthread_mutex_lock(downloader_files_mutex);
	
	logging_log("Downloader", LOGGING_LEVEL_INFO, "downloader_lock_url(url=%s)...", url);
	
	char search_result;
	downloader_request_t *request = (downloader_request_t*)al_dictionary_get(downloader_files,
			&search_result, url);
	if(search_result) {
		request = downloader_request_construct(url);
		
		request->reference_count = 2;
		
		al_dictionary_insert(downloader_files, url, request);
		queue_enqueue(downloader_requests_queue, request);
		
		logging_log("Donwloader", LOGGING_LEVEL_INFO, "Inserted new job into queue...");
		
		pthread_cond_signal(downloader_requests_cond);
	} else {
		logging_log("Donwloader", LOGGING_LEVEL_INFO, "File already downloaded or downloading...");
		
		pthread_mutex_lock(request->mutex);
		request->reference_count++;
		logging_log("Donwloader", LOGGING_LEVEL_INFO, "request->reference_count: %lu...",
				(unsigned long int)request->reference_count);
		pthread_mutex_unlock(request->mutex);
	}
	
	pthread_mutex_unlock(downloader_files_mutex);
}
예제 #3
0
파일: fg_pcap.c 프로젝트: arnd/flowgrind
void fg_pcap_go(struct _flow *flow)
{
	int rc;
	if (!flow->settings.traffic_dump)
		return;

	if (dumping) {
		logging_log(LOG_WARNING, "pcap: dumping already in progress "
			    "on this host");
		return;
	}

	DEBUG_MSG(LOG_DEBUG, "called fg_pcap_go() for flow %d", flow->id);
	dumping = 1;
	rc = pthread_create(&flow->pcap_thread, NULL, fg_pcap_work,
			    (void*)flow);
	/* barrier: dump thread is ready (or aborted) */
#ifndef __DARWIN__
	pthread_barrier_wait(&pcap_barrier);
#endif /* __DARWIN__ */
	if (rc)
		logging_log(LOG_WARNING, "Could not start pcap thread: %s",
			    strerror(errno) );
	return;
}
예제 #4
0
파일: filesystem.c 프로젝트: jucs/musicfs
static char filesystem_get_url(char const *path, char **url) {
    path_t *path_parsed = path_parse(path);
    if(path_parsed->parts_length != 2) {
        pthread_mutex_unlock(filesystem_io_mutex);
        path_free(path_parsed);
        logging_log("Filesystem", LOGGING_LEVEL_WARNING,
                    "filesystem_get_url() - Invalid path %s...", path);
        return -1;
    }

    pthread_mutex_lock(filesystem_io_mutex);
    ALDictionary *results = searcher_get_search_results(path_parsed->parts[0]);

    if(results == NULL) {
        pthread_mutex_unlock(filesystem_io_mutex);
        path_free(path_parsed);
        logging_log("Filesystem", LOGGING_LEVEL_WARNING, "Invalid file %s...", path);
        return -1;
    }

    char result;
    *url = (char*)al_dictionary_get(results, &result, path_parsed->parts[1]);
    pthread_mutex_unlock(filesystem_io_mutex);

    if(result) {
        logging_log("Filesystem", LOGGING_LEVEL_WARNING,
                    "filesystem_get_url() - Invalid path %s...", path);
        return -1;
    } else
        logging_log("Filesystem", LOGGING_LEVEL_INFO, "filesystem_get_url() - Url is %s...", *url);

    path_free(path_parsed);

    return 0;
}
예제 #5
0
static void sighandler(int sig)
{
	int status;

	switch (sig) {
	case SIGCHLD:
		while (waitpid(-1, &status, WNOHANG) > 0)
			logging_log(LOG_NOTICE, "child returned (status = %d)",
					status);
		break;

	case SIGHUP:
		logging_log(LOG_NOTICE, "got SIGHUP, don't know what to do.");
		break;

	case SIGALRM:
		logging_log(LOG_NOTICE, "Caught SIGALRM. don't know what to do.");
		break;

	case SIGPIPE:
		break;

	default:
		logging_log(LOG_ALERT, "got signal %d, but don't remember "
				"intercepting it, aborting...", sig);
		abort();
	}
}
예제 #6
0
파일: main.c 프로젝트: jucs/musicfs
static void fuse_destroyed() {	
	logging_log("Main", LOGGING_LEVEL_INFO,
			"*** Got EXIT COMMAND from FUSE, termination sequence initiated...");
	
	logging_log("Main", LOGGING_LEVEL_INFO,
			"Terminating all other threads...");
	
	downloader_shutdown();
	
	logging_log("Main", LOGGING_LEVEL_INFO,
			"All other threads have terminated, cleaning up...");
	
	http_free();
	downloader_free();
	searcher_free();
	filesystem_free();
	providers_free();
	configuration_free();
	
	logging_log("Main", LOGGING_LEVEL_INFO,
			"Cleanup almost finished, cleaning up the logging subsystem and exiting...");
	logging_free();
	
	fclose(stdin);
	fclose(stdout);
	fclose(stderr);
}
예제 #7
0
/* This method returns version information of flowgrindd and OS as an xmlrpc struct */
static xmlrpc_value * method_get_version(xmlrpc_env * const env,
		   xmlrpc_value * const param_array,
		   void * const user_data)
{
	UNUSED_ARGUMENT(param_array);
	UNUSED_ARGUMENT(user_data);
	struct utsname buf;

	xmlrpc_value *ret = 0;

	DEBUG_MSG(LOG_WARNING, "Method get_version called");

	if (uname(&buf)) {
		logging_log(LOG_WARNING, "uname() failed %s", strerror(errno));
		exit(1);
	}

	ret = xmlrpc_build_value(env, "{s:s,s:i,s:s,s:s}",
				 "version", FLOWGRIND_VERSION,
				 "api_version", FLOWGRIND_API_VERSION,
				 "os_name", buf.sysname,
				 "os_release", buf.release);

	if (env->fault_occurred)
		logging_log(LOG_WARNING, "Method get_version failed: %s", env->fault_string);
	else {
		DEBUG_MSG(LOG_WARNING, "Method get_version successful");
	}

	return ret;
}
예제 #8
0
void set_affinity(int cpu)
{
#ifdef __LINUX__
	typedef cpu_set_t fg_cpuset;
#elif __FreeBSD__
	typedef cpuset_t fg_cpuset;
#endif /* __LINUX__ */
	int rc;
	int ncpu = sysconf(_SC_NPROCESSORS_ONLN);   /* number of cores */
	fg_cpuset cpuset;			    /* define cpu_set bit mask */

	/* sanity check */
	if (cpu > ncpu) {
		logging_log(LOG_WARNING, "CPU binding failed. Given cpu number "
			    "is higher then the available cores");
		return;
	}

	CPU_ZERO(&cpuset);	/* initialize to 0, i.e. no CPUs selected. */
	CPU_SET(cpu, &cpuset);	/* set bit that represents the given core */

#ifdef __LINUX__
	rc = sched_setaffinity(getpid(), sizeof(cpuset), &cpuset);
#elif __FreeBSD__
	rc = cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, -1,
				sizeof(cpuset), &cpuset);
#endif /* __LINUX__ */
	if (rc)
		logging_log(LOG_WARNING, "failed to bind %s (PID %d) to "
			    "CPU %i\n", progname, getpid(), cpu);
	else
		DEBUG_MSG(LOG_WARNING, "bind %s (PID %d) to CPU %i\n",
			  progname, getpid(), cpu);
}
예제 #9
0
/* creates listen socket for the xmlrpc server */
static int bind_rpc_server(char *bind_addr, unsigned int port) {
	int rc;
	int fd;
	int optval;
	struct addrinfo hints, *res, *ressave;
	char tmp_port[100];

	bzero(&hints, sizeof(struct addrinfo));
	hints.ai_flags = AI_PASSIVE | AI_NUMERICSERV;
	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;
	sprintf(tmp_port, "%u", port);

	if ((rc = getaddrinfo(bind_addr, tmp_port,
				&hints, &res)) != 0) {
		logging_log(LOG_ALERT, "Failed to find address to bind rpc_server: %s\n",
			gai_strerror(rc));
		return -1;
	}
	ressave = res;

	/* try to bind the first succeeding socket of
	   the returned addresses (libxmlrpc only supports one fd)
	*/
	do {
		fd = socket(res->ai_family, res->ai_socktype,
		res->ai_protocol);
		if (fd < 0)
			continue;
		/* ignore old client connections in TIME_WAIT */
		optval = 1;
		setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
		/* Disable Nagle algorithm to reduce latency */
		setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof(optval));

		if (bind(fd, res->ai_addr, res->ai_addrlen) == 0)
			break;

		close(fd);
	} while ((res = res->ai_next) != NULL);

	if (res == NULL) {
		logging_log(LOG_ALERT, "failed to bind RPC listen socket: %s\n", strerror(errno));
		freeaddrinfo(ressave);
		return -1;
	}

	return fd;
}
예제 #10
0
파일: shd-tracker.c 프로젝트: 4sp1r3/shadow
static void _tracker_logRAM(Tracker* tracker, GLogLevelFlags level, SimulationTime interval) {
    guint seconds = (guint) (interval / SIMTIME_ONE_SECOND);
    guint numptrs = g_hash_table_size(tracker->allocatedLocations);

    if(!tracker->didLogRAMHeader) {
        tracker->didLogRAMHeader = TRUE;
        logging_log(G_LOG_DOMAIN, level, __FILE__, __FUNCTION__, __LINE__,
                "[shadow-heartbeat] [ram-header] interval-seconds,alloc-bytes,dealloc-bytes,total-bytes,pointers-count,failfree-count");
    }

    logging_log(G_LOG_DOMAIN, level, __FILE__, __FUNCTION__, __LINE__,
        "[shadow-heartbeat] [ram] %u,%"G_GSIZE_FORMAT",%"G_GSIZE_FORMAT",%"G_GSIZE_FORMAT",%u,%u",
        seconds, tracker->allocatedBytesLastInterval, tracker->deallocatedBytesLastInterval,
        tracker->allocatedBytesTotal, numptrs, tracker->numFailedFrees);
}
예제 #11
0
파일: filesystem.c 프로젝트: jucs/musicfs
void filesystem_free() {
    logging_log("Filesystem", LOGGING_LEVEL_INFO,
                "Global destructor of the filesystem subsystem was called, cleaning up...");

    pthread_mutex_destroy(filesystem_io_mutex);
    free(filesystem_io_mutex);
}
예제 #12
0
파일: downloader.c 프로젝트: jucs/musicfs
static void downloader_garbage_collect() {
	void *reference = NULL;
	while(configuration->downloader_size_maximum &&
			downloader_files_size > configuration->downloader_size_maximum &&
			queue_get_length(downloader_files_free_queue)) {
		downloader_request_t *next = (downloader_request_t*)queue_dequeue(
				downloader_files_free_queue);
		if(reference == next)
			break;
		else if(reference == NULL)
			reference = next;
		pthread_mutex_lock(next->mutex);
		if(!next->reference_count) {
			pthread_mutex_unlock(next->mutex);
			downloader_files_size -= next->file->size;
			
			logging_log("Downloader", LOGGING_LEVEL_INFO, "About to free contents saved for %s...",
					next->url);
			
			al_dictionary_remove(downloader_files, next->url);
			downloader_request_free(next);
			
			reference = NULL;
		} else {
			pthread_mutex_unlock(next->mutex);
			
			queue_enqueue(downloader_files_free_queue, next);
		}
	}
}
예제 #13
0
파일: fg_pcap.c 프로젝트: arnd/flowgrind
void fg_pcap_init()
{
/* initalize *alldevs for later use */
#ifdef DEBUG
	pcap_if_t *d;
	char devdes[200];
#endif /* DEBUG */
	if (pcap_findalldevs(&alldevs, errbuf) == -1) {
		logging_log(LOG_WARNING,"Error in pcap_findalldevs: %s\n",
			    errbuf);
		return;
	}
#ifdef DEBUG
	for (d = alldevs; d; d = d->next) {
		pcap_addr_t *a;
		snprintf(devdes, sizeof(devdes), "%s: ", d->name);
		for (a = d->addresses; a; a = a->next) {
			char addr[100];
			if (!a->addr)
				continue;
			snprintf(addr, sizeof(addr), "a=%s",
				 fg_nameinfo(a->addr, sizeof(struct sockaddr)));
			strncat(devdes, addr, sizeof(devdes) - strlen(devdes) - 1);
			if (a->next)
				strncat(devdes, ", ", sizeof(devdes) - strlen(devdes) - 1);
		}
		DEBUG_MSG(LOG_ERR, "pcap: found pcapable device (%s)", devdes);
	}
#endif /* DEBUG*/
	pthread_mutex_init(&pcap_mutex, NULL);
#ifndef __DARWIN__
	pthread_barrier_init(&pcap_barrier, NULL, 2);
#endif /* __DARWIN__ */
	return;
}
예제 #14
0
파일: downloader.c 프로젝트: jucs/musicfs
void downloader_init() {
	logging_log("Donwloader", LOGGING_LEVEL_INFO, "downloader_init()");
	
	configuration = configuration_get();
	
	downloader_requests_queue = queue_construct();
	downloader_files_free_queue = queue_construct();
	
	downloader_requests_cond = (pthread_cond_t*)malloc(sizeof(pthread_cond_t));
	pthread_cond_init(downloader_requests_cond, NULL);
	
	downloader_files
			= al_dictionary_construct((char(*)(const void *, const void *))&string_compare);
	downloader_files_size = 0;
	
	downloader_files_mutex = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t));
	pthread_mutex_init(downloader_files_mutex, NULL);
	
	thread_counter_mutex = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t));
	pthread_mutex_init(thread_counter_mutex, NULL);
	
	thread_terminating = (pthread_cond_t*)malloc(sizeof(pthread_cond_t));
	pthread_cond_init(thread_terminating, NULL);
	
	for(uint8_t i = 0; i < configuration->downloader_threads_number; ++i) {
		pthread_t worker_thread;
		pthread_create(&worker_thread, NULL, (void *(*)(void *))&downloader_do_work, (void*)NULL);
	}
}
예제 #15
0
파일: downloader.c 프로젝트: jucs/musicfs
void downloader_shutdown() {
	logging_log("Downloader", LOGGING_LEVEL_INFO,
			"Global shutdown sequence of the downloader subsystem was initiated, terminating threads...");
	
	pthread_mutex_lock(downloader_files_mutex);
	pthread_mutex_lock(thread_counter_mutex);
	logging_log("Downloader", LOGGING_LEVEL_INFO, "Waiting for all threads to terminate...");
	threads *= -1;
	pthread_cond_broadcast(downloader_requests_cond);
	pthread_mutex_unlock(downloader_files_mutex);
	while(threads)
		pthread_cond_wait(thread_terminating, thread_counter_mutex);
	threads = -1;
	pthread_mutex_unlock(thread_counter_mutex);
	
	logging_log("Downloader", LOGGING_LEVEL_INFO, "All threads terminated...");
}
예제 #16
0
static void run_rpc_server(xmlrpc_env *env, unsigned int port)
{
	xmlrpc_server_abyss_parms serverparm;
	xmlrpc_registry * registryP;
	memset(&serverparm, 0, sizeof(serverparm));

	registryP = xmlrpc_registry_new(env);

	xmlrpc_registry_add_method(env, registryP, NULL, "add_flow_destination", &add_flow_destination, NULL);
	xmlrpc_registry_add_method(env, registryP, NULL, "add_flow_source", &add_flow_source, NULL);
	xmlrpc_registry_add_method(env, registryP, NULL, "start_flows", &start_flows, NULL);
	xmlrpc_registry_add_method(env, registryP, NULL, "get_reports", &method_get_reports, NULL);
	xmlrpc_registry_add_method(env, registryP, NULL, "stop_flow", &method_stop_flow, NULL);
	xmlrpc_registry_add_method(env, registryP, NULL, "get_version", &method_get_version, NULL);
	xmlrpc_registry_add_method(env, registryP, NULL, "get_status", &method_get_status, NULL);

	/* In the modern form of the Abyss API, we supply parameters in memory
	   like a normal API.  We select the modern form by setting
	   config_file_name to NULL:
	*/
	serverparm.config_file_name	= NULL;
	serverparm.registryP		= registryP;
	serverparm.socket_bound		= 1;
	serverparm.log_file_name        = NULL; /*"/tmp/xmlrpc_log";*/

	/* Increase HTTP keep-alive duration. Using defaults the amount of
	 * sockets in TIME_WAIT state would become too high.
	 */
	serverparm.keepalive_timeout = 60;
	serverparm.keepalive_max_conn = 1000;

	/* Disable introspection */
	serverparm.dont_advertise = 1;

	logging_log(LOG_NOTICE, "Running XML-RPC server on port %u", port);
	printf("Running XML-RPC server...\n");

	serverparm.socket_handle = bind_rpc_server(rpc_bind_addr, port);
	xmlrpc_server_abyss(env, &serverparm, XMLRPC_APSIZE(socket_handle));

	if (env->fault_occurred) {
		logging_log(LOG_ALERT, "XML-RPC Fault: %s (%d)\n",
			env->fault_string, env->fault_code);
	}
	/* xmlrpc_server_abyss() never returns */
}
예제 #17
0
파일: filesystem.c 프로젝트: jucs/musicfs
static int filesystem_releasedir(const char *path, struct fuse_file_info *fi) {
    int retstat = 0;

    logging_log("Filesystem", LOGGING_LEVEL_INFO, "filesystem_releasedir(path=\"%s\", fi=0x%08x)",
                path, fi);

    return retstat;
}
예제 #18
0
void logging_init(config_t *cfg)
{
    apr_status_t rv;
    if (cfg->errorlog) {
        rv = apr_file_open(&cfg->errorlog_fp, cfg->errorlog,
                APR_FOPEN_CREATE | APR_FOPEN_WRITE | APR_FOPEN_APPEND,
                APR_OS_DEFAULT,
                cfg->pool);
        if (rv) {
            printf("Error opening %s\n",cfg->errorlog);
            cfg->loglevel = LOGLEVEL_NONE;
        }
        logging_log(cfg, LOGLEVEL_ERROR, "Log file Opened");
    } else {
        cfg->loglevel = LOGLEVEL_NONE;
        logging_log(cfg, LOGLEVEL_NOISE, "No Log file specified, disabled logging");
    }
}
예제 #19
0
파일: shd-tracker.c 프로젝트: 4sp1r3/shadow
static void _tracker_logNode(Tracker* tracker, GLogLevelFlags level, SimulationTime interval) {
    guint seconds = (guint) (interval / SIMTIME_ONE_SECOND);
    gdouble cpuutil = (gdouble)(((gdouble)tracker->processingTimeLastInterval) / ((gdouble)interval));
    gdouble avgdelayms = 0.0;

    if(tracker->numDelayedLastInterval > 0) {
        gdouble delayms = (gdouble) (((gdouble)tracker->delayTimeLastInterval) / ((gdouble)SIMTIME_ONE_MILLISECOND));
        avgdelayms = (gdouble) (delayms / ((gdouble) tracker->numDelayedLastInterval));
    }

    if(!tracker->didLogNodeHeader) {
        tracker->didLogNodeHeader = TRUE;
        logging_log(G_LOG_DOMAIN, level, __FILE__, __FUNCTION__, __LINE__,
                "[shadow-heartbeat] [node-header] "
                "interval-seconds,recv-bytes,send-bytes,cpu-percent,delayed-count,avgdelay-milliseconds;"
                "inbound-localhost-counters;outbound-localhost-counters;"
                "inbound-remote-counters;outbound-remote-counters "
                "where counters are: %s", _tracker_getCounterHeaderString()
        );
    }

    gsize totalRecvBytes = _tracker_sumBytes(&tracker->remote.inCounters.bytes);
    gsize totalSendBytes = _tracker_sumBytes(&tracker->remote.outCounters.bytes);

    gchar* inLocal = _tracker_getCounterString(&tracker->local.inCounters);
    gchar* outLocal = _tracker_getCounterString(&tracker->local.outCounters);
    gchar* inRemote = _tracker_getCounterString(&tracker->remote.inCounters);
    gchar* outRemote = _tracker_getCounterString(&tracker->remote.outCounters);

    GString* buffer = g_string_new("[shadow-heartbeat] [node] ");

    g_string_append_printf(buffer, "%u,%"G_GSIZE_FORMAT",%"G_GSIZE_FORMAT",%f,%"G_GSIZE_FORMAT",%f;",
            seconds, totalRecvBytes, totalSendBytes, cpuutil, tracker->numDelayedLastInterval, avgdelayms);
    g_string_append_printf(buffer, "%s;%s;%s;%s", inLocal, outLocal, inRemote, outRemote);

    logging_log(G_LOG_DOMAIN, level, __FILE__, __FUNCTION__, __LINE__, "%s", buffer->str);

    g_free(inLocal);
    g_free(outLocal);
    g_free(inRemote);
    g_free(outRemote);
    g_string_free(buffer, TRUE);
}
예제 #20
0
파일: filesystem.c 프로젝트: jucs/musicfs
static int filesystem_open(const char *path, struct fuse_file_info *file_info) {
    logging_log("Filesystem", LOGGING_LEVEL_INFO, "filesystem_open(path\"%s\", fi=0x%08x)", path,
                file_info);

    char *url;
    if(filesystem_get_url(path, &url))
        return -1;

    downloader_url_lock(url);

    return 0;
}
예제 #21
0
파일: downloader.c 프로젝트: jucs/musicfs
void downloader_url_unlock(char const *url) {
	pthread_mutex_lock(downloader_files_mutex);
	
	logging_log("Downloader", LOGGING_LEVEL_INFO, "downloader_unlock_url(url=%s)...", url);
	
	char search_result;
	downloader_request_t *request = (downloader_request_t*)al_dictionary_get(downloader_files,
			&search_result, url);
	if(!search_result) {
		pthread_mutex_lock(request->mutex);
		if(request->reference_count)
			request->reference_count--;
		logging_log("Donwloader", LOGGING_LEVEL_INFO, "request->reference_count: %lu...",
				(unsigned long int)request->reference_count);
		pthread_mutex_unlock(request->mutex);
		
		downloader_garbage_collect();
	} else
		logging_log("Downloader", LOGGING_LEVEL_ERROR,
				"Fatal error: Could not find url to unlock...");
	
	pthread_mutex_unlock(downloader_files_mutex);
}
예제 #22
0
파일: downloader.c 프로젝트: jucs/musicfs
size_t downloader_file_contents_try_get(char *url, size_t requested_size, off_t offset,
		uint16_t time_max, void **data) {
	
	pthread_mutex_lock(downloader_files_mutex);
	
	logging_log(
			"Donwloader",
			LOGGING_LEVEL_INFO,
			"downloader_file_contents_try_get(url=%s, requested_size=%lu, offset=%ld, time_max=%d)...",
			url, requested_size, offset, time_max);
	
	char search_result;
	downloader_request_t *request = (downloader_request_t*)al_dictionary_get(downloader_files,
			&search_result, url);
	pthread_mutex_unlock(downloader_files_mutex);
	if(search_result) {
		logging_log("Downloader", LOGGING_LEVEL_CRITICAL, "Fatal error: Locked url not present...");
		return 0;
		
	} else
		logging_log("Donwloader", LOGGING_LEVEL_INFO, "File already downloaded or downloading...");
	
	struct timeval tp;
	gettimeofday(&tp, NULL);
	
	struct timespec ts;
	ts.tv_sec = tp.tv_sec;
	ts.tv_nsec = tp.tv_usec * 1000;
	ts.tv_sec += time_max;
	
	pthread_mutex_lock(request->mutex);
	while(!request->finished && request->file->size < offset + requested_size) {
		logging_log("Donwloader", LOGGING_LEVEL_INFO, "request->file->size=%lu",
				request->file->size);
		if(request->minimum_size <= request->file->size || offset + requested_size
				< request->minimum_size)
			request->minimum_size = offset + requested_size;
		
		if(pthread_cond_timedwait(request->minimum_size_reached, request->mutex, &ts) == ETIMEDOUT) {
			logging_log("Donwloader", LOGGING_LEVEL_INFO, "Request timed out...");
			break;
		}
	}

	logging_log("Donwloader", LOGGING_LEVEL_INFO, "Got enough data to copy back...");
	
	size_t to_copy = 0;
	if(request->file->size > offset) {
		to_copy = (request->file->size - offset) > requested_size ? requested_size
				: (request->file->size - offset);
		*data = malloc(to_copy);
		memcpy(*data, (char*)request->file->contents + offset, to_copy);
	}
	pthread_mutex_unlock(request->mutex);
	
	return to_copy;
}
예제 #23
0
파일: main.c 프로젝트: jucs/musicfs
static void fuse_initialised() {
	logging_init();
	
	musicfs_configuration_t *configuration = configuration_get();
	
	logging_set_destination(configuration->logfile);
	logging_set_level(configuration->log_level);
	logging_set_timestamp_printed(configuration->log_timestamp_use);
	
	http_init();
	providers_init();
	
	// Register built-in providers
	skreemr_init();
	
	// Set default search provider
	provider_t *provider = providers_find(configuration->provider_name);
	if(!provider)
		logging_log(MODULE, LOGGING_LEVEL_CRITICAL, "'%s' is not a known search provider.", configuration->provider_name);
	else searcher_provider_set(provider);
	
	logging_log(MODULE, LOGGING_LEVEL_INFO, "fuse_initialised()");
	downloader_init();
}
예제 #24
0
static xmlrpc_value * start_flows(xmlrpc_env * const env,
		   xmlrpc_value * const param_array,
		   void * const user_data)
{
	UNUSED_ARGUMENT(user_data);

	int rc;
	xmlrpc_value *ret = 0;
	int start_timestamp;
	struct _request_start_flows *request = 0;

	DEBUG_MSG(LOG_WARNING, "Method start_flows called");

	/* Parse our argument array. */
	xmlrpc_decompose_value(env, param_array, "({s:i,*})",

		/* general settings */
		"start_timestamp", &start_timestamp);

	if (env->fault_occurred)
		goto cleanup;

	request = malloc(sizeof(struct _request_start_flows));
	request->start_timestamp = start_timestamp;
	rc = dispatch_request((struct _request*)request, REQUEST_START_FLOWS);

	if (rc == -1) {
		XMLRPC_FAIL(env, XMLRPC_INTERNAL_ERROR, request->r.error); /* goto cleanup on failure */
	}

	/* Return our result. */
	ret = xmlrpc_build_value(env, "i", 0);

cleanup:
	if (request) {
		free(request->r.error);
		free(request);
	}

	if (env->fault_occurred)
		logging_log(LOG_WARNING, "Method start_flows failed: %s", env->fault_string);
	else {
		DEBUG_MSG(LOG_WARNING, "Method start_flows successful");
	}

	return ret;
}
예제 #25
0
static xmlrpc_value * method_stop_flow(xmlrpc_env * const env,
		   xmlrpc_value * const param_array,
		   void * const user_data)
{
	UNUSED_ARGUMENT(user_data);

	int rc;
	xmlrpc_value *ret = 0;
	int flow_id;
	struct _request_stop_flow *request = 0;

	DEBUG_MSG(LOG_WARNING, "Method stop_flow called");

	/* Parse our argument array. */
	xmlrpc_decompose_value(env, param_array, "({s:i,*})",

		/* flow id */
		"flow_id", &flow_id);

	if (env->fault_occurred)
		goto cleanup;

	request = malloc(sizeof(struct _request_stop_flow));
	request->flow_id = flow_id;
	rc = dispatch_request((struct _request*)request, REQUEST_STOP_FLOW);

	if (rc == -1) {
		XMLRPC_FAIL(env, XMLRPC_INTERNAL_ERROR, request->r.error); /* goto cleanup on failure */
	}

	/* Return our result. */
	ret = xmlrpc_build_value(env, "()");

cleanup:
	if (request) {
		free(request->r.error);
		free(request);
	}

	if (env->fault_occurred)
		logging_log(LOG_WARNING, "Method stop_flow failed: %s", env->fault_string);
	else {
		DEBUG_MSG(LOG_WARNING, "Method stop_flow successful");
	}

	return ret;
}
예제 #26
0
파일: downloader.c 프로젝트: jucs/musicfs
size_t downloader_file_size_try_get(char const *url) {
	size_t result = 0;
	
	logging_log("Downloader", LOGGING_LEVEL_INFO, "downloader_file_size_try_get(url=%s)", url);
	
	pthread_mutex_lock(downloader_files_mutex);
	char search_result;
	downloader_request_t *request = (downloader_request_t*)al_dictionary_get(downloader_files,
			&search_result, url);
	
	if(!search_result) {
		pthread_mutex_lock(request->mutex);
		result = request->file->size;
		pthread_mutex_unlock(request->mutex);
	}

	pthread_mutex_unlock(downloader_files_mutex);
	
	return result;
}
예제 #27
0
파일: daemon.c 프로젝트: arnd/flowgrind
void uninit_flow(struct _flow *flow)
{
	DEBUG_MSG(LOG_DEBUG,"uninit_flow() called for flow %d",flow->id);
	if (flow->fd != -1)
		close(flow->fd);
	if (flow->listenfd_data != -1)
		close(flow->listenfd_data);
#ifdef HAVE_LIBPCAP
	int rc;
	if (flow->settings.traffic_dump && flow->pcap_thread) {
		rc = pthread_cancel(flow->pcap_thread);
		if (rc)
			logging_log(LOG_WARNING, "failed to cancel dump "
				    "thread: %s", strerror(errno));
		fg_pcap_cleanup(flow);
	}
#endif
	free_all(flow->read_block, flow->write_block, flow->addr, flow->error);
	free_math_functions(flow);
}
예제 #28
0
int main(int argc, char *argv[])
{
	struct sigaction sa;

	xmlrpc_env env;

	if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
		crit("could not ignore SIGPIPE");

	sa.sa_handler = sighandler;
	sa.sa_flags = 0;
	sigemptyset (&sa.sa_mask);
	sigaction (SIGHUP, &sa, NULL);
	sigaction (SIGALRM, &sa, NULL);
	sigaction (SIGCHLD, &sa, NULL);

	set_progname(argv[0]);
	parse_cmdline(argc, argv);
	logging_init();
#ifdef HAVE_LIBPCAP
	fg_pcap_init();
#endif /* HAVE_LIBPCAP */
	if (log_type == LOGTYPE_SYSLOG) {
		/* Need to call daemon() before creating the thread because
		 * it internally calls fork() which does not copy threads. */
		if (daemon(0, 0) == -1)
			crit("daemon() failed");
		logging_log(LOG_NOTICE, "flowgrindd daemonized");
	}

	if (cpu >= 0)
		set_affinity(cpu);

	create_daemon_thread();

	xmlrpc_env_init(&env);

	run_rpc_server(&env, port);

	critx("control should never reach end of main()");
}
예제 #29
0
/* This method returns the number of flows and if actual test has started */
static xmlrpc_value * method_get_status(xmlrpc_env * const env,
		   xmlrpc_value * const param_array,
		   void * const user_data)
{
	UNUSED_ARGUMENT(param_array);
	UNUSED_ARGUMENT(user_data);

	int rc;
	xmlrpc_value *ret = 0;
	struct _request_get_status *request = 0;

	DEBUG_MSG(LOG_WARNING, "Method get_status called");

	request = malloc(sizeof(struct _request_get_status));
	rc = dispatch_request((struct _request*)request, REQUEST_GET_STATUS);

	if (rc == -1) {
		XMLRPC_FAIL(env, XMLRPC_INTERNAL_ERROR, request->r.error); /* goto cleanup on failure */
	}

	/* Return our result. */
	ret = xmlrpc_build_value(env, "{s:i,s:i}",
		"started", request->started,
		"num_flows", request->num_flows);

cleanup:
	if (request) {
		free(request->r.error);
		free(request);
	}

	if (env->fault_occurred)
		logging_log(LOG_WARNING, "Method get_status failed: %s", env->fault_string);
	else {
		DEBUG_MSG(LOG_WARNING, "Method get_status successful");
	}

	return ret;
}
예제 #30
0
파일: filesystem.c 프로젝트: jucs/musicfs
int filesystem_init(int fargc, char *fargv[], void(*fuse_initialised)(), void(*fuse_destroyed)()) {
    _fuse_initialised = fuse_initialised;
    _fuse_destroyed = fuse_destroyed;

    struct fuse_operations operations;
    for(size_t i = 0; i < sizeof(struct fuse_operations); i++) {
        char *ptr = (char*)&operations + i;
        *ptr = 0;
    }
    operations.read = filesystem_read;
    operations.open = filesystem_open;
    operations.release = filesystem_release;
    operations.getattr = filesystem_getattr;
    operations.init = __fuse_initialised;
    operations.destroy = __fuse_destroyed;
    operations.readdir = filesystem_readdir;
    operations.opendir = filesystem_opendir;
    operations.releasedir = filesystem_releasedir;

    logging_log("Filesystem", LOGGING_LEVEL_INFO, "About to call fuse_main()...");
    return fuse_main(fargc, fargv, &operations, NULL);
}