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