Пример #1
0
static gboolean
save_numbered_parts (MuMsg *msg, MuConfig *opts)
{
	gboolean rv;
	char **parts, **cur;

	parts = g_strsplit (opts->parts, ",", 0);

	for (rv = TRUE, cur = parts; cur && *cur; ++cur) {

		unsigned idx;
		int i;
		char *endptr;

		idx = (unsigned)(i = strtol (*cur, &endptr, 10));
		if (i < 0 || *cur == endptr) {
			g_warning ("invalid MIME-part index '%s'", *cur);
			rv = FALSE;
			break;
		}

		if (!save_part (msg, opts->targetdir, idx, opts)) {
			g_warning ("failed to save MIME-part %d", idx);
			rv = FALSE;
			break;
		}
	}

	g_strfreev (parts);
	return rv;
}
Пример #2
0
static gboolean
save_part_with_filename (MuMsg *msg, const char *pattern, MuConfig *opts)
{
	GSList *lst, *cur;
	GRegex *rx;
	gboolean rv;
	MuMsgOptions msgopts;

	msgopts = mu_config_get_msg_options (opts);

	/* 'anchor' the pattern with '^...$' if not already */
	rx = anchored_regex (pattern);
	if (!rx)
		return FALSE;

	lst = mu_msg_find_files (msg, msgopts, rx);
	g_regex_unref (rx);
	if (!lst) {
		g_warning ("no matching attachments found");
		return FALSE;
	}

	for (cur = lst, rv = TRUE; cur; cur = g_slist_next (cur))
		rv = rv && save_part (msg, opts->targetdir,
				      GPOINTER_TO_UINT(cur->data), opts);
	g_slist_free (lst);

	return rv;
}
Пример #3
0
/* 'extract' extracts some mime part from a message */
static MuError
cmd_extract (ServerContext *ctx, GHashTable *args, GError **err)
{
	MuMsg *msg;
	int docid, index, action;
	MuError rv;
	MuMsgOptions opts;
	const char* actionstr, *indexstr;

	opts = get_encrypted_msg_opts (args);
	rv = MU_ERROR;

	/* read parameters */
	GET_STRING_OR_ERROR_RETURN (args, "action", &actionstr, err);
	GET_STRING_OR_ERROR_RETURN (args, "index",  &indexstr, err);
	index = atoi (indexstr);
	docid = determine_docid (ctx->query, args, err);
	if (docid == MU_STORE_INVALID_DOCID) {
		print_and_clear_g_error (err);
		return MU_OK;
	}

	if ((action = action_type (actionstr)) == INVALID_ACTION) {
		print_error (MU_ERROR_IN_PARAMETERS, "invalid action");
		return MU_OK;
	}
	msg = mu_store_get_msg (ctx->store, docid, err);
	if (!msg) {
		print_error (MU_ERROR, "failed to get message");
		return MU_OK;
	}

	switch (action) {
	case SAVE: rv = save_part (msg, docid, index, opts, args, err); break;
	case OPEN: rv = open_part (msg, docid, index, opts, err); break;
	case TEMP: rv = temp_part (msg, docid, index, opts, args, err); break;
	default: print_error (MU_ERROR_INTERNAL, "unknown action");
	}

	if (rv != MU_OK)
		print_and_clear_g_error (err);

	mu_msg_unref (msg);
	return MU_OK;
}
Пример #4
0
int main(int argc, char **argv)
{
	int i;
	FILE *in = stdin;
	int verbose = 1;
	int save_parts = 0;
	int part = -1;
	int opt;
	const char *dest = "%d.img";
	
	while ((opt = getopt(argc, argv, "vqso:p:?")) != -1) {
		switch(opt) {
		case 'v':
			verbose++;
			break;
		case 'q':
			if (verbose)
				verbose--;
			break;
		case 'o':
			dest = optarg;
			save_parts = 1;
			break;
		case 'p':
			save_parts = 1;
			part = atoi(optarg);
			break;
		case 's':
			save_parts = 1;
			break;
		default:
			usage(argv);
			exit(1);
			break;
		}
	}
	if (save_parts && !strchr(dest, '%')) {
		const char *t = dest;
		if (!*t)
			t = "./";
		if (t[strlen(t)-1] == '/' || !part) {
			int l = strlen(t) + strlen("/%d.img") + 1;
			char *tmp = malloc(l);
			snprintf(tmp, l, "%s/%%d.img", optarg);
			t = tmp;
		}
		dest = t;
	}
	if (argc > optind + 1) {
		usage(argv);
		exit(1);
	}
	if (optind < argc ) {
		in = fopen(argv[optind], "rb");
	}
	fseek(in, 0x1C00, SEEK_CUR);
	fread(&ptable, 1, 0x400, in);
	if (strncmp(ptable.signature, "PHOENIX_CARD_IMG", 16) != 0) {
		fprintf(stderr, "ERROR: Not a phoenix image\n");
		exit(1);
	}
	if (verbose > 1) {
		printf("????  : %08x\n", le32toh(ptable.unknown1));
		printf("Parts : %d\n", le16toh(ptable.parts));
		printf("????  : %08x\n", le16toh(ptable.unknown2));
		printf("pad   : %02x%02x%02x%02x%02x%02x%02x%02x\n", ptable.pad[0], ptable.pad[1], ptable.pad[2], ptable.pad[3], ptable.pad[4], ptable.pad[5], ptable.pad[6], ptable.pad[7]);
		printf("\n");
	}
	for (i = 0; i < le16toh(ptable.parts); i++) {
		if (verbose && (part == -1 || part == i)) {
			printf("part %d:\n", i);
			printf("\tstart: 0x%08x (%u / 0x%08x)\n", le32toh(ptable.part[i].start)*512, le32toh(ptable.part[i].start), le32toh(ptable.part[i].start));
			printf("\tsize : %u\n", le32toh(ptable.part[i].size));
			printf("\t?????: %08x\n", le32toh(ptable.part[i].unknown));
			if (verbose > 1 || le32toh(ptable.part[i].sig) != 0x00646461)
				printf("\tsig??: %08x\n", le32toh(ptable.part[i].sig));
			printf("\n");
		}
		if (save_parts && (part == -1 || part == i)) {
			save_part(&ptable, i, dest, in);
		}
	}
}