Ejemplo n.º 1
0
static int run_worker(struct worker_data *data)
{
	char buf[PIPE_BUF+1] = {};
	char outbuf[PIPE_BUF+1] = {};
	char *urls[MAX_URLS];
	size_t urls_c;
	char *p;
	int res, i;
	ssize_t len;
	double bytes;
	long header_bytes;
	if(init_worker(data)) return -1;

	while(1)
	{
		if((len = msg_read(data->pipe_r, buf, sizeof(buf))) == -1) {
			return EXIT_FAILURE;
		}
		buf[len] = '\0';
		if(strncmp(buf, "STOP", 4) == 0 || len == 0) return destroy_worker(data);
		if(strncmp(buf, "RESET", 5) == 0) {
			if((res = reset_worker(data)) != 0) {
				len = sprintf(outbuf, "ERR %d", res);
				msg_write(data->pipe_w, outbuf, len);
			} else {
				msg_write(data->pipe_w, "OK", sizeof("OK"));
			}
			continue;
		}
		if(strncmp(buf, "URLLIST ", 8) == 0) {
			p = buf + 8;
			data->chunk.enabled = 1;
		} else if(strncmp(buf, "URL ", 4) == 0) {
			p = buf + 4;
		} else {
			fprintf(stderr, "Unrecognised command '%s'!\n", buf);
			break;
		}

		if(data->debug) {
			fprintf(stderr, "Getting URL '%s'.\n", p);
		}

		curl_easy_setopt(data->curl, CURLOPT_URL, p);
		data->chunk.size = 0;
		if((res = curl_easy_perform(data->curl)) != CURLE_OK) {
			len = sprintf(outbuf, "ERR %d", res);
			msg_write(data->pipe_w, outbuf, len);
		} else {
			if((res = curl_easy_getinfo(data->curl, CURLINFO_SIZE_DOWNLOAD, &bytes)) != CURLE_OK ||
				(res = curl_easy_getinfo(data->curl, CURLINFO_HEADER_SIZE, &header_bytes)) != CURLE_OK ) {
				fprintf(stderr, "cURL error: %s\n", curl_easy_strerror(res));
			}
			if(data->chunk.enabled == 0) {
				len = sprintf(outbuf, "OK %lu bytes", (long)bytes + header_bytes);
				msg_write(data->pipe_w, outbuf, len);
			} else {
				urls_c = parse_urls(data->chunk.memory, data->chunk.size, urls, MAX_URLS);
				len = sprintf(outbuf, "OK %lu bytes %lu urls", (long)bytes + header_bytes, (long)urls_c);
				msg_write(data->pipe_w, outbuf, len);
				for(i = 0; i < urls_c; i++) {
					len = sprintf(outbuf, "%s", urls[i]);
					msg_write(data->pipe_w, outbuf, len);
					free(urls[i]);
				}
				data->chunk.enabled = 0;
			}
		}
	}
	return 0;
}
Ejemplo n.º 2
0
static mulk_type_return_t filter_buffer(int i, int valid_res, const char *base_url, long err_code, long resp_code)
{
	char *newfilename = NULL;
	char *newmimefilename = NULL;
	char *subtype = NULL;
	char *type = NULL;
	mulk_type_return_t ret = MULK_RET_OK;
	buffer_t *buffer = buffer_array + i;

#ifdef ENABLE_METALINK
	metalink_file_list_t *metalink = buffer->url->metalink_uri;

	if (metalink)
		buffer->url->http_code = 0;
	else
#endif
	{
		buffer->url->err_code = err_code;
		buffer->url->http_code = resp_code;
	}

	if (!valid_res) {
#ifdef ENABLE_METALINK
		if (metalink)
			buffer->url->err_code = METALINK_RES_NO_NORE_RESOURCES;
#endif
		remove(buffer->filename);
		return MULK_RET_ERR;
	}

#ifdef ENABLE_RECURSION
	if (is_html_file(buffer->url->mimetype)) 
		parse_urls(buffer->filename, base_url, buffer->url->level);
#endif

#ifdef ENABLE_METALINK
	if (option_values.follow_metalink && is_metalink_file(buffer->url->mimetype)) 
		add_new_metalink(buffer->filename, buffer->url->level);

	if (metalink) {
#ifdef ENABLE_CHECKSUM
		if (verify_metalink_file(metalink->file, buffer->filename) == CS_VERIFY_ERR) {
			MULK_NOTE((_("The file will be deleted.\n")));
			buffer->url->err_code = METALINK_RES_WRONG_CHECKSUM;

			ret = MULK_RET_ERR;
		}
		else
#endif /* ENABLE_CHECKSUM */
		{
			string_printf(&newfilename, "%s%s", option_values.file_output_directory,
				metalink->file->name);
			buffer->url->err_code = METALINK_RES_OK;
		}
	}
	else 
#endif /* ENABLE_METALINK */
	if (!option_values.disable_save_tree) {
		UriUriA *uri = create_absolute_uri(NULL, base_url);
		char *furi_str = uri2filename(uri);

		if (furi_str) {
			string_printf(&newfilename, "%s%s", option_values.file_output_directory, furi_str);

			/* add index.<mime-type> if the filename represents a directory name */
			if (newfilename[strlen(newfilename)-1] == *DIR_SEPAR_STR) {
				string_cat(&newfilename, "index.");
				if (extract_mime_type(buffer->url->mimetype, NULL, &subtype) == MULK_RET_OK) {
					string_cat(&newfilename, subtype);
					string_free(&subtype);
				} else
					string_cat(&newfilename, "bin");
			}
		}

		string_free(&furi_str);
		uri_free(uri);
	}

	if ((is_gif_image(buffer->url->mimetype) && is_valid_gif_image(buffer->filename))
		|| (is_png_image(buffer->url->mimetype) && is_valid_png_image(buffer->filename)) 
		|| (is_jpeg_image(buffer->url->mimetype) && is_valid_jpeg_image(buffer->filename))
		|| (is_saved_mime_type(buffer->url->mimetype))) {
		if (extract_mime_type(buffer->url->mimetype, &type, &subtype) == MULK_RET_OK) {
			string_printf(&newmimefilename, "%s%s%s%s_%05d.%s", option_values.mime_output_directory,
				type, DIR_SEPAR_STR, subtype, buffer->url->id, subtype);
			string_free(&type);
			string_free(&subtype);
		}
	}

	/* save file */
	buffer->url->filename = string_new(newfilename);
	buffer->url->mimefilename = string_new(newmimefilename);

	if (newfilename && newmimefilename) {
		if ((ret = save_file_to_outputdir(buffer->filename, newfilename, 1)) == MULK_RET_OK)
			ret = save_file_to_outputdir(buffer->filename, newmimefilename, 0);
	}
	else if (newfilename) 
		ret = save_file_to_outputdir(buffer->filename, newfilename, 0);
	else if (newmimefilename) 
		ret = save_file_to_outputdir(buffer->filename, newmimefilename, 0);
	else
		remove(buffer->filename);

	string_free(&newmimefilename);
	string_free(&newfilename);

	return ret;
}