Exemplo n.º 1
0
gpgme_data_t sgpgme_data_from_mimeinfo(MimeInfo *mimeinfo)
{
	gpgme_data_t data = NULL;
	gpgme_error_t err;
	FILE *fp = g_fopen(mimeinfo->data.filename, "rb");
	gchar *tmp_file = NULL;

	if (!fp) 
		return NULL;

	tmp_file = get_tmp_file();
	copy_file_part(fp, mimeinfo->offset, mimeinfo->length, tmp_file);
	fclose(fp);
	fp = NULL;
	debug_print("tmp file %s\n", tmp_file);
	
	err = gpgme_data_new_from_file(&data, tmp_file, 1);
	claws_unlink(tmp_file);
	g_free(tmp_file);

	debug_print("data %p (%d %d)\n", (void *)&data, mimeinfo->offset, mimeinfo->length);
	if (err) {
		debug_print ("gpgme_data_new_from_file failed: %s\n",
			     gpgme_strerror (err));
		privacy_set_error(_("Couldn't get data from message, %s"), gpgme_strerror(err));
		return NULL;
	}
	return data;
}
void extract_ramdisk() {
    int elf_fd, return_val = 0;
    Elf *e;
    GElf_Phdr phdr;
    char elf_filename[PATH_MAX], output[PATH_MAX], output2[PATH_MAX];
    char command[4096];
    size_t result;
    unsigned long fota_location;

    // Make sure that tmp_dir ends with a /
    if (tmp_dir[strlen(tmp_dir) - 1] != '/')
        strcat(tmp_dir, "/");

    if (elf_version(EV_CURRENT) == EV_NONE) {
        printf("ELF library initialization failed.\n");
        exit(-1);
    }

    if (use_dump_image) {
        strcpy(elf_filename, tmp_dir);
        strcat(elf_filename, "dumped.elf");
        printf("Dumping image to '%s'\n", elf_filename);
        sprintf(command, "dump_image '%s' '%s'\n", input_filename,
                elf_filename);
        __system(command);
    } else {
        strcpy(elf_filename, input_filename);
    }

    if ((elf_fd = open(elf_filename, O_RDONLY, 0)) < 0) {
        printf("Unable to open '%s' for read.\n", elf_filename);
        exit(-1);
    }

    if ((e = elf_begin(elf_fd, ELF_C_READ, NULL)) == NULL) {
        printf("elf_begin failed.\n");
        close(elf_fd);
        exit(-1);
    }

    if (elf_kind(e) != ELF_K_ELF) {
        printf("'%s' is not an ELF file.\n", elf_filename);
        elf_end(e);
        close(elf_fd);
        exit(-1);
    }

    if (gelf_getphdr(e, ramdisk_loc - 1, &phdr) != &phdr) {
        printf("Failed to get header %i\n", ramdisk_loc - 1);
        elf_end(e);
        close(elf_fd);
        exit(-1);
    }
    printf("Offset:      %llu\n", phdr.p_offset);
    printf("Size:        %llu\n", phdr.p_filesz);
    // printf("Flags:       %ll\n", phdr.e_flags); Does not exist in Android's
    //                                             libelf
    elf_end(e);
    close(elf_fd);

    if (dont_unzip) {
        strcpy(output, output_filename);
    } else {
        strcpy(output, tmp_dir);
        strcat(output, EER_TMP_RAMDISK_GZ);
        if (path_exists(output) && unlink(output)) {
            printf("Unable to unlink '%s'\n", output);
            exit(-1);
        }
    }

    copy_file_part(elf_filename, output, (unsigned long) phdr.p_offset,
                   (unsigned long) phdr.p_filesz);

    if (!dont_unzip) {
        if (check_ramdisk) {
            strcpy(output2, tmp_dir);
            strcat(output2, EER_TMP_RAMDISK_CPIO);
        } else {
            unlink(output_filename);
            strcpy(output2, output_filename);
        }
        sprintf(command, "busybox gunzip -c '%s' > '%s'", output,
                output2);
        __system(command);
        unlink(output);
        printf("Uncompressed ramdisk written to '%s'\n", output2);
        if (check_ramdisk) {
            printf("Checking ramdisk to ensure it is not a stock Sony ");
            printf("recovery.\n");
            printf("  (Checking for %s)\n", EER_SEARCH_STRING);
            // Find the ramdisk offset table
            unsigned char needle[7] = EER_SEARCH_STRING;
            return_val = scan_file_for_data(output2, needle, sizeof(needle), 0,
                                            &fota_location);
            if (return_val < 0) {
                printf("This is not a stock Sony recovery ramdisk.\n");
                copy_file_part(output2, output_filename, 0, 0);
                printf("Ramdisk copied to '%s'\nDONE!\n", output_filename);
            } else {
                printf("This is a stock Sony recovery ramdisk.\n");
                printf("Ramdisk NOT copied to '%s'\n", output_filename);
            }
            unlink(output2);
        } else {
            printf("DONE!\n");
        }
    } else {
        printf("Ramdisk copied to '%s'\nDONE!\n", output_filename);
    }
}