unrar_err_t unrar_extract_custom( unrar_t* p, unrar_write_func user_write, void* user_data ) { assert( !unrar_done( p ) ); RETURN_ERR( NONLOCAL_ERROR( p ) ); if ( solid_file( p ) ) { unrar_pos_t pos = p->Arc.CurBlockPos; if ( p->solid_pos != pos ) { // Next file to solid extract isn't current one if ( p->solid_pos > pos ) RETURN_ERR( reopen( p ) ); else p->Arc.NextBlockPos = p->solid_pos; RETURN_ERR( next_( p, true ) ); // Keep extracting until solid position is at desired file while ( !p->done && p->solid_pos < pos ) { RETURN_ERR( skip_solid( p ) ); RETURN_ERR( next_( p, true ) ); } // Be sure we're at right file if ( p->solid_pos != pos || p->Arc.CurBlockPos != pos ) return unrar_err_corrupt; } } return extract_( p, user_write, user_data ); }
static unrar_err_t skip_solid( unrar_t* p ) { if ( !solid_file( p ) ) { update_solid_pos( p ); return unrar_ok; } return extract_( p, NULL, NULL ); }
void print_extracted() { int extracted = extract_(); printf("Extracted = %d\n", extracted); }
static aug_result run_BIN_(int argc, char* argv[], const char* archivename) { aug_mpool* mpool; int flags = 0; mode_t mode = 0; aug_mar* mar; int ch; switch (options_ & (READOPT_ | WRITEOPT_)) { case READOPT_: flags = AUG_RDONLY; break; case WRITEOPT_: flags = AUG_WRONLY; break; case READOPT_ | WRITEOPT_: flags = AUG_RDWR; break; } if (options_ & CREATEOPT_) { flags |= AUG_CREAT; mode = 0666; } mpool = aug_getmpool(aug_tlx); mar = aug_openmar_BIN(mpool, archivename, flags, mode); aug_release(mpool); if (!mar) { aug_perrinfo(aug_tlx, "aug_openmar() failed", NULL); return -1; } while (-1 != (ch = aug_getopt(argc, argv, OPTIONS_))) switch (ch) { case 'c': if (clear_(mar) < 0) { aug_perrinfo(aug_tlx, "failed to " CLEARTEXT_, NULL); goto fail; } break; case 'd': if (del_(mar, aug_optarg) < 0) { aug_perrinfo(aug_tlx, "failed to " DELTEXT_, NULL); goto fail; } break; case 'f': break; case 'g': if (get_(mar, aug_optarg) < 0) { aug_perrinfo(aug_tlx, "failed to " GETTEXT_, NULL); goto fail; } break; case 'i': if (insert_BIN_(mar, aug_optarg) < 0) { aug_perrinfo(aug_tlx, "failed to " INSERTTEXT_, NULL); goto fail; } break; case 'l': if (names_(mar) < 0) { aug_perrinfo(aug_tlx, "failed to " NAMESTEXT_, NULL); goto fail; } break; case 'n': size_(mar); break; case 'o': if (aug_compactmar(mar) < 0) { aug_perrinfo(aug_tlx, "failed to " COMPACTTEXT_, NULL); goto fail; } break; case 'p': if (put_BIN_(mar, aug_optarg) < 0) { aug_perrinfo(aug_tlx, "failed to " PUTTEXT_, NULL); goto fail; } break; case 't': if (list_(mar) < 0) { aug_perrinfo(aug_tlx, "failed to " LISTTEXT_, NULL); goto fail; } break; case 'x': if (extract_(mar, aug_optarg) < 0) { aug_perrinfo(aug_tlx, "failed to " EXTRACTTEXT_, NULL); goto fail; } break; case 'z': if (zero_(mar) < 0) { aug_perrinfo(aug_tlx, "failed to " ZEROTEXT_, NULL); goto fail; } break; case 'h': case '?': default: fprintf(stderr, "unexpected option [-%c]\n", aug_optopt); goto fail; } aug_release(mar); return 0; fail: aug_release(mar); return -1; }